ZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmggYi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oCmluZGV4IGY4MjA5OTkuLmY0ZjliOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaApAQCAtMTYsNyArMTYsNyBAQAogdm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbik7CiB2b2lkIENSWVBUX0FyY0ZvdXJTZXR1cCh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGxlbmd0aCk7CiB2b2lkIENSWVBUX0FyY0ZvdXJDcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKLXZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBjb25zdCB1aW50OF90KiBrZXksIEZYX0RXT1JEIGtleWxlbiwgRlhfQk9PTCBiRW5jcnlwdCk7Cit2b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LCBGWF9EV09SRCBibG9ja2xlbiwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBrZXlsZW4sIGJvb2wgYkVuY3J5cHQpOwogdm9pZCBDUllQVF9BRVNTZXRJVih2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBpdik7CiB2b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwgdWludDhfdCogZGVzdCwgY29uc3QgdWludDhfdCogc3JjLCBGWF9EV09SRCBzaXplKTsKIHZvaWQgQ1JZUFRfQUVTRW5jcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkZXN0LCBjb25zdCB1aW50OF90KiBzcmMsIEZYX0RXT1JEIHNpemUpOwpAQCAtNDAsNyArNDAsNyBAQAogdm9pZCBDUllQVF9TSEE1MTJVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiB2b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pOwogdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFs2NF0pOwotdm9pZCBDUllQVF9TZXRQdWJLZXlEZWNyeXB0b3IoRlhfQk9PTCAoKmZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSk7Cit2b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihib29sICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgKaW5kZXggNTg3N2UxMS4uYjZmOGRlMCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oCkBAIC02MCw5ICs2MCw5IEBACiAKICAgICB2b2lkIEluaXRSZW5kZXJNb2R1bGUoKTsKIAotICAgIHZvaWQgU2V0RG93bmxvYWRDYWxsYmFjayhGWF9CT09MICgqY2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKSk7CisgICAgdm9pZCBTZXREb3dubG9hZENhbGxiYWNrKGJvb2wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKTsKIAotICAgIEZYX0JPT0wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOworICAgIGJvb2wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCiAgICAgdm9pZCBOb3RpZnlNb2R1bGVBdmFpbGFibGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SVBERl9SZW5kZXJNb2R1bGU+IG1fcFJlbmRlck1vZHVsZTsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SVBERl9QYWdlTW9kdWxlPiBtX3BQYWdlTW9kdWxlOwogCi0gICAgRlhfQk9PTCAoKm1fcERvd25sb2FkQ2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKTsKKyAgICBib29sICgqbV9wRG93bmxvYWRDYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1NlY3VyaXR5SGFuZGxlck1hcDsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9vYmplY3RzLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaAppbmRleCA0NWI3Y2M2Li44ZDk1NGZmIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaApAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICByZXR1cm4gbV9HZW5OdW07CiAgICAgfQogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT2JqKSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICAgIENsb25lKEZYX0JPT0wgYkRpcmVjdCA9IEZBTFNFKSBjb25zdDsKKyAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZShib29sIGJEaXJlY3QgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZVJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpIGNvbnN0OwogCkBAIC04OCw5ICs4OCw5IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIHByb3RlY3RlZDoKICAgICBDUERGX09iamVjdChGWF9EV09SRCB0eXBlKSA6IG1fVHlwZSh0eXBlKSwgbV9PYmpOdW0oMCksIG1fR2VuTnVtKDApIHsgfQpAQCAtMTA4LDI3ICsxMDgsMjcgQEAKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX1N5bnRheFBhcnNlcjsKIHByaXZhdGU6CiAgICAgQ1BERl9PYmplY3QoY29uc3QgQ1BERl9PYmplY3QmIHNyYykge30KLSAgICBDUERGX09iamVjdCogQ2xvbmVJbnRlcm5hbChGWF9CT09MIGJEaXJlY3QsIENGWF9NYXBQdHJUb1B0ciogdmlzaXRlZCkgY29uc3Q7CisgICAgQ1BERl9PYmplY3QqIENsb25lSW50ZXJuYWwoYm9vbCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0OwogfTsKIGNsYXNzIENQREZfQm9vbGVhbiA6IHB1YmxpYyBDUERGX09iamVjdAogewogcHVibGljOgogCi0gICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKEZYX0JPT0wgdmFsdWUpCisgICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKGJvb2wgdmFsdWUpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENQREZfQm9vbGVhbih2YWx1ZSk7CiAgICAgfQogCiAgICAgQ1BERl9Cb29sZWFuKCkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKGZhbHNlKSB7IH0KLSAgICBDUERGX0Jvb2xlYW4oRlhfQk9PTCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KKyAgICBDUERGX0Jvb2xlYW4oYm9vbCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX0Jvb2xlYW4qIHBPdGhlcikgY29uc3QKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9Cb29sZWFuKiBwT3RoZXIpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iVmFsdWUgPT0gcE90aGVyLT5tX2JWYWx1ZTsKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBGWF9CT09MCQkJCQltX2JWYWx1ZTsKKyAgICBib29sCQkJCQltX2JWYWx1ZTsKICAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKIH07CiBjbGFzcyBDUERGX051bWJlciA6IHB1YmxpYyBDUERGX09iamVjdApAQCAtMTUwLDE0ICsxNTAsMTQgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcihzdHIpOwogICAgIH0KIAotICAgIHN0YXRpYyBDUERGX051bWJlcioJCUNyZWF0ZShGWF9CT09MIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKKyAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoYm9vbCBiSW50ZWdlciwgdm9pZCogcERhdGEpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENQREZfTnVtYmVyKGJJbnRlZ2VyLCBwRGF0YSk7CiAgICAgfQogCiAgICAgQ1BERl9OdW1iZXIoKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKGZhbHNlKSwgbV9JbnRlZ2VyKDApIHsgfQogCi0gICAgQ1BERl9OdW1iZXIoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpOworICAgIENQREZfTnVtYmVyKGJvb2wgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKIAogICAgIENQREZfTnVtYmVyKGludCB2YWx1ZSk7CiAKQEAgLTE2NSwxMyArMTY1LDEzIEBACiAKICAgICBDUERGX051bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3Q7CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfTnVtYmVyKiBwT3RoZXIpIGNvbnN0OwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRTdHJpbmcoKSBjb25zdDsKIAogICAgIHZvaWQJCQkJCVNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBGWF9CT09MCQkJCQlJc0ludGVnZXIoKSBjb25zdAorICAgIGJvb2wJCQkJCUlzSW50ZWdlcigpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSW50ZWdlcjsKICAgICB9CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBGWF9CT09MCQkJCQltX2JJbnRlZ2VyOworICAgIGJvb2wJCQkJCW1fYkludGVnZXI7CiAKICAgICB1bmlvbiB7CiAKQEAgLTIxMyw3ICsyMTMsNyBAQAogewogcHVibGljOgogCi0gICAgc3RhdGljIENQREZfU3RyaW5nKgkJQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0JPT0wgYkhleCA9IEZBTFNFKQorICAgIHN0YXRpYyBDUERGX1N0cmluZyoJCUNyZWF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBib29sIGJIZXggPSBmYWxzZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoc3RyLCBiSGV4KTsKICAgICB9CkBAIC0yMjMsOSArMjIzLDkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX1N0cmluZyhzdHIpOwogICAgIH0KIAotICAgIENQREZfU3RyaW5nKCkgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7IH0KKyAgICBDUERGX1N0cmluZygpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChmYWxzZSkgeyB9CiAKLSAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXggPSBGQUxTRSkKKyAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBib29sIGJIZXggPSBmYWxzZSkKICAgICAgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9TdHJpbmcoc3RyKSwgbV9iSGV4KGJIZXgpIHsKICAgICB9CiAKQEAgLTIzNiwxMiArMjM2LDEyIEBACiAgICAgICAgIHJldHVybiBtX1N0cmluZzsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9TdHJpbmcqIHBPdGhlcikgY29uc3QKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9TdHJpbmcqIHBPdGhlcikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX1N0cmluZyA9PSBwT3RoZXItPm1fU3RyaW5nOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUlzSGV4KCkgY29uc3QKKyAgICBib29sCQkJCQlJc0hleCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSGV4OwogICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1N0cmluZzsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkhleDsKKyAgICBib29sCQkJCQltX2JIZXg7CiAgICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7CiB9OwogY2xhc3MgQ1BERl9OYW1lIDogcHVibGljIENQREZfT2JqZWN0CkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgcmV0dXJuIG1fTmFtZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfTmFtZSogcE90aGVyKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fTmFtZSA9PSBwT3RoZXItPm1fTmFtZTsKICAgICB9CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgQWRkTnVtYmVyKHZhbHVlKTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKIHByb3RlY3RlZDoKIAogICAgIH5DUERGX0FycmF5KCk7CkBAIC00MTksNyArNDE5LDcgQEAKIAogICAgIGludAkJCQkJCUdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBkZWZhdWx0X2ludCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJEZWZhdWx0ID0gRkFMU0UpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGJvb2wgYkRlZmF1bHQgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCkBAIC00MzksNyArNDM5LDcgQEAKICAgICB9CiAKIAotICAgIEZYX0JPT0wJCQkJCUtleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKKyAgICBib29sCQkJCQlLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CiAKICAgICBGWF9QT1NJVElPTgkJCQlHZXRTdGFydFBvcygpIGNvbnN0OwogCkBAIC00NzgsNyArNDc4LDcgQEAKIAogICAgIHZvaWQJCQkJCVNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogCi0gICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSk7CisgICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBib29sIGJWYWx1ZSk7CiAKIAogCkBAIC00ODcsNyArNDg3LDcgQEAKIAogICAgIHZvaWQJCQkJCVJlcGxhY2VLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvbGRrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmV3a2V5KTsKIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSBjb25zdDsKKyAgICBib29sCQkJCQlJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgY29uc3Q7CiAKICAgICBpbnQJCQkJCQlHZXRDb3VudCgpIGNvbnN0CiAgICAgewpAQCAtNTE5LDE1ICs1MTksMTUgQEAKICAgICAgICAgcmV0dXJuIG1fcERpY3Q7CiAgICAgfQogCi0gICAgdm9pZAkJCQkJU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiQ29tcHJlc3NlZCwgRlhfQk9PTCBiS2VlcEJ1Zik7CisgICAgdm9pZAkJCQkJU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiQ29tcHJlc3NlZCwgYm9vbCBiS2VlcEJ1Zik7CiAKICAgICB2b2lkCQkJCQlJbml0U3RyZWFtKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAogICAgIHZvaWQJCQkJCUluaXRTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3Q7CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0OwogCi0gICAgQ1BERl9TdHJlYW1GaWx0ZXIqCQlHZXRTdHJlYW1GaWx0ZXIoRlhfQk9PTCBiUmF3ID0gRkFMU0UpIGNvbnN0OworICAgIENQREZfU3RyZWFtRmlsdGVyKgkJR2V0U3RyZWFtRmlsdGVyKGJvb2wgYlJhdyA9IGZhbHNlKSBjb25zdDsKIAogCiAKQEAgLTUzNiwxNSArNTM2LDE1IEBACiAgICAgICAgIHJldHVybiBtX2R3U2l6ZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKKyAgICBib29sCQkJCQlSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKIAogCi0gICAgRlhfQk9PTAkJCQkJSXNNZW1vcnlCYXNlZCgpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNNZW1vcnlCYXNlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDE7CiAgICAgfQogCi0gICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7CisgICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoYm9vbCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7CiBwcm90ZWN0ZWQ6CiAKICAgICB+Q1BERl9TdHJlYW0oKTsKQEAgLTU3OSw4ICs1NzksOCBAQAogCiAgICAgfkNQREZfU3RyZWFtQWNjKCk7CiAKLSAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmF3QWNjZXNzID0gRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBGWF9CT09MIGJJbWFnZUFjYyA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiUmF3QWNjZXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBib29sIGJJbWFnZUFjYyA9IGZhbHNlKTsKIAogICAgIGNvbnN0IENQREZfU3RyZWFtKgkJR2V0U3RyZWFtKCkgY29uc3QKICAgICB7CkBAIC02MTMsNyArNjEzLDcgQEAKIAogICAgIEZYX0RXT1JECQkJCW1fZHdTaXplOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iTmV3QnVmOworICAgIGJvb2wJCQkJCW1fYk5ld0J1ZjsKIAogICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JbWFnZURlY29kZXI7CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogCiAgICAgdm9pZAkJCQkJU2V0UmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOwogCi0gICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0CisgICAgYm9vbAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9SZWZPYmpOdW0gPT0gcE90aGVyLT5tX1JlZk9iak51bTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCmluZGV4IDdhZWQ2MjYuLmQ3NjkyMGEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCkBAIC0zMSw3ICszMSw3IEBACiB7CiBwdWJsaWM6CiAKLSAgICBDUERGX1BhZ2VPYmplY3RzKEZYX0JPT0wgYlJlbGVhc2VNZW1iZXJzID0gVFJVRSk7CisgICAgQ1BERl9QYWdlT2JqZWN0cyhib29sIGJSZWxlYXNlTWVtYmVycyA9IHRydWUpOwogCiAgICAgfkNQREZfUGFnZU9iamVjdHMoKTsKIApAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNQYXJzZWQoKSBjb25zdAorICAgIGJvb2wJCQkJSXNQYXJzZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fUGFyc2VTdGF0ZSA9PSBQREZfQ09OVEVOVF9QQVJTRUQ7CiAgICAgfQpAQCAtOTcsNyArOTcsNyBAQAogCiAgICAgdm9pZAkJCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKIAotICAgIEZYX0JPT0wJCQkJQmFja2dyb3VuZEFscGhhTmVlZGVkKCkgY29uc3QKKyAgICBib29sCQkJCUJhY2tncm91bmRBbHBoYU5lZWRlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkOwogICAgIH0KQEAgLTEyNSwxNSArMTI1LDE1IEBACiAKICAgICBDRlhfUHRyTGlzdAkJCW1fT2JqZWN0TGlzdDsKIAotICAgIEZYX0JPT0wJCQkJbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkOworICAgIGJvb2wJCQkJbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkOwogCi0gICAgRlhfQk9PTAkJCQltX2JSZWxlYXNlTWVtYmVyczsKKyAgICBib29sCQkJCW1fYlJlbGVhc2VNZW1iZXJzOwogICAgIHZvaWQJCQkJTG9hZFRyYW5zSW5mbygpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgQ2xlYXJDYWNoZU9iamVjdHMoKTsKIAogICAgIENQREZfQ29udGVudFBhcnNlcioJbV9wUGFyc2VyOwogCi0gICAgRlhfQk9PTAkJCQltX1BhcnNlU3RhdGU7CisgICAgYm9vbAkJCQltX1BhcnNlU3RhdGU7CiB9OwogY2xhc3MgQ1BERl9QYWdlIDogcHVibGljIENQREZfUGFnZU9iamVjdHMsIHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEKIHsKQEAgLTE0MywxMSArMTQzLDExIEBACiAKICAgICB+Q1BERl9QYWdlKCk7CiAKLSAgICB2b2lkCQkJCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgRlhfQk9PTCBiUGFnZUNhY2hlID0gVFJVRSk7CisgICAgdm9pZAkJCQlMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIGJvb2wgYlBhZ2VDYWNoZSA9IHRydWUpOwogCi0gICAgdm9pZAkJCQlTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7CisgICAgdm9pZAkJCQlTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwsIGJvb2wgYlJlUGFyc2UgPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJCVBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOworICAgIHZvaWQJCQkJUGFyc2VDb250ZW50KENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwsIGJvb2wgYlJlUGFyc2UgPSBmYWxzZSk7CiAKICAgICB2b2lkCQkJCUdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LCBpbnQgeFBvcywgaW50IHlQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U2l6ZSwgaW50IHlTaXplLCBpbnQgaVJvdGF0ZSkgY29uc3Q7CkBAIC0yMDAsMTMgKzIwMCwxMyBAQAogCiAgICAgQ1BERl9QYXJzZU9wdGlvbnMoKTsKIAotICAgIEZYX0JPT0wJCQkJbV9iVGV4dE9ubHk7CisgICAgYm9vbAkJCQltX2JUZXh0T25seTsKIAotICAgIEZYX0JPT0wJCQkJbV9iTWFya2VkQ29udGVudDsKKyAgICBib29sCQkJCW1fYk1hcmtlZENvbnRlbnQ7CiAKLSAgICBGWF9CT09MCQkJCW1fYlNlcGFyYXRlRm9ybTsKKyAgICBib29sCQkJCW1fYlNlcGFyYXRlRm9ybTsKIAotICAgIEZYX0JPT0wJCQkJbV9iRGVjb2RlSW5saW5lSW1hZ2U7CisgICAgYm9vbAkJCQltX2JEZWNvZGVJbmxpbmVJbWFnZTsKIH07CiBjbGFzcyBDUERGX0Zvcm0gOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0cwogewpAQCAtMjI5LDcgKzIyOSw3IEBACiBwdWJsaWM6CiAgICAgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlKENQREZfUGFnZSogcFBhZ2UpOwogICAgIH5DUERGX1BhZ2VDb250ZW50R2VuZXJhdGUoKTsKLSAgICBGWF9CT09MIEluc2VydFBhZ2VPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iamVjdCk7CisgICAgYm9vbCBJbnNlcnRQYWdlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmplY3QpOwogICAgIHZvaWQgR2VuZXJhdGVDb250ZW50KCk7CiAgICAgdm9pZCBUcmFuc2Zvcm1Db250ZW50KENGWF9NYXRyaXgmIG1hdHJpeCk7CiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oCmluZGV4IDczNTQwYTMuLmMxNDBkZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oCkBAIC04OCw3ICs4OCw3IEBACiAgICAgICAgIG1fcE9iamVjdC0+QXBwZW5kUmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNSZWN0KCkgY29uc3QKKyAgICBib29sCQkJCUlzUmVjdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5Jc1JlY3QoKTsKICAgICB9CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogICAgIENGWF9GbG9hdFJlY3QJCUdldENsaXBCb3goKSBjb25zdDsKIAotICAgIHZvaWQJCQkJQXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSk7CisgICAgdm9pZAkJCQlBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgYm9vbCBiQXV0b01lcmdlKTsKIAogICAgIHZvaWQJCQkJRGVsZXRlUGF0aChpbnQgbGF5ZXJfaW5kZXgpOwogCkBAIC0yOTIsMTUgKzI5MiwxNSBAQAogCiAgICAgaW50CQkJCQltX1JlbmRlckludGVudDsKIAotICAgIEZYX0JPT0wJCQkJbV9TdHJva2VBZGp1c3Q7CisgICAgYm9vbAkJCQltX1N0cm9rZUFkanVzdDsKIAotICAgIEZYX0JPT0wJCQkJbV9BbHBoYVNvdXJjZTsKKyAgICBib29sCQkJCW1fQWxwaGFTb3VyY2U7CiAKLSAgICBGWF9CT09MCQkJCW1fVGV4dEtub2Nrb3V0OworICAgIGJvb2wJCQkJbV9UZXh0S25vY2tvdXQ7CiAKLSAgICBGWF9CT09MCQkJCW1fU3Ryb2tlT1A7CisgICAgYm9vbAkJCQltX1N0cm9rZU9QOwogCi0gICAgRlhfQk9PTAkJCQltX0ZpbGxPUDsKKyAgICBib29sCQkJCW1fRmlsbE9QOwogCiAgICAgaW50CQkJCQltX09QTW9kZTsKIApAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBtX3BPYmplY3QtPm1fQmxlbmRUeXBlIDogRlhESUJfQkxFTkRfTk9STUFMOwogICAgIH0KIAotICAgIGludAkJCQkJR2V0QWxwaGEoRlhfQk9PTCBiU3Ryb2tlKSBjb25zdAorICAgIGludAkJCQkJR2V0QWxwaGEoYm9vbCBiU3Ryb2tlKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcE9iamVjdCA/IEZYU1lTX3JvdW5kKChiU3Ryb2tlID8gbV9wT2JqZWN0LT5tX1N0cm9rZUFscGhhIDogbV9wT2JqZWN0LT5tX0ZpbGxBbHBoYSkgKiAyNTUpIDogMjU1OwogICAgIH0KQEAgLTM2Miw3ICszNjIsNyBAQAogICAgICAgICByZXR1cm4gbV9wUGFyYW07CiAgICAgfQogCi0gICAgaW5saW5lIEZYX0JPT0wJCUhhc01DSUQoKSBjb25zdDsKKyAgICBpbmxpbmUgYm9vbAkJSGFzTUNJRCgpIGNvbnN0OwogCiAgICAgaW5saW5lIHZvaWQJCQlTZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQogICAgIHsKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiAgICAgaW50CQkJCQlHZXRNQ0lEKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCUFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIENQREZfRGljdGlvbmFyeSogcERpY3QsIEZYX0JPT0wgYkRpY3ROZWVkQ2xvbmUpOworICAgIHZvaWQJCQkJQWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgYm9vbCBiRGljdE5lZWRDbG9uZSk7CiAKICAgICB2b2lkCQkJCURlbGV0ZUxhc3RNYXJrKCk7CiBwcml2YXRlOgpAQCAtNDE4LDkgKzQxOCw5IEBACiAgICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBtX3BPYmplY3QtPkdldE1DSUQoKSA6IC0xOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSGFzTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmspIGNvbnN0OworICAgIGJvb2wJCQkJSGFzTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmspIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0OworICAgIGJvb2wJCQkJTG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdDsKIH07CiAKICNkZWZpbmUgUERGUEFHRV9URVhUICAgICAxCkBAIC00NjEsNyArNDYxLDcgQEAKIAogICAgIHZvaWQJCQkJUmVtb3ZlQ2xpcFBhdGgoKTsKIAotICAgIHZvaWQJCQkJQXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpOworICAgIHZvaWQJCQkJQXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBib29sIGJBdXRvTWVyZ2UpOwogCiAgICAgdm9pZAkJCQlDb3B5Q2xpcFBhdGgoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKIApAQCAtNjI5LDcgKzYyOSw3IEBACiAKICAgICBpbnQJCQkJCW1fRmlsbFR5cGU7CiAKLSAgICBGWF9CT09MCQkJCW1fYlN0cm9rZTsKKyAgICBib29sCQkJCW1fYlN0cm9rZTsKIAogICAgIENGWF9BZmZpbmVNYXRyaXgJbV9NYXRyaXg7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oCmluZGV4IGE4NTY0MzMuLjdhNDM5NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaApAQCAtODYsOSArODYsOSBAQAogCiAgICAgaW50CQkJCQkJR2V0UGFnZUluZGV4KEZYX0RXT1JEIG9iam51bSk7CiAKLSAgICBGWF9EV09SRAkJCQlHZXRVc2VyUGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbiA9IEZBTFNFKSBjb25zdDsKKyAgICBGWF9EV09SRAkJCQlHZXRVc2VyUGVybWlzc2lvbnMoYm9vbCBiQ2hlY2tSZXZpc2lvbiA9IGZhbHNlKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUlzT3duZXIoKSBjb25zdDsKKyAgICBib29sCQkJCQlJc093bmVyKCkgY29uc3Q7CiAKIAogCkBAIC0xMTIsMTQgKzExMiwxNCBAQAogICAgIHZvaWQJCQkJCUNsZWFyUmVuZGVyRm9udCgpOwogCiAKLSAgICBGWF9CT09MCQkJCQlJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSkgY29uc3Q7CisgICAgYm9vbAkJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgYm9vbCYgYkZvcm0pIGNvbnN0OwogCiAgICAgLy8gfHBGb250RGljdHwgbXVzdCBub3QgYmUgbnVsbC4KICAgICBDUERGX0ZvbnQqIExvYWRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKIAogICAgIENQREZfQ29sb3JTcGFjZSoJCUxvYWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmosIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyA9IE5VTEwpOwogCi0gICAgQ1BERl9QYXR0ZXJuKgkJCUxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXggPSBOVUxMKTsKKyAgICBDUERGX1BhdHRlcm4qCQkJTG9hZFBhdHRlcm4oQ1BERl9PYmplY3QqIHBPYmosIGJvb2wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCA9IE5VTEwpOwogCiAgICAgQ1BERl9JbWFnZSoJCQkJTG9hZEltYWdlRihDUERGX09iamVjdCogcE9iaik7CiAKQEAgLTEyOSwxNyArMTI5LDE3IEBACiAKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAKLSAgICBDUERGX0ZvbnQqCQkJCUFkZFdpbmRvd3NGb250KExPR0ZPTlRBKiBwTG9nRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSA9IEZBTFNFKTsKLSAgICBDUERGX0ZvbnQqCQkJCUFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSA9IEZBTFNFKTsKKyAgICBDUERGX0ZvbnQqCQkJCUFkZFdpbmRvd3NGb250KExPR0ZPTlRBKiBwTG9nRm9udCwgYm9vbCBiVmVydCwgYm9vbCBiVHJhbnNsYXRlTmFtZSA9IGZhbHNlKTsKKyAgICBDUERGX0ZvbnQqCQkJCUFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwgYm9vbCBiVmVydCwgYm9vbCBiVHJhbnNsYXRlTmFtZSA9IGZhbHNlKTsKICNlbmRpZgogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgQWRkTWFjRm9udChDVEZvbnRSZWYgcEZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7CisgICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgQWRkTWFjRm9udChDVEZvbnRSZWYgcEZvbnQsIGJvb2wgYlZlcnQsIGJvb2wgYlRyYW5zbGF0ZU5hbWUgPSBmYWxzZSk7CiAjZW5kaWYKIAogICAgIENQREZfRm9udCoJCQkJQWRkU3RhbmRhcmRGb250KGNvbnN0IEZYX0NIQVIqIGZvbnQsIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpOwogCiAKLSAgICBDUERGX0ZvbnQqCQkJCUFkZEZvbnQoQ0ZYX0ZvbnQqIHBGb250LCBpbnQgY2hhcnNldCwgRlhfQk9PTCBiVmVydCk7CisgICAgQ1BERl9Gb250KgkJCQlBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIGJvb2wgYlZlcnQpOwogCiAgICAgdm9pZAkJCQkJQ3JlYXRlTmV3RG9jKCk7CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JRDI7CiAKIAotICAgIEZYX0JPT0wJCQkJCW1fYkxpbmVhcml6ZWQ7CisgICAgYm9vbAkJCQkJbV9iTGluZWFyaXplZDsKIAogICAgIEZYX0RXT1JECQkJCW1fZHdGaXJzdFBhZ2VObzsKIApAQCAtMTcyLDggKzE3Miw4IEBACiAgICAgaW50CQkJCQkJX0dldFBhZ2VDb3VudCgpIGNvbnN0OwogICAgIENQREZfRGljdGlvbmFyeSoJCV9GaW5kUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywgaW50IGlQYWdlLCBpbnQgblBhZ2VzVG9HbywgaW50IGxldmVsKTsKICAgICBpbnQJCQkJCQlfRmluZFBhZ2VJbmRleChDUERGX0RpY3Rpb25hcnkqIHBOb2RlLCBGWF9EV09SRCYgc2tpcF9jb3VudCwgRlhfRFdPUkQgb2JqbnVtLCBpbnQmIGluZGV4LCBpbnQgbGV2ZWwgPSAwKTsKLSAgICBGWF9CT09MCQkJCQlJc0NvbnRlbnRVc2VkRWxzZXdoZXJlKEZYX0RXT1JEIG9iam51bSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOwotICAgIEZYX0JPT0wJCQkJCUNoZWNrT0NHVmlzaWJsZShDUERGX0RpY3Rpb25hcnkqIHBPQ0csIEZYX0JPT0wgYlByaW50aW5nKTsKKyAgICBib29sCQkJCQlJc0NvbnRlbnRVc2VkRWxzZXdoZXJlKEZYX0RXT1JEIG9iam51bSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOworICAgIGJvb2wJCQkJCUNoZWNrT0NHVmlzaWJsZShDUERGX0RpY3Rpb25hcnkqIHBPQ0csIGJvb2wgYlByaW50aW5nKTsKICAgICBDUERGX0RvY1BhZ2VEYXRhKgkJR2V0VmFsaWRhdGVQYWdlRGF0YSgpOwogICAgIENQREZfRG9jUmVuZGVyRGF0YSoJCUdldFZhbGlkYXRlUmVuZGVyRGF0YSgpOwogICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfQ3JlYXRvcjsKQEAgLTIwNCwxNCArMjA0LDE0IEBACiAKICAgICBDRlhfQnl0ZVN0cmluZ0MJCUdldFdvcmQoKTsKIAotICAgIEZYX0JPT0wJCQkJU2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CisgICAgYm9vbAkJCQlTZWFyY2hUb2tlbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKTsKIAotICAgIEZYX0JPT0wJCQkJU2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CisgICAgYm9vbAkJCQlTa2lwV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKTsKIAotICAgIEZYX0JPT0wJCQkJRmluZFRhZ1BhaXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdGFydF90b2tlbiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCisgICAgYm9vbAkJCQlGaW5kVGFnUGFpcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0YXJ0X3Rva2VuLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGVuZF90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzdGFydF9wb3MsIEZYX0RXT1JEJiBlbmRfcG9zKTsKIAotICAgIEZYX0JPT0wJCQkJRmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sIGludCBuUGFyYW1zKTsKKyAgICBib29sCQkJCUZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcyk7CiAKICAgICBGWF9EV09SRAkJCUdldFBvcygpCiAgICAgewpAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgICAgIG1fUG9zID0gcG9zOwogICAgIH0KIAotICAgIENQREZfT2JqZWN0KgkJR2V0T2JqZWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwsIEZYX0JPT0wgYkRlY3J5cHQgPSBUUlVFKTsKKyAgICBDUERGX09iamVjdCoJCUdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMLCBib29sIGJEZWNyeXB0ID0gdHJ1ZSk7CiAKIAogICAgIENQREZfT2JqZWN0KgkJR2V0T2JqZWN0QnlTdHJpY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCk7CkBAIC0yNzEsOSArMjcxLDkgQEAKIAogICAgIHZvaWQJCQkJVG9OZXh0V29yZCgpOwogCi0gICAgRlhfQk9PTAkJCQlTZWFyY2hXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCwgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9CT09MIGJGb3J3YXJkLCBGWF9GSUxFU0laRSBsaW1pdCk7CisgICAgYm9vbAkJCQlTZWFyY2hXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCwgYm9vbCBiV2hvbGVXb3JkLCBib29sIGJGb3J3YXJkLCBGWF9GSUxFU0laRSBsaW1pdCk7CiAKLSAgICBpbnQJCQkJCVNlYXJjaE11bHRpV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmRzLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KTsKKyAgICBpbnQJCQkJCVNlYXJjaE11bHRpV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmRzLCBib29sIGJXaG9sZVdvcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KTsKIAogICAgIEZYX0ZJTEVTSVpFCQkJRmluZFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgRlhfRklMRVNJWkUgbGltaXQpOwogCkBAIC0yODIsMjcgKzI4MiwyNyBAQAogICAgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gcENyeXB0b0hhbmRsZXI7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc0VuY3J5cHRlZCgpCisgICAgYm9vbAkJCQlJc0VuY3J5cHRlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9wQ3J5cHRvSGFuZGxlciAhPSBOVUxMOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJR2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOworICAgIGJvb2wJCQkJR2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOwogCi0gICAgRlhfQk9PTAkJCQlSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSk7CisgICAgYm9vbAkJCQlSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKTsKKyAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmV4dFdvcmQoYm9vbCYgYklzTnVtYmVyKTsKIHByb3RlY3RlZDoKICAgICBzdGF0aWMgY29uc3QgaW50IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCA9IDY0OwogICAgIHN0YXRpYyBpbnQgc19DdXJyZW50UmVjdXJzaW9uRGVwdGg7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0TmV4dENoYXIodWludDhfdCYgY2gpOworICAgIHZpcnR1YWwgYm9vbAkJCQlHZXROZXh0Q2hhcih1aW50OF90JiBjaCk7CiAKLSAgICBGWF9CT09MCQkJCUdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOworICAgIGJvb2wJCQkJR2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCk7CiAKICAgICB2b2lkCQkJCUdldE5leHRXb3JkKCk7CiAKLSAgICBGWF9CT09MCQkJCUlzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pOworICAgIGJvb2wJCQkJSXNXaG9sZVdvcmQoRlhfRklMRVNJWkUgc3RhcnRwb3MsIEZYX0ZJTEVTSVpFIGxpbWl0LCBjb25zdCB1aW50OF90KiB0YWcsIEZYX0RXT1JEIHRhZ2xlbik7CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJUmVhZFN0cmluZygpOwogCkBAIC0zMTIsNyArMzEyLDcgQEAKIAogICAgIEZYX0ZJTEVTSVpFCQkJbV9Qb3M7CiAKLSAgICBGWF9CT09MCQkJCW1fYkZpbGVTdHJlYW07CisgICAgYm9vbAkJCQltX2JGaWxlU3RyZWFtOwogCiAgICAgaW50CQkJCQltX01ldGFkYXRhT2JqbnVtOwogCkBAIC0zMzQsNyArMzM0LDcgQEAKIAogICAgIEZYX0RXT1JECQkJbV9Xb3JkU2l6ZTsKIAotICAgIEZYX0JPT0wJCQkJbV9iSXNOdW1iZXI7CisgICAgYm9vbAkJCQltX2JJc051bWJlcjsKIAogICAgIEZYX0ZJTEVTSVpFCQkJbV9kd1dvcmRQb3M7CiAgICAgZnJpZW5kIGNsYXNzCQlDUERGX1BhcnNlcjsKQEAgLTM0NSw3ICszNDUsNyBAQAogI2RlZmluZSBQREZQQVJTRV9OT1NUUkVBTQkyCiBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCB7CiAKLSAgICBGWF9CT09MCQltX0ZsYWdzOworICAgIGJvb2wJCW1fRmxhZ3M7CiAKICAgICBGWF9GSUxFU0laRQltX0RpY3RTdGFydDsKIApAQCAtMzY5LDE1ICszNjksMTUgQEAKICAgICBDUERGX1BhcnNlcigpOwogICAgIH5DUERGX1BhcnNlcigpOwogCi0gICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwotICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7Ci0gICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSwgRlhfQk9PTCBiT3duRmlsZVJlYWQgPSBUUlVFKTsKKyAgICBGWF9EV09SRAkJCVN0YXJ0UGFyc2UoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIGJvb2wgYlJlUGFyc2UgPSBmYWxzZSk7CisgICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgYm9vbCBiUmVQYXJzZSA9IGZhbHNlKTsKKyAgICBGWF9EV09SRAkJCVN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgYm9vbCBiUmVQYXJzZSA9IGZhbHNlLCBib29sIGJPd25GaWxlUmVhZCA9IHRydWUpOwogCi0gICAgdm9pZAkJCQlDbG9zZVBhcnNlcihGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOworICAgIHZvaWQJCQkJQ2xvc2VQYXJzZXIoYm9vbCBiUmVQYXJzZSA9IGZhbHNlKTsKIAotICAgIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSk7CisgICAgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoYm9vbCBiQ2hlY2tSZXZpc2lvbiA9IGZhbHNlKTsKIAotICAgIEZYX0JPT0wJCUlzT3duZXIoKTsKKyAgICBib29sCQlJc093bmVyKCk7CiAKICAgICB2b2lkCQkJCVNldFBhc3N3b3JkKGNvbnN0IEZYX0NIQVIqIHBhc3N3b3JkKQogICAgIHsKQEAgLTM5OSw3ICszOTksNyBAQAogICAgICAgICByZXR1cm4gbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlcjsKICAgICB9CiAKLSAgICB2b2lkCQkJCVNldFNlY3VyaXR5SGFuZGxlcihDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciwgRlhfQk9PTCBiRm9yY2VkID0gRkFMU0UpOworICAgIHZvaWQJCQkJU2V0U2VjdXJpdHlIYW5kbGVyKENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyLCBib29sIGJGb3JjZWQgPSBmYWxzZSk7CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0UmVjaXBpZW50KCkKICAgICB7CkBAIC00MzUsNyArNDM1LDcgQEAKICAgICAgICAgcmV0dXJuIG1fcEVuY3J5cHREaWN0OwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNFbmNyeXB0ZWQoKQorICAgIGJvb2wJCQkJSXNFbmNyeXB0ZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIEdldEVuY3J5cHREaWN0KCkgIT0gTlVMTDsKICAgICB9CkBAIC00NDMsNyArNDQzLDcgQEAKIAogICAgIENQREZfT2JqZWN0KgkJUGFyc2VJbmRpcmVjdE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMKSA7CiAgICAgRlhfRFdPUkQJCQlHZXRMYXN0T2JqTnVtKCk7Ci0gICAgRlhfQk9PTAkJCQlJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSk7CisgICAgYm9vbAkJCQlJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBib29sJiBiRm9ybSk7CiAKICAgICBGWF9GSUxFU0laRQkJCUdldE9iamVjdE9mZnNldChGWF9EV09SRCBvYmpudW0pOwogCkBAIC00NTYsMTIgKzQ1NiwxMiBAQAogCiAgICAgdm9pZAkJCQlHZXRJbmRpcmVjdEJpbmFyeShGWF9EV09SRCBvYmpudW0sIHVpbnQ4X3QqJiBwQnVmZmVyLCBGWF9EV09SRCYgc2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJCUdldEZpbGVTdHJlYW1PcHRpb24oKQorICAgIGJvb2wJCQkJR2V0RmlsZVN0cmVhbU9wdGlvbigpCiAgICAgewogICAgICAgICByZXR1cm4gbV9TeW50YXgubV9iRmlsZVN0cmVhbTsKICAgICB9CiAKLSAgICB2b2lkCQkJCVNldEZpbGVTdHJlYW1PcHRpb24oRlhfQk9PTCBiKQorICAgIHZvaWQJCQkJU2V0RmlsZVN0cmVhbU9wdGlvbihib29sIGIpCiAgICAgewogICAgICAgICBtX1N5bnRheC5tX2JGaWxlU3RyZWFtID0gYjsKICAgICB9CkBAIC00NzYsNyArNDc2LDcgQEAKICAgICAgICAgcmV0dXJuIG1fRmlsZVZlcnNpb247CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc1hSZWZTdHJlYW0oKSBjb25zdAorICAgIGJvb2wJCQkJSXNYUmVmU3RyZWFtKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JYUmVmU3RyZWFtOwogICAgIH0KQEAgLTQ4Niw3ICs0ODYsNyBAQAogICAgIENQREZfT2JqZWN0KgkJUGFyc2VJbmRpcmVjdE9iamVjdEF0QnlTdHJpY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIG9iam51bSwKICAgICAgICAgICAgIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwgRlhfRklMRVNJWkUgKnBSZXN1bHRQb3MpOwogCi0gICAgRlhfRFdPUkQJCQlTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UsIEZYX0JPT0wgYk93bkZpbGVSZWFkID0gVFJVRSk7CisgICAgRlhfRFdPUkQJCQlTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBib29sIGJSZVBhcnNlID0gZmFsc2UsIGJvb2wgYk93bkZpbGVSZWFkID0gdHJ1ZSk7CiAKICAgICBGWF9EV09SRAkJCUdldEZpcnN0UGFnZU5vKCkKICAgICB7CkBAIC00OTYsMzAgKzQ5NiwzMCBAQAogICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKIAogICAgIENQREZfU3ludGF4UGFyc2VyCW1fU3ludGF4OwotICAgIEZYX0JPT0wJCQkJbV9iT3duRmlsZVJlYWQ7CisgICAgYm9vbAkJCQltX2JPd25GaWxlUmVhZDsKICAgICBDUERGX09iamVjdCoJCVBhcnNlRGlyZWN0KENQREZfT2JqZWN0KiBwT2JqKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zKTsKKyAgICBib29sCQkJCUxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcyk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CisgICAgYm9vbAkJCQlMb2FkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywgRlhfQk9PTCBiU2tpcCwgRlhfQk9PTCBiRmlyc3QpOworICAgIGJvb2wJCQkJTG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIGJvb2wgYlNraXAsIGJvb2wgYkZpcnN0KTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSYgcHJldiwgRlhfQk9PTCBiTWFpblhSZWYpOworICAgIGJvb2wJCQkJTG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSYgcHJldiwgYm9vbCBiTWFpblhSZWYpOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KglMb2FkVHJhaWxlclY0KCk7CiAKLSAgICBGWF9CT09MCQkJCVJlYnVpbGRDcm9zc1JlZigpOworICAgIGJvb2wJCQkJUmVidWlsZENyb3NzUmVmKCk7CiAKICAgICBGWF9EV09SRAkJCVNldEVuY3J5cHRIYW5kbGVyKCk7CiAKICAgICB2b2lkCQkJCVJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKKyAgICBib29sCQkJCUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKKyAgICBib29sCQkJCUxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKKyAgICBib29sCQkJCUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MpOwogCiAgICAgRlhfRFdPUkQJCQlMb2FkTGluZWFyaXplZE1haW5YUmVmVGFibGUoKTsKIApAQCAtNTI3LDcgKzUyNyw3IEBACiAKICAgICBDUERGX1N0cmVhbUFjYyoJCUdldE9iamVjdFN0cmVhbShGWF9EV09SRCBudW1iZXIpOwogCi0gICAgRlhfQk9PTAkJCQlJc0xpbmVhcml6ZWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0RXT1JEIG9mZnNldCk7CisgICAgYm9vbAkJCQlJc0xpbmVhcml6ZWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0RXT1JEIG9mZnNldCk7CiAKIAogCkBAIC01NDAsMTIgKzU0MCwxMiBAQAogCiAgICAgRlhfRklMRVNJWkUJCQltX0xhc3RYUmVmT2Zmc2V0OwogCi0gICAgRlhfQk9PTAkJCQltX2JYUmVmU3RyZWFtOworICAgIGJvb2wJCQkJbV9iWFJlZlN0cmVhbTsKIAogCiAgICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqCW1fcFNlY3VyaXR5SGFuZGxlcjsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyOworICAgIGJvb2wJCQkJCW1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcJCQltX2JzUmVjaXBpZW50OwogCkBAIC01NjIsNyArNTYyLDcgQEAKICAgICBDRlhfV29yZEFycmF5CQltX09ialZlcnNpb247CiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5ICo+CW1fVHJhaWxlcnM7CiAKLSAgICBGWF9CT09MCQkJCW1fYlZlcnNpb25VcGRhdGVkOworICAgIGJvb2wJCQkJbV9iVmVyc2lvblVwZGF0ZWQ7CiAKICAgICBDUERGX09iamVjdCoJCW1fcExpbmVhcml6ZWQ7CiAKQEAgLTU4MiwxNyArNTgyLDE3IEBACiAKICAgICB2aXJ0dWFsIH5DUERGX1NlY3VyaXR5SGFuZGxlcigpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzT3duZXIoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlJc093bmVyKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKQorICAgIHZpcnR1YWwgYm9vbAkJSXNNZXRhZGF0YUVuY3J5cHRlZCgpCiAgICAgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgdmlydHVhbCBDUERGX0NyeXB0b0hhbmRsZXIqCUNyZWF0ZUNyeXB0b0hhbmRsZXIoKSA9IDA7CkBAIC02MDksMTQgKzYwOSwxNCBAQAogICAgIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKIAogICAgIHZpcnR1YWwgfkNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOworICAgIHZpcnR1YWwgYm9vbAkJT25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRQZXJtaXNzaW9ucygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNPd25lcigpCisgICAgdmlydHVhbCBib29sCQlJc093bmVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JPd25lcjsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgY29uc3QgdWludDhfdComIGJ1ZmZlciwgaW50JiBrZXlsZW4pOworICAgIHZpcnR1YWwgYm9vbAkJSXNNZXRhZGF0YUVuY3J5cHRlZCgpOwogICAgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKglDcmVhdGVDcnlwdG9IYW5kbGVyKCk7CiAgICAgdmlydHVhbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKiBHZXRTdGFuZGFyZEhhbmRsZXIoKQogICAgIHsKQEAgLTY0MSw4ICs2NDEsOCBAQAogICAgICAgICByZXR1cm4gbV9SZXZpc2lvbjsKICAgICB9CiAKLSAgICBpbnQJCQkJCUNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSk7Ci0gICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXksIGludCBrZXlfbGVuKTsKKyAgICBpbnQJCQkJCUNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSk7CisgICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIGJvb2wgYk93bmVyLCB1aW50OF90KiBrZXksIGludCBrZXlfbGVuKTsKIHByaXZhdGU6CiAKICAgICBpbnQJCQkJCW1fVmVyc2lvbjsKQEAgLTY1MywyMiArNjUzLDIyIEBACiAKICAgICBDUERGX0RpY3Rpb25hcnkqCW1fcEVuY3J5cHREaWN0OwogCi0gICAgRlhfQk9PTAkJCQlMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCk7Ci0gICAgRlhfQk9PTAkJCQlMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgdHlwZSwgaW50JiBjaXBoZXIsIGludCYga2V5X2xlbik7CisgICAgYm9vbAkJCQlMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCk7CisgICAgYm9vbAkJCQlMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgdHlwZSwgaW50JiBjaXBoZXIsIGludCYga2V5X2xlbik7CiAKLSAgICBGWF9CT09MCQkJCUNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pOworICAgIGJvb2wJCQkJQ2hlY2tVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklnbm9yZUVuY3J5cHRNZXRhLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbik7CiAKLSAgICBGWF9CT09MCQkJCUNoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbik7Ci0gICAgRlhfQk9PTAkJCQlBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSk7Ci0gICAgdm9pZAkJCQlBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgY29uc3QgdWludDhfdCoga2V5KTsKLSAgICB2b2lkCQkJCUFFUzI1Nl9TZXRQZXJtcyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgcGVybWlzc2lvbiwgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpOworICAgIGJvb2wJCQkJQ2hlY2tPd25lclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKTsKKyAgICBib29sCQkJCUFFUzI1Nl9DaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBib29sIGJPd25lciwgdWludDhfdCoga2V5KTsKKyAgICB2b2lkCQkJCUFFUzI1Nl9TZXRQYXNzd29yZChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIGJvb2wgYk93bmVyLCBjb25zdCB1aW50OF90KiBrZXkpOworICAgIHZvaWQJCQkJQUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9uLCBib29sIGJFbmNyeXB0TWV0YWRhdGEsIGNvbnN0IHVpbnQ4X3QqIGtleSk7CiAgICAgdm9pZAkJCQlPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsIEZYX0RXT1JEIHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpOwotICAgIEZYX0JPT0wJCQkJQ2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgb3duZXJfc2l6ZSwgYm9vbCBiRGVmYXVsdCwgRlhfRFdPUkQgdHlwZSk7CisgICAgYm9vbAkJCQlDaGVja1NlY3VyaXR5KGludDMyX3Qga2V5X2xlbik7CiAKLSAgICBGWF9CT09MCQkJCW1fYk93bmVyOworICAgIGJvb2wJCQkJbV9iT3duZXI7CiAKICAgICBGWF9EV09SRAkJCW1fUGVybWlzc2lvbnM7CiAKQEAgLTY4NCwyMCArNjg0LDIwIEBACiAKICAgICB2aXJ0dWFsIH5DUERGX0NyeXB0b0hhbmRsZXIoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQlJbml0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcikgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRFdPUkQJRGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCoJRGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlEZWNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CiAKIAogICAgIHZpcnR1YWwgRlhfRFdPUkQJRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAorICAgIHZpcnR1YWwgYm9vbAkJRW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiAKICAgICB2b2lkCQkJCURlY3J5cHQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKQEAgLTcxMCwyMiArNzEwLDIyIEBACiAKICAgICB2aXJ0dWFsIH5DUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpOwogCi0gICAgRlhfQk9PTAkJCQlJbml0KGludCBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlJbml0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcik7CisgICAgYm9vbAkJCQlJbml0KGludCBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbik7CisgICAgdmlydHVhbCBib29sCQlJbml0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcik7CiAgICAgdmlydHVhbCBGWF9EV09SRAlEZWNyeXB0R2V0U2l6ZShGWF9EV09SRCBzcmNfc2l6ZSk7CiAgICAgdmlydHVhbCB2b2lkKglEZWNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgICAgdmlydHVhbCBib29sCQlEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgICAgdmlydHVhbCBib29sCQlEZWNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUVuY3J5cHRHZXRTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBwcm90ZWN0ZWQ6CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUNyeXB0QmxvY2soRlhfQk9PTCBiRW5jcnlwdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAorICAgIHZpcnR1YWwgdm9pZAkJQ3J5cHRCbG9jayhib29sIGJFbmNyeXB0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQqCUNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIEZYX0JPT0wgYkVuY3J5cHQpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KTsKKyAgICB2aXJ0dWFsIHZvaWQqCUNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGJvb2wgYkVuY3J5cHQpOworICAgIHZpcnR1YWwgYm9vbAkJQ3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBib29sIGJFbmNyeXB0KTsKKyAgICB2aXJ0dWFsIGJvb2wJCUNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBib29sIGJFbmNyeXB0KTsKIAogICAgIHVpbnQ4X3QJCQkJbV9FbmNyeXB0S2V5WzMyXTsKIApAQCAtNzU1LDcgKzc1NSw3IEBACiBDRlhfQnl0ZVN0cmluZyBQREZfTmFtZURlY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG9yaWcpOwogQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9yaWcpOwogQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9yaWcpOwotQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBGWF9CT09MIGJIZXggPSBGQUxTRSk7CitDRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsIGJvb2wgYkhleCA9IGZhbHNlKTsKIENGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKTsKIGlubGluZSBDRlhfV2lkZVN0cmluZyBQREZfRGVjb2RlVGV4dChjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgewogICAgIHJldHVybiBQREZfRGVjb2RlVGV4dCgoY29uc3QgdWludDhfdCopYnN0ci5jX3N0cigpLCBic3RyLkdldExlbmd0aCgpLCBwQ2hhck1hcCk7CkBAIC03NjksMTIgKzc2OSwxMiBAQAogewogcHVibGljOgogICAgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBDcmVhdGVOZXdEb2MoKTsKLSAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogUGFyc2VGaWxlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYk93bkZpbGUgPSBGQUxTRSk7CisgICAgc3RhdGljIENGREZfRG9jdW1lbnQqIFBhcnNlRmlsZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJPd25GaWxlID0gZmFsc2UpOwogICAgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZU1lbW9yeShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiAKICAgICB+Q0ZERl9Eb2N1bWVudCgpOwogCi0gICAgRlhfQk9PTAkJCQkJV3JpdGVCdWYoQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIGNvbnN0OworICAgIGJvb2wJCQkJCVdyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdDsKIAogICAgIENQREZfRGljdGlvbmFyeSoJCUdldFJvb3QoKSBjb25zdAogICAgIHsKQEAgLTc4NSwxMCArNzg1LDEwIEBACiBwcm90ZWN0ZWQ6CiAKICAgICBDRkRGX0RvY3VtZW50KCk7Ci0gICAgdm9pZAlQYXJzZVN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJPd25GaWxlKTsKKyAgICB2b2lkCVBhcnNlU3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGUsIGJvb2wgYk93bkZpbGUpOwogICAgIENQREZfRGljdGlvbmFyeSoJCW1fcFJvb3REaWN0OwogICAgIElGWF9GaWxlUmVhZCoJCQltX3BGaWxlOwotICAgIEZYX0JPT0wJCQkJCW1fYk93bkZpbGU7CisgICAgYm9vbAkJCQkJbV9iT3duRmlsZTsKIH07CiAKIENGWF9XaWRlU3RyaW5nCUZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKGNvbnN0IENQREZfT2JqZWN0KiBwRmlsZVNwZWMpOwpAQCAtODE2LDcgKzgxNiw3IEBACiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+SUZYX0ZpbGVBdmFpbCgpIHsgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRGF0YUF2YWlsKCBGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0RhdGFBdmFpbCggRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSA9IDA7CiB9OwogY2xhc3MgSUZYX0Rvd25sb2FkSGludHMKIHsKQEAgLTgzOSwxMCArODM5LDEwIEBACiAgICAgSUZYX0ZpbGVBdmFpbCogR2V0RmlsZUF2YWlsKCkgY29uc3QgeyByZXR1cm4gbV9wRmlsZUF2YWlsOyB9CiAgICAgSUZYX0ZpbGVSZWFkKiBHZXRGaWxlUmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZpbGVSZWFkOyB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQJCQlTZXREb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNQYWdlQXZhaWwoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNMaW5lYXJpemVkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUlzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUlzTGluZWFyaXplZCgpID0gMDsKICAgICB2aXJ0dWFsIGludDMyX3QJCUlzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpID0gMDsKICAgICB2aXJ0dWFsIGludDMyX3QJCUlzTGluZWFyaXplZFBERigpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSAqcFBvcywgRlhfRFdPUkQgKnBTaXplKSA9IDA7CkBAIC04NTksNyArODU5LDcgQEAKIAogICAgIHZvaWQgQWRkT2JqTnVtKEZYX0RXT1JEIGR3T2JqTnVtKTsKIAotICAgIEZYX0JPT0wgRmluZChGWF9EV09SRCBkd09iak51bSk7CisgICAgYm9vbCBGaW5kKEZYX0RXT1JEIGR3T2JqTnVtKTsKIAogICAgIHZvaWQgUmVtb3ZlQWxsKCkKICAgICB7CkBAIC04NjcsNyArODY3LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICBGWF9CT09MIEJpbmFyeVNlYXJjaChGWF9EV09SRCB2YWx1ZSwgaW50ICZpTmV4dCk7CisgICAgYm9vbCBCaW5hcnlTZWFyY2goRlhfRFdPUkQgdmFsdWUsIGludCAmaU5leHQpOwogcHJvdGVjdGVkOgogCiAgICAgQ0ZYX0RXb3JkQXJyYXkJCQltX251bWJlcl9hcnJheTsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oCmluZGV4IGYzNTkwMDkuLjM3ZThhNTQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaApAQCAtMzMsOSArMzMsOSBAQAogCiAgICAgdmlydHVhbCB+SVBERl9PQ0NvbnRleHQoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0cpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJQ2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DRykgPSAwOwogCi0gICAgRlhfQk9PTCBDaGVja09iamVjdFZpc2libGUoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKKyAgICBib29sIENoZWNrT2JqZWN0VmlzaWJsZShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopOwogfTsKICNkZWZpbmUgUkVOREVSX0NPTE9SX05PUk1BTAkJMAogI2RlZmluZSBSRU5ERVJfQ09MT1JfR1JBWQkJMQpAQCAtODksMTAgKzg5LDEwIEBACiAKICAgICBDUERGX1JlbmRlckNvbnRleHQoKTsKIAotICAgIHZvaWQJCQlDcmVhdGUoQ1BERl9QYWdlKiBwUGFnZSwgRlhfQk9PTCBiRmlyc3RMYXllciA9IFRSVUUpOworICAgIHZvaWQJCQlDcmVhdGUoQ1BERl9QYWdlKiBwUGFnZSwgYm9vbCBiRmlyc3RMYXllciA9IHRydWUpOwogCiAgICAgdm9pZAkJCUNyZWF0ZShDUERGX0RvY3VtZW50KiBwRG9jID0gTlVMTCwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBQYWdlQ2FjaGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyA9IE5VTEwsIEZYX0JPT0wgYkZpcnN0TGF5ZXIgPSBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMgPSBOVUxMLCBib29sIGJGaXJzdExheWVyID0gdHJ1ZSk7CiAKICAgICB+Q1BERl9SZW5kZXJDb250ZXh0KCk7CiAKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8c3RydWN0IF9QREZfUmVuZGVySXRlbT4JbV9Db250ZW50TGlzdDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkZpcnN0TGF5ZXI7CisgICAgYm9vbAkJCQkJbV9iRmlyc3RMYXllcjsKIAogICAgIHZvaWQJCQlSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBGaW5hbE1hdHJpeCk7CkBAIC0xOTIsMTcgKzE5MiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zID0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICBzdGF0aWMgYm9vbAlEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgRlhfQVJHQiBzdHJva2VfYXJnYiwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLCBpbnQgbkZsYWcgPSAwKTsKIAotICAgIHN0YXRpYyBGWF9CT09MCURyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgc3RhdGljIGJvb2wJRHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIAotICAgIHN0YXRpYyBGWF9CT09MCURyYXdUeXBlM1RleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICBzdGF0aWMgYm9vbAlEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IpOwogfTsKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICBtX25UaW1lQ291bnQgPSAwOwogICAgICAgICBtX25DYWNoZVNpemUgPSAwOwogICAgICAgICBtX3BDdXJJbWFnZUNhY2hlID0gTlVMTDsKLSAgICAgICAgbV9iQ3VyRmluZENhY2hlID0gRkFMU0U7CisgICAgICAgIG1fYkN1ckZpbmRDYWNoZSA9IGZhbHNlOwogICAgICAgICBtX3BDdXJJbWFnZUNhY2hlcyA9IE5VTEw7CiAgICAgfQogICAgIH5DUERGX1BhZ2VSZW5kZXJDYWNoZSgpCkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICB9CiAKICAgICB2b2lkCQkJCUdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CiAKICAgICB2b2lkCQkJCVJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOwpAQCAtMjQ5LDExICsyNDksMTEgQEAKICAgICB9CiAgICAgQ0ZYX01hcFB0clRvUHRyCQltX0ltYWdlQ2FjaGVzOwogcHVibGljOgotICAgIEZYX0JPT0wJCQkJU3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKLSAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwKKyAgICBib29sCQkJCVN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICBib29sIGJMb2FkTWFzayA9IGZhbHNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCiAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCA9IDApOwogCi0gICAgRlhfQk9PTAkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ1BERl9JbWFnZUNhY2hlKgltX3BDdXJJbWFnZUNhY2hlOwogICAgIENGWF9QdHJBcnJheSogICAgICAgbV9wQ3VySW1hZ2VDYWNoZXM7CiBwcm90ZWN0ZWQ6CkBAIC0yNjIsNyArMjYyLDcgQEAKIAogICAgIEZYX0RXT1JECQkJbV9uVGltZUNvdW50OwogICAgIEZYX0RXT1JECQkJbV9uQ2FjaGVTaXplOwotICAgIEZYX0JPT0wJCQkJbV9iQ3VyRmluZENhY2hlOworICAgIGJvb2wJCQkJbV9iQ3VyRmluZENhY2hlOwogfTsKIGNsYXNzIENQREZfUmVuZGVyQ29uZmlnCiB7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgKaW5kZXggNWM4Y2M4NS4uYzYwNzM3ZCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaApAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgIHJldHVybiBtX0ZsYWdzOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVmVydFdyaXRpbmcoKWNvbnN0OworICAgIHZpcnR1YWwgYm9vbAkJCUlzVmVydFdyaXRpbmcoKWNvbnN0OwogCiAKIApAQCAtMTQyLDE0ICsxNDIsMTQgQEAKICAgICB9CiAKIAotICAgIEZYX0JPT0wJCQkJCUlzRW1iZWRkZWQoKSBjb25zdAorICAgIGJvb2wJCQkJCUlzRW1iZWRkZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fRm9udFR5cGUgPT0gUERGRk9OVF9UWVBFMyB8fCBtX3BGb250RmlsZSAhPSBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAorICAgIHZpcnR1YWwgYm9vbAkJCUlzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQ1BERl9TdHJlYW1BY2MqCQkJR2V0Rm9udEZpbGUoKSBjb25zdApAQCAtMTYyLDcgKzE2Miw3IEBACiAgICAgICAgIHJldHVybiBtX3BGb250RGljdDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlJc1N0YW5kYXJkRm9udCgpIGNvbnN0OworICAgIGJvb2wJCQkJCUlzU3RhbmRhcmRGb250KCkgY29uc3Q7CiAKICAgICBGWEZUX0ZhY2UJCQkJR2V0RmFjZSgpIGNvbnN0CiAgICAgewpAQCAtMTk5LDcgKzE5OSw3IEBACiAKIAogCi0gICAgdmlydHVhbCBpbnQJCQkJR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBpbnQJCQkJR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIGJvb2wgKnBWZXJ0R2x5cGggPSBOVUxMKSA9IDA7CiAgICAgdmlydHVhbCBpbnQJCQkJR2x5cGhGcm9tQ2hhckNvZGVFeHQoRlhfRFdPUkQgY2hhcmNvZGUpCiAgICAgewogICAgICAgICByZXR1cm4gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwpAQCAtMjY1LDExICsyNjUsMTEgQEAKIHByb3RlY3RlZDoKICAgICBleHBsaWNpdCBDUERGX0ZvbnQoaW50IGZvbnR0eXBlKTsKIAotICAgIEZYX0JPT0wJCQkJCUluaXRpYWxpemUoKTsKKyAgICBib29sCQkJCQlJbml0aWFsaXplKCk7CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkKCk7CisgICAgYm9vbAkJCQkJTG9hZCgpOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJX0xvYWQoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJX0xvYWQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIEZYX1dDSEFSCQlfVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgPSAwOwogCkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICB2b2lkCQkJCQlMb2FkVW5pY29kZU1hcCgpOwogCiAgICAgdm9pZAkJCQkJTG9hZFBERkVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcsIGludCYgaUJhc2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLCBGWF9CT09MIGJFbWJlZGRlZCwgRlhfQk9PTCBiVHJ1ZVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyomIHBDaGFyTmFtZXMsIGJvb2wgYkVtYmVkZGVkLCBib29sIGJUcnVlVHlwZSk7CiAKICAgICB2b2lkCQkJCQlMb2FkRm9udERlc2NyaXB0b3IoQ1BERl9EaWN0aW9uYXJ5Kik7CiAKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiAgICAgQ1BERl9Ub1VuaWNvZGVNYXAqCQltX3BUb1VuaWNvZGVNYXA7CiAKLSAgICBGWF9CT09MCQkJCQltX2JUb1VuaWNvZGVMb2FkZWQ7CisgICAgYm9vbAkJCQkJbV9iVG9Vbmljb2RlTG9hZGVkOwogCiAKIApAQCAtMzM4LDcgKzMzOCw3IEBACiAKICAgICB2b2lkCQkJCQlMb2FkRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZyk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0OworICAgIGJvb2wJCQkJCUlzSWRlbnRpY2FsKENQREZfRm9udEVuY29kaW5nKiBwQW5vdGhlcikgY29uc3Q7CiAKICAgICBGWF9XQ0hBUgkJCQlVbmljb2RlRnJvbUNoYXJDb2RlKHVpbnQ4X3QgY2hhcmNvZGUpIGNvbnN0CiAgICAgewpAQCAtMzcwLDExICszNzAsMTEgQEAKICAgICB9CiAgICAgaW50IEdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCA9IDApIG92ZXJyaWRlOwogICAgIHZvaWQgR2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCA9IDApIG92ZXJyaWRlOwotICAgIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCA9IE5VTEwpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgYm9vbCAqcFZlcnRHbHlwaCA9IE5VTEwpIG92ZXJyaWRlOworICAgIGJvb2wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6Ci0gICAgRlhfQk9PTCBMb2FkQ29tbW9uKCk7CisgICAgYm9vbCBMb2FkQ29tbW9uKCk7CiAKICAgICB2b2lkIExvYWRTdWJzdEZvbnQoKTsKIApAQCAtNDAxLDcgKzQwMSw3IEBACiAgICAgaW50IG1fQmFzZUVuY29kaW5nOwogICAgIEZYX1dPUkQgbV9DaGFyV2lkdGhbMjU2XTsKICAgICBGWF9TTUFMTF9SRUNUIG1fQ2hhckJCb3hbMjU2XTsKLSAgICBGWF9CT09MIG1fYlVzZUZvbnRXaWR0aDsKKyAgICBib29sIG1fYlVzZUZvbnRXaWR0aDsKIH07CiAKIGNsYXNzIENQREZfVHlwZTFGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udApAQCAtNDE2LDcgKzQxNiw3IEBACiAgICAgfQogICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKTsKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlfTG9hZCgpOworICAgIHZpcnR1YWwgYm9vbAkJCV9Mb2FkKCk7CiAKICAgICBpbnQJCQkJCQltX0Jhc2UxNEZvbnQ7CiAgICAgdmlydHVhbCB2b2lkCQkJTG9hZEdseXBoTWFwKCk7CkBAIC00MjcsNyArNDI3LDcgQEAKIAogICAgIENQREZfVHJ1ZVR5cGVGb250KCk7CiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJX0xvYWQoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCQlfTG9hZCgpOwogICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRHbHlwaE1hcCgpOwogfTsKIGNsYXNzIENQREZfVHlwZTNDaGFyCkBAIC00MzgsMTEgKzQzOCwxMSBAQAogCiAgICAgfkNQREZfVHlwZTNDaGFyKCk7CiAKLSAgICBGWF9CT09MIExvYWRCaXRtYXAoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCk7CisgICAgYm9vbCBMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iQ29sb3JlZDsKKyAgICBib29sCQkJCQltX2JDb2xvcmVkOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iUGFnZVJlcXVpcmVkOworICAgIGJvb2wJCQkJCW1fYlBhZ2VSZXF1aXJlZDsKIAogCiAKQEAgLTQ4NCw3ICs0ODQsNyBAQAogICAgIENGWF9BZmZpbmVNYXRyaXggbV9Gb250TWF0cml4OwogCiBwcml2YXRlOgotICAgIEZYX0JPT0wgX0xvYWQoKSBvdmVycmlkZTsKKyAgICBib29sIF9Mb2FkKCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBMb2FkR2x5cGhNYXAoKSBvdmVycmlkZSB7fQogCiAgICAgaW50IG1fQ2hhcldpZHRoTFsyNTZdOwpAQCAtNTExLDEzICs1MTEsMTMgQEAKIAogICAgIH5DUERGX0NJREZvbnQoKSBvdmVycmlkZTsKIAotICAgIEZYX0JPT0wgTG9hZEdCMjMxMigpOwotICAgIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCA9IE5VTEwpIG92ZXJyaWRlOworICAgIGJvb2wgTG9hZEdCMjMxMigpOworICAgIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgYm9vbCAqcFZlcnRHbHlwaCA9IE5VTEwpIG92ZXJyaWRlOwogICAgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKICAgICB2b2lkIEdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKICAgICBGWF9XT1JEIENJREZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CiAKLSAgICBGWF9CT09MIElzVHJ1ZVR5cGUoKSBjb25zdAorICAgIGJvb2wgSXNUcnVlVHlwZSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gIW1fYlR5cGUxOwogICAgIH0KQEAgLTUzMywxOSArNTMzLDE5IEBACiAgICAgfQogCiAgICAgY29uc3QgdWludDhfdCogR2V0Q0lEVHJhbnNmb3JtKEZYX1dPUkQgQ0lEKSBjb25zdDsKLSAgICBGWF9CT09MIElzVmVydFdyaXRpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIElzVmVydFdyaXRpbmcoKSBjb25zdCBvdmVycmlkZTsKICAgICBzaG9ydCBHZXRWZXJ0V2lkdGgoRlhfV09SRCBDSUQpIGNvbnN0OwogICAgIHZvaWQgR2V0VmVydE9yaWdpbihGWF9XT1JEIENJRCwgc2hvcnQmIHZ4LCBzaG9ydCYgdnkpIGNvbnN0OwotICAgIEZYX0JPT0wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgRlhfQk9PTCBJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CisgICAgYm9vbCBJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIElzRm9udFN0eWxlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIGZyaWVuZCBjbGFzcyBDUERGX0ZvbnQ7CiAKLSAgICBGWF9CT09MIF9Mb2FkKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBfTG9hZCgpIG92ZXJyaWRlOwogICAgIEZYX1dDSEFSIF9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCBvdmVycmlkZTsKICAgICBGWF9EV09SRCBfQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCBvdmVycmlkZTsKLSAgICBpbnQgR2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlYiwgRlhfQk9PTCAqcFZlcnRHbHlwaCk7CisgICAgaW50IEdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZWIsIGJvb2wgKnBWZXJ0R2x5cGgpOwogICAgIHZvaWQgTG9hZE1ldHJpY3NBcnJheShDUERGX0FycmF5KiBwQXJyYXksIENGWF9EV29yZEFycmF5JiByZXN1bHQsIGludCBuRWxlbWVudHMpOwogICAgIHZvaWQgTG9hZFN1YnN0Rm9udCgpOwogCkBAIC01NTMsOSArNTUzLDkgQEAKICAgICBDUERGX0NNYXAqIG1fcEFsbG9jYXRlZENNYXA7CiAgICAgQ1BERl9DSUQyVW5pY29kZU1hcCogbV9wQ0lEMlVuaWNvZGVNYXA7CiAgICAgaW50IG1fQ2hhcnNldDsKLSAgICBGWF9CT09MIG1fYlR5cGUxOworICAgIGJvb2wgbV9iVHlwZTE7CiAgICAgQ1BERl9TdHJlYW1BY2MqIG1fcENJRFRvR0lETWFwOwotICAgIEZYX0JPT0wgbV9iQ0lESXNHSUQ7CisgICAgYm9vbCBtX2JDSURJc0dJRDsKICAgICBGWF9XT1JEIG1fRGVmYXVsdFdpZHRoOwogICAgIEZYX1dPUkQqIG1fcEFuc2lXaWR0aHM7CiAgICAgRlhfU01BTExfUkVDVCBtX0NoYXJCQm94WzI1Nl07CkBAIC01NjMsNyArNTYzLDcgQEAKICAgICBzaG9ydCBtX0RlZmF1bHRWWTsKICAgICBzaG9ydCBtX0RlZmF1bHRXMTsKICAgICBDRlhfRFdvcmRBcnJheSBtX1ZlcnRNZXRyaWNzOwotICAgIEZYX0JPT0wgbV9iQWRvYmVDb3VyaWVyU3RkOworICAgIGJvb2wgbV9iQWRvYmVDb3VyaWVyU3RkOwogICAgIENGWF9DVFRHU1VCVGFibGUqIG1fcFRUR1NVQlRhYmxlOwogfTsKIApAQCAtNjEyLDI3ICs2MTIsMjcgQEAKICAgICAgICAgbWF4ID0gMS4wZjsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlzUkdCKCkgY29uc3Q7CisgICAgYm9vbAkJCQkJc1JHQigpIGNvbnN0OwogCiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAorICAgIHZpcnR1YWwgYm9vbAkJCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogCiAKIAotICAgIEZYX0JPT0wJCQkJCUdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdDsKKyAgICBib29sCQkJCQlHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdDsKKyAgICBib29sCQkJCQlTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdDsKIAogCiAgICAgdmlydHVhbCB2b2lkCQkJVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgcGl4ZWxzLAotICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Q7CisgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdDsKIAogICAgIENQREZfQXJyYXkqJgkJCUdldEFycmF5KCkKICAgICB7CkBAIC02NDYsNyArNjQ2LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkCQkJRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKTsKKyAgICB2aXJ0dWFsIHZvaWQJCQlFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpOwogCiAgICAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CiAKQEAgLTY1OSwxNyArNjU5LDE3IEBACiAgICAgICAgICAgbV9kd1N0ZENvbnZlcnNpb24oMCkgewogICAgIH0KICAgICB2aXJ0dWFsIH5DUERGX0NvbG9yU3BhY2UoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCXZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCisgICAgdmlydHVhbCBib29sCQkJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQl2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCXZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQl2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpbnQJCQkJCQltX0ZhbWlseTsKQEAgLTY5MiwxNCArNjkyLDE0IEBACiAKICAgICB+Q1BERl9Db2xvcigpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNOdWxsKCkgY29uc3QKKyAgICBib29sCQkJCQlJc051bGwoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcEJ1ZmZlciA9PSBOVUxMOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUlzRXF1YWwoY29uc3QgQ1BERl9Db2xvciYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wJCQkJCUlzRXF1YWwoY29uc3QgQ1BERl9Db2xvciYgb3RoZXIpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSXNQYXR0ZXJuKCkgY29uc3QKKyAgICBib29sCQkJCQlJc1BhdHRlcm4oKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcENTICYmIG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOOwogICAgIH0KQEAgLTcxMiw3ICs3MTIsNyBAQAogCiAgICAgdm9pZAkJCQkJU2V0VmFsdWUoQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiwgRlhfRkxPQVQqIGNvbXAsIGludCBuY29tcHMpOwogCi0gICAgRlhfQk9PTAkJCQkJR2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldFJHQihpbnQmIFIsIGludCYgRywgaW50JiBCKSBjb25zdDsKIAogICAgIENQREZfUGF0dGVybioJCQlHZXRQYXR0ZXJuKCkgY29uc3Q7CiAKQEAgLTczNCw3ICs3MzQsNyBAQAogcHVibGljOgogCiAgICAgdmlydHVhbCB+Q1BERl9QYXR0ZXJuKCk7Ci0gICAgdm9pZCAgICBTZXRGb3JjZUNsZWFyKEZYX0JPT0wgYkZvcmNlQ2xlYXIpIHsgbV9iRm9yY2VDbGVhciA9IGJGb3JjZUNsZWFyOyB9CisgICAgdm9pZCAgICBTZXRGb3JjZUNsZWFyKGJvb2wgYkZvcmNlQ2xlYXIpIHsgbV9iRm9yY2VDbGVhciA9IGJGb3JjZUNsZWFyOyB9CiAKICAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgbV9wUGF0dGVybk9iajsKIApAQCAtNzQ3LDcgKzc0Nyw3IEBACiAKIHByb3RlY3RlZDoKICAgICBDUERGX1BhdHRlcm4oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCk7Ci0gICAgRlhfQk9PTCAgICAgbV9iRm9yY2VDbGVhcjsKKyAgICBib29sICAgICBtX2JGb3JjZUNsZWFyOwogfTsKIAogY2xhc3MgQ1BERl9UaWxpbmdQYXR0ZXJuIDogcHVibGljIENQREZfUGF0dGVybgpAQCAtNzU4LDExICs3NTgsMTEgQEAKIAogICAgIHZpcnR1YWwgfkNQREZfVGlsaW5nUGF0dGVybigpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkKCk7CisgICAgYm9vbAkJCQlMb2FkKCk7CiAKIAogCi0gICAgRlhfQk9PTAkJCQltX2JDb2xvcmVkOworICAgIGJvb2wJCQkJbV9iQ29sb3JlZDsKIAogICAgIENGWF9GbG9hdFJlY3QJCW1fQkJveDsKIApAQCAtNzc4LDE3ICs3NzgsMTcgQEAKIHsKIHB1YmxpYzoKIAotICAgIENQREZfU2hhZGluZ1BhdHRlcm4oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpOworICAgIENQREZfU2hhZGluZ1BhdHRlcm4oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBib29sIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpOwogCiAgICAgdmlydHVhbCB+Q1BERl9TaGFkaW5nUGF0dGVybigpOwogCiAgICAgQ1BERl9PYmplY3QqCQltX3BTaGFkaW5nT2JqOwogCi0gICAgRlhfQk9PTAkJCQltX2JTaGFkaW5nT2JqOworICAgIGJvb2wJCQkJbV9iU2hhZGluZ09iajsKIAotICAgIEZYX0JPT0wJCQkJTG9hZCgpOworICAgIGJvb2wJCQkJTG9hZCgpOwogCi0gICAgRlhfQk9PTAkJCQlSZWxvYWQoKTsKKyAgICBib29sCQkJCVJlbG9hZCgpOwogCiAgICAgaW50CQkJCQltX1NoYWRpbmdUeXBlOwogCkBAIC04MTAsNyArODEwLDcgQEAKIHsKIHB1YmxpYzoKIAotICAgIEZYX0JPT0wJCQkJTG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsIENQREZfQ29sb3JTcGFjZSogcENTKTsKKyAgICBib29sCQkJCUxvYWQoQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUyk7CiAKICAgICBGWF9EV09SRAkJCUdldEZsYWcoKTsKIApAQCAtODIwLDcgKzgyMCw3IEBACiAKICAgICBGWF9EV09SRCAJCQlHZXRWZXJ0ZXgoQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKTsKIAotICAgIEZYX0JPT0wJCQkJR2V0VmVydGV4Um93KENQREZfTWVzaFZlcnRleCogdmVydGV4LCBpbnQgY291bnQsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKTsKKyAgICBib29sCQkJCUdldFZlcnRleFJvdyhDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwgaW50IGNvdW50LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CiAgICAgQ1BERl9GdW5jdGlvbioqCW1fcEZ1bmNzOwogICAgIENQREZfQ29sb3JTcGFjZSoJbV9wQ1M7CiAgICAgRlhfRFdPUkQJCQltX25GdW5jcywgbV9uQ29vcmRCaXRzLCBtX25Db21wQml0cywgbV9uRmxhZ0JpdHMsIG1fbkNvbXBzOwpAQCAtODU0LDEzICs4NTQsMTMgQEAKIAogICAgIH5DUERGX0ltYWdlKCk7CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkSW1hZ2VGKENQREZfU3RyZWFtKiBwSW1hZ2VTdHJlYW0sIEZYX0JPT0wgYklubGluZSk7CisgICAgYm9vbAkJCQkJTG9hZEltYWdlRihDUERGX1N0cmVhbSogcEltYWdlU3RyZWFtLCBib29sIGJJbmxpbmUpOwogCiAgICAgdm9pZAkJCQkJUmVsZWFzZSgpOwogCiAgICAgQ1BERl9JbWFnZSoJCQkJQ2xvbmUoKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzSW5saW5lKCkKKyAgICBib29sCQkJCQlJc0lubGluZSgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9iSW5saW5lOwogICAgIH0KQEAgLTkwOCwxNyArOTA4LDE3IEBACiAgICAgfQogCiAKLSAgICBGWF9CT09MCQkJCQlJc01hc2soKSBjb25zdAorICAgIGJvb2wJCQkJCUlzTWFzaygpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSXNNYXNrOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUlzSW50ZXJwb2woKSBjb25zdAorICAgIGJvb2wJCQkJCUlzSW50ZXJwb2woKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkludGVycG9sYXRlOwogICAgIH0KIAotICAgIENGWF9ESUJTb3VyY2UqCQkJTG9hZERJQlNvdXJjZShDRlhfRElCU291cmNlKiogcHBNYXNrID0gTlVMTCwgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yID0gTlVMTCwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKSBjb25zdDsKKyAgICBDRlhfRElCU291cmNlKgkJCUxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzayA9IE5VTEwsIEZYX0RXT1JEKiBwTWF0dGVDb2xvciA9IE5VTEwsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSkgY29uc3Q7CiAKIAogCkBAIC05MzEsOCArOTMxLDggQEAKICAgICB2b2lkCQkJCQlSZXNldENhY2hlKENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcERJQml0bWFwKTsKIAogcHVibGljOgotICAgIEZYX0JPT0wJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKTsKLSAgICBGWF9CT09MCQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJCQkJU3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLCBib29sIGJTdGRDUyA9IGZhbHNlLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOworICAgIGJvb2wJCQkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKICAgICBDRlhfRElCU291cmNlKgkJCURldGFjaEJpdG1hcCgpOwogICAgIENGWF9ESUJTb3VyY2UqCQkJRGV0YWNoTWFzaygpOwogICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wRElCU291cmNlOwpAQCAtOTQxLDE2ICs5NDEsMTYgQEAKIHByaXZhdGU6CiAKICAgICBDUERGX1N0cmVhbSoJCQltX3BTdHJlYW07Ci0gICAgRlhfQk9PTAkJCQkJbV9iSW5saW5lOworICAgIGJvb2wJCQkJCW1fYklubGluZTsKICAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BJbmxpbmVEaWN0OwogCiAgICAgaW50MzJfdAkJCQltX0hlaWdodDsKIAogICAgIGludDMyX3QJCQkJbV9XaWR0aDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYklzTWFzazsKKyAgICBib29sCQkJCQltX2JJc01hc2s7CiAKLSAgICBGWF9CT09MCQkJCQltX2JJbnRlcnBvbGF0ZTsKKyAgICBib29sCQkJCQltX2JJbnRlcnBvbGF0ZTsKIAogICAgIENQREZfRG9jdW1lbnQqCQkJbV9wRG9jdW1lbnQ7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oCmluZGV4IDE4NzdlZjguLjA2Y2YyMTMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaApAQCAtMTE3LDM1ICsxMTcsMzUgQEAKIAogICAgIHZvaWQJCQkJUmVtb3ZlU2VjdXJpdHkoKTsKIAotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKKyAgICBib29sCQkJCUNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CiAKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKKyAgICBib29sCQkJCUNyZWF0ZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKIAotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzID0gMCk7CisgICAgYm9vbAkJCQlDcmVhdGUoSUZYX1N0cmVhbVdyaXRlKiBwRmlsZSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKIAogICAgIGludDMyX3QJCQlDb250aW51ZShJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCQlTZXRGaWxlVmVyc2lvbihpbnQzMl90IGZpbGVWZXJzaW9uID0gMTcpOworICAgIGJvb2wJCQkJU2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiA9IDE3KTsKIHByb3RlY3RlZDoKIAogICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKIAogICAgIENQREZfUGFyc2VyKgkJbV9wUGFyc2VyOwogCi0gICAgRlhfQk9PTAkJCQltX2JDb21wcmVzczsKKyAgICBib29sCQkJCW1fYkNvbXByZXNzOwogCi0gICAgRlhfQk9PTAkJCQltX2JTZWN1cml0eUNoYW5nZWQ7CisgICAgYm9vbAkJCQltX2JTZWN1cml0eUNoYW5nZWQ7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqCW1fcEVuY3J5cHREaWN0OwogICAgIEZYX0RXT1JECQkJbV9kd0VucnlwdE9iak51bTsKLSAgICBGWF9CT09MCQkJCW1fYkVuY3J5cHRDbG9uZWQ7CisgICAgYm9vbAkJCQltX2JFbmNyeXB0Q2xvbmVkOwogCi0gICAgRlhfQk9PTAkJCQltX2JTdGFuZGFyZFNlY3VyaXR5OworICAgIGJvb2wJCQkJbV9iU3RhbmRhcmRTZWN1cml0eTsKIAogICAgIENQREZfQ3J5cHRvSGFuZGxlcioJbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICBGWF9CT09MCQkJCW1fYk5ld0NyeXB0bzsKKyAgICBib29sCQkJCW1fYk5ld0NyeXB0bzsKIAotICAgIEZYX0JPT0wJCQkJbV9iRW5jcnlwdE1ldGFkYXRhOworICAgIGJvb2wJCQkJbV9iRW5jcnlwdE1ldGFkYXRhOwogCiAgICAgQ1BERl9PYmplY3QqCQltX3BNZXRhZGF0YTsKIApAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgaW50MzJfdAkJCW1fT2JqZWN0U3RyZWFtU2l6ZTsKIAogICAgIEZYX0RXT1JECQkJbV9kd0xhc3RPYmpOdW07Ci0gICAgRlhfQk9PTAkJCQlDcmVhdGUoRlhfRFdPUkQgZmxhZ3MpOworICAgIGJvb2wJCQkJQ3JlYXRlKEZYX0RXT1JEIGZsYWdzKTsKICAgICB2b2lkCQkJCVJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOwogICAgIHZvaWQJCQkJQ2xlYXIoKTsKICAgICBpbnQzMl90CQkJV3JpdGVEb2NfU3RhZ2UxKElGWF9QYXVzZSAqcFBhdXNlKTsKQEAgLTE3MCwxNCArMTcwLDE0IEBACiAgICAgdm9pZAkJCQlBcHBlbmROZXdPYmpOdW0oRlhfRFdPUkQgb2JqYnVtKTsKICAgICBpbnQzMl90CQkJV3JpdGVPbGRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pOwogICAgIGludDMyX3QJCQlXcml0ZU9sZE9ianMoSUZYX1BhdXNlICpwUGF1c2UpOwotICAgIGludDMyX3QJCQlXcml0ZU5ld09ianMoRlhfQk9PTCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSAqcFBhdXNlKTsKKyAgICBpbnQzMl90CQkJV3JpdGVOZXdPYmpzKGJvb2wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSk7CiAgICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmooY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOwotICAgIGludDMyX3QJCQlXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJFbmNyeXB0ID0gVFJVRSk7CisgICAgaW50MzJfdAkJCVdyaXRlRGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosIGJvb2wgYkVuY3J5cHQgPSB0cnVlKTsKICAgICBpbnQzMl90CQkJV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKICAgICBpbnQzMl90CQkJV3JpdGVJbmRpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKICAgICBpbnQzMl90CQkJV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKTsKICAgICBpbnQzMl90CQkJQXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKEZYX0RXT1JEIG9iam51bSk7Ci0gICAgdm9pZAkJCQlJbml0SUQoRlhfQk9PTCBiRGVmYXVsdCA9IFRSVUUpOworICAgIHZvaWQJCQkJSW5pdElEKGJvb2wgYkRlZmF1bHQgPSB0cnVlKTsKICAgICBpbnQzMl90CQkJV3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sIEZYX0RXT1JEIG9iam51bSwgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKTsKIAogICAgIGludDMyX3QJCQltX2lTdGFnZTsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaCBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaAppbmRleCA3Y2ZhZWQ0Li5lYjBjYTQ0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oCkBAIC02MCw3ICs2MCw3IEBACiAKICAgICBpbnQzMl90CQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KTsKIAotICAgIEZYX0JPT0wJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKKyAgICBib29sCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CiAKICAgICBpbnQzMl90CQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpOwogcHJpdmF0ZToKQEAgLTc2LDIwICs3NiwyMCBAQAogewogcHVibGljOgogCi0gICAgc3RhdGljIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVUZXh0RmllbGRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICAgIHN0YXRpYyBib29sCQkJCQkJCUdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJCQkJCUdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICAgIHN0YXRpYyBib29sCQkJCQkJCUdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwogCi0gICAgc3RhdGljIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgICBzdGF0aWMgYm9vbAkJCQkJCQlHZW5lcmF0ZUxpc3RCb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwogCiAgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IsCi0gICAgICAgICAgICBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIEZYX0JPT0wgYkNvbnRpbnVvdXMsIEZYX1dPUkQgU3ViV29yZCA9IDAsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUgPSBOVUxMKTsKKyAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgYm9vbCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkID0gMCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwVmlzaWJsZSA9IE5VTEwpOwogCiAgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUJvcmRlckFQKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKICAgICAgICAgICAgIGNvbnN0IENQVlRfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BWVF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BWVF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCiAgICAgICAgICAgICBpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BWVF9EYXNoICYgZGFzaCk7CiAKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IEZYX0JPT0wgJiBiRmlsbE9yU3Ryb2tlKTsKKyAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IGJvb2wgJiBiRmlsbE9yU3Ryb2tlKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9BUF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgKaW5kZXggZmM5ZDNiYy4uMzZkOWQyOSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oCkBAIC0xNjQsMjYgKzE2NCwyNiBAQAogICAgICAgICByZXR1cm4gbV9lVXNhZ2VUeXBlOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CisgICAgYm9vbAkJCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KTsKIAogICAgIHZvaWQJCQlSZXNldE9DQ29udGV4dCgpOwogcHJvdGVjdGVkOgogCi0gICAgRlhfQk9PTAkJCUxvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0NvbmZpZywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCwgRlhfQk9PTCAmYlZhbGlkQ29uZmlnKSBjb25zdDsKKyAgICBib29sCQkJTG9hZE9DR1N0YXRlRnJvbUNvbmZpZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzQ29uZmlnLCBjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0LCBib29sICZiVmFsaWRDb25maWcpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdDsKKyAgICBib29sCQkJTG9hZE9DR1N0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CisgICAgYm9vbAkJCUdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CiAKLSAgICBGWF9CT09MCQkJR2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIEZYX0JPT0wgYkZyb21Db25maWcsIGludCBuTGV2ZWwgPSAwKTsKKyAgICBib29sCQkJR2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIGJvb2wgYkZyb21Db25maWcsIGludCBuTGV2ZWwgPSAwKTsKIAotICAgIEZYX0JPT0wJCQlMb2FkT0NNRFN0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DTUREaWN0LCBGWF9CT09MIGJGcm9tQ29uZmlnKTsKKyAgICBib29sCQkJTG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgYm9vbCBiRnJvbUNvbmZpZyk7CiAKICAgICBDUERGX0RvY3VtZW50CQkqbV9wRG9jdW1lbnQ7CiAKICAgICBVc2FnZVR5cGUJCQltX2VVc2FnZVR5cGU7CiAKLSAgICBzdGQ6Om1hcDxjb25zdCBDUERGX0RpY3Rpb25hcnkqLCBGWF9CT09MPiBtX09DR1N0YXRlczsKKyAgICBzdGQ6Om1hcDxjb25zdCBDUERGX0RpY3Rpb25hcnkqLCBib29sPiBtX09DR1N0YXRlczsKIH07CiBjbGFzcyBDUERGX0xXaW5QYXJhbQogewpAQCAtMjk1LDcgKzI5NSw3IEBACiAKICAgICBDRlhfV2lkZVN0cmluZwkJR2V0RmlsZVBhdGgoKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJR2V0TmV3V2luZG93KCkgY29uc3QKKyAgICBib29sCQkJCUdldE5ld1dpbmRvdygpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTmV3V2luZG93Iik7CiAgICAgfQpAQCAtMzA0LDcgKzMwNCw3IEBACiAKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VVJJKENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlHZXRNb3VzZU1hcCgpIGNvbnN0CisgICAgYm9vbAkJCQlHZXRNb3VzZU1hcCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiSXNNYXAiKTsKICAgICB9CkBAIC0zMTQsOSArMzE0LDkgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlHZXRIaWRlU3RhdHVzKCkgY29uc3QKKyAgICBib29sCQkJCUdldEhpZGVTdGF0dXMoKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIkgiLCBUUlVFKTsKKyAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIkgiLCB0cnVlKTsKICAgICB9CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZWRBY3Rpb24oKSBjb25zdApAQCAtMzQ1LDE3ICszNDUsMTcgQEAKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldE51bWJlcigiVm9sdW1lIik7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc1N5bmNocm9ub3VzKCkgY29uc3QKKyAgICBib29sCQkJCUlzU3luY2hyb25vdXMoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIlN5bmNocm9ub3VzIik7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc1JlcGVhdCgpIGNvbnN0CisgICAgYm9vbAkJCQlJc1JlcGVhdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiUmVwZWF0Iik7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc01peFBsYXkoKSBjb25zdAorICAgIGJvb2wJCQkJSXNNaXhQbGF5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJNaXgiKTsKICAgICB9CkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgRG9jdW1lbnRQcmludGVkCiAgICAgfTsKIAotICAgIEZYX0JPT0wJCQkJQWN0aW9uRXhpc3QoQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OworICAgIGJvb2wJCQkJQWN0aW9uRXhpc3QoQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OwogCiAgICAgQ1BERl9BY3Rpb24JCQlHZXRBY3Rpb24oQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OwogCkBAIC00NTUsMTMgKzQ1NSwxMyBAQAogICAgICAgICByZXR1cm4gbV9wT2JqOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlJc1VSTCgpIGNvbnN0OworICAgIGJvb2wJCQlJc1VSTCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUdldEZpbGVOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0ZpbGVOYW1lKSBjb25zdDsKKyAgICBib29sCQkJR2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzRmlsZU5hbWUpIGNvbnN0OwogCiAgICAgQ1BERl9TdHJlYW0qCUdldEZpbGVTdHJlYW0oKSBjb25zdDsKIAotICAgIHZvaWQJCQlTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIEZYX0JPT0wgYlVSTCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJU2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBib29sIGJVUkwgPSBmYWxzZSk7CiBwcm90ZWN0ZWQ6CiAKICAgICBDUERGX09iamVjdAkJKm1fcE9iajsKQEAgLTU0MywxMyArNTQzLDEzIEBACiAKICAgICBDUERGX0RpY3Rpb25hcnkqIEdldEFubm90RGljdCgpOwogCi0gICAgRlhfQk9PTCBEcmF3QXBwZWFyYW5jZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgIGJvb2wgRHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlYXJhbmNlTW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKLSAgICBGWF9CT09MIERyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICBib29sIERyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlYXJhbmNlTW9kZSBtb2RlKTsKQEAgLTU4NSwyNSArNTg1LDI1IEBACiAgICAgdm9pZAlHZXRBbm5vdFJlY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsIENQREZfUmVjdCAmcnRBbm5vdCkgY29uc3Q7CiAKICAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCBiU2hvd1dpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgYm9vbCBiU2hvd1dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKICAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBib29sIGJTaG93V2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQogICAgIHsKICAgICAgICAgRGlzcGxheUFubm90cyhwUGFnZSwgTlVMTCwgcENvbnRleHQsIGJQcmludGluZywgcE1hdHJpeCwgYlNob3dXaWRnZXQgPyAzIDogMSwgcE9wdGlvbnMsIE5VTEwpOwogICAgIH0KIAogICAgIHZvaWQJCQkJRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCBiU2hvd1dpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGJvb2wgYlNob3dXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QgKnBDbGlwUmVjdCkKICAgICB7CiAgICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwogICAgIH0KIAogICAgIHZvaWQJCQkJRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBwQ2xpcFJlY3QpOwogCiAKQEAgLTYzNiw4ICs2MzYsOCBAQAogICAgIENGWF9QdHJBcnJheQkJbV9Cb3JkZXJzOwogCiAgICAgdm9pZAkJCQlEaXNwbGF5UGFzcyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWRnZXQsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBib29sIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpZGdldCwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogY2xpcF9yZWN0KTsKICAgICBmcmllbmQgY2xhc3MJCUNQREZfQW5ub3Q7CiB9OwogI2RlZmluZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQJMApAQCAtNjc4LDcgKzY3OCw3IEBACiAKIAogCi0gICAgRlhfQk9PTAkJCQlIYXNGb250KCk7CisgICAgYm9vbAkJCQlIYXNGb250KCk7CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJR2V0Rm9udFN0cmluZygpOwogCkBAIC02ODcsMTggKzY4NywxOCBAQAogCiAKIAotICAgIEZYX0JPT0wJCQkJSGFzQ29sb3IoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBGQUxTRSk7CisgICAgYm9vbAkJCQlIYXNDb2xvcihib29sIGJTdHJva2luZ09wZXJhdGlvbiA9IGZhbHNlKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKKyAgICBDRlhfQnl0ZVN0cmluZwkJR2V0Q29sb3JTdHJpbmcoYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJCUdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworICAgIHZvaWQJCQkJR2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJCUdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworICAgIHZvaWQJCQkJR2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsIGludCYgaUNvbG9yVHlwZSwgYm9vbCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBmYWxzZSk7CiAKIAogCiAKLSAgICBGWF9CT09MCQkJCUhhc1RleHRNYXRyaXgoKTsKKyAgICBib29sCQkJCUhhc1RleHRNYXRyaXgoKTsKIAogICAgIENGWF9CeXRlU3RyaW5nCQlHZXRUZXh0TWF0cml4U3RyaW5nKCk7CiAKQEAgLTcyMCwxNSArNzIwLDE1IEBACiB7CiBwdWJsaWM6CiAKLSAgICBDUERGX0ludGVyRm9ybShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0JPT0wgYlVwZGF0ZUFQKTsKKyAgICBDUERGX0ludGVyRm9ybShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGJvb2wgYlVwZGF0ZUFQKTsKIAogICAgIH5DUERGX0ludGVyRm9ybSgpOwogCiAKIAotICAgIHN0YXRpYyB2b2lkCQkJCUVuYWJsZVVwZGF0ZUFQKEZYX0JPT0wgYlVwZGF0ZUFQKTsKKyAgICBzdGF0aWMgdm9pZAkJCQlFbmFibGVVcGRhdGVBUChib29sIGJVcGRhdGVBUCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAkJCVVwZGF0aW5nQVBFbmFibGVkKCk7CisgICAgc3RhdGljIGJvb2wJCQlVcGRhdGluZ0FQRW5hYmxlZCgpOwogCiAKICAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJR2VuZXJhdGVOZXdSZXNvdXJjZU5hbWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwgY29uc3QgRlhfQ0hBUiogY3NUeXBlLCBpbnQgaU1pbkxlbiA9IDIsIGNvbnN0IEZYX0NIQVIqIGNzUHJlZml4ID0gIiIpOwpAQCAtNzU2LDExICs3NTYsMTEgQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSk7CisgICAgYm9vbAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpOwogCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKTsKKyAgICBib29sCQkJCQlWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOwogCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CisgICAgYm9vbAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CiAKIAogCkBAIC03NzEsNyArNzcxLDcgQEAKIAogICAgIHZvaWQJCQkJCUdldEFsbEZpZWxkTmFtZXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYWxsRmllbGROYW1lcyk7CiAKLSAgICBGWF9CT09MCQkJCQlJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCk7CisgICAgYm9vbAkJCQkJSXNWYWxpZEZvcm1GaWVsZChjb25zdCB2b2lkKiBwRmllbGQpOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqCQkJR2V0RmllbGRCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSBjb25zdDsKIApAQCAtNzgyLDcgKzc4Miw3IEBACiAKICAgICBDUERGX0Zvcm1Db250cm9sKgkJR2V0Q29udHJvbChGWF9EV09SRCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUgPSBMIiIpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKTsKKyAgICBib29sCQkJCQlJc1ZhbGlkRm9ybUNvbnRyb2woY29uc3Qgdm9pZCogcENvbnRyb2wpOwogCiAgICAgaW50CQkJCQkJQ291bnRQYWdlQ29udHJvbHMoQ1BERl9QYWdlKiBwUGFnZSkgY29uc3Q7CiAKQEAgLTgxNyw5ICs4MTcsOSBAQAogCiAKIAotICAgIEZYX0JPT0wJCQkJCU5lZWRDb25zdHJ1Y3RBUCgpOworICAgIGJvb2wJCQkJCU5lZWRDb25zdHJ1Y3RBUCgpOwogCi0gICAgdm9pZAkJCQkJTmVlZENvbnN0cnVjdEFQKEZYX0JPT0wgYk5lZWRBUCk7CisgICAgdm9pZAkJCQkJTmVlZENvbnN0cnVjdEFQKGJvb2wgYk5lZWRBUCk7CiAKIAogCkBAIC04NDUsMTEgKzg0NSwxMSBAQAogCiAgICAgQ1BERl9Gb250KgkJCQlHZXROYXRpdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIAotICAgIEZYX0JPT0wJCQkJCUZpbmRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKyAgICBib29sCQkJCQlGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKLSAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOworICAgIGJvb2wJCQkJCUZpbmRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKLSAgICBpbmxpbmUgRlhfQk9PTAkJCUZpbmRGb3JtRm9udChDRlhfV2lkZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKKyAgICBpbmxpbmUgYm9vbAkJCUZpbmRGb3JtRm9udChDRlhfV2lkZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKICAgICB7CiAgICAgICAgIHJldHVybiBGaW5kRm9ybUZvbnQoUERGX0VuY29kZVRleHQoY3NGb250TmFtZSksIHBGb250LCBjc05hbWVUYWcpOwogICAgIH0KQEAgLTg4MiwyMCArODgyLDIwIEBACiAKIAogCi0gICAgQ1BERl9Gb3JtRmllbGQqCQkJQ2hlY2tSZXF1aXJlZEZpZWxkcyhjb25zdCBDRlhfUHRyQXJyYXkgKmZpZWxkcyA9IE5VTEwsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFKSBjb25zdDsKKyAgICBDUERGX0Zvcm1GaWVsZCoJCQlDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IENGWF9QdHJBcnJheSAqZmllbGRzID0gTlVMTCwgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSA9IHRydWUpIGNvbnN0OwogCi0gICAgQ0ZERl9Eb2N1bWVudCogCQkJRXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgRlhfQk9PTCBiU2ltcGxlRmlsZVNwZWMgPSBGQUxTRSkgY29uc3Q7CisgICAgQ0ZERl9Eb2N1bWVudCogCQkJRXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgYm9vbCBiU2ltcGxlRmlsZVNwZWMgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBDRkRGX0RvY3VtZW50KgkJCUV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsIENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSwgRlhfQk9PTCBiU2ltcGxlRmlsZVNwZWMgPSBGQUxTRSkgY29uc3Q7CisgICAgQ0ZERl9Eb2N1bWVudCoJCQlFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSA9IHRydWUsIGJvb2wgYlNpbXBsZUZpbGVTcGVjID0gZmFsc2UpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGRG9jLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJSW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGRG9jLCBib29sIGJOb3RpZnkgPSBmYWxzZSk7CiAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlSZXNldEZvcm0oY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJUmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBib29sIGJJbmNsdWRlT3JFeGNsdWRlID0gdHJ1ZSwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCi0gICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQlSZXNldEZvcm0oYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCiAgICAgdm9pZAkJCQkJUmVsb2FkRm9ybSgpOwogCkBAIC05MDcsMjcgKzkwNywyNyBAQAogICAgIHZvaWQJCQkJCVNldEZvcm1Ob3RpZnkoY29uc3QgQ1BERl9Gb3JtTm90aWZ5KiBwTm90aWZ5KTsKIAogCi0gICAgaW50CQkJCQkJR2V0UGFnZVdpdGhXaWRnZXQoaW50IGlDdXJQYWdlLCBGWF9CT09MIGJOZXh0KTsKKyAgICBpbnQJCQkJCQlHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIGJvb2wgYk5leHQpOwogCiAKIAotICAgIEZYX0JPT0wJCQkJCUlzVXBkYXRlZCgpCisgICAgYm9vbAkJCQkJSXNVcGRhdGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JVcGRhdGVkOwogICAgIH0KIAogICAgIHZvaWQJCQkJCUNsZWFyVXBkYXRlZEZsYWcoKQogICAgIHsKLSAgICAgICAgbV9iVXBkYXRlZCA9IEZBTFNFOworICAgICAgICBtX2JVcGRhdGVkID0gZmFsc2U7CiAgICAgfQogCiAKLSAgICBGWF9CT09MCQkJCQlIYXNYRkFGb3JtKCkgY29uc3Q7CisgICAgYm9vbAkJCQkJSGFzWEZBRm9ybSgpIGNvbnN0OwogCiAgICAgdm9pZAkJCQkJRml4UGFnZUZpZWxkcyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlKTsKIHByb3RlY3RlZDoKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJbV9iVXBkYXRlQVA7CisgICAgc3RhdGljIGJvb2wJCQltX2JVcGRhdGVBUDsKIAogICAgIHZvaWQJCQkJCUxvYWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwgPSAwKTsKIApAQCAtOTM3LDkgKzkzNyw5IEBACiAKICAgICBDUERGX0Zvcm1Db250cm9sKgkJQWRkQ29udHJvbChjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKIAotICAgIHZvaWQJCQkJCUZERl9JbXBvcnRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgaW50IG5MZXZlbCA9IDApOworICAgIHZvaWQJCQkJCUZERl9JbXBvcnRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLCBib29sIGJOb3RpZnkgPSBmYWxzZSwgaW50IG5MZXZlbCA9IDApOwogCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUsIGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRXhjbHVkZWRGaWVsZCwgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCk7CisgICAgYm9vbAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUsIGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRXhjbHVkZWRGaWVsZCwgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCk7CiAKICAgICBpbnQJCQkJCQlDb21wYXJlRmllbGROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUyKTsKIApAQCAtOTQ3LDcgKzk0Nyw3IEBACiAKICAgICBDUERGX0RvY3VtZW50KgkJCW1fcERvY3VtZW50OwogCi0gICAgRlhfQk9PTAkJCQkJbV9iR2VuZXJhdGVBUDsKKyAgICBib29sCQkJCQltX2JHZW5lcmF0ZUFQOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wRm9ybURpY3Q7CiAKQEAgLTk1OSw3ICs5NTksNyBAQAogCiAgICAgQ1BERl9Gb3JtTm90aWZ5KgkJbV9wRm9ybU5vdGlmeTsKIAotICAgIEZYX0JPT0wJCQkJCW1fYlVwZGF0ZWQ7CisgICAgYm9vbAkJCQkJbV9iVXBkYXRlZDsKICAgICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtQ29udHJvbDsKICAgICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiB9OwpAQCAtMTAxOCw3ICsxMDE4LDcgQEAKICAgICAgICAgbV9wRGljdCA9IHBEaWN0OwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCVJlc2V0RmllbGQoRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworICAgIGJvb2wJCQkJCVJlc2V0RmllbGQoYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCiAKIApAQCAtMTA3NSw3ICsxMDc1LDcgQEAKIAogICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RGVmYXVsdFZhbHVlKCk7CiAKLSAgICBGWF9CT09MCQkJCQlTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQlTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAogCiAKQEAgLTEwOTAsMTMgKzEwOTAsMTMgQEAKIAogICAgIGludAkJCQkJCUdldFNlbGVjdGVkSW5kZXgoaW50IGluZGV4KTsKIAotICAgIEZYX0JPT0wJCQkJCUNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQlDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpOworICAgIGJvb2wJCQkJCUlzSXRlbVNlbGVjdGVkKGludCBpbmRleCk7CiAKLSAgICBGWF9CT09MCQkJCQlTZXRJdGVtU2VsZWN0aW9uKGludCBpbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgICBib29sCQkJCQlTZXRJdGVtU2VsZWN0aW9uKGludCBpbmRleCwgYm9vbCBiU2VsZWN0ZWQsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzSXRlbURlZmF1bHRTZWxlY3RlZChpbnQgaW5kZXgpOworICAgIGJvb2wJCQkJCUlzSXRlbURlZmF1bHRTZWxlY3RlZChpbnQgaW5kZXgpOwogCiAgICAgaW50CQkJCQkJR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOwogCkBAIC0xMTE2LDcgKzExMTYsNyBAQAogCiAKIAotICAgIEZYX0JPT0wJCQkJCUNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworICAgIGJvb2wJCQkJCUNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgYm9vbCBiQ2hlY2tlZCwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCiAKIApAQCAtMTEzMCwxMSArMTEzMCwxMSBAQAogCiAgICAgaW50CQkJCQkJR2V0U2VsZWN0ZWRPcHRpb25JbmRleChpbnQgaW5kZXgpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgaU9wdEluZGV4KTsKKyAgICBib29sCQkJCQlJc09wdGlvblNlbGVjdGVkKGludCBpT3B0SW5kZXgpOwogCi0gICAgRlhfQk9PTAkJCQkJU2VsZWN0T3B0aW9uKGludCBpT3B0SW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJU2VsZWN0T3B0aW9uKGludCBpT3B0SW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQkJCQlDbGVhclNlbGVjdGVkT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJQ2xlYXJTZWxlY3RlZE9wdGlvbnMoYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCiAKIApAQCAtMTE2OSw5ICsxMTY5LDkgQEAKIAogCiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpOworICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0VmFsdWUoYm9vbCBiRGVmYXVsdCk7CiAKLSAgICBGWF9CT09MCQkJCQlTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0JPT0wgYk5vdGlmeSk7CisgICAgYm9vbAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpOwogCiAKICAgICB2b2lkCQkJCQlTeW5jRmllbGRGbGFncygpOwpAQCAtMTE4Niw5ICsxMTg2LDkgQEAKIAogCiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRDaGVja1ZhbHVlKGJvb2wgYkRlZmF1bHQpOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0Q2hlY2tWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0JPT0wgYk5vdGlmeSk7CisgICAgYm9vbAkJCQkJU2V0Q2hlY2tWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYkRlZmF1bHQsIGJvb2wgYk5vdGlmeSk7CiAKIAogICAgIEZYX0ZMT0FUCQkJCW1fRm9udFNpemU7CkBAIC0xMjI1LDcgKzEyMjUsNyBAQAogCiAKIAotICAgIEZYX0JPT0wJCQkJCUlzUHJvcG9ydGlvbmFsU2NhbGUoKTsKKyAgICBib29sCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7CiAKIAogCkBAIC0xMjM1LDcgKzEyMzUsNyBAQAogCiAKIAotICAgIEZYX0JPT0wJCQkJCUdldEZpdHRpbmdCb3VuZHMoKTsKKyAgICBib29sCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7CiAKIAogICAgIENQREZfRGljdGlvbmFyeSoJCW1fcERpY3Q7CkBAIC0xMjgzLDkgKzEyODMsOSBAQAogCiAgICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRFeHBvcnRWYWx1ZSgpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNDaGVja2VkKCk7CisgICAgYm9vbAkJCQkJSXNDaGVja2VkKCk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0RlZmF1bHRDaGVja2VkKCk7CisgICAgYm9vbAkJCQkJSXNEZWZhdWx0Q2hlY2tlZCgpOwogCiAKIApAQCAtMTMwMyw3ICsxMzAzLDcgQEAKIAogCiAKLSAgICBGWF9CT09MCQkJCQlIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworICAgIGJvb2wJCQkJCUhhc01LRW50cnkoQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CiAKIAogCkBAIC0xNDM0LDcgKzE0MzQsNyBAQAogCiAgICAgdm9pZAkJCQkJU2V0T25TdGF0ZU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzT24pOwogCi0gICAgdm9pZAkJCQkJQ2hlY2tDb250cm9sKEZYX0JPT0wgYkNoZWNrZWQpOworICAgIHZvaWQJCQkJCUNoZWNrQ29udHJvbChib29sIGJDaGVja2VkKTsKIAogICAgIEZYX0FSR0IJCQkJCUdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CiAKQEAgLTE0NDYsNyArMTQ0Niw3IEBACiAKICAgICBDUERGX1N0cmVhbSoJCQlHZXRJY29uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCi0gICAgQ1BERl9BcFNldHRpbmdzCQkJR2V0TUsoRlhfQk9PTCBiQ3JlYXRlKTsKKyAgICBDUERGX0FwU2V0dGluZ3MJCQlHZXRNSyhib29sIGJDcmVhdGUpOwogCiAgICAgQ1BERl9JbnRlckZvcm0qCQkJbV9wRm9ybTsKIApAQCAtMTUwNyw3ICsxNTA3LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfTsKLUZYX0JPT0wJCUZQREZfR2VuZXJhdGVBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworYm9vbAkJRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CiBjbGFzcyBDUERGX1BhZ2VMYWJlbAogewogcHVibGljOgpAQCAtMTU1OSw5ICsxNTU5LDkgQEAKICAgICB+Q1BERl9WaWV3ZXJQcmVmZXJlbmNlcygpOwogCiAKLSAgICBGWF9CT09MIElzRGlyZWN0aW9uUjJMKCkgY29uc3Q7CisgICAgYm9vbCBJc0RpcmVjdGlvblIyTCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTCBQcmludFNjYWxpbmcoKSBjb25zdDsKKyAgICBib29sIFByaW50U2NhbGluZygpIGNvbnN0OwogCiAgICAgaW50MzJfdCBOdW1Db3BpZXMoKSBjb25zdDsKIApAQCAtMTU4Niw3ICsxNTg2LDcgQEAKICAgICAgICAgcmV0dXJuIG1fcERpY3Q7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJSGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpOworICAgIGJvb2wJCQkJCUhhc01LRW50cnkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKIAogCiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oCmluZGV4IDcwNmY1YzAuLjk3NjFlMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaApAQCAtODUsMTcgKzg1LDE3IEBACiAKICAgICB2aXJ0dWFsIENGWF9QdHJBcnJheSoJCUdldE9iamVjdEFycmF5KCkgPSAwOwogCi0gICAgdmlydHVhbCBDUERGX09iamVjdCoJCUdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBGWF9GTE9BVCBmTGV2ZWwgPSAwLjBGKSA9IDA7CisgICAgdmlydHVhbCBDUERGX09iamVjdCoJCUdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBGWF9GTE9BVCBmTGV2ZWwgPSAwLjBGKSA9IDA7CiAKIAogCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQVJHQiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOworICAgIHZpcnR1YWwgRlhfQVJHQgkJCQlHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOworICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogCi0gICAgdmlydHVhbCBpbnQJCQkJCUdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIGludAkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgKaW5kZXggNGJhYmE0MS4uN2Y4OWU4ZCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaApAQCAtMzksMTIgKzM5LDEyIEBACiAgICAgICAgIG5TZWNJbmRleCA9IG5MaW5lSW5kZXggPSBuV29yZEluZGV4ID0gLTE7CiAgICAgfQogCi0gICAgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHdwLm5TZWNJbmRleCA9PSBuU2VjSW5kZXggJiYgd3AubkxpbmVJbmRleCA9PSBuTGluZUluZGV4ICYmIHdwLm5Xb3JkSW5kZXggPT0gbldvcmRJbmRleDsKICAgICB9CiAKLSAgICBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAorICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3ApIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gd3AublNlY0luZGV4ICE9IG5TZWNJbmRleCB8fCB3cC5uTGluZUluZGV4ICE9IG5MaW5lSW5kZXggfHwgd3AubldvcmRJbmRleCAhPSBuV29yZEluZGV4OwogICAgIH0KQEAgLTE0MiwxMiArMTQyLDEyIEBACiAgICAgICAgIFN3YXBXb3JkUGxhY2UoKTsKICAgICB9CiAKLSAgICBGWF9CT09MIElzRXhpc3QoKSBjb25zdAorICAgIGJvb2wgSXNFeGlzdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gQmVnaW5Qb3MgIT0gRW5kUG9zOwogICAgIH0KIAotICAgIEZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpIGNvbnN0CisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOwogICAgIH0KQEAgLTI5MCw3ICsyOTAsNyBAQAogCiAgICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkgPSAwOwogCiAgICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpID0gMDsKIH07CkBAIC0yOTksMjcgKzI5OSwyNyBAQAogcHVibGljOgogICAgIHZpcnR1YWwgfklQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKCkgeyB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dFdvcmQoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCU5leHRXb3JkKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZXb3JkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2V29yZCgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0TGluZSgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJTmV4dExpbmUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldkxpbmUoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCVByZXZMaW5lKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRTZWN0aW9uKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlOZXh0U2VjdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2U2VjdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJUHJldlNlY3Rpb24oKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCQkJCVNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpID0gMDsKIApAQCAtMzUyLDIzICszNTIsMjMgQEAKIAogICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlMaW5lKGJvb2wgYk11bHRpTGluZSA9IHRydWUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9SZXR1cm4oYm9vbCBiQXV0byA9IHRydWUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UmljaFRleHQoYm9vbCBiUmljaFRleHQpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlJbml0aWFsaXplKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzVmFsaWQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCQkJCUlzVmFsaWQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlSZWFycmFuZ2VBbGwoKSA9IDA7CiAKQEAgLTQxMCw3ICs0MTAsNyBAQAogCiAgICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0TGltaXRDaGFyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTXVsdGlMaW5lKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCQkJCQlJc011bHRpTGluZSgpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCUdldEhvcnpTY2FsZSgpIGNvbnN0ID0gMDsKIApAQCAtNDQwLDcgKzQ0MCw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJVXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUFqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9CT09MIGJQcmV2T3JOZXh0KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJQWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGJvb2wgYlByZXZPck5leHQpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCVdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oCmluZGV4IDA0OTIyYzQuLjhiNTRmMmQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgKQEAgLTYxLDkgKzYxLDkgQEAKIHB1YmxpYzoKIAogICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucygpOwotICAgIEZYX0JPT0wJCQltX2JHZXRDaGFyQ29kZU9ubHk7Ci0gICAgRlhfQk9PTAkJCW1fYk5vcm1hbGl6ZU9ianM7Ci0gICAgRlhfQk9PTAkJCW1fYk91dHB1dEh5cGhlbjsKKyAgICBib29sCQkJbV9iR2V0Q2hhckNvZGVPbmx5OworICAgIGJvb2wJCQltX2JOb3JtYWxpemVPYmpzOworICAgIGJvb2wJCQltX2JPdXRwdXRIeXBoZW47CiB9OwogY2xhc3MgSVBERl9UZXh0UGFnZQogewpAQCAtNzUsMTIgKzc1LDEyIEBACiAgICAgc3RhdGljIElQREZfVGV4dFBhZ2UqCUNyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBpbnQgZmxhZ3MgPSAwKTsKICAgICBzdGF0aWMgSVBERl9UZXh0UGFnZSoJQ3JlYXRlUmVmbG93VGV4dFBhZ2UoSVBERl9SZWZsb3dlZFBhZ2UqIHBSZWZQYWdlKTsKIAotICAgIHZpcnR1YWwgdm9pZAkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCQkJTm9ybWFsaXplT2JqZWN0cyhib29sIGJOb3JtYWxpemUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVBhcnNlVGV4dFBhZ2UoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJUGFyc2VUZXh0UGFnZSgpID0gMDsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNQYXJzZXJlZCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc1BhcnNlcmVkKCkgY29uc3QgPSAwOwogcHVibGljOgogCiAgICAgdmlydHVhbCBpbnQgQ2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdCA9IDA7CkBAIC0xMDksMTEgKzEwOSwxMSBAQAogCiAgICAgdmlydHVhbAl2b2lkCQkJR2V0UmVjdChpbnQgcmVjdEluZGV4LCBGWF9GTE9BVCYgbGVmdCwgRlhfRkxPQVQmIHRvcCwgRlhfRkxPQVQmIHJpZ2h0LCBGWF9GTE9BVCAmYm90dG9tKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUdldEJhc2VsaW5lUm90YXRlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIGludCYgUm90YXRlKSA9IDA7CiAKLSAgICB2aXJ0dWFsCWludAkJCQlDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCBib3R0b20sIEZYX0JPT0wgYkNvbnRhaW5zID0gRkFMU0UpID0gMDsKKyAgICB2aXJ0dWFsCWludAkJCQlDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCBib3R0b20sIGJvb2wgYkNvbnRhaW5zID0gZmFsc2UpID0gMDsKIAogICAgIHZpcnR1YWwJdm9pZAkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QgPSAwOwogCkBAIC0xMzQsMTEgKzEzNCwxMSBAQAogICAgIHN0YXRpYwlJUERGX1RleHRQYWdlRmluZCoJQ3JlYXRlUGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKIHB1YmxpYzoKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcyA9IDApID0gMDsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKSA9IDA7CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJRmluZE5leHQoKSA9IDA7CisgICAgdmlydHVhbAlib29sCQkJCUZpbmROZXh0KCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCUZpbmRQcmV2KCkgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJCQlGaW5kUHJldigpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRSZWN0QXJyYXkoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0ID0gMDsKIApAQCAtMTU0LDcgKzE1NCw3IEBACiAKICAgICBzdGF0aWMJSVBERl9MaW5rRXh0cmFjdCoJQ3JlYXRlTGlua0V4dHJhY3QoKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCUV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpID0gMDsKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgaW50CQkJCQlDb3VudExpbmtzKCkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgKaW5kZXggZTNkNjllNS4uNTUzOTAwOCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oCkBAIC01MSw5ICs1MSw5IEBACiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIH5JQ29kZWNfQmFzaWNNb2R1bGUoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAlSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICB2aXJ0dWFsIGJvb2wJUnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCUE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorICAgIHZpcnR1YWwgYm9vbAlBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKICAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMpID0gMDsKQEAgLTcwLDcgKzcwLDcgQEAKIAogICAgIHZpcnR1YWwgdWludDhfdCoJR2V0U2NhbmxpbmUoaW50IGxpbmUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKIAogICAgIHZpcnR1YWwgaW50CQkJR2V0V2lkdGgoKSA9IDA7CiAKQEAgLTgwLDcgKzgwLDcgQEAKIAogICAgIHZpcnR1YWwgaW50CQkJR2V0QlBDKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc0NvbG9yVHJhbnNmb3JtZWQoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlJc0NvbG9yVHJhbnNmb3JtZWQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCUNsZWFySW1hZ2VEYXRhKCkgPSAwOwogfTsKQEAgLTkxLDEzICs5MSwxMyBAQAogICAgIHZpcnR1YWwgfklDb2RlY19GbGF0ZU1vZHVsZSgpIHt9CiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UsCisgICAgdmlydHVhbCBGWF9EV09SRAlGbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGJvb2wgYkVhcmx5Q2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKIH07CiBjbGFzcyBJQ29kZWNfRmF4TW9kdWxlCiB7CkBAIC0xMDYsMTAgKzEwNiwxMCBAQAogICAgIHZpcnR1YWwgfklDb2RlY19GYXhNb2R1bGUoKSB7fQogCiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKSA9IDA7CisgICAgICAgICAgICBpbnQgSywgYm9vbCBFbmRPZkxpbmUsIGJvb2wgRW5jb2RlZEJ5dGVBbGlnbiwgYm9vbCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoLAorICAgIHZpcnR1YWwgYm9vbAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwogfTsKIGNsYXNzIElDb2RlY19KcGVnTW9kdWxlCkBAIC0xMjEsMTMgKzEyMSwxMyBAQAogICAgIHZpcnR1YWwgdm9pZAkJU2V0UG92aWRlcihJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApID0gMDsKIAogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgPSAwOworICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBib29sIENvbG9yVHJhbnNmb3JtKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAorICAgIHZpcnR1YWwgYm9vbAkJTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBib29sJiBjb2xvcl90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIgPSBOVUxMLCBGWF9EV09SRCogaWNjX2xlbmd0aCA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKGNvbnN0IGNsYXNzIENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSA9IDc1LAorICAgIHZpcnR1YWwgYm9vbAkJRW5jb2RlKGNvbnN0IGNsYXNzIENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSA9IDc1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYgPSBOVUxMLCBGWF9EV09SRCBpY2NfbGVuZ3RoID0gMCkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkKgkJU3RhcnQoKSA9IDA7CkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICB2aXJ0dWFsIGludAkJCVN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSA9IDA7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOwogCiAKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOwpAQCAtMTUzLDEzICsxNTMsMTMgQEAKIAogICAgIHZpcnR1YWwgfklDb2RlY19KcHhNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkKiAJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfQk9PTCB1c2VDb2xvclNwYWNlID0gRkFMU0UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQqIAlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBib29sIHVzZUNvbG9yU3BhY2UgPSBmYWxzZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQlHZXRJbWFnZUluZm8odm9pZCogY3R4LCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcykgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNvZGUodm9pZCogY3R4LCB1aW50OF90KiBkZXN0X2RhdGEsIGludCBwaXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJRGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJRGVzdHJveURlY29kZXIodm9pZCogY3R4KSA9IDA7CiB9OwpAQCAtMTY5LDEwICsxNjksMTAgQEAKIAogICAgIHZpcnR1YWwgfklDb2RlY19KYmlnMk1vZHVsZSgpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIGJvb2wJCURlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKSAgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNvZGUoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LAorICAgIHZpcnR1YWwgYm9vbAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZikgPSAwOwogICAgIHZpcnR1YWwgdm9pZCoJCQkJQ3JlYXRlSmJpZzJDb250ZXh0KCkgPSAwOwogCkBAIC0yNTEsNiArMjUxLDYgQEAKIH07CiB2b2lkIEFkb2JlQ01ZS190b19zUkdCKEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGssIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpOwogdm9pZCBBZG9iZUNNWUtfdG9fc1JHQjEodWludDhfdCBjLCB1aW50OF90IG0sIHVpbnQ4X3QgeSwgdWludDhfdCBrLCB1aW50OF90JiBSLCB1aW50OF90JiBHLCB1aW50OF90JiBCKTsKLUZYX0JPT0wgTUQ1Q29tcHV0ZUlEKGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSk7Citib29sIE1ENUNvbXB1dGVJRChjb25zdCB2b2lkKiBidWYsIEZYX0RXT1JEIGR3U2l6ZSwgdWludDhfdCBJRFsxNl0pOwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENPREVDX0ZYX0NPREVDX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaAppbmRleCAwYjIzOGI3Li5hYzY5ZjlhIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgKQEAgLTE0LDI1ICsxNCwyNSBAQAogcHVibGljOgogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCoJCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCoJCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgYm9vbCBDb2xvclRyYW5zZm9ybSkgPSAwOwogCiAKICAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIHBEZWNvZGVyKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCURvd25TY2FsZSh2b2lkKiBwRGVjb2RlciwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZXdpbmQodm9pZCogcERlY29kZXIpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCVJld2luZCh2b2lkKiBwRGVjb2RlcikgPSAwOwogCiAgICAgdmlydHVhbCB1aW50OF90KglHZXROZXh0TGluZSh2b2lkKiBwRGVjb2RlcikgPSAwOwogCiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQodm9pZCogcERlY29kZXIpID0gMDsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQlMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICB2aXJ0dWFsIGJvb2wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgYm9vbCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyID0gTlVMTCwgRlhfRFdPUkQqIGljY19sZW5ndGggPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpY2NfYnVmID0gTlVMTCwgRlhfRFdPUkQgaWNjX2xlbmd0aCA9IDApID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KCkgPSAwOwpAQCAtNDcsNyArNDcsNyBAQAogICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpID0gMDsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKSA9IDA7CiAKIAogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgKaW5kZXggN2NlMjFlNS4uNWM0MTczOCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaApAQCAtMTUsOSArMTUsOSBAQAogICAgIHN0YXRpYyBJRlhfQmlkaUNoYXIqIENyZWF0ZSgpOwogICAgIHZpcnR1YWwgfklGWF9CaWRpQ2hhcigpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgU2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCA9IFRSVUUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgRW5kQ2hhcigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgU2V0UG9saWN5KGJvb2wgYlNlcGFyYXRlTmV1dHJhbCA9IHRydWUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgRW5kQ2hhcigpID0gMDsKICAgICB2aXJ0dWFsIGludDMyX3QgR2V0QmlkaUluZm8oaW50MzJfdCAmaVN0YXJ0LCBpbnQzMl90ICZpQ291bnQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaAppbmRleCBkNTc1ZGY2Li5jMjcyZWI1IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaApAQCAtMjE4LDkgKzIxOCw5IEBACiAKICAgICBDRlhfQXJjaGl2ZUxvYWRlciYJCW9wZXJhdG9yID4+IChDRlhfV2lkZVN0cmluZyYgd3N0cik7CiAKLSAgICBGWF9CT09MCQkJCQlJc0VPRigpOworICAgIGJvb2wJCQkJCUlzRU9GKCk7CiAKLSAgICBGWF9CT09MCQkJCQlSZWFkKHZvaWQqIHBCdWYsIEZYX0RXT1JEIGR3U2l6ZSk7CisgICAgYm9vbAkJCQkJUmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpOwogcHJvdGVjdGVkOgogCiAgICAgRlhfRFdPUkQJCQkJbV9Mb2FkaW5nUG9zOwpAQCAtMjM5LDcgKzIzOSw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKTsKIAotICAgIEZYX0JPT0wgRmx1c2goKTsKKyAgICBib29sIEZsdXNoKCk7CiAKICAgICBpbnQzMl90IEFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKTsKIApAQCAtMjUyLDcgKzI1Miw3IEBACiAKIHByb3RlY3RlZDoKIAotICAgIHZpcnR1YWwgRlhfQk9PTCBEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSA9IDA7CiAKICAgICBGWF9TVFJTSVpFIG1fQnVmU2l6ZTsKIApAQCAtMjY5LDE4ICsyNjksMTggQEAKIAogICAgIHZvaWQgQ2xlYXIoKSBvdmVycmlkZTsKIAotICAgIEZYX0JPT0wgQXR0YWNoRmlsZShJRlhfU3RyZWFtV3JpdGUgKnBGaWxlLCBGWF9CT09MIGJUYWtlb3ZlciA9IEZBTFNFKTsKKyAgICBib29sIEF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgYm9vbCBiVGFrZW92ZXIgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MIEF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKTsKKyAgICBib29sIEF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKTsKIAotICAgIEZYX0JPT0wgQXR0YWNoRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSk7CisgICAgYm9vbCBBdHRhY2hGaWxlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lKTsKIAogcHJpdmF0ZToKLSAgICBGWF9CT09MIERvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCiAgICAgSUZYX1N0cmVhbVdyaXRlKiBtX3BGaWxlOwogCi0gICAgRlhfQk9PTCBtX2JUYWtlb3ZlcjsKKyAgICBib29sIG1fYlRha2VvdmVyOwogfTsKIAogc3RydWN0IENGWF9DaGFyTWFwIHsKQEAgLTM2MiwxNyArMzYyLDE3IEBACiAKICAgICB+Q0ZYX0Jhc2ljQXJyYXkoKTsKIAotICAgIEZYX0JPT0wJCQlTZXRTaXplKGludCBuTmV3U2l6ZSk7CisgICAgYm9vbAkJCVNldFNpemUoaW50IG5OZXdTaXplKTsKIAotICAgIEZYX0JPT0wJCQlBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CisgICAgYm9vbAkJCUFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKIAotICAgIEZYX0JPT0wJCQlDb3B5KGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpOworICAgIGJvb2wJCQlDb3B5KGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpOwogCiAgICAgdWludDhfdCoJCUluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCk7CiAKLSAgICBGWF9CT09MCQkJUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCk7CisgICAgYm9vbAkJCVJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOwogCi0gICAgRlhfQk9PTAkJCUluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSk7CisgICAgYm9vbAkJCUluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSk7CiAKICAgICBjb25zdCB2b2lkKgkJR2V0RGF0YVB0cihpbnQgaW5kZXgpIGNvbnN0OwogcHJvdGVjdGVkOgpAQCAtNDAxLDcgKzQwMSw3IEBACiAgICAgICAgIHJldHVybiBtX25TaXplIC0gMTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlTZXRTaXplKGludCBuTmV3U2l6ZSkKKyAgICBib29sCQlTZXRTaXplKGludCBuTmV3U2l6ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShuTmV3U2l6ZSk7CiAgICAgfQpAQCAtNDE5LDEzICs0MTksMTMgQEAKICAgICAgICAgcmV0dXJuICgoY29uc3QgVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlTZXRBdChpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpCisgICAgYm9vbAkJU2V0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQogICAgIHsKICAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleF0gPSBuZXdFbGVtZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgVFlQRSYJCUVsZW1lbnRBdChpbnQgbkluZGV4KQpAQCAtNDQ2LDM2ICs0NDYsMzYgQEAKICAgICAgICAgcmV0dXJuIChUWVBFKiltX3BEYXRhOwogICAgIH0KIAotICAgIEZYX0JPT0wJCVNldEF0R3JvdyhpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpCisgICAgYm9vbAkJU2V0QXRHcm93KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCkKICAgICB7CiAgICAgICAgIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5JbmRleCA+PSBtX25TaXplKQogICAgICAgICAgICAgaWYgKCFTZXRTaXplKG5JbmRleCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdID0gbmV3RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIEZYX0JPT0wJCUFkZChUWVBFIG5ld0VsZW1lbnQpCisgICAgYm9vbAkJQWRkKFRZUEUgbmV3RWxlbWVudCkKICAgICB7CiAgICAgICAgIGlmIChtX25TaXplIDwgbV9uTWF4U2l6ZSkgewogICAgICAgICAgICAgbV9uU2l6ZSArKzsKICAgICAgICAgfSBlbHNlIGlmICghU2V0U2l6ZShtX25TaXplICsgMSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICAoKFRZUEUqKW1fcERhdGEpW21fblNpemUgLSAxXSA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlBcHBlbmQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKKyAgICBib29sCQlBcHBlbmQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKICAgICB7CiAgICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6QXBwZW5kKHNyYyk7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJQ29weShjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZSYgc3JjKQorICAgIGJvb2wJCUNvcHkoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKICAgICB7CiAgICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6Q29weShzcmMpOwogICAgIH0KQEAgLTUxMSwyMyArNTExLDIzIEBACiAgICAgICAgIHJldHVybiAoKFRZUEUqKW1fcERhdGEpW25JbmRleF07CiAgICAgfQogCi0gICAgRlhfQk9PTAkJSW5zZXJ0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50LCBpbnQgbkNvdW50ID0gMSkKKyAgICBib29sCQlJbnNlcnRBdChpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQsIGludCBuQ291bnQgPSAxKQogICAgIHsKICAgICAgICAgaWYgKCFJbnNlcnRTcGFjZUF0KG5JbmRleCwgbkNvdW50KSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChuQ291bnQtLSkgewogICAgICAgICAgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXgrK10gPSBuZXdFbGVtZW50OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50ID0gMSkKKyAgICBib29sCQlSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50ID0gMSkKICAgICB7CiAgICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6UmVtb3ZlQXQobkluZGV4LCBuQ291bnQpOwogICAgIH0KIAotICAgIEZYX0JPT0wJCUluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkKKyAgICBib29sCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCiAgICAgewogICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydEF0KG5TdGFydEluZGV4LCBwTmV3QXJyYXkpOwogICAgIH0KQEAgLTcwMCw3ICs3MDAsNyBAQAogICAgICAgICByZXR1cm4gbV9Vbml0U2l6ZTsKICAgICB9CiAKLSAgICB2b2lkKglJdGVyYXRlKEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OworICAgIHZvaWQqCUl0ZXJhdGUoYm9vbCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3Q7CiBwcml2YXRlOgogCiAgICAgaW50CQkJCW1fVW5pdFNpemU7CkBAIC03MTUsOCArNzE1LDggQEAKIAogICAgIHZvaWQqCQkJbV9wSW5kZXg7CiAgICAgdm9pZCoqCUdldEluZGV4KGludCBzZWdfaW5kZXgpIGNvbnN0OwotICAgIHZvaWQqCUl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwotICAgIHZvaWQqCUl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LCBpbnQgY291bnQsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OworICAgIHZvaWQqCUl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIGJvb2wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OworICAgIHZvaWQqCUl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LCBpbnQgY291bnQsIGJvb2wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwogfTsKIHRlbXBsYXRlIDxjbGFzcyBFbGVtZW50VHlwZT4KIGNsYXNzIENGWF9TZWdtZW50ZWRBcnJheSA6IHB1YmxpYyBDRlhfQmFzZVNlZ21lbnRlZEFycmF5CkBAIC03OTgsMTIgKzc5OCwxMiBAQAogICAgICAgICByZXR1cm4gbV9uQ291bnQ7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QKKyAgICBib29sIElzRW1wdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fbkNvdW50ID09IDA7CiAgICAgfQogCi0gICAgRlhfQk9PTCBMb29rdXAodm9pZCoga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgICBib29sIExvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OwogCiAgICAgdm9pZCogR2V0VmFsdWVBdCh2b2lkKiBrZXkpIGNvbnN0OwogCkBAIC04MTQsNyArODE0LDcgQEAKICAgICAgICAgKCp0aGlzKVtrZXldID0gbmV3VmFsdWU7CiAgICAgfQogCi0gICAgRlhfQk9PTCBSZW1vdmVLZXkodm9pZCoga2V5KTsKKyAgICBib29sIFJlbW92ZUtleSh2b2lkKiBrZXkpOwogCiAgICAgdm9pZCBSZW1vdmVBbGwoKTsKIApAQCAtODMwLDcgKzgzMCw3IEBACiAgICAgICAgIHJldHVybiBtX25IYXNoVGFibGVTaXplOwogICAgIH0KIAotICAgIHZvaWQgSW5pdEhhc2hUYWJsZShGWF9EV09SRCBoYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cgPSBUUlVFKTsKKyAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIGJvb2wgYkFsbG9jTm93ID0gdHJ1ZSk7CiBwcm90ZWN0ZWQ6CiAKICAgICBDQXNzb2MqKiBtX3BIYXNoVGFibGU7CkBAIC04NTgsNyArODU4LDcgQEAKIHsKIHB1YmxpYzoKIAotICAgIEZYX0JPT0wJCQlMb29rdXAoRlhfRFdPUkQga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0OworICAgIGJvb2wJCQlMb29rdXAoRlhfRFdPUkQga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0OwogCiAgICAgdm9pZAkJCVNldEF0KEZYX0RXT1JEIGtleSwgRlhfRFdPUkQgdmFsdWUpOwogCkBAIC04OTMsMTIgKzg5MywxMiBAQAogICAgICAgICByZXR1cm4gbV9uQ291bnQ7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QKKyAgICBib29sIElzRW1wdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fbkNvdW50ID09IDA7CiAgICAgfQogCi0gICAgRlhfQk9PTCBMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OworICAgIGJvb2wgTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAogICAgIHZvaWQqJiBvcGVyYXRvcltdKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KTsKIApAQCAtOTA3LDcgKzkwNyw3IEBACiAgICAgICAgICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOwogICAgIH0KIAotICAgIEZYX0JPT0wgUmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KTsKKyAgICBib29sIFJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSk7CiAKICAgICB2b2lkIFJlbW92ZUFsbCgpOwogCkBAIC05MjUsNyArOTI1LDcgQEAKICAgICAgICAgcmV0dXJuIG1fbkhhc2hUYWJsZVNpemU7CiAgICAgfQogCi0gICAgdm9pZCBJbml0SGFzaFRhYmxlKEZYX0RXT1JEIGhhc2hTaXplLCBGWF9CT09MIGJBbGxvY05vdyA9IFRSVUUpOworICAgIHZvaWQgSW5pdEhhc2hUYWJsZShGWF9EV09SRCBoYXNoU2l6ZSwgYm9vbCBiQWxsb2NOb3cgPSB0cnVlKTsKIAogICAgIEZYX0RXT1JEIEhhc2hLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogcHJvdGVjdGVkOgpAQCAtOTY2LDcgKzk2Niw3IEBACiAKICAgICB2b2lkKgkJR2V0TmV4dFZhbHVlKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OworICAgIGJvb2wJCQlMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OwogCiAgICAgdm9pZAkJCVNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiB2YWx1ZSk7CiAKQEAgLTEwOTAsNyArMTA5MCw3IEBACiAKICAgICBQRF9DQUxMQkFDS19GUkVFREFUQQltX3BDYWxsYmFjazsKIAotICAgIEZYX0JPT0wJCQkJCW1fYlNlbGZEZXN0cnVjdDsKKyAgICBib29sCQkJCQltX2JTZWxmRGVzdHJ1Y3Q7CiB9OwogY2xhc3MgQ0ZYX1ByaXZhdGVEYXRhCiB7CkBAIC0xMTA2LDI3ICsxMTA2LDI3IEBACiAKICAgICB2b2lkKgkJCQlHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9va3VwUHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiAmcERhdGEpIGNvbnN0CisgICAgYm9vbAkJCQkJTG9va3VwUHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiAmcERhdGEpIGNvbnN0CiAgICAgewogICAgICAgICBpZiAoIW1vZHVsZV9pZCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX0RXT1JEIG5Db3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOwogICAgICAgICBmb3IgKEZYX0RXT1JEIG4gPSAwOyBuIDwgbkNvdW50OyBuICsrKSB7CiAgICAgICAgICAgICBpZiAobV9EYXRhTGlzdFtuXS5tX3BNb2R1bGVJZCA9PSBtb2R1bGVfaWQpIHsKICAgICAgICAgICAgICAgICBwRGF0YSA9IG1fRGF0YUxpc3Rbbl0ubV9wRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOworICAgIGJvb2wJCQkJCVJlbW92ZVByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCk7CiBwcm90ZWN0ZWQ6CiAKICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9QUklWQVRFREFUQT4JbV9EYXRhTGlzdDsKIAotICAgIHZvaWQJCQkJCUFkZERhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssIEZYX0JPT0wgYlNlbGZEZXN0cnVjdCk7CisgICAgdm9pZAkJCQkJQWRkRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaywgYm9vbCBiU2VsZkRlc3RydWN0KTsKIH07CiBjbGFzcyBDRlhfQml0U3RyZWFtCiB7CkBAIC0xMTM5LDcgKzExMzksNyBAQAogCiAgICAgdm9pZAkJCQlCeXRlQWxpZ24oKTsKIAotICAgIEZYX0JPT0wJCQkJSXNFT0YoKQorICAgIGJvb2wJCQkJSXNFT0YoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fQml0UG9zID49IG1fQml0U2l6ZTsKICAgICB9CkBAIC0xMjUyLDEyICsxMjUyLDEyIEBACiAgICAgICAgIHJldHVybiBtX3BPYmplY3Q7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQlJc051bGwoKSBjb25zdAorICAgIGJvb2wJCQkJSXNOdWxsKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BPYmplY3QgPT0gTlVMTDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCU5vdE51bGwoKSBjb25zdAorICAgIGJvb2wJCQkJTm90TnVsbCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9wT2JqZWN0ICE9IE5VTEw7CiAgICAgfQpAQCAtMTI4OCw3ICsxMjg4LDcgQEAKICAgICAgICAgbV9wT2JqZWN0ID0gTlVMTDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCW9wZXJhdG9yID09IChjb25zdCBSZWYmIHJlZikgY29uc3QKKyAgICBib29sCQkJCW9wZXJhdG9yID09IChjb25zdCBSZWYmIHJlZikgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BPYmplY3QgPT0gcmVmLm1fcE9iamVjdDsKICAgICB9CkBAIC0xMzAwLDcgKzEzMDAsNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgfklGWF9QYXVzZSgpIHsgfQotICAgIHZpcnR1YWwgRlhfQk9PTAlOZWVkVG9QYXVzZU5vdygpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJTmVlZFRvUGF1c2VOb3coKSA9IDA7CiB9OwogY2xhc3MgQ0ZYX0RhdGFGaWx0ZXIKIHsKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAKICAgICB2b2lkCQkJU2V0RGVzdEZpbHRlcihDRlhfRGF0YUZpbHRlciogcEZpbHRlcik7CiAKLSAgICBGWF9CT09MCQkJSXNFT0YoKSBjb25zdAorICAgIGJvb2wJCQlJc0VPRigpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iRU9GOwogICAgIH0KQEAgLTEzMzAsNyArMTMzMCw3IEBACiAgICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CiAgICAgdm9pZAkJCVJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KTsKIAotICAgIEZYX0JPT0wJCQltX2JFT0Y7CisgICAgYm9vbAkJCW1fYkVPRjsKIAogICAgIEZYX0RXT1JECQltX1NyY1BvczsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaAppbmRleCAzNjg5YTRiLi42ZWRhZjUzIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaApAQCAtNjgsMTEgKzY4LDExIEBACiAgICAgICAgIHkgLz0gbGFtZGE7CiAgICAgICAgIHJldHVybiAqdGhpczsKICAgICB9Ci0gICAgZnJpZW5kCUZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBGWFRfUFNWICZvYmoxLCBjb25zdCBGWFRfUFNWICZvYmoyKQorICAgIGZyaWVuZAlib29sCQlvcGVyYXRvciA9PSAoY29uc3QgRlhUX1BTViAmb2JqMSwgY29uc3QgRlhUX1BTViAmb2JqMikKICAgICB7CiAgICAgICAgIHJldHVybiBvYmoxLnggPT0gb2JqMi54ICYmIG9iajEueSA9PSBvYmoyLnk7CiAgICAgfQotICAgIGZyaWVuZAlGWF9CT09MCQlvcGVyYXRvciAhPSAoY29uc3QgRlhUX1BTViAmb2JqMSwgY29uc3QgRlhUX1BTViAmb2JqMikKKyAgICBmcmllbmQJYm9vbAkJb3BlcmF0b3IgIT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCiAgICAgewogICAgICAgICByZXR1cm4gb2JqMS54ICE9IG9iajIueCB8fCBvYmoxLnkgIT0gb2JqMi55OwogICAgIH0KQEAgLTE3NCwyMSArMTc0LDIxIEBACiAgICAgewogICAgICAgICByZXR1cm4gRlhUX1BTVjo6eCAqIHYueCArIEZYVF9QU1Y6OnkgKiB2Lnk7CiAgICAgfQotICAgIEZYX0JPT0wJCUlzUGFyYWxsZWwoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0CisgICAgYm9vbAkJSXNQYXJhbGxlbChiYXNlVHlwZSBvdGhlcngsIGJhc2VUeXBlIG90aGVyeSkgY29uc3QKICAgICB7CiAgICAgICAgIGJhc2VUeXBlIHQgPSBGWFRfUFNWOjp4ICogb3RoZXJ5IC0gRlhUX1BTVjo6eSAqIG90aGVyeDsKICAgICAgICAgcmV0dXJuIEZYU1lTX2ZhYnModCkgPCAweDAwMDFmOwogICAgIH0KLSAgICBGWF9CT09MCQlJc1BhcmFsbGVsKGNvbnN0IEZYVF9WRUNUT1IgJnYpIGNvbnN0CisgICAgYm9vbAkJSXNQYXJhbGxlbChjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIElzUGFyYWxsZWwodi54LCB2LnkpOwogICAgIH0KLSAgICBGWF9CT09MCQlJc1BlcnBlbmRpY3VsYXIoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0CisgICAgYm9vbAkJSXNQZXJwZW5kaWN1bGFyKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAogICAgIHsKICAgICAgICAgYmFzZVR5cGUgdCA9IERvdFByb2R1Y3Qob3RoZXJ4LCBvdGhlcnkpOwogICAgICAgICByZXR1cm4gRlhTWVNfZmFicyh0KSA8IDB4MDAwMWY7CiAgICAgfQotICAgIEZYX0JPT0wJCUlzUGVycGVuZGljdWxhcihjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAorICAgIGJvb2wJCUlzUGVycGVuZGljdWxhcihjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIElzUGVycGVuZGljdWxhcih2LngsIHYueSk7CiAgICAgfQpAQCAtMzQwLDExICszNDAsMTEgQEAKICAgICB7CiAgICAgICAgIERlZmxhdGUocnQubGVmdCwgcnQudG9wLCBydC50b3AgKyBydC53aWR0aCwgcnQudG9wICsgcnQuaGVpZ2h0KTsKICAgICB9Ci0gICAgRlhfQk9PTAkJSXNFbXB0eSgpIGNvbnN0CisgICAgYm9vbAkJSXNFbXB0eSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMDsKICAgICB9Ci0gICAgRlhfQk9PTAkJSXNFbXB0eShGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QKKyAgICBib29sCQlJc0VtcHR5KEZYX0ZMT0FUIGZFcHNpbG9uKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHdpZHRoIDw9IGZFcHNpbG9uIHx8IGhlaWdodCA8PSBmRXBzaWxvbjsKICAgICB9CkBAIC0zNTIsMTUgKzM1MiwxNSBAQAogICAgIHsKICAgICAgICAgd2lkdGggPSBoZWlnaHQgPSAwOwogICAgIH0KLSAgICBGWF9CT09MCQlDb250YWlucyhiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSBjb25zdAorICAgIGJvb2wJCUNvbnRhaW5zKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4geCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodDsKICAgICB9Ci0gICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhUX1BPSU5UICZwKSBjb25zdAorICAgIGJvb2wJCUNvbnRhaW5zKGNvbnN0IEZYVF9QT0lOVCAmcCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBDb250YWlucyhwLngsIHAueSk7CiAgICAgfQotICAgIEZYX0JPT0wJCUNvbnRhaW5zKGNvbnN0IEZYVF9SRUNUICZydCkgY29uc3QKKyAgICBib29sCQlDb250YWlucyhjb25zdCBGWFRfUkVDVCAmcnQpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gcnQubGVmdCA+PSBsZWZ0ICYmIHJ0LnJpZ2h0KCkgPD0gcmlnaHQoKSAmJiBydC50b3AgPj0gdG9wICYmIHJ0LmJvdHRvbSgpIDw9IGJvdHRvbSgpOwogICAgIH0KQEAgLTUwMSwyMyArNTAxLDIzIEBACiAgICAgICAgIHdpZHRoID0gciAtIGxlZnQ7CiAgICAgICAgIGhlaWdodCA9IGIgLSB0b3A7CiAgICAgfQotICAgIEZYX0JPT0wJCUludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QgJnJ0KSBjb25zdAorICAgIGJvb2wJCUludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QgJnJ0KSBjb25zdAogICAgIHsKICAgICAgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OwogICAgICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CiAgICAgICAgIHJldHVybiAhcmVjdC5Jc0VtcHR5KCk7CiAgICAgfQotICAgIEZYX0JPT0wJCUludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QgJnJ0LCBGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QKKyAgICBib29sCQlJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUICZydCwgRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0CiAgICAgewogICAgICAgICBGWFRfUkVDVCByZWN0ID0gcnQ7CiAgICAgICAgIHJlY3QuSW50ZXJzZWN0KCp0aGlzKTsKICAgICAgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoZkVwc2lsb24pOwogICAgIH0KLSAgICBmcmllbmQJRlhfQk9PTAlvcGVyYXRvciA9PSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKKyAgICBmcmllbmQJYm9vbAlvcGVyYXRvciA9PSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKICAgICB7CiAgICAgICAgIHJldHVybiByYzEubGVmdCA9PSByYzIubGVmdCAmJiByYzEudG9wID09IHJjMi50b3AgJiYgcmMxLndpZHRoID09IHJjMi53aWR0aCAmJiByYzEuaGVpZ2h0ID09IHJjMi5oZWlnaHQ7CiAgICAgfQotICAgIGZyaWVuZAlGWF9CT09MCW9wZXJhdG9yICE9IChjb25zdCBGWFRfUkVDVCAmcmMxLCBjb25zdCBGWFRfUkVDVCAmcmMyKQorICAgIGZyaWVuZAlib29sCW9wZXJhdG9yICE9IChjb25zdCBGWFRfUkVDVCAmcmMxLCBjb25zdCBGWFRfUkVDVCAmcmMyKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJjMS5sZWZ0ICE9IHJjMi5sZWZ0IHx8IHJjMS50b3AgIT0gcmMyLnRvcCB8fCByYzEud2lkdGggIT0gcmMyLndpZHRoIHx8IHJjMS5oZWlnaHQgIT0gcmMyLmhlaWdodDsKICAgICB9CkBAIC01NjEsNyArNTYxLDcgQEAKICAgICAgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKICAgICB9CiAKLSAgICBGWF9CT09MCQlJc0VtcHR5KCkgY29uc3QKKyAgICBib29sCQlJc0VtcHR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiByaWdodCA8PSBsZWZ0IHx8IGJvdHRvbSA8PSB0b3A7CiAgICAgfQpAQCAtNTc3LDcgKzU3Nyw3IEBACiAKICAgICB2b2lkCQlVbmlvbihjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KTsKIAotICAgIEZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBGWF9SRUNUJiBzcmMpIGNvbnN0CisgICAgYm9vbAkJb3BlcmF0b3IgPT0gKGNvbnN0IEZYX1JFQ1QmIHNyYykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBsZWZ0ID09IHNyYy5sZWZ0ICYmIHJpZ2h0ID09IHNyYy5yaWdodCAmJiB0b3AgPT0gc3JjLnRvcCAmJiBib3R0b20gPT0gc3JjLmJvdHRvbTsKICAgICB9CkBAIC01OTAsMTIgKzU5MCwxMiBAQAogICAgICAgICBib3R0b20gKz0gZHk7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCkgY29uc3QKKyAgICBib29sCQlDb250YWlucyhjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG90aGVyX3JlY3QubGVmdCA+PSBsZWZ0ICYmIG90aGVyX3JlY3QucmlnaHQgPD0gcmlnaHQgJiYgb3RoZXJfcmVjdC50b3AgPj0gdG9wICYmIG90aGVyX3JlY3QuYm90dG9tIDw9IGJvdHRvbTsKICAgICB9CiAKLSAgICBGWF9CT09MCQlDb250YWlucyhpbnQgeCwgaW50IHkpIGNvbnN0CisgICAgYm9vbAkJQ29udGFpbnMoaW50IHgsIGludCB5KSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIHggPj0gbGVmdCAmJiB4IDwgcmlnaHQgJiYgeSA+PSB0b3AgJiYgeSA8IGJvdHRvbTsKICAgICB9CkBAIC02MzcsNyArNjM3LDcgQEAKIAogICAgIENGWF9GbG9hdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCk7CiAKLSAgICBGWF9CT09MCQkJCUlzRW1wdHkoKSBjb25zdAorICAgIGJvb2wJCQkJSXNFbXB0eSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodCB8fCBib3R0b20gPj0gdG9wOwogICAgIH0KQEAgLTY0OSw5ICs2NDksOSBAQAogICAgICAgICBsZWZ0ID0gcmlnaHQgPSBib3R0b20gPSB0b3AgPSAwOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJQ29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3Q7CisgICAgYm9vbAkJCQlDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJQ29udGFpbnMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgY29uc3Q7CisgICAgYm9vbAkJCQlDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdDsKIAogICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogCkBAIC03ODYsMTEgKzc4NiwxMSBAQAogCiAgICAgdm9pZAkJCVNldFJldmVyc2UoY29uc3QgQ0ZYX01hdHJpeCAmbSk7CiAKLSAgICB2b2lkCQkJQ29uY2F0KEZYX0ZMT0FUIGEsIEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIGQsIEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYsIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJQ29uY2F0KEZYX0ZMT0FUIGEsIEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIGQsIEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYsIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQJCQlDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCAmbSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICAgIHZvaWQJCQlDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCAmbSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwogCi0gICAgdm9pZAkJCUNvbmNhdEludmVyc2UoY29uc3QgQ0ZYX01hdHJpeCYgbSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICAgIHZvaWQJCQlDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0sIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKICAgICB2b2lkCQkJUmVzZXQoKQogICAgIHsKICAgICAgICAgU2V0SWRlbnRpdHkoKTsKQEAgLTgwMSwzMCArODAxLDMwIEBACiAgICAgICAgICp0aGlzID0gbTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJSXNJZGVudGl0eSgpIGNvbnN0CisgICAgYm9vbAkJCUlzSWRlbnRpdHkoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIGEgPT0gMSAmJiBiID09IDAgJiYgYyA9PSAwICYmIGQgPT0gMSAmJiBlID09IDAgJiYgZiA9PSAwOwogICAgIH0KLSAgICBGWF9CT09MCQkJSXNJbnZlcnRpYmxlKCkgY29uc3Q7CisgICAgYm9vbAkJCUlzSW52ZXJ0aWJsZSgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUlzOTBSb3RhdGVkKCkgY29uc3Q7CisgICAgYm9vbAkJCUlzOTBSb3RhdGVkKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJSXNTY2FsZWQoKSBjb25zdDsKKyAgICBib29sCQkJSXNTY2FsZWQoKSBjb25zdDsKIAotICAgIHZvaWQJCQlUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICAgIHZvaWQJCQlUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwogCi0gICAgdm9pZAkJCVRyYW5zbGF0ZUkoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKQorICAgIHZvaWQJCQlUcmFuc2xhdGVJKGludDMyX3QgeCwgaW50MzJfdCB5LCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSkKICAgICB7CiAgICAgICAgIFRyYW5zbGF0ZSgoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksIGJQcmVwZW5kZWQpOwogICAgIH0KIAotICAgIHZvaWQJCQlTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJU2NhbGUoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5LCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkCQkJUm90YXRlKEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgICB2b2lkCQkJUm90YXRlKEZYX0ZMT0FUIGZSYWRpYW4sIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQJCQlSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgICAgdm9pZAkJCVJvdGF0ZUF0KEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQJCQlTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgICAgdm9pZAkJCVNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwgRlhfRkxPQVQgZkJldGFSYWRpYW4sIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKIAogICAgIHZvaWQJCQlNYXRjaFJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCAmZGVzdCwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCAmc3JjKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oCmluZGV4IGYyNGY0NTQuLmEwNGZjNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgKQEAgLTIxLDExICsyMSwxMSBAQAogaW50MzJfdAkJRlhTWVNfd2NzbmljbXAoY29uc3QgRlhfV0NIQVIqIHMxLCBjb25zdCBGWF9XQ0hBUiogczIsIHNpemVfdCBjb3VudCk7CiBpbnQzMl90CQlGWFNZU19zdHJuaWNtcChjb25zdCBGWF9DSEFSKiBzMSwgY29uc3QgRlhfQ0hBUiogczIsIHNpemVfdCBjb3VudCk7CiAKLWlubGluZSBGWF9CT09MCUZYU1lTX2lzbG93ZXIoaW50MzJfdCBjaCkKK2lubGluZSBib29sCUZYU1lTX2lzbG93ZXIoaW50MzJfdCBjaCkKIHsKICAgICByZXR1cm4gY2ggPj0gJ2EnICYmIGNoIDw9ICd6JzsKIH0KLWlubGluZSBGWF9CT09MCUZYU1lTX2lzdXBwZXIoaW50MzJfdCBjaCkKK2lubGluZSBib29sCUZYU1lTX2lzdXBwZXIoaW50MzJfdCBjaCkKIHsKICAgICByZXR1cm4gY2ggPj0gJ0EnICYmIGNoIDw9ICdaJzsKIH0KQEAgLTM4LDggKzM4LDggQEAKICAgICByZXR1cm4gY2ggPCAnYScgfHwgY2ggPiAneicgPyBjaCA6IChjaCAtIDB4MjApOwogfQogCi1GWF9EV09SRAlGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UgPSBGQUxTRSk7Ci1GWF9EV09SRAlGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpOworRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBib29sIGJJZ25vcmVDYXNlID0gZmFsc2UpOworRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgYm9vbCBiSWdub3JlQ2FzZSA9IGZhbHNlKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgKaW5kZXggZmRkN2IxMS4uYjA1ZTg0ZCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaApAQCAtMTEsOCArMTEsOCBAQAogCiB2b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX0NIQVIqIHBhdGgpOwogdm9pZCogRlhfT3BlbkZvbGRlcihjb25zdCBGWF9XQ0hBUiogcGF0aCk7Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKTsKLUZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsIEZYX0JPT0wmIGJGb2xkZXIpOworYm9vbCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwgYm9vbCYgYkZvbGRlcik7Citib29sIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBib29sJiBiRm9sZGVyKTsKIHZvaWQgRlhfQ2xvc2VGb2xkZXIodm9pZCogaGFuZGxlKTsKIEZYX1dDSEFSIEZYX0dldEZvbGRlclNlcGFyYXRvcigpOwogdHlwZWRlZiBzdHJ1Y3QgRlhfSEZJTEVfIHsKQEAgLTUzLDIzICs1MywyMyBAQAogc2l6ZV90CQlGWF9GaWxlX1JlYWRQb3MoRlhfSEZJTEUgaEZpbGUsIHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKIHNpemVfdAkJRlhfRmlsZV9Xcml0ZShGWF9IRklMRSBoRmlsZSwgY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKIHNpemVfdAkJRlhfRmlsZV9Xcml0ZVBvcyhGWF9IRklMRSBoRmlsZSwgY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotRlhfQk9PTAkJRlhfRmlsZV9GbHVzaChGWF9IRklMRSBoRmlsZSk7Ci1GWF9CT09MCQlGWF9GaWxlX1RydW5jYXRlKEZYX0hGSUxFIGhGaWxlLCBGWF9GSUxFU0laRSBzekZpbGUpOwotRlhfQk9PTAkJRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSk7Ci1GWF9CT09MCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOwotRlhfQk9PTAkJRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworYm9vbAkJRlhfRmlsZV9GbHVzaChGWF9IRklMRSBoRmlsZSk7Citib29sCQlGWF9GaWxlX1RydW5jYXRlKEZYX0hGSUxFIGhGaWxlLCBGWF9GSUxFU0laRSBzekZpbGUpOworYm9vbAkJRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKK2Jvb2wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSk7Citib29sCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKK2Jvb2wJCUZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOworYm9vbAkJRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworYm9vbAkJRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworYm9vbAkJRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworYm9vbAkJRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwogY2xhc3MgSUZYX1N0cmVhbVdyaXRlCiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+SUZYX1N0cmVhbVdyaXRlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpID0gMDsKIH07CiBjbGFzcyBJRlhfRmlsZVdyaXRlIDogcHVibGljIElGWF9TdHJlYW1Xcml0ZQogewpAQCAtNzksMTAgKzc5LDEwIEBACiAKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRTaXplKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJRmx1c2goKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJRmx1c2goKSA9IDA7CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpCisgICAgdmlydHVhbAlib29sCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwJYm9vbAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKQogICAgIHsKICAgICAgICAgcmV0dXJuIFdyaXRlQmxvY2socERhdGEsIEdldFNpemUoKSwgc2l6ZSk7CiAgICAgfQpAQCAtOTYsNyArOTYsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUlzRU9GKCkgPSAwOwogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKSA9IDA7CiAKQEAgLTEwOSw5ICsxMDksOSBAQAogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0U2l6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRQb3NpdGlvbigpCkBAIC0xMTksMTQgKzExOSwxNCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpCisgICAgdmlydHVhbCBib29sCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkCQkJQ2xlYXJSYW5nZSgpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKICAgICB7CkBAIC0xNDUsMjEgKzE0NSwyMSBAQAogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFNpemUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCUlzRU9GKCkgPSAwOwogCiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFBvc2l0aW9uKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzaXplX3QJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCisgICAgdmlydHVhbAlib29sCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbAlib29sCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmx1c2goKSA9IDA7CisgICAgdmlydHVhbCBib29sCQkJCUZsdXNoKCkgPSAwOwogfTsKIElGWF9GaWxlU3RyZWFtKgkJRlhfQ3JlYXRlRmlsZVN0cmVhbShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2Rlcyk7CiBJRlhfRmlsZVN0cmVhbSoJCUZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKTsKQEAgLTE2NywzMSArMTY3LDMxIEBACiB7CiBwdWJsaWM6CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUlzQ29uc2VjdXRpdmUoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQlFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgPSAwOwogCiAgICAgdmlydHVhbCB1aW50OF90KgkJR2V0QnVmZmVyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJQXR0YWNoQnVmZmVyKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSkgPSAwOworICAgIHZpcnR1YWwgdm9pZAkJCUF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyID0gZmFsc2UpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZAkJCURldGFjaEJ1ZmZlcigpID0gMDsKIH07Ci1JRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsKLUlGWF9NZW1vcnlTdHJlYW0qCUZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSA9IEZBTFNFKTsKK0lGWF9NZW1vcnlTdHJlYW0qCUZYX0NyZWF0ZU1lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyID0gZmFsc2UpOworSUZYX01lbW9yeVN0cmVhbSoJRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGJvb2wgYkNvbnNlY3V0aXZlID0gZmFsc2UpOwogY2xhc3MgSUZYX0J1ZmZlclJlYWQgOiBwdWJsaWMgSUZYX1N0cmVhbVJlYWQKIHsKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpID0gMDsKIAogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkgPSAwOwogCiAgICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZE5leHRCbG9jayhGWF9CT09MIGJSZXN0YXJ0ID0gRkFMU0UpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlSZWFkTmV4dEJsb2NrKGJvb2wgYlJlc3RhcnQgPSBmYWxzZSkgPSAwOwogCiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KgkJR2V0QmxvY2tCdWZmZXIoKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaAppbmRleCA4ZDczNTU1Li43MzZhYTMyIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oCkBAIC02NzAsNyArNjcwLDcgQEAKICAgICB2b2lkCQkJCQlFbXB0eSgpOwogCiAKLSAgICBGWF9CT09MCQkJCQlJc0VtcHR5KCkgY29uc3QKKyAgICBib29sCQkJCQlJc0VtcHR5KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiAhR2V0TGVuZ3RoKCk7CiAgICAgfQpAQCAtODk1LDcgKzg5NSw3IEBACiAgICAgcmV0dXJuIHJocyAhPSBsaHM7CiB9CiBGWF9GTE9BVCBGWF9hdG9mKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLXZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyLCBGWF9CT09MJiBiSW50ZWdlciwgdm9pZCogcERhdGEpOwordm9pZCBGWF9hdG9udW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIsIGJvb2wmIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSk7CiBGWF9TVFJTSVpFIEZYX2Z0b2EoRlhfRkxPQVQgZiwgRlhfQ0hBUiogYnVmKTsKIENGWF9CeXRlU3RyaW5nCUZYX1VURjhFbmNvZGUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgRlhfU1RSU0laRSBsZW4pOwogaW5saW5lIENGWF9CeXRlU3RyaW5nCUZYX1VURjhFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1N0cikKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaAppbmRleCA4YmMyYjRhLi45ZmNhZjE3IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oCkBAIC03MSw3ICs3MSw2IEBACiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIEZYX1dPUkQ7ICAgICAvLyBLZWVwIC0gImFuIGVmZmljaWVudCBzbWFsbCB0eXBlIgogdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICBGWF9EV09SRDsgICAgLy8gS2VlcCAtICJhbiBlZmZpY2llbnQgdHlwZSIKIHR5cGVkZWYgZmxvYXQgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQ7ICAgIC8vIEtlZXAsIGFsbG93IHVwZ3JhZGUgdG8gZG91Ymxlcy4KLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTDsgICAgIC8vIEtlZXAsIHNhZGx5IG5vdCBhbHdheXMgMCBvciAxLgogdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICAgICBGWF9DSEFSOyAgICAgLy8gS2VlcCwgcXVlc3Rpb25hYmxlIHNpZ25lZG5lc3MuCiB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICAgIEZYX1dDSEFSOyAgICAvLyBLZWVwLCBtYXliZSBiYWQgcGxhdGZvcm0gd2NoYXJzLgogCkBAIC04NCwxNCArODMsNiBAQAogI2RlZmluZSBfREVCVUcKICNlbmRpZgogCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkxCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRQkwCi0jZW5kaWYKLQogI2lmbmRlZiBOVUxMCiAjZGVmaW5lIE5VTEwJMAogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgKaW5kZXggN2I3MzBiYi4uZDliNTc4MSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaApAQCAtOTIsMTEgKzkyLDExIEBACiAgICAgRlhfQ0hBUlRZUEVfQXJhYmljCQkJCT0gKDEyIDw8IEZYX0NIQVJUWVBFQklUUyksCiB9OwogRlhfRFdPUkQgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMoRlhfV0NIQVIgd2NoKTsKLUZYX0JPT0wJRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCk7Ci1GWF9CT09MCUZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKTsKLUZYX0JPT0wgRlhfSXNDb21iaW5hdGlvbkNoYXIoRlhfV0NIQVIgd2NoKTsKLUZYX0JPT0wJRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpOwotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpOwotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0RXT1JEIGR3UHJvcHMsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpOworYm9vbAlGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKTsKK2Jvb2wJRlhfSXNSb3RhdGlvbkNvZGUoRlhfV0NIQVIgY2gpOworYm9vbCBGWF9Jc0NvbWJpbmF0aW9uQ2hhcihGWF9XQ0hBUiB3Y2gpOworYm9vbAlGWF9Jc0JpZGlDaGFyKEZYX1dDSEFSIHdjaCk7CitGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgYm9vbCBiUlRMLCBib29sIGJWZXJ0aWNhbCk7CitGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfRFdPUkQgZHdQcm9wcywgYm9vbCBiUlRMLCBib29sIGJWZXJ0aWNhbCk7CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX1VDRF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oCmluZGV4IGJhMzNiMjAuLjIzM2E4ZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgKQEAgLTM4LDIxICszOCwyMSBAQAogY2xhc3MgQ1hNTF9Db250ZW50CiB7CiBwdWJsaWM6Ci0gICAgQ1hNTF9Db250ZW50KCkgOiBtX2JDREFUQShGQUxTRSksIG1fQ29udGVudCgpIHt9Ci0gICAgdm9pZAlTZXQoRlhfQk9PTCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCkKKyAgICBDWE1MX0NvbnRlbnQoKSA6IG1fYkNEQVRBKGZhbHNlKSwgbV9Db250ZW50KCkge30KKyAgICB2b2lkCVNldChib29sIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50KQogICAgIHsKICAgICAgICAgbV9iQ0RBVEEgPSBiQ0RBVEE7CiAgICAgICAgIG1fQ29udGVudCA9IGNvbnRlbnQ7CiAgICAgfQotICAgIEZYX0JPT0wJCQltX2JDREFUQTsKKyAgICBib29sCQkJbV9iQ0RBVEE7CiAgICAgQ0ZYX1dpZGVTdHJpbmcJbV9Db250ZW50OwogfTsKIGNsYXNzIENYTUxfRWxlbWVudAogewogcHVibGljOgotICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzaXplLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKLSAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKLSAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlciwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7CisgICAgc3RhdGljIENYTUxfRWxlbWVudCoJUGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYlNhdmVTcGFjZUNoYXJzID0gZmFsc2UsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOworICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIGJvb2wgYlNhdmVTcGFjZUNoYXJzID0gZmFsc2UsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOworICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyLCBib29sIGJTYXZlU3BhY2VDaGFycyA9IGZhbHNlLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKICAgICBDWE1MX0VsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxU3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnTmFtZSk7CiAgICAgQ1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpOwogICAgIENYTUxfRWxlbWVudCgpOwpAQCAtNjMsOSArNjMsOSBAQAogCiAKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0VGFnTmFtZShGWF9CT09MIGJRdWFsaWZpZWQgPSBGQUxTRSkgY29uc3Q7CisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRUYWdOYW1lKGJvb2wgYlF1YWxpZmllZCA9IGZhbHNlKSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0TmFtZXNwYWNlKEZYX0JPT0wgYlF1YWxpZmllZCA9IEZBTFNFKSBjb25zdDsKKyAgICBDRlhfQnl0ZVN0cmluZwkJCUdldE5hbWVzcGFjZShib29sIGJRdWFsaWZpZWQgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBDRlhfQnl0ZVN0cmluZwkJCUdldE5hbWVzcGFjZVVSSShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFOYW1lKSBjb25zdDsKIApAQCAtODEsOSArODEsOSBAQAogCiAgICAgdm9pZAkJCQkJR2V0QXR0ckJ5SW5kZXgoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyAmc3BhY2UsIENGWF9CeXRlU3RyaW5nICZuYW1lLCBDRlhfV2lkZVN0cmluZyAmdmFsdWUpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFOYW1lKSBjb25zdDsKKyAgICBib29sCQkJCQlIYXNBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcU5hbWUpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7CiAgICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdAogICAgIHsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cjsKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgcmV0dXJuIGF0dHI7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7CiAgICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdAogICAgIHsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cjsKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgcmV0dXJuIGF0dHI7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3Q7CiAgICAgaW50CQkJCQkJR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdAogICAgIHsKICAgICAgICAgaW50IGF0dHIgPSAwOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgIHJldHVybiBhdHRyOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OworICAgIGJvb2wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OwogICAgIGludAkJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIGludCBhdHRyID0gMDsKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICByZXR1cm4gYXR0cjsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKKyAgICBib29sCQkJCQlHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKICAgICBGWF9GTE9BVAkJCQlHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdAogICAgIHsKICAgICAgICAgRlhfRkxPQVQgYXR0ciA9IDA7CkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgcmV0dXJuIGF0dHI7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CiAgICAgRlhfRkxPQVQJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKICAgICB7CiAgICAgICAgIEZYX0ZMT0FUIGF0dHIgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9mcGYuaAppbmRleCBmYjliZjRkLi4xMTVlZjU1IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9mcGYuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9mcGYuaApAQCAtNDEsOCArNDEsOCBAQAogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0QXNjZW50KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGVzY2VudCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJCUdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUICZydEJCb3gpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCQlHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCkgPSAwOwogCiAgICAgdmlydHVhbCBpbnQzMl90CQlHZXRIZWlnaHQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90CQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgKaW5kZXggMjdmYzJmOS4uNTU0ZmUzMCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgKQEAgLTE3OSwxMyArMTc5LDEzIEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqCUdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZAkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkCQlTZXREb3duU2FtcGxlU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0IHt9CiAKQEAgLTE5NCwyNCArMTk0LDI0IEBACiAgICAgICAgIHJldHVybiBtX2JwcDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJSXNBbHBoYU1hc2soKSBjb25zdAorICAgIGJvb2wJCQlJc0FscGhhTWFzaygpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgPT0gMTsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJSGFzQWxwaGEoKSBjb25zdAorICAgIGJvb2wJCQlIYXNBbHBoYSgpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiAyID8gVFJVRSA6IEZBTFNFOworICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiAyID8gdHJ1ZSA6IGZhbHNlOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlJc09wYXF1ZUltYWdlKCkgY29uc3QKKyAgICBib29sCQkJSXNPcGFxdWVJbWFnZSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gIShtX0FscGhhRmxhZyAmIDMpOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlJc0NteWtJbWFnZSgpIGNvbnN0CisgICAgYm9vbAkJCUlzQ215a0ltYWdlKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX0FscGhhRmxhZyAmIDQgPyBUUlVFIDogRkFMU0U7CisgICAgICAgIHJldHVybiBtX0FscGhhRmxhZyAmIDQgPyB0cnVlIDogZmFsc2U7CiAgICAgfQogCiAKQEAgLTI0OCwxMSArMjQ4LDExIEBACiAKICAgICBDRlhfRElCaXRtYXAqCUdldEFscGhhTWFzayhjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKTsKKyAgICBib29sCQkJQ29weUFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpOwogCi0gICAgQ0ZYX0RJQml0bWFwKglTd2FwWFkoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OworICAgIENGWF9ESUJpdG1hcCoJU3dhcFhZKGJvb2wgYlhGbGlwLCBib29sIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKIAotICAgIENGWF9ESUJpdG1hcCoJRmxpcEltYWdlKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCkgY29uc3Q7CisgICAgQ0ZYX0RJQml0bWFwKglGbGlwSW1hZ2UoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwKSBjb25zdDsKIAogICAgIHZvaWQJCQlHZXRPdmVybGFwUmVjdChpbnQmIGRlc3RfbGVmdCwgaW50JiBkZXN0X3RvcCwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsIGludCBzcmNfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaGVpZ2h0LCBpbnQmIHNyY19sZWZ0LCBpbnQmIHNyY190b3AsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbik7CkBAIC0yNzYsNyArMjc2LDcgQEAKIAogICAgIHZvaWQJCQlCdWlsZFBhbGV0dGUoKTsKIAotICAgIEZYX0JPT0wJCQlCdWlsZEFscGhhTWFzaygpOworICAgIGJvb2wJCQlCdWlsZEFscGhhTWFzaygpOwogCiAgICAgaW50CQkJCUZpbmRQYWxldHRlKEZYX0RXT1JEIGNvbG9yKSBjb25zdDsKIApAQCAtMjkyLDkgKzI5Miw5IEBACiAKICAgICBDRlhfRElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwJiBzcmMpOwogCi0gICAgRlhfQk9PTAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIHVpbnQ4X3QqIHBCdWZmZXIgPSBOVUxMLCBpbnQgcGl0Y2ggPSAwKTsKKyAgICBib29sCQkJQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgdWludDhfdCogcEJ1ZmZlciA9IE5VTEwsIGludCBwaXRjaCA9IDApOwogCi0gICAgRlhfQk9PTAkJCUNvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYyk7CisgICAgYm9vbAkJCUNvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYyk7CiAKICAgICB2aXJ0dWFsCXVpbnQ4X3QqCUdldEJ1ZmZlcigpIGNvbnN0CiAgICAgewpAQCAtMzA3LDExICszMDcsMTEgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3Q7CiAKICAgICB2b2lkCQkJVGFrZU92ZXIoQ0ZYX0RJQml0bWFwKiBwU3JjQml0bWFwKTsKIAotICAgIEZYX0JPT0wJCQlDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBmb3JtYXQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgICBib29sCQkJQ29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKICAgICB2b2lkCQkJQ2xlYXIoRlhfRFdPUkQgY29sb3IpOwogCkBAIC0zMTksNDAgKzMxOSw0MCBAQAogCiAgICAgdm9pZAkJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IpOwogCi0gICAgRlhfQk9PTAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCk7CisgICAgYm9vbAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCk7CiAKLSAgICBGWF9CT09MCQkJTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKTsKKyAgICBib29sCQkJTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKTsKIAotICAgIEZYX0JPT0wJCQlNdWx0aXBseUFscGhhKGludCBhbHBoYSk7CisgICAgYm9vbAkJCU11bHRpcGx5QWxwaGEoaW50IGFscGhhKTsKIAotICAgIEZYX0JPT0wJCQlNdWx0aXBseUFscGhhKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2spOworICAgIGJvb2wJCQlNdWx0aXBseUFscGhhKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2spOwogCi0gICAgRlhfQk9PTAkJCVRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIGJvb2wJCQlUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICBib29sCQkJQ29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiA9IE5VTEwsIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJVHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIGJvb2wJCQlUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywgRlhfRFdPUkQgY29sb3IsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgYm9vbAkJCUNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiA9IE5VTEwsIGJvb2wgYlJnYkJ5dGVPcmRlciA9IGZhbHNlLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlDb21wb3NpdGVSZWN0KGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgYm9vbAkJCUNvbXBvc2l0ZVJlY3QoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcik7CisgICAgYm9vbAkJCUNvbnZlcnRDb2xvclNjYWxlKEZYX0RXT1JEIGZvcmVjb2xvciwgRlhfRFdPUkQgYmFja2NvbG9yKTsKIAotICAgIEZYX0JPT0wJCQlEaXRoZXJGUyhjb25zdCBGWF9EV09SRCogcFBhbGV0dGUsIGludCBwYWxfc2l6ZSwgY29uc3QgRlhfUkVDVCogcFJlY3QgPSBOVUxMKTsKKyAgICBib29sCQkJRGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0ID0gTlVMTCk7CiBwcm90ZWN0ZWQ6CiAKICAgICB1aW50OF90KgkJbV9wQnVmZmVyOwogCi0gICAgRlhfQk9PTAkJCW1fYkV4dEJ1ZjsKKyAgICBib29sCQkJbV9iRXh0QnVmOwogCi0gICAgRlhfQk9PTAkJCUdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgICBib29sCQkJR2V0R3JheURhdGEodm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogfTsKIGNsYXNzIENGWF9ESUJFeHRyYWN0b3IKIHsKQEAgLTM3OSw3ICszNzksNyBAQAogCiAgICAgfkNGWF9GaWx0ZXJlZERJQigpOwogCi0gICAgdm9pZAkJCQkJTG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYyA9IEZBTFNFKTsKKyAgICB2b2lkCQkJCQlMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGJvb2wgYkF1dG9Ecm9wU3JjID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCBGWERJQl9Gb3JtYXQJR2V0RGVzdEZvcm1hdCgpID0gMDsKIApAQCAtMzkyLDExICszOTIsMTEgQEAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqCQlHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkCQkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OworICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3Q7CiAKICAgICBjb25zdCBDRlhfRElCU291cmNlKgltX3BTcmM7CiAKLSAgICBGWF9CT09MCQkJCQltX2JBdXRvRHJvcFNyYzsKKyAgICBib29sCQkJCQltX2JBdXRvRHJvcFNyYzsKIAogICAgIHVpbnQ4X3QqCQkJCW1fcFNjYW5saW5lOwogfTsKQEAgLTQwNyw3ICs0MDcsNyBAQAogCiAgICAgdmlydHVhbAl2b2lkCQlDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLCBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJU2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpID0gMDsKIH07CiBjbGFzcyBDRlhfU2NhbmxpbmVDb21wb3NpdG9yCiB7CkBAIC00MTYsOCArNDE2LDggQEAKIAogICAgIH5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCk7CiAKLSAgICBGWF9CT09MCQkJCUluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgaW50MzJfdCB3aWR0aCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQgYmxlbmRfdHlwZSwgRlhfQk9PTCBiQ2xpcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICAgIGJvb2wJCQkJSW5pdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBpbnQzMl90IHdpZHRoLCBGWF9EV09SRCogcFNyY1BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIGludCBibGVuZF90eXBlLCBib29sIGJDbGlwLCBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKIAogICAgIHZvaWQJCQkJQ29tcG9zaXRlUmdiQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgIHZvaWQqCQkJCW1fcEljY1RyYW5zZm9ybTsKICAgICB1aW50OF90KgkJCW1fcENhY2hlU2NhbmxpbmU7CiAgICAgaW50CQkJCQltX0NhY2hlU2l6ZTsKLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcjsKKyAgICBib29sICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcjsKIH07CiBjbGFzcyBDRlhfQml0bWFwQ29tcG9zZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIKIHsKQEAgLTQ2MSwxMSArNDYxLDExIEBACiAKIAogICAgIHZvaWQJCQkJQ29tcG9zZShDRlhfRElCaXRtYXAqIHBEZXN0LCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIEZYX1JFQ1QmIGRlc3RfcmVjdCwgRlhfQk9PTCBiVmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLCBGWF9CT09MIGJGbGlwWSwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIEZYX1JFQ1QmIGRlc3RfcmVjdCwgYm9vbCBiVmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBYLCBib29sIGJGbGlwWSwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpOworICAgIHZpcnR1YWwgYm9vbAkJU2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpOwogCiAKICAgICB2aXJ0dWFsCXZvaWQJCUNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgY29uc3QgdWludDhfdCogc2NhbmxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpOwpAQCAtNDgwLDEwICs0ODAsMTAgQEAKICAgICBGWF9EV09SRAkJCW1fTWFza0NvbG9yOwogICAgIGNvbnN0IENGWF9ESUJpdG1hcCoJbV9wQ2xpcE1hc2s7CiAgICAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcgltX0NvbXBvc2l0b3I7Ci0gICAgRlhfQk9PTAkJCQltX2JWZXJ0aWNhbCwgbV9iRmxpcFgsIG1fYkZsaXBZOworICAgIGJvb2wJCQkJbV9iVmVydGljYWwsIG1fYkZsaXBYLCBtX2JGbGlwWTsKICAgICBpbnQJCQkJCW1fQWxwaGFGbGFnOwogICAgIHZvaWQqCQkJCW1fcEljY1RyYW5zZm9ybTsKLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcjsKKyAgICBib29sICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcjsKICAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOwogICAgIHZvaWQJCQkJQ29tcG9zZVNjYW5saW5lVihpbnQgbGluZSwgY29uc3QgdWludDhfdCogc2NhbmxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEgPSBOVUxMKTsKICAgICB1aW50OF90KiBtX3BTY2FubGluZVY7CkBAIC01MDEsNyArNTAxLDcgQEAKIAogICAgIHZpcnR1YWwJdm9pZAkJQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKKyAgICB2aXJ0dWFsIGJvb2wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKIAogICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpCiAgICAgewpAQCAtNTIxLDIyICs1MjEsMjIgQEAKICAgICBDRlhfSW1hZ2VTdHJldGNoZXIoKTsKICAgICB+Q0ZYX0ltYWdlU3RyZXRjaGVyKCk7CiAKLSAgICBGWF9CT09MIFN0YXJ0KElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdCwgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICBib29sIFN0YXJ0KElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdCwgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QmIGJpdG1hcF9yZWN0LAogICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MpOwogCi0gICAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhfQk9PTCBTdGFydFF1aWNrU3RyZXRjaCgpOwotICAgIEZYX0JPT0wgU3RhcnRTdHJldGNoKCk7Ci0gICAgRlhfQk9PTCBDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhfQk9PTCBDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wgU3RhcnRRdWlja1N0cmV0Y2goKTsKKyAgICBib29sIFN0YXJ0U3RyZXRjaCgpOworICAgIGJvb2wgQ29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wgQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKIAogICAgIElGWF9TY2FubGluZUNvbXBvc2VyKgltX3BEZXN0OwogICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCW1fcFNvdXJjZTsKICAgICBDU3RyZXRjaEVuZ2luZSoJCW1fcFN0cmV0Y2hFbmdpbmU7CiAgICAgRlhfRFdPUkQJCW1fRmxhZ3M7Ci0gICAgRlhfQk9PTAkJCW1fYkZsaXBYOwotICAgIEZYX0JPT0wgICAgICAgICBtX2JGbGlwWTsKKyAgICBib29sCQkJbV9iRmxpcFg7CisgICAgYm9vbCAgICAgICAgIG1fYkZsaXBZOwogICAgIGludAkJCQltX0Rlc3RXaWR0aDsKICAgICBpbnQgICAgICAgICAgICAgbV9EZXN0SGVpZ2h0OwogICAgIEZYX1JFQ1QJCQltX0NsaXBSZWN0OwpAQCAtNTUyLDEwICs1NTIsMTAgQEAKICAgICBDRlhfSW1hZ2VUcmFuc2Zvcm1lcigpOwogICAgIH5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpOwogCi0gICAgRlhfQk9PTCBTdGFydChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgIGJvb2wgU3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgY29uc3QgRlhfUkVDVCogcENsaXApOwogCi0gICAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKICAgICBDRlhfQWZmaW5lTWF0cml4KiBtX3BNYXRyaXg7CiAgICAgRlhfUkVDVAkJbV9TdHJldGNoQ2xpcDsKQEAgLTU3NSwxNCArNTc1LDE0IEBACiAgICAgQ0ZYX0ltYWdlUmVuZGVyZXIoKTsKICAgICB+Q0ZYX0ltYWdlUmVuZGVyZXIoKTsKIAotICAgIEZYX0JPT0wgU3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgYm9vbCBTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKIHByb3RlY3RlZDoKICAgICBDRlhfRElCaXRtYXAqCQltX3BEZXZpY2U7CkBAIC01OTgsNyArNTk4LDcgQEAKICAgICBGWF9EV09SRAkJCW1fRmxhZ3M7CiAgICAgaW50CQkJCQltX0FscGhhRmxhZzsKICAgICB2b2lkKgkJCQltX3BJY2NUcmFuc2Zvcm07Ci0gICAgRlhfQk9PTAkJCQltX2JSZ2JCeXRlT3JkZXI7CisgICAgYm9vbAkJCQltX2JSZ2JCeXRlT3JkZXI7CiAgICAgaW50CQkJCQltX0JsZW5kVHlwZTsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaAppbmRleCAyODMyZmJmLi4yMGVmNWQ0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCkBAIC01NiwxMiArNTYsMTIgQEAKICAgICBDRlhfRm9udCgpOwogICAgIH5DRlhfRm9udCgpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgRlhfQk9PTCBiVmVydGljYWwgPSBGQUxTRSk7CisgICAgYm9vbAkJCQkJTG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIGJvb2wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgYm9vbCBiVmVydGljYWwgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7CisgICAgYm9vbAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSk7CisgICAgYm9vbAkJCQkJTG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSk7CiAKICAgICBGWEZUX0ZhY2UJCQkJR2V0RmFjZSgpIGNvbnN0CiAgICAgewpAQCAtODIsMTUgKzgyLDE1IEBACiAKICAgICBpbnQJCQkJCQlHZXREZXNjZW50KCkgY29uc3Q7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBHZXRHbHlwaEJCb3goRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QgJmJib3gpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIEdldEdseXBoQkJveChGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfUkVDVCAmYmJveCk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJc0l0YWxpYygpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIElzSXRhbGljKCk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJc0JvbGQoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBJc0JvbGQoKTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIElzRml4ZWRXaWR0aCgpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIElzRml4ZWRXaWR0aCgpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNWZXJ0aWNhbCgpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNWZXJ0aWNhbCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iVmVydGljYWw7CiAgICAgfQpAQCAtMTAzLDkgKzEwMyw5IEBACiAgICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgR2V0RmFjZU5hbWUoKSBjb25zdDsKIAogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNUVEZvbnQoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBJc1RURm9udCgpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0QkJveChGWF9SRUNUICZiYm94KTsKKyAgICBib29sICAgICAgICAgICAgICAgICBHZXRCQm94KEZYX1JFQ1QgJmJib3gpOwogCiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgR2V0SGVpZ2h0KCk7CiAKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgIEZYRlRfRmFjZQkJCQltX0ZhY2U7CiAKICAgICBDRlhfU3Vic3RGb250KgkJCW1fcFN1YnN0Rm9udDsKLSAgICBGWF9CT09MCQkJCQlJc0VtYmVkZGVkKCkKKyAgICBib29sCQkJCQlJc0VtYmVkZGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JFbWJlZGRlZDsKICAgICB9CkBAIC0xMzMsMTQgKzEzMywxNCBAQAogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1fcFBsYXRmb3JtRm9udDsKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uOwogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1fcER3Rm9udDsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBtX2JEd0xvYWRlZDsKKyAgICBib29sICAgICAgICAgICAgICAgICBtX2JEd0xvYWRlZDsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOwogCiAgICAgdm9pZAkJCQkJRGVsZXRlRmFjZSgpOwogcHJvdGVjdGVkOgogCi0gICAgRlhfQk9PTAkJCQkJbV9iRW1iZWRkZWQ7Ci0gICAgRlhfQk9PTAkJCQkJbV9iVmVydGljYWw7CisgICAgYm9vbAkJCQkJbV9iRW1iZWRkZWQ7CisgICAgYm9vbAkJCQkJbV9iVmVydGljYWw7CiAgICAgdm9pZCoJCQkJCW1fcE93bmVkU3RyZWFtOwogfTsKICNkZWZpbmUgRU5DT0RJTkdfSU5URVJOQUwJCTAKQEAgLTE4MiwxMSArMTgyLDExIEBACiAKICAgICBpbnQJCQkJCQltX0l0YWxpY0FuZ2xlOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iU3Vic3RPZkNKSzsKKyAgICBib29sCQkJCQltX2JTdWJzdE9mQ0pLOwogCiAgICAgaW50CQkJCQkJbV9XZWlnaHRDSks7CiAKLSAgICBGWF9CT09MCQkJCQltX2JJdGxpY0NKSzsKKyAgICBib29sCQkJCQltX2JJdGxpY0NKSzsKIH07CiAjZGVmaW5lIEZYX0ZPTlRfRkxBR19TRVJJRiAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBGWF9GT05UX0ZMQUdfRklYRURQSVRDSAkJCTB4MDIKQEAgLTIwNiw5ICsyMDYsOSBAQAogICAgIH5DRlhfRm9udE1ncigpOwogICAgIHZvaWQJCQlJbml0RlRMaWJyYXJ5KCk7CiAgICAgRlhGVF9GYWNlCQlHZXRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiYgcEZvbnREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIHVpbnQ4X3QqJiBwRm9udERhdGEpOwogICAgIEZYRlRfRmFjZQkJQWRkQ2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBmYWNlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CiAgICAgRlhGVF9GYWNlCQlHZXRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0LCB1aW50OF90KiYgcEZvbnREYXRhKTsKICAgICBGWEZUX0ZhY2UJCUFkZENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLCBGWF9EV09SRCBjaGVja3N1bSwKQEAgLTIxNywxMiArMjE3LDEyIEBACiAgICAgRlhGVF9GYWNlCQlHZXRGaXhlZEZhY2UoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBmYWNlX2luZGV4KTsKICAgICB2b2lkCQkJUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOwogICAgIHZvaWQJCQlTZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbyk7Ci0gICAgRlhGVF9GYWNlCQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKKyAgICBGWEZUX0ZhY2UJCUZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgYm9vbCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpOwogCiAgICAgdm9pZAkJCUZyZWVDYWNoZSgpOwogCi0gICAgRlhfQk9PTAkJCUdldFN0YW5kYXJkRm9udChjb25zdCB1aW50OF90KiYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KTsKKyAgICBib29sCQkJR2V0U3RhbmRhcmRGb250KGNvbnN0IHVpbnQ4X3QqJiBwRm9udERhdGEsIEZYX0RXT1JEJiBzaXplLCBpbnQgaW5kZXgpOwogICAgIENGWF9Gb250TWFwcGVyKgltX3BCdWlsdGluTWFwcGVyOwogICAgIElGWF9Gb250TWFwcGVyKgltX3BFeHRNYXBwZXI7CiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZhY2VNYXA7CkBAIC0yMzUsNyArMjM1LDcgQEAKIAogICAgIHZpcnR1YWwgfklGWF9Gb250TWFwcGVyKCkge30KIAotICAgIHZpcnR1YWwgRlhGVF9GYWNlCUZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAorICAgIHZpcnR1YWwgRlhGVF9GYWNlCUZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgYm9vbCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KSA9IDA7CiAKICAgICBDRlhfRm9udE1ncioJCW1fcEZvbnRNZ3I7CkBAIC0yNzcsMTQgKzI3NywxNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcEZvbnRFbnVtZXJhdG9yOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKKyAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIGJvb2wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCk7CiBwcml2YXRlOgogICAgIENGWF9CeXRlU3RyaW5nCQlHZXRQU05hbWVGcm9tVFQodm9pZCogaEZvbnQpOwogICAgIENGWF9CeXRlU3RyaW5nCQlNYXRjaEluc3RhbGxlZEZvbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpOwogICAgIEZYRlRfRmFjZQkJCVVzZUludGVybmFsU3Vic3QoQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCwgaW50IGlCYXNlRm9udCwgaW50IGl0YWxpY19hbmdsZSwgaW50IHdlaWdodCwgaW50IHBpY3RoZmFtaWx5KTsKIAotICAgIEZYX0JPT0wJCQkJbV9iTGlzdExvYWRlZDsKKyAgICBib29sCQkJCW1fYkxpc3RMb2FkZWQ7CiAgICAgRlhGVF9GYWNlCQkJbV9NTUZhY2VzWzJdOwogICAgIENGWF9CeXRlU3RyaW5nCQltX0xhc3RGYW1pbHk7CiAgICAgQ0ZYX0RXb3JkQXJyYXkJCW1fQ2hhcnNldEFycmF5OwpAQCAtMjk5LDEyICsyOTksMTIgQEAKICAgICBzdGF0aWMgSUZYX1N5c3RlbUZvbnRJbmZvKglDcmVhdGVEZWZhdWx0KCk7CiAgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIGludCYgaUV4YWN0KSA9IDA7CisgICAgdmlydHVhbAlib29sCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIGludCYgaUV4YWN0KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkKgkJR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSA9IDA7CisgICAgdmlydHVhbCBib29sCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpID0gMDsKICAgICB2aXJ0dWFsIGludAkJCUdldEZhY2VJbmRleCh2b2lkKiBoRm9udCkKICAgICB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMzI2LDE1ICszMjYsMTUgQEAKIAogICAgIC8vIElGWF9TeXRlbUZvbnRJbmZvOgogICAgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKLSAgICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCisgICAgYm9vbCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlOworICAgIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsIGludCYgYkV4YWN0KSBvdmVycmlkZTsKICAgICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIG92ZXJyaWRlOwogICAgIEZYX0RXT1JEIEdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpIG92ZXJyaWRlOwogICAgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fRm9udExpc3Q7CkBAIC0zNTcsNyArMzU3LDcgQEAKICAgICB+Q0ZYX0ZvbnRDYWNoZSgpOwogICAgIENGWF9GYWNlQ2FjaGUqCQkJR2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOwogICAgIHZvaWQJCQkJCVJlbGVhc2VDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCk7Ci0gICAgdm9pZAkJCQkJRnJlZUNhY2hlKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7CisgICAgdm9pZAkJCQkJRnJlZUNhY2hlKGJvb2wgYlJlbGVhc2UgPSBmYWxzZSk7CiAKIHByaXZhdGU6CiAgICAgdXNpbmcgQ0ZYX0ZUQ2FjaGVNYXAgPSBzdGQ6Om1hcDxGWEZUX0ZhY2UsIENGWF9Db3VudGVkRmFjZUNhY2hlKj47CkBAIC0zOTEsNyArMzkxLDcgQEAKIHsKIHB1YmxpYzoKICAgICB+Q0ZYX0ZhY2VDYWNoZSgpOwotICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCoJTG9hZEdseXBoQml0bWFwKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqCUxvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBib29sIGJGb250U3R5bGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcywgaW50JiB0ZXh0X2ZsYWdzKTsKICAgICBjb25zdCBDRlhfUGF0aERhdGEqCQlMb2FkR2x5cGhQYXRoKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKTsKIApAQCAtMzk5LDEyICszOTksMTIgQEAKICAgICBDRlhfRmFjZUNhY2hlKEZYRlRfRmFjZSBmYWNlKTsKIHByaXZhdGU6CiAgICAgRlhGVF9GYWNlCQkJCW1fRmFjZTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqCQlSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsCisgICAgQ0ZYX0dseXBoQml0bWFwKgkJUmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcyk7CiAgICAgQ0ZYX0dseXBoQml0bWFwKgkJUmVuZGVyR2x5cGhfTmF0aXZldGV4dChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LAogICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKTsKICAgICBDRlhfR2x5cGhCaXRtYXAqICAgICAgICBMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwKLSAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcyk7CisgICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwgYm9vbCBiRm9udFN0eWxlLCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpOwogICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9TaXplTWFwOwogICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fUGF0aE1hcDsKICAgICBDRlhfRElCaXRtYXAqICAgICAgICAgICBtX3BCaXRtYXA7CkBAIC00MTgsMTYgKzQxOCwxNiBAQAogICAgIEZYX0ZMT0FUCQkJbV9mT3JpZ2luWCwgbV9mT3JpZ2luWTsKIH0gRlhURVhUX0dMWVBIUE9TOwogRlhfUkVDVCBGWEdFX0dldEdseXBoc0JCb3goRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MsIGludCBuQ2hhcnMsIGludCBhbnRpX2FsaWFzLCBGWF9GTE9BVCByZXRpbmFTY2FsZVggPSAxLjBmLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKLUZYX0JPT0wJT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKK2Jvb2wJT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgbG9uZyBnbHlwaF9pbmRleCwgdW5zaWduZWQgbG9uZyBhcmdiKTsKLUZYX0JPT0wJT3V0cHV0VGV4dCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAorYm9vbAlPdXRwdXRUZXh0KHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRfbWF0cml4LCB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCwgdW5zaWduZWQgbG9uZyBhcmdiKTsKIGNsYXNzIElGWF9HU1VCVGFibGUKIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgSUZYX0dTVUJUYWJsZSogQ3JlYXRlKENGWF9Gb250KiBwRm9udCk7CiAgICAgdmlydHVhbCB+SUZYX0dTVUJUYWJsZSgpIHsgfQotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKSA9IDA7CisgICAgdmlydHVhbCBib29sIEdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pID0gMDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYR0VfRlhfRk9OVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgKaW5kZXggZmQ5YzE0OC4uNTk2NTY0MSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oCkBAIC0xOTMsMTEgKzE5MywxMSBAQAogCiAgICAgdm9pZAkJCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCk7CiAKLSAgICBGWF9CT09MCQkJCUlzUmVjdCgpIGNvbnN0OworICAgIGJvb2wJCQkJSXNSZWN0KCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCUdldFplcm9BcmVhUGF0aChDRlhfUGF0aERhdGEmIE5ld1BhdGgsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wmYlRoaW4sIEZYX0JPT0wgYkFkanVzdCkgY29uc3Q7CisgICAgYm9vbAkJCQlHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBib29sJmJUaGluLCBib29sIGJBZGp1c3QpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlJc1JlY3QoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcmVjdCkgY29uc3Q7CisgICAgYm9vbAkJCQlJc1JlY3QoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcmVjdCkgY29uc3Q7CiAKICAgICB2b2lkIEFwcGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwogICAgIHZvaWQgQXBwZW5kUmVjdChGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCBib3R0b20sIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCB0b3ApOwpAQCAtMjk0LDEwICsyOTQsMTAgQEAKICAgICBGWF9EV09SRAkJCW1fR2x5cGhJbmRleDsKICAgICBGWF9GTE9BVAkJCW1fT3JpZ2luWCwgbV9PcmlnaW5ZOwogICAgIGludAkJCQkJbV9Gb250Q2hhcldpZHRoOwotICAgIEZYX0JPT0wJCQkJbV9iR2x5cGhBZGp1c3Q7CisgICAgYm9vbAkJCQltX2JHbHlwaEFkanVzdDsKICAgICBGWF9GTE9BVAkJCW1fQWRqdXN0TWF0cml4WzRdOwogICAgIEZYX0RXT1JECQkJbV9FeHRHSUQ7Ci0gICAgRlhfQk9PTAkJCQltX2JGb250U3R5bGU7CisgICAgYm9vbAkJCQltX2JGb250U3R5bGU7CiB9IEZYVEVYVF9DSEFSUE9TOwogY2xhc3MgQ0ZYX1JlbmRlckRldmljZQogewpAQCAtMzEzLDcgKzMxMyw3IEBACiAgICAgICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXI7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCVN0YXJ0UmVuZGVyaW5nKCk7CisgICAgYm9vbAkJCVN0YXJ0UmVuZGVyaW5nKCk7CiAKICAgICB2b2lkCQkJRW5kUmVuZGVyaW5nKCk7CiAKQEAgLTMyMSw3ICszMjEsNyBAQAogCiAgICAgdm9pZAkJCVNhdmVTdGF0ZSgpOwogCi0gICAgdm9pZAkJCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSk7CisgICAgdm9pZAkJCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQgPSBmYWxzZSk7CiAKIAogCkBAIC0zNjUsMjYgKzM2NSwyNiBAQAogICAgICAgICBtX3BCaXRtYXAgPSBwQml0bWFwOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQlDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdDsKKyAgICBib29sCQkJQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3Q7CiAKICAgICBjb25zdCBGWF9SRUNUJglHZXRDbGlwQm94KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX0NsaXBCb3g7CiAgICAgfQogCi0gICAgRlhfQk9PTAkJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgYm9vbAkJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAotICAgIEZYX0JPT0wJCQlTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpOworICAgIGJvb2wJCQlTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpOwogCi0gICAgRlhfQk9PTAkJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICBib29sCQkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICBGWF9CT09MCQkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgYm9vbAkJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTM5NSw0NiArMzk1LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMCiAgICAgICAgICAgICAgICAgICAgICAgKTsKIAotICAgIEZYX0JPT0wJCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAorICAgIGJvb2wJCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgY29sb3IsCisgICAgYm9vbAkJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgRlhfQk9PTAkJCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAorICAgIGJvb2wJCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlID0gMCwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgRlhfQk9PTAkJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgICAgYm9vbAkJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKICAgICBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKTsKIAotICAgIEZYX0JPT0wJCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAorICAgIGJvb2wJCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCisgICAgYm9vbAkJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgRlhfQk9PTAkJCVNldEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIEZYX0RXT1JEIGNvbG9yLAorICAgIGJvb2wJCQlTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKKyAgICBib29sCQkJU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLCBGWF9EV09SRCBmbGFncyA9IDAsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAorICAgIGJvb2wJCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIEZYX0JPT0wJCQlDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sCQkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKICAgICB2b2lkCQkJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSk7CiAKLSAgICBGWF9CT09MCQkJRHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgIGJvb2wJCQlEcmF3Tm9ybWFsVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgRlhfRFdPUkQgdGV4dF9mbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJRHJhd1RleHRQYXRoKGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICBib29sCQkJRHJhd1RleHRQYXRoKGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLApAQCAtNDc3LDEyICs0NzcsMTIgQEAKIAogICAgIH5DRlhfRnhnZURldmljZSgpOwogCi0gICAgRlhfQk9PTAkJCUF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cyA9IDAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOworICAgIGJvb2wJCQlBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgYm9vbCBiR3JvdXBLbm9ja291dCA9IGZhbHNlKTsKIAotICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKKyAgICBib29sCQkJQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzID0gMCwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCk7CiBwcm90ZWN0ZWQ6CiAKLSAgICBGWF9CT09MCQkJbV9iT3duZWRCaXRtYXA7CisgICAgYm9vbAkJCW1fYk93bmVkQml0bWFwOwogfTsKIGNsYXNzIENGWF9Ta2lhRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UKIHsKQEAgLTQ5MiwxOSArNDkyLDE5IEBACiAKICAgICB+Q0ZYX1NraWFEZXZpY2UoKTsKIAotICAgIEZYX0JPT0wJCQlBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKKyAgICBib29sCQkJQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzID0gMCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsIGJvb2wgYkdyb3VwS25vY2tvdXQgPSBmYWxzZSk7CiAKLSAgICBGWF9CT09MCQkJQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzID0gMCwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCk7CisgICAgYm9vbAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwogcHJvdGVjdGVkOgogCi0gICAgRlhfQk9PTAkJCW1fYk93bmVkQml0bWFwOworICAgIGJvb2wJCQltX2JPd25lZEJpdG1hcDsKIH07CiBjbGFzcyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCiB7CiBwdWJsaWM6CiAKLSAgICBzdGF0aWMgSUZYX1JlbmRlckRldmljZURyaXZlcioJCUNyZWF0ZUZ4Z2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKLSAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQgPSBGQUxTRSk7CisgICAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCQlDcmVhdGVGeGdlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBib29sIGJHcm91cEtub2Nrb3V0ID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCB+SUZYX1JlbmRlckRldmljZURyaXZlcigpIHt9CiAgICAgdmlydHVhbCB2b2lkIEJlZ2luKCkgeyB9CkBAIC01MTcsMTQgKzUxNywxNCBAQAogICAgICAgICByZXR1cm4gQ0ZYX01hdHJpeCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBJc1BTUHJpbnREcml2ZXIoKQorICAgIHZpcnR1YWwgYm9vbCBJc1BTUHJpbnREcml2ZXIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCkKKyAgICB2aXJ0dWFsIGJvb2wJU3RhcnRSZW5kZXJpbmcoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZAlFbmRSZW5kZXJpbmcoKSB7fQpAQCAtNTM0LDIzICs1MzQsMjMgQEAKIAogICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKSA9IDA7CisgICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQgPSBmYWxzZSkgPSAwOwogCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTU2MSw1OSArNTYxLDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSA9IDA7CisgICAgdmlydHVhbCBib29sIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpCisgICAgdmlydHVhbCBib29sCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogICBHZXRCYWNrRHJvcCgpCiAgICAgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICB2aXJ0dWFsIGJvb2wJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIHZpcnR1YWwgYm9vbAlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKKyAgICB2aXJ0dWFsIGJvb2wJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZAlDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorICAgIHZpcnR1YWwgYm9vbCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCoJR2V0UGxhdGZvcm1TdXJmYWNlKCkKQEAgLTY0NiwxMyArNjQ2LDEzIEBACiAKICAgICB+Q0ZYX1BTUmVuZGVyZXIoKTsKIAotICAgIHZvaWQJCQlJbml0KElGWF9QU091dHB1dCogcE91dHB1dCwgaW50IHBzX2xldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0JPT0wgYkNteWtPdXRwdXQpOwotICAgIEZYX0JPT0wJCQlTdGFydFJlbmRlcmluZygpOworICAgIHZvaWQJCQlJbml0KElGWF9QU091dHB1dCogcE91dHB1dCwgaW50IHBzX2xldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgYkNteWtPdXRwdXQpOworICAgIGJvb2wJCQlTdGFydFJlbmRlcmluZygpOwogICAgIHZvaWQJCQlFbmRSZW5kZXJpbmcoKTsKIAogICAgIHZvaWQJCQlTYXZlU3RhdGUoKTsKIAotICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOworICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkID0gZmFsc2UpOwogCiAgICAgdm9pZAkJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCkBAIC02NjksNyArNjY5LDcgQEAKICAgICAgICAgcmV0dXJuIG1fQ2xpcEJveDsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgYm9vbAkJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTY3OSwxOCArNjc5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgKTsKIAotICAgIEZYX0JPT0wJCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICBib29sCQkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLAorICAgIGJvb2wJCQlEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCURyYXdUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgYm9vbAkJCURyYXdUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIHByaXZhdGU6CkBAIC03MDEsMTEgKzcwMSwxMSBAQAogCiAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhCW1fQ3VyR3JhcGhTdGF0ZTsKIAotICAgIEZYX0JPT0wJCQltX2JHcmFwaFN0YXRlU2V0OworICAgIGJvb2wJCQltX2JHcmFwaFN0YXRlU2V0OwogCi0gICAgRlhfQk9PTAkJCW1fYkNteWtPdXRwdXQ7CisgICAgYm9vbAkJCW1fYkNteWtPdXRwdXQ7CiAKLSAgICBGWF9CT09MCQkJbV9iQ29sb3JTZXQ7CisgICAgYm9vbAkJCW1fYkNvbG9yU2V0OwogCiAgICAgRlhfRFdPUkQJCW1fTGFzdENvbG9yOwogCkBAIC03MTQsNyArNzE0LDcgQEAKICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFNGb250Kj4JbV9QU0ZvbnRMaXN0OwogCiAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfUkVDVD4JbV9DbGlwQm94U3RhY2s7Ci0gICAgRlhfQk9PTAkJCW1fYkluaXRlZDsKKyAgICBib29sCQkJbV9iSW5pdGVkOwogCiAgICAgdm9pZAkJCU91dHB1dFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmgKaW5kZXggMGZiOGJlZC4uZWJlNjFjYyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oCkBAIC0xMywxNSArMTMsMTUgQEAKIHB1YmxpYzoKICAgICBDRlhfUXVhcnR6RGV2aWNlKCk7CiAgICAgfkNGWF9RdWFydHpEZXZpY2UoKTsKLSAgICBGWF9CT09MIEF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MgPSBGWERDX0RJU1BMQVkpOwotICAgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgRlhfQk9PTCBDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpOworICAgIGJvb2wgQXR0YWNoKENHQ29udGV4dFJlZiBjb250ZXh0LCBpbnQzMl90IG5EZXZpY2VDbGFzcyA9IEZYRENfRElTUExBWSk7CisgICAgYm9vbCBBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKKyAgICBib29sIENyZWF0ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCk7CiAKICAgICBDR0NvbnRleHRSZWYgR2V0Q29udGV4dCgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ0dDb250ZXh0UmVmIG1fcENvbnRleHQ7Ci0gICAgRlhfQk9PTCBtX2JPd25lZEJpdG1hcDsKKyAgICBib29sIG1fYk93bmVkQml0bWFwOwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaAppbmRleCA1YjE2MTQ2Li44MDIzYmQ4IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgKQEAgLTcyLDEzICs3MiwxMyBAQAogY2xhc3MgQ0ZYX1dpbmRvd3NEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZQogewogcHVibGljOgotICAgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKglDcmVhdGVEcml2ZXIoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCA9IEZBTFNFKTsKKyAgICBzdGF0aWMgSUZYX1JlbmRlckRldmljZURyaXZlcioJQ3JlYXRlRHJpdmVyKEhEQyBoREMsIGJvb2wgYkNteWtPdXRwdXQgPSBmYWxzZSk7CiAKLSAgICBDRlhfV2luZG93c0RldmljZShIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0ID0gRkFMU0UsIEZYX0JPT0wgYkZvcmNlUFNPdXRwdXQgPSBGQUxTRSwgaW50IHBzTGV2ZWwgPSAyKTsKKyAgICBDRlhfV2luZG93c0RldmljZShIREMgaERDLCBib29sIGJDbXlrT3V0cHV0ID0gZmFsc2UsIGJvb2wgYkZvcmNlUFNPdXRwdXQgPSBmYWxzZSwgaW50IHBzTGV2ZWwgPSAyKTsKIAogICAgIEhEQwkJR2V0REMoKSBjb25zdDsKIAotICAgIEZYX0JPT0wgbV9iRm9yY2VQU091dHB1dDsKKyAgICBib29sIG1fYkZvcmNlUFNPdXRwdXQ7CiAKICAgICBzdGF0aWMgaW50IG1fcHNMZXZlbDsKIH07CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvam1vcmVjZmcuaCBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qbW9yZWNmZy5oCmluZGV4IDg4ZDIxMDkuLmUwYTg3MWUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qbW9yZWNmZy5oCisrKyBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qbW9yZWNmZy5oCkBAIC0yMzAsNyArMjMwLDcgQEAKIAogCiAvKgotICogT24gYSBmZXcgc3lzdGVtcywgdHlwZSBib29sZWFuIGFuZC9vciBpdHMgdmFsdWVzIEZBTFNFLCBUUlVFIG1heSBhcHBlYXIKKyAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBmYWxzZSwgdHJ1ZSBtYXkgYXBwZWFyCiAgKiBpbiBzdGFuZGFyZCBoZWFkZXIgZmlsZXMuICBPciB5b3UgbWF5IGhhdmUgY29uZmxpY3RzIHdpdGggYXBwbGljYXRpb24tCiAgKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIHRvZ2V0aGVyIHdpdGggdGhlc2UgZmlsZXMuCiAgKiBEZWZpbmluZyBIQVZFX0JPT0xFQU4gYmVmb3JlIGluY2x1ZGluZyBqcGVnbGliLmggc2hvdWxkIG1ha2UgaXQgd29yay4KQEAgLTIzOSwxMSArMjM5LDExIEBACiAjaWZuZGVmIEhBVkVfQk9PTEVBTgogdHlwZWRlZiBpbnQgYm9vbGVhbjsKICNlbmRpZgotI2lmbmRlZiBGQUxTRQkJCS8qIGluIGNhc2UgdGhlc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QgKi8KLSNkZWZpbmUgRkFMU0UJMAkJLyogdmFsdWVzIG9mIGJvb2xlYW4gKi8KKyNpZm5kZWYgZmFsc2UJCQkvKiBpbiBjYXNlIHRoZXNlIG1hY3JvcyBhbHJlYWR5IGV4aXN0ICovCisjZGVmaW5lIGZhbHNlCTAJCS8qIHZhbHVlcyBvZiBib29sZWFuICovCiAjZW5kaWYKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFCTEKKyNpZm5kZWYgdHJ1ZQorI2RlZmluZSB0cnVlCTEKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnaW50LmggYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2ludC5oCmluZGV4IDk1YjAwZDQuLjc0NWE0YzAgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnaW50LmgKKysrIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdpbnQuaApAQCAtOTUsNyArOTUsNyBAQAogCQkJICAgICBKU0FNUElNQUdFIG91dHB1dF9idWYsCiAJCQkgICAgIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cF9pbmRleCkpOwogCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogdHJ1ZSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLwogfTsKIAogLyogRm9yd2FyZCBEQ1QgKGFsc28gY29udHJvbHMgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uKSAqLwpAQCAtMjEzLDcgKzIxMyw3IEBACiAKICAgLyogVGhpcyBpcyBoZXJlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiBiYXNlbGluZSBhbmQgcHJvZ3Jlc3NpdmUgZGVjb2RlcnM7ICovCiAgIC8qIG90aGVyIG1vZHVsZXMgcHJvYmFibHkgc2hvdWxkIG5vdCB1c2UgaXQgKi8KLSAgYm9vbGVhbiBpbnN1ZmZpY2llbnRfZGF0YTsJLyogc2V0IFRSVUUgYWZ0ZXIgZW1pdHRpbmcgd2FybmluZyAqLworICBib29sZWFuIGluc3VmZmljaWVudF9kYXRhOwkvKiBzZXQgdHJ1ZSBhZnRlciBlbWl0dGluZyB3YXJuaW5nICovCiB9OwogCiAvKiBJbnZlcnNlIERDVCAoYWxzbyBwZXJmb3JtcyBkZXF1YW50aXphdGlvbikgKi8KQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCiAJCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CiAKLSAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLworICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiB0cnVlIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCiB9OwogCiAvKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnbGliLmggYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2xpYi5oCmluZGV4IDdkZTVhYjcuLjc4ODMxYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnbGliLmgKKysrIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdsaWIuaApAQCAtMTUzLDEyICsxNTMsMTIgQEAKICAgICogQ0FVVElPTjogSUpHIHZlcnNpb25zIHByaW9yIHRvIHY2YSBrZXB0IHRoaXMgYXJyYXkgaW4gemlnemFnIG9yZGVyLgogICAgKi8KICAgVUlOVDE2IHF1YW50dmFsW0RDVFNJWkUyXTsJLyogcXVhbnRpemF0aW9uIHN0ZXAgZm9yIGVhY2ggY29lZmZpY2llbnQgKi8KLSAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCi0gICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgotICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCisgIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgZmFsc2Ugd2hlbgorICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCB0cnVlIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KKyAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byB0cnVlLgogICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKICAgICovCi0gIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KKyAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogdHJ1ZSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLwogfSBKUVVBTlRfVEJMOwogCiAKQEAgLTE2OSwxMiArMTY5LDEyIEBACiAgIFVJTlQ4IGJpdHNbMTddOwkJLyogYml0c1trXSA9ICMgb2Ygc3ltYm9scyB3aXRoIGNvZGVzIG9mICovCiAJCQkJLyogbGVuZ3RoIGsgYml0czsgYml0c1swXSBpcyB1bnVzZWQgKi8KICAgVUlOVDggaHVmZnZhbFsyNTZdOwkJLyogVGhlIHN5bWJvbHMsIGluIG9yZGVyIG9mIGluY3IgY29kZSBsZW5ndGggKi8KLSAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCi0gICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgotICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCisgIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgZmFsc2Ugd2hlbgorICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCB0cnVlIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KKyAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byB0cnVlLgogICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKICAgICovCi0gIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KKyAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogdHJ1ZSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLwogfSBKSFVGRl9UQkw7CiAKIApAQCAtMzg0LDEwICszODQsMTAgQEAKICAgICogc2V0IG51bV9zY2FucyBhbmQgc2Nhbl9pbmZvIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbnMuCiAgICAqLwogCi0gIGJvb2xlYW4gcmF3X2RhdGFfaW47CQkvKiBUUlVFPWNhbGxlciBzdXBwbGllcyBkb3duc2FtcGxlZCBkYXRhICovCi0gIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KLSAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLwotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBib29sZWFuIHJhd19kYXRhX2luOwkJLyogdHJ1ZT1jYWxsZXIgc3VwcGxpZXMgZG93bnNhbXBsZWQgZGF0YSAqLworICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiB0cnVlPWFyaXRobWV0aWMgY29kaW5nLCBmYWxzZT1IdWZmbWFuICovCisgIGJvb2xlYW4gb3B0aW1pemVfY29kaW5nOwkvKiB0cnVlPW9wdGltaXplIGVudHJvcHkgZW5jb2RpbmcgcGFybXMgKi8KKyAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiB0cnVlPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KICAgaW50IHNtb290aGluZ19mYWN0b3I7CQkvKiAxLi4xMDAsIG9yIDAgZm9yIG5vIGlucHV0IHNtb290aGluZyAqLwogICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLwogCkBAIC00MjcsNyArNDI3LDcgQEAKICAgLyoKICAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cAogICAgKi8KLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIHRydWUgaWYgc2NhbiBzY3JpcHQgdXNlcyBwcm9ncmVzc2l2ZSBtb2RlICovCiAgIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCiAgIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCiAKQEAgLTUwMCwxNyArNTAwLDE3IEBACiAKICAgZG91YmxlIG91dHB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIHdhbnRlZCBpbiBvdXRwdXQgKi8KIAotICBib29sZWFuIGJ1ZmZlcmVkX2ltYWdlOwkvKiBUUlVFPW11bHRpcGxlIG91dHB1dCBwYXNzZXMgKi8KLSAgYm9vbGVhbiByYXdfZGF0YV9vdXQ7CQkvKiBUUlVFPWRvd25zYW1wbGVkIGRhdGEgd2FudGVkICovCisgIGJvb2xlYW4gYnVmZmVyZWRfaW1hZ2U7CS8qIHRydWU9bXVsdGlwbGUgb3V0cHV0IHBhc3NlcyAqLworICBib29sZWFuIHJhd19kYXRhX291dDsJCS8qIHRydWU9ZG93bnNhbXBsZWQgZGF0YSB3YW50ZWQgKi8KIAogICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogSURDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KLSAgYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nOwkvKiBUUlVFPWFwcGx5IGZhbmN5IHVwc2FtcGxpbmcgKi8KLSAgYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmc7CS8qIFRSVUU9YXBwbHkgaW50ZXJibG9jayBzbW9vdGhpbmcgKi8KKyAgYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nOwkvKiB0cnVlPWFwcGx5IGZhbmN5IHVwc2FtcGxpbmcgKi8KKyAgYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmc7CS8qIHRydWU9YXBwbHkgaW50ZXJibG9jayBzbW9vdGhpbmcgKi8KIAotICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogVFJVRT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCisgIGJvb2xlYW4gcXVhbnRpemVfY29sb3JzOwkvKiB0cnVlPWNvbG9ybWFwcGVkIG91dHB1dCB3YW50ZWQgKi8KICAgLyogdGhlIGZvbGxvd2luZyBhcmUgaWdub3JlZCBpZiBub3QgcXVhbnRpemVfY29sb3JzOiAqLwogICBKX0RJVEhFUl9NT0RFIGRpdGhlcl9tb2RlOwkvKiB0eXBlIG9mIGNvbG9yIGRpdGhlcmluZyB0byB1c2UgKi8KLSAgYm9vbGVhbiB0d29fcGFzc19xdWFudGl6ZTsJLyogVFJVRT11c2UgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uICovCisgIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIHRydWU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLwogICBpbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwkvKiBtYXggIyBjb2xvcnMgdG8gdXNlIGluIGNyZWF0ZWQgY29sb3JtYXAgKi8KICAgLyogdGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZTogKi8KICAgYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDEtcGFzcyBxdWFudGl6ZXIgKi8KQEAgLTYwMiw4ICs2MDIsOCBAQAogICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOwogICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KIAotICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgU09GbiBzcGVjaWZpZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLwotICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCisgIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogdHJ1ZSBpZiBTT0ZuIHNwZWNpZmllcyBwcm9ncmVzc2l2ZSBtb2RlICovCisgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIHRydWU9YXJpdGhtZXRpYyBjb2RpbmcsIGZhbHNlPUh1ZmZtYW4gKi8KIAogICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KICAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCkBAIC02MTQsMTcgKzYxNCwxNyBAQAogICAvKiBUaGVzZSBmaWVsZHMgcmVjb3JkIGRhdGEgb2J0YWluZWQgZnJvbSBvcHRpb25hbCBtYXJrZXJzIHJlY29nbml6ZWQgYnkKICAgICogdGhlIEpQRUcgbGlicmFyeS4KICAgICovCi0gIGJvb2xlYW4gc2F3X0pGSUZfbWFya2VyOwkvKiBUUlVFIGlmZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIGZvdW5kICovCi0gIC8qIERhdGEgY29waWVkIGZyb20gSkZJRiBtYXJrZXI7IG9ubHkgdmFsaWQgaWYgc2F3X0pGSUZfbWFya2VyIGlzIFRSVUU6ICovCisgIGJvb2xlYW4gc2F3X0pGSUZfbWFya2VyOwkvKiB0cnVlIGlmZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIGZvdW5kICovCisgIC8qIERhdGEgY29waWVkIGZyb20gSkZJRiBtYXJrZXI7IG9ubHkgdmFsaWQgaWYgc2F3X0pGSUZfbWFya2VyIGlzIHRydWU6ICovCiAgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogSkZJRiB2ZXJzaW9uIG51bWJlciAqLwogICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247CiAgIFVJTlQ4IGRlbnNpdHlfdW5pdDsJCS8qIEpGSUYgY29kZSBmb3IgcGl4ZWwgc2l6ZSB1bml0cyAqLwogICBVSU5UMTYgWF9kZW5zaXR5OwkJLyogSG9yaXpvbnRhbCBwaXhlbCBkZW5zaXR5ICovCiAgIFVJTlQxNiBZX2RlbnNpdHk7CQkvKiBWZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCi0gIGJvb2xlYW4gc2F3X0Fkb2JlX21hcmtlcjsJLyogVFJVRSBpZmYgYW4gQWRvYmUgQVBQMTQgbWFya2VyIHdhcyBmb3VuZCAqLworICBib29sZWFuIHNhd19BZG9iZV9tYXJrZXI7CS8qIHRydWUgaWZmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgZm91bmQgKi8KICAgVUlOVDggQWRvYmVfdHJhbnNmb3JtOwkvKiBDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlciAqLwogCi0gIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCisgIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogdHJ1ZT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCiAKICAgLyogQXNpZGUgZnJvbSB0aGUgc3BlY2lmaWMgZGF0YSByZXRhaW5lZCBmcm9tIEFQUG4gbWFya2VycyBrbm93biB0byB0aGUKICAgICogbGlicmFyeSwgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgYW55IG9yIGFsbCBBUFBuIGFuZCBDT00gbWFya2VycwpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKICNkZWZpbmUgSlBFR19TVVNQRU5ERUQJCTAgLyogU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KICNkZWZpbmUgSlBFR19IRUFERVJfT0sJCTEgLyogRm91bmQgdmFsaWQgaW1hZ2UgZGF0YXN0cmVhbSAqLwogI2RlZmluZSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWQkyIC8qIEZvdW5kIHZhbGlkIHRhYmxlLXNwZWNzLW9ubHkgZGF0YXN0cmVhbSAqLwotLyogSWYgeW91IHBhc3MgcmVxdWlyZV9pbWFnZSA9IFRSVUUgKG5vcm1hbCBjYXNlKSwgeW91IG5lZWQgbm90IGNoZWNrIGZvcgorLyogSWYgeW91IHBhc3MgcmVxdWlyZV9pbWFnZSA9IHRydWUgKG5vcm1hbCBjYXNlKSwgeW91IG5lZWQgbm90IGNoZWNrIGZvcgogICogYSBUQUJMRVNfT05MWSByZXR1cm4gY29kZTsgYW4gYWJicmV2aWF0ZWQgZmlsZSB3aWxsIGNhdXNlIGFuIGVycm9yIGV4aXQuCiAgKiBKUEVHX1NVU1BFTkRFRCBpcyBvbmx5IHBvc3NpYmxlIGlmIHlvdSB1c2UgYSBkYXRhIHNvdXJjZSBtb2R1bGUgdGhhdCBjYW4KICAqIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybiAodGhlIHN0ZGlvIHNvdXJjZSBtb2R1bGUgZG9lc24ndCkuCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAKaW5kZXggODNhNDIwYS4uZjE5NDQ1ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcApAQCAtMjQ5LDggKzI0OSw4IEBACiAgICAgQ1JZUFRfTUQ1VXBkYXRlKCZjdHgsIGlucHV0LCBsZW5ndGgpOwogICAgIENSWVBUX01ENUZpbmlzaCgmY3R4LCBkaWdlc3QpOwogfQotc3RhdGljIEZYX0JPT0wgKCpnX1B1YktleURlY3J5cHRvcikoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pID0gTlVMTDsKLXZvaWQgQ1JZUFRfU2V0UHViS2V5RGVjcnlwdG9yKEZYX0JPT0wgKCpmdW5jKShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCogZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX2xlbikpCitzdGF0aWMgYm9vbCAoKmdfUHViS2V5RGVjcnlwdG9yKShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCogZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX2xlbikgPSBOVUxMOwordm9pZCBDUllQVF9TZXRQdWJLZXlEZWNyeXB0b3IoYm9vbCAoKmZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSkKIHsKICAgICBnX1B1YktleURlY3J5cHRvciA9IGZ1bmM7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcAppbmRleCA0YmQ4NzEwLi45ZjE0MjIyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAKQEAgLTk4OCw3ICs5ODgsNyBAQAogICAgIH0KICAgICBGWFNZU19tZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOwogfQotdm9pZCBDUllQVF9BRVNTZXRLZXkodm9pZCogY29udGV4dCwgRlhfRFdPUkQgYmxvY2tsZW4sIGNvbnN0IHVpbnQ4X3QqIGtleSwgRlhfRFdPUkQga2V5bGVuLCBGWF9CT09MIGJFbmNyeXB0KQordm9pZCBDUllQVF9BRVNTZXRLZXkodm9pZCogY29udGV4dCwgRlhfRFdPUkQgYmxvY2tsZW4sIGNvbnN0IHVpbnQ4X3QqIGtleSwgRlhfRFdPUkQga2V5bGVuLCBib29sIGJFbmNyeXB0KQogewogICAgIGFlc19zZXR1cCgoQUVTQ29udGV4dCopY29udGV4dCwgYmxvY2tsZW4sIGtleSwga2V5bGVuKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwCmluZGV4IGIyMjM0OGEuLmRlMWVjMDggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKKysrIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfc2hhLmNwcApAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID49ICdBJyAmJiBzdHJbaV0gPD0gJ0YnKSB7CiAgICAgICAgICAgICByZXQgfD0gKHN0cltpXSAtICdBJyArIDEwKSAmIDB4RkY7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOworICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfYmFzaWNfbW9kdWxlLmNwcAppbmRleCAwM2NmZDY2Li44MzAzNGFmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfYmFzaWNfbW9kdWxlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfYmFzaWNfbW9kdWxlLmNwcApAQCAtNDQsMTQgKzQ0LDE0IEBACiB7CiB9CiAKLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OlNldERvd25sb2FkQ2FsbGJhY2soRlhfQk9PTCAoKmNhbGxiYWNrKShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSkpCit2b2lkIENQREZfTW9kdWxlTWdyOjpTZXREb3dubG9hZENhbGxiYWNrKGJvb2wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKQogewogICAgIG1fcERvd25sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjazsKIH0KLUZYX0JPT0wgQ1BERl9Nb2R1bGVNZ3I6OkRvd25sb2FkTW9kdWxlKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKQorYm9vbCBDUERGX01vZHVsZU1ncjo6RG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpCiB7CiAgICAgaWYgKG1fcERvd25sb2FkQ2FsbGJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERvd25sb2FkQ2FsbGJhY2sobW9kdWxlX25hbWUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oCmluZGV4IDRhZWMzMmEuLmJjNGM3MmEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9lZGl0aW50LmgKQEAgLTEyLDcgKzEyLDcgQEAKIHB1YmxpYzoKICAgICBDUERGX09iamVjdFN0cmVhbSgpOwogCi0gICAgRlhfQk9PTAkJCQlTdGFydCgpOworICAgIGJvb2wJCQkJU3RhcnQoKTsKIAogICAgIGludDMyX3QJCQlDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCBDUERGX09iamVjdCAqcE9iaik7CiAgICAgaW50MzJfdAkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7CkBAIC0zNCwxNSArMzQsMTUgQEAKIAogICAgIENQREZfWFJlZlN0cmVhbSgpOwogCi0gICAgRlhfQk9PTAkJCQlTdGFydCgpOworICAgIGJvb2wJCQkJU3RhcnQoKTsKIAogICAgIGludDMyX3QJCQlDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCBDUERGX09iamVjdCAqcE9iaiwgQ1BERl9DcmVhdG9yICpwQ3JlYXRvcik7CiAKICAgICBpbnQzMl90CQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplLCBDUERGX0NyZWF0b3IgKnBDcmVhdG9yKTsKIAotICAgIEZYX0JPT0wJCQkJRW5kKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIEZYX0JPT0wgYkVPRiA9IEZBTFNFKTsKLSAgICBGWF9CT09MCQkJCUFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShGWF9EV09SRCBvYmpudW0pOwotICAgIEZYX0JPT0wJCQkJRW5kWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yKTsKKyAgICBib29sCQkJCUVuZChDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBib29sIGJFT0YgPSBmYWxzZSk7CisgICAgYm9vbAkJCQlBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKTsKKyAgICBib29sCQkJCUVuZFhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7CiAKIAogICAgIENGWF9EV29yZEFycmF5CQltX0luZGV4QXJyYXk7CkBAIC01MSw4ICs1MSw4IEBACiAgICAgRlhfRFdPUkQJCQltX2R3VGVtcE9iak51bTsKIAogcHJvdGVjdGVkOgotICAgIGludDMyX3QJCQlFbmRPYmplY3RTdHJlYW0oQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgRlhfQk9PTCBiRU9GID0gVFJVRSk7Ci0gICAgRlhfQk9PTAkJCQlHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKTsKKyAgICBpbnQzMl90CQkJRW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIGJvb2wgYkVPRiA9IHRydWUpOworICAgIGJvb2wJCQkJR2VuZXJhdGVYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIGJvb2wgYkVPRik7CiAgICAgaW50MzJfdAkJCW1faVNlZzsKICAgICBDUERGX09iamVjdFN0cmVhbQltX09ialN0cmVhbTsKICAgICBDRlhfQnl0ZVRleHRCdWYJCW1fQnVmZmVyOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwCmluZGV4IDY1Zjc4ZGEuLmI4NDkzNmMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAKQEAgLTI4LDEwICsyOCwxMCBAQAogQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjp+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRlKCkKIHsKIH0KLUZYX0JPT0wgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpJbnNlcnRQYWdlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmplY3QpCitib29sIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6SW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KQogewogICAgIGlmICghcFBhZ2VPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX3BhZ2VPYmplY3RzLkFkZChwUGFnZU9iamVjdCk7CiB9CkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgIHBQYWdlRGljdC0+UmVtb3ZlQXQoIkNvbnRlbnRzIik7CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CisgICAgcFN0cmVhbS0+U2V0RGF0YShidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKICAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CiAgICAgcFBhZ2VEaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwogfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgIFByb2Nlc3NGb3JtKGJ1ZiwgY29udGVudFN0cmVhbS5HZXREYXRhKCksIGNvbnRlbnRTdHJlYW0uR2V0U2l6ZSgpLCBtYXRyaXgpOwogICAgIH0KICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLSAgICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICAgIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CiAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOwogICAgIG1fcFBhZ2UtPm1fcEZvcm1EaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcAppbmRleCAyMjgyNmEzLi5iMTk3YjI1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcApAQCAtMTMsNyArMTMsNyBAQAogZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX2RhdGEsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBleHRlcm4gdm9pZCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLWV4dGVybiBGWF9CT09MIElzU2lnbmF0dXJlRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKK2V4dGVybiBib29sIElzU2lnbmF0dXJlRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIGludDMyX3QgUERGX0NyZWF0b3JBcHBlbmRPYmplY3QoY29uc3QgQ1BERl9PYmplY3QqIHBPYmosIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSAqcEZpbGUsIEZYX0ZJTEVTSVpFJiBvZmZzZXQpCiB7CiAgICAgaW50MzJfdCBsZW4gPSAwOwpAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewogICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOworICAgICAgICAgICAgICAgIGJvb2wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwogICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCkpKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gODsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHAsIFRSVUUpOworICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJsb2NrKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY4LDEyICsxNjgsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICAgICAgICBBU1NFUlQoZmFsc2UpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiAxOwogfQotaW50MzJfdCBQREZfQ3JlYXRvcldyaXRlVHJhaWxlcihDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUsIENQREZfQXJyYXkqIHBJREFycmF5LCBGWF9CT09MIGJDb21wcmVzcykKK2ludDMyX3QgUERGX0NyZWF0b3JXcml0ZVRyYWlsZXIoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLCBDUERGX0FycmF5KiBwSURBcnJheSwgYm9vbCBiQ29tcHJlc3MpCiB7CiAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMDsKICAgICBpbnQzMl90IGxlbiA9IDA7CkBAIC0yODUsMTAgKzI4NSwxMCBAQAogICAgIG9mZnNldCArPSBsZW4gKyA2OwogICAgIHJldHVybiBvZmZzZXQ7CiB9Ci1GWF9CT09MIFBERl9HZW5lcmF0ZUZpbGVJRChGWF9EV09SRCBkd1NlZWQxLCBGWF9EV09SRCBkd1NlZWQyLCBGWF9EV09SRCogcEJ1ZmZlcikKK2Jvb2wgUERGX0dlbmVyYXRlRmlsZUlEKEZYX0RXT1JEIGR3U2VlZDEsIEZYX0RXT1JEIGR3U2VlZDIsIEZYX0RXT1JEKiBwQnVmZmVyKQogewogICAgIGlmICghcEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdm9pZCogcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkMSk7CiAgICAgaW50MzJfdCBpID0gMDsKQEAgLTMwMSwyMSArMzAxLDIxIEBACiAgICAgICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOwogICAgIH0KICAgICBGWF9SYW5kb21fTVRfQ2xvc2UocENvbnRleHQpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ1BERl9GbGF0ZUVuY29kZXIKIHsKIHB1YmxpYzoKICAgICBDUERGX0ZsYXRlRW5jb2RlcigpOwogICAgIH5DUERGX0ZsYXRlRW5jb2RlcigpOwotICAgIEZYX0JPT0wJCUluaXRpYWxpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkZsYXRlRW5jb2RlKTsKLSAgICBGWF9CT09MCQlJbml0aWFsaXplKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkZsYXRlRW5jb2RlLCBGWF9CT09MIGJYUmVmU3RyZWFtID0gRkFMU0UpOworICAgIGJvb2wJCUluaXRpYWxpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGJvb2wgYkZsYXRlRW5jb2RlKTsKKyAgICBib29sCQlJbml0aWFsaXplKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIHNpemUsIGJvb2wgYkZsYXRlRW5jb2RlLCBib29sIGJYUmVmU3RyZWFtID0gZmFsc2UpOwogICAgIHZvaWQJCUNsb25lRGljdCgpOwogICAgIHVpbnQ4X3QqCQkJbV9wRGF0YTsKICAgICBGWF9EV09SRAkJCW1fZHdTaXplOwogICAgIENQREZfRGljdGlvbmFyeSoJbV9wRGljdDsKLSAgICBGWF9CT09MCQkJCW1fYkNsb25lZDsKLSAgICBGWF9CT09MCQkJCW1fYk5ld0RhdGE7CisgICAgYm9vbAkJCQltX2JDbG9uZWQ7CisgICAgYm9vbAkJCQltX2JOZXdEYXRhOwogICAgIENQREZfU3RyZWFtQWNjCQltX0FjYzsKIH07CiBDUERGX0ZsYXRlRW5jb2Rlcjo6Q1BERl9GbGF0ZUVuY29kZXIoKQpAQCAtMzIzLDE5ICszMjMsMTkgQEAKICAgICBtX3BEYXRhID0gTlVMTDsKICAgICBtX2R3U2l6ZSA9IDA7CiAgICAgbV9wRGljdCA9IE5VTEw7Ci0gICAgbV9iQ2xvbmVkID0gRkFMU0U7Ci0gICAgbV9iTmV3RGF0YSA9IEZBTFNFOworICAgIG1fYkNsb25lZCA9IGZhbHNlOworICAgIG1fYk5ld0RhdGEgPSBmYWxzZTsKIH0KIHZvaWQgQ1BERl9GbGF0ZUVuY29kZXI6OkNsb25lRGljdCgpCiB7CiAgICAgaWYgKCFtX2JDbG9uZWQpIHsKICAgICAgICAgbV9wRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcERpY3QtPkNsb25lKCk7Ci0gICAgICAgIG1fYkNsb25lZCA9IFRSVUU7CisgICAgICAgIG1fYkNsb25lZCA9IHRydWU7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUpCitib29sIENQREZfRmxhdGVFbmNvZGVyOjpJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJGbGF0ZUVuY29kZSkKIHsKLSAgICBtX0FjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBUUlVFKTsKKyAgICBtX0FjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCB0cnVlKTsKICAgICBpZiAoKHBTdHJlYW0gJiYgcFN0cmVhbS0+R2V0RGljdCgpICYmIHBTdHJlYW0tPkdldERpY3QoKS0+S2V5RXhpc3QoIkZpbHRlciIpKSB8fCAhYkZsYXRlRW5jb2RlKSB7CiAgICAgICAgIGlmIChwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSAmJiAhYkZsYXRlRW5jb2RlKSB7CiAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBkZXN0QWNjOwpAQCAtMzQ0LDQwICszNDQsNDAgQEAKICAgICAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopZGVzdEFjYy5EZXRhY2hEYXRhKCk7CiAgICAgICAgICAgICBtX3BEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpOwogICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICAgICAgICAgIG1fYk5ld0RhdGEgPSBUUlVFOwotICAgICAgICAgICAgbV9iQ2xvbmVkID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5ld0RhdGEgPSB0cnVlOworICAgICAgICAgICAgbV9iQ2xvbmVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopbV9BY2MuR2V0RGF0YSgpOwogICAgICAgICAgICAgbV9kd1NpemUgPSBtX0FjYy5HZXRTaXplKCk7CiAgICAgICAgICAgICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwotICAgIG1fYk5ld0RhdGEgPSBUUlVFOwotICAgIG1fYkNsb25lZCA9IFRSVUU7CisgICAgbV9iTmV3RGF0YSA9IHRydWU7CisgICAgbV9iQ2xvbmVkID0gdHJ1ZTsKICAgICA6OkZsYXRlRW5jb2RlKG1fQWNjLkdldERhdGEoKSwgbV9BY2MuR2V0U2l6ZSgpLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CiAgICAgbV9wRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBTdHJlYW0tPkdldERpY3QoKS0+Q2xvbmUoKTsKICAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoIkxlbmd0aCIsIG1fZHdTaXplKTsKICAgICBtX3BEaWN0LT5TZXRBdE5hbWUoIkZpbHRlciIsICJGbGF0ZURlY29kZSIpOwogICAgIG1fcERpY3QtPlJlbW92ZUF0KCJEZWNvZGVQYXJtcyIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJGbGF0ZUVuY29kZSwgRlhfQk9PTCBiWFJlZlN0cmVhbSkKK2Jvb2wgQ1BERl9GbGF0ZUVuY29kZXI6OkluaXRpYWxpemUoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSwgYm9vbCBiRmxhdGVFbmNvZGUsIGJvb2wgYlhSZWZTdHJlYW0pCiB7CiAgICAgaWYgKCFiRmxhdGVFbmNvZGUpIHsKICAgICAgICAgbV9wRGF0YSA9ICh1aW50OF90KilwQnVmZmVyOwogICAgICAgICBtX2R3U2l6ZSA9IHNpemU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgbV9iTmV3RGF0YSA9IFRSVUU7CisgICAgbV9iTmV3RGF0YSA9IHRydWU7CiAgICAgaWYgKGJYUmVmU3RyZWFtKSB7CiAgICAgICAgIDo6RmxhdGVFbmNvZGUocEJ1ZmZlciwgc2l6ZSwgMTIsIDEsIDgsIDcsIG1fcERhdGEsIG1fZHdTaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICA6OkZsYXRlRW5jb2RlKHBCdWZmZXIsIHNpemUsIG1fcERhdGEsIG1fZHdTaXplKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX0ZsYXRlRW5jb2Rlcjo6fkNQREZfRmxhdGVFbmNvZGVyKCkKIHsKQEAgLTM5MywzMyArMzkzLDMzIEBACiBwdWJsaWM6CiAgICAgQ1BERl9FbmNyeXB0b3IoKTsKICAgICB+Q1BERl9FbmNyeXB0b3IoKTsKLSAgICBGWF9CT09MCQlJbml0aWFsaXplKENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIsIGludCBvYmpudW0sIHVpbnQ4X3QqIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfc2l6ZSk7CisgICAgYm9vbAkJSW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCB1aW50OF90KiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpOwogICAgIHVpbnQ4X3QqCQkJbV9wRGF0YTsKICAgICBGWF9EV09SRAkJCW1fZHdTaXplOwotICAgIEZYX0JPT0wJCQkJbV9iTmV3QnVmOworICAgIGJvb2wJCQkJbV9iTmV3QnVmOwogfTsKIENQREZfRW5jcnlwdG9yOjpDUERGX0VuY3J5cHRvcigpCiB7CiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwotICAgIG1fYk5ld0J1ZiA9IEZBTFNFOworICAgIG1fYk5ld0J1ZiA9IGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0VuY3J5cHRvcjo6SW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCB1aW50OF90KiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpCitib29sIENQREZfRW5jcnlwdG9yOjpJbml0aWFsaXplKENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIsIGludCBvYmpudW0sIHVpbnQ4X3QqIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfc2l6ZSkKIHsKICAgICBpZiAoc3JjX3NpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwSGFuZGxlciA9PSBOVUxMKSB7CiAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopc3JjX2RhdGE7CiAgICAgICAgIG1fZHdTaXplID0gc3JjX3NpemU7Ci0gICAgICAgIG1fYk5ld0J1ZiA9IEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgbV9iTmV3QnVmID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX2R3U2l6ZSA9IHBIYW5kbGVyLT5FbmNyeXB0R2V0U2l6ZShvYmpudW0sIDAsIHNyY19kYXRhLCBzcmNfc2l6ZSk7CiAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKICAgICBwSGFuZGxlci0+RW5jcnlwdENvbnRlbnQob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUsIG1fcERhdGEsIG1fZHdTaXplKTsKLSAgICBtX2JOZXdCdWYgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fYk5ld0J1ZiA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX0VuY3J5cHRvcjo6fkNQREZfRW5jcnlwdG9yKCkKIHsKQEAgLTQzMiwxNCArNDMyLDE0IEBACiAgICAgLCBtX2luZGV4KDApCiB7CiB9Ci1GWF9CT09MIENQREZfT2JqZWN0U3RyZWFtOjpTdGFydCgpCitib29sIENQREZfT2JqZWN0U3RyZWFtOjpTdGFydCgpCiB7CiAgICAgbV9PYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKICAgICBtX09mZnNldEFycmF5LlJlbW92ZUFsbCgpOwogICAgIG1fQnVmZmVyLkNsZWFyKCk7CiAgICAgbV9kd09iak51bSA9IDA7CiAgICAgbV9pbmRleCA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBpbnQzMl90IENQREZfT2JqZWN0U3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCBDUERGX09iamVjdCAqcE9iaikKIHsKQEAgLTU0NywxMiArNTQ3LDEyIEBACiAgICAgLCBtX2lTZWcoMCkKIHsKIH0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpTdGFydCgpCitib29sIENQREZfWFJlZlN0cmVhbTo6U3RhcnQoKQogewogICAgIG1fSW5kZXhBcnJheS5SZW1vdmVBbGwoKTsKICAgICBtX0J1ZmZlci5DbGVhcigpOwogICAgIG1faVNlZyA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBpbnQzMl90IENQREZfWFJlZlN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmosIENQREZfQ3JlYXRvciAqcENyZWF0b3IpCiB7CkBAIC01NzgsNyArNTc4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIEVuZE9iamVjdFN0cmVhbShwQ3JlYXRvcik7CiB9Ci1zdGF0aWMgdm9pZCBfQXBwZW5kSW5kZXgwKENGWF9CeXRlVGV4dEJ1ZiYgYnVmZmVyLCBGWF9CT09MIGJGaXJzdE9iamVjdCA9ICBUUlVFKQorc3RhdGljIHZvaWQgX0FwcGVuZEluZGV4MChDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgYm9vbCBiRmlyc3RPYmplY3QgPSAgdHJ1ZSkKIHsKICAgICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKICAgICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKQEAgLTYxMyw3ICs2MTMsNyBAQAogICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KGluZGV4KSk7CiAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAoaW5kZXgpKTsKIH0KLWludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpFbmRPYmplY3RTdHJlYW0oQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKQoraW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBib29sIGJFT0YpCiB7CiAgICAgRlhfRklMRVNJWkUgb2JqT2Zmc2V0ID0gMDsKICAgICBpZiAoYkVPRikgewpAQCAtNjQ0LDcgKzY0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBpbmRleCsrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlTaXplID4gMCAmJiBiRU9GKSB7CkBAIC02ODIsMTIgKzY4MiwxMiBAQAogICAgIH0KICAgICByZXR1cm4gMTsKIH0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKQorYm9vbCBDUERGX1hSZWZTdHJlYW06OkdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBib29sIGJFT0YpCiB7CiAgICAgRlhfRklMRVNJWkUgb2Zmc2V0X3RtcCA9IHBDcmVhdG9yLT5tX09mZnNldDsKICAgICBGWF9EV09SRCBvYmpudW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKICAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlID0gJnBDcmVhdG9yLT5tX0ZpbGU7Ci0gICAgRlhfQk9PTCBiSW5jcmVtZW50YWwgPSAocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7CisgICAgYm9vbCBiSW5jcmVtZW50YWwgPSAocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7CiAgICAgaWYgKGJJbmNyZW1lbnRhbCkgewogICAgICAgICBBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKICAgICB9IGVsc2UgewpAQCAtNjk2LDcgKzY5Niw3IEBACiAgICAgICAgICAgICBpZiAob2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MShtX0J1ZmZlciwgKm9mZnNldCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03MDQsNDkgKzcwNCw0OSBAQAogICAgIEZYX0ZJTEVTSVpFICZvZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7CiAgICAgaW50MzJfdCBsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtKTsKICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIG9ialxyXG48PC9UeXBlIC9YUmVmL1dbMSA0IDJdL0luZGV4WyIpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuOwogICAgIGlmICghYkluY3JlbWVudGFsKSB7CiAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKDApKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwogICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChvYmpudW0gKyAxKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQzMl90IGlTZWcgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlZzsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CiAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyICsgMSkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdL1NpemUgIikpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgb2Zmc2V0ICs9IGxlbiArIDc7CiAgICAgaWYgKG1fUHJldk9mZnNldCA+IDApIHsKQEAgLTc2MiwyNiArNzYyLDI2IEBACiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDY7CiAgICAgfQotICAgIEZYX0JPT0wgYlByZWRpY3RvciA9IFRSVUU7CisgICAgYm9vbCBiUHJlZGljdG9yID0gdHJ1ZTsKICAgICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyOwogICAgIGVuY29kZXIuSW5pdGlhbGl6ZShtX0J1ZmZlci5HZXRCdWZmZXIoKSwgbV9CdWZmZXIuR2V0TGVuZ3RoKCksIHBDcmVhdG9yLT5tX2JDb21wcmVzcywgYlByZWRpY3Rvcik7CiAgICAgaWYgKHBDcmVhdG9yLT5tX2JDb21wcmVzcykgewogICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0ZpbHRlciAvRmxhdGVEZWNvZGUiKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IDIwOwogICAgICAgICBpZiAoYlByZWRpY3RvcikgewogICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRGVjb2RlUGFybXM8PC9Db2x1bW5zIDcvUHJlZGljdG9yIDEyPj4iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvTGVuZ3RoICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKGVuY29kZXIubV9kd1NpemUpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW4gKyA4OwogICAgIGlmIChiRU9GKSB7CkBAIC04MDEsMjcgKzgwMSwyNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47CiAgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtXHJcbmVuZG9ialxyXG4iKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgb2Zmc2V0ICs9IGVuY29kZXIubV9kd1NpemUgKyBsZW47CiAgICAgbV9QcmV2T2Zmc2V0ID0gb2Zmc2V0X3RtcDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpFbmQoQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgRlhfQk9PTCBiRU9GICkKK2Jvb2wgQ1BERl9YUmVmU3RyZWFtOjpFbmQoQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgYm9vbCBiRU9GICkKIHsKICAgICBpZiAoRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yLCBiRU9GKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBHZW5lcmF0ZVhSZWZTdHJlYW0ocENyZWF0b3IsIGJFT0YpOwogfQotRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OkVuZFhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcikKK2Jvb2wgQ1BERl9YUmVmU3RyZWFtOjpFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpCiB7CiAgICAgaWYgKCEocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7CiAgICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIpOwpAQCAtODMwLDcgKzgzMCw3IEBACiAgICAgICAgICAgICBpZiAob2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MShtX0J1ZmZlciwgKm9mZnNldCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtODQzLDkgKzg0Myw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEdlbmVyYXRlWFJlZlN0cmVhbShwQ3JlYXRvciwgRkFMU0UpOworICAgIHJldHVybiBHZW5lcmF0ZVhSZWZTdHJlYW0ocENyZWF0b3IsIGZhbHNlKTsKIH0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKQorYm9vbCBDUERGX1hSZWZTdHJlYW06OkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShGWF9EV09SRCBvYmpudW0pCiB7CiAgICAgaW50MzJfdCBpU2l6ZSA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCk7CiAgICAgaWYgKGlTaXplID09IDApIHsKQEAgLTg2MiwxMyArODYyLDEzIEBACiAgICAgICAgICAgICBtX0luZGV4QXJyYXkuQWRkKDEpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9DcmVhdG9yOjpDUERGX0NyZWF0b3IoQ1BERl9Eb2N1bWVudCogcERvYykKIHsKICAgICBtX3BEb2N1bWVudCA9IHBEb2M7CiAgICAgbV9wUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jLT5tX3BQYXJzZXI7Ci0gICAgbV9iQ29tcHJlc3MgPSBUUlVFOworICAgIG1fYkNvbXByZXNzID0gdHJ1ZTsKICAgICBpZiAobV9wUGFyc2VyKSB7CiAgICAgICAgIG1fcEVuY3J5cHREaWN0ID0gbV9wUGFyc2VyLT5HZXRFbmNyeXB0RGljdCgpOwogICAgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gbV9wUGFyc2VyLT5HZXRDcnlwdG9IYW5kbGVyKCk7CkBAIC04NzYsMTEgKzg3NiwxMSBAQAogICAgICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CiAgICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwogICAgIH0KLSAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBGQUxTRTsKLSAgICBtX2JTdGFuZGFyZFNlY3VyaXR5ID0gRkFMU0U7CisgICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gZmFsc2U7CisgICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IGZhbHNlOwogICAgIG1fcE1ldGFkYXRhID0gTlVMTDsKLSAgICBtX2JFbmNyeXB0Q2xvbmVkID0gRkFMU0U7Ci0gICAgbV9iRW5jcnlwdE1ldGFkYXRhID0gRkFMU0U7CisgICAgbV9iRW5jcnlwdENsb25lZCA9IGZhbHNlOworICAgIG1fYkVuY3J5cHRNZXRhZGF0YSA9IGZhbHNlOwogICAgIG1fT2Zmc2V0ID0gMDsKICAgICBtX2lTdGFnZSA9IC0xOwogICAgIG1fZHdGbGFncyA9IDA7CkBAIC04OTIsNyArODkyLDcgQEAKICAgICBtX3BJREFycmF5ID0gTlVMTDsKICAgICBtX0ZpbGVWZXJzaW9uID0gMDsKICAgICBtX2R3RW5yeXB0T2JqTnVtID0gMDsKLSAgICBtX2JOZXdDcnlwdG8gPSBGQUxTRTsKKyAgICBtX2JOZXdDcnlwdG8gPSBmYWxzZTsKIH0KIENQREZfQ3JlYXRvcjo6fkNQREZfQ3JlYXRvcigpCiB7CkBAIC05MDMsMTAgKzkwMywxMCBAQAogICAgIH0KICAgICBDbGVhcigpOwogfQotc3RhdGljIEZYX0JPT0wgX0lzWFJlZk5lZWRFbmQoQ1BERl9YUmVmU3RyZWFtKiBwWFJlZiwgRlhfRFdPUkQgZmxhZykKK3N0YXRpYyBib29sIF9Jc1hSZWZOZWVkRW5kKENQREZfWFJlZlN0cmVhbSogcFhSZWYsIEZYX0RXT1JEIGZsYWcpCiB7CiAgICAgaWYgKCEoZmxhZyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQzMl90IGlTaXplID0gcFhSZWYtPm1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOwogICAgIGludDMyX3QgaUNvdW50ID0gMDsKQEAgLTEwMDEsNyArMTAwMSw3IEBACiBpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sIEZYX0RXT1JEIG9iam51bSwgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKQogewogICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7Ci0gICAgZW5jb2Rlci5Jbml0aWFsaXplKChDUERGX1N0cmVhbSopcFN0cmVhbSwgcFN0cmVhbSA9PSBtX3BNZXRhZGF0YSA/IEZBTFNFIDogbV9iQ29tcHJlc3MpOworICAgIGVuY29kZXIuSW5pdGlhbGl6ZSgoQ1BERl9TdHJlYW0qKXBTdHJlYW0sIHBTdHJlYW0gPT0gbV9wTWV0YWRhdGEgPyBmYWxzZSA6IG1fYkNvbXByZXNzKTsKICAgICBDUERGX0VuY3J5cHRvciBlbmNyeXB0b3I7CiAgICAgaWYoIWVuY3J5cHRvci5Jbml0aWFsaXplKHBDcnlwdG8sIG9iam51bSwgZW5jb2Rlci5tX3BEYXRhLCBlbmNvZGVyLm1fZHdTaXplKSkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogICAgIH0KICAgICByZXR1cm4gV3JpdGVJbmRpcmVjdE9iaihwT2JqLT5HZXRPYmpOdW0oKSwgcE9iaik7CiB9Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiRW5jcnlwdCkKK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBib29sIGJFbmNyeXB0KQogewogICAgIGludDMyX3QgbGVuID0gMDsKICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CkBAIC0xMDk2LDcgKzEwOTYsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewogICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOworICAgICAgICAgICAgICAgIGJvb2wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwogICAgICAgICAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyID09IE5VTEwgfHwgIWJFbmNyeXB0KSB7CiAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQgPSBQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhjb250ZW50KSkgPCAwKSB7CkBAIC0xMjA2LDEwICsxMjA2LDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDI7CiAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTaWduRGljdCA9IElzU2lnbmF0dXJlRGljdChwKTsKKyAgICAgICAgICAgICAgICBib29sIGJTaWduRGljdCA9IElzU2lnbmF0dXJlRGljdChwKTsKICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwogICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnblZhbHVlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNpZ25WYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7CiAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBwLT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvIikpIDwgMCkgewpAQCAtMTIyMCw3ICsxMjIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyAxOwogICAgICAgICAgICAgICAgICAgICBpZiAoYlNpZ25EaWN0ICYmIGtleSA9PSBGWF9CU1RSQygiQ29udGVudHMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25WYWx1ZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiU2lnblZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7CkBAIC0xMjU1LDggKzEyNTUsOCBAQAogICAgIH0KICAgICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7CiAgICAgdm9pZCogdmFsdWV0ZW1wID0gTlVMTDsKLSAgICBGWF9CT09MIGJFeGlzdEluTWFwID0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVldGVtcCk7Ci0gICAgRlhfQk9PTCBiT2JqU3RtID0gKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyKSAmJiBtX3BFbmNyeXB0RGljdCAmJiAhbV9wWFJlZlN0cmVhbTsKKyAgICBib29sIGJFeGlzdEluTWFwID0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVldGVtcCk7CisgICAgYm9vbCBiT2JqU3RtID0gKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyKSAmJiBtX3BFbmNyeXB0RGljdCAmJiAhbV9wWFJlZlN0cmVhbTsKICAgICBpZihtX3BQYXJzZXItPm1fYlZlcnNpb25VcGRhdGVkIHx8IG1fYlNlY3VyaXR5Q2hhbmdlZCB8fCBiRXhpc3RJbk1hcCB8fCBiT2JqU3RtKSB7CiAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9wRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KG9iam51bSk7CiAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKQEAgLTEzMzQsNyArMTMzNCw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlTmV3T2JqcyhGWF9CT09MIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlICpwUGF1c2UpCitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVOZXdPYmpzKGJvb2wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSkKIHsKICAgICBpbnQzMl90IGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwogICAgIGludDMyX3QgaW5kZXggPSAoaW50MzJfdCkodWludHB0cl90KW1fUG9zOwpAQCAtMTM4NSw4ICsxMzg1LDggQEAKIH0KIHZvaWQgQ1BERl9DcmVhdG9yOjpJbml0TmV3T2JqTnVtT2Zmc2V0cygpCiB7Ci0gICAgRlhfQk9PTCBiSW5jcmVtZW50YWwgPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMDsKLSAgICBGWF9CT09MIGJOb09yaWdpbmFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpICE9IDA7CisgICAgYm9vbCBiSW5jcmVtZW50YWwgPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMDsKKyAgICBib29sIGJOb09yaWdpbmFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpICE9IDA7CiAgICAgRlhfRFdPUkQgbk9sZFNpemUgPSBtX3BQYXJzZXIgPyBtX3BQYXJzZXItPm1fQ3Jvc3NSZWYuR2V0U2l6ZSgpIDogMDsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BEb2N1bWVudC0+bV9JbmRpcmVjdE9ianMuR2V0U3RhcnRQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKQEAgLTE0MTQsNyArMTQxNCw3IEBACiAgICAgfQogICAgIGludDMyX3QgaSA9IDA7CiAgICAgRlhfRFdPUkQgZHdTdGFydE9iak51bSA9IDA7Ci0gICAgRlhfQk9PTCBiQ3Jvc3NSZWZWYWxpZCA9IG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCkgPiAwOworICAgIGJvb2wgYkNyb3NzUmVmVmFsaWQgPSBtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID4gMDsKICAgICB3aGlsZSAoaSA8IGlDb3VudCkgewogICAgICAgICBkd1N0YXJ0T2JqTnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7CiAgICAgICAgIGlmICgoYkluY3JlbWVudGFsICYmIChiTm9PcmlnaW5hbCB8fCBiQ3Jvc3NSZWZWYWxpZCkpIHx8ICFtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd1N0YXJ0T2JqTnVtKSkgewpAQCAtMTQyNywxMCArMTQyNywxMCBAQAogICAgIH0KICAgICBGWF9EV09SRCBkd0xhc3RPYmpOdW0gPSBkd1N0YXJ0T2JqTnVtOwogICAgIGkrKzsKLSAgICBGWF9CT09MIGJOZXdTdGFydCA9IEZBTFNFOworICAgIGJvb2wgYk5ld1N0YXJ0ID0gZmFsc2U7CiAgICAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgewogICAgICAgICBGWF9EV09SRCBkd0N1ck9iak51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICBGWF9CT09MIGJFeGlzdCA9IChkd0N1ck9iak51bSA8IG5PbGRTaXplICYmIG1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGR3Q3VyT2JqTnVtKSAhPSBOVUxMKTsKKyAgICAgICAgYm9vbCBiRXhpc3QgPSAoZHdDdXJPYmpOdW0gPCBuT2xkU2l6ZSAmJiBtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd0N1ck9iak51bSkgIT0gTlVMTCk7CiAgICAgICAgIGlmIChiRXhpc3QgfHwgZHdDdXJPYmpOdW0gLSBkd0xhc3RPYmpOdW0gPiAxKSB7CiAgICAgICAgICAgICBpZiAoIWJOZXdTdGFydCkgewogICAgICAgICAgICAgICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7CkBAIC0xNTQ2LDcgKzE1NDYsNyBAQAogICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDAgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKICAgICAgICAgICAgIEluaXRPbGRPYmpOdW1PZmZzZXRzKCk7CiAgICAgICAgICAgICBGWF9EV09SRCBkd0VuZCA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwotICAgICAgICAgICAgRlhfQk9PTCBiT2JqU3RtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSAhPSAwOworICAgICAgICAgICAgYm9vbCBiT2JqU3RtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSAhPSAwOwogICAgICAgICAgICAgZm9yIChGWF9EV09SRCBvYmpudW0gPSAwOyBvYmpudW0gPD0gZHdFbmQ7IG9iam51bSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAwIHx8IG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNjIyLDcgKzE2MjIsNyBAQAogICAgIGlmIChtX2lTdGFnZSA9PSA4MCkgewogICAgICAgICBtX1hyZWZTdGFydCA9IG1fT2Zmc2V0OwogICAgICAgICBpZiAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0pIHsKLSAgICAgICAgICAgIG1fcFhSZWZTdHJlYW0tPkVuZCh0aGlzLCBUUlVFKTsKKyAgICAgICAgICAgIG1fcFhSZWZTdHJlYW0tPkVuZCh0aGlzLCB0cnVlKTsKICAgICAgICAgICAgIG1fWHJlZlN0YXJ0ID0gbV9wWFJlZlN0cmVhbS0+bV9QcmV2T2Zmc2V0OwogICAgICAgICAgICAgbV9pU3RhZ2UgPSA5MDsKICAgICAgICAgfSBlbHNlIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fCAhbV9wUGFyc2VyLT5Jc1hSZWZTdHJlYW0oKSkgewpAQCAtMTc2NSw3ICsxNzY1LDcgQEAKIHsKICAgICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPj0gOTApOwogICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0pID09IDApIHsKLSAgICAgICAgRlhfQk9PTCBiWFJlZlN0cmVhbSA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCk7CisgICAgICAgIGJvb2wgYlhSZWZTdHJlYW0gPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpOwogICAgICAgICBpZiAoIWJYUmVmU3RyZWFtKSB7CiAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygidHJhaWxlclxyXG48PCIpKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xOTc2LDM5ICsxOTc2LDM5IEBACiAgICAgICAgIG1fcElEQXJyYXkgPSBOVUxMOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQorYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZmxhZ3MpCiB7CiAgICAgaWYgKCFtX0ZpbGUuQXR0YWNoRmlsZShmaWxlbmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wgYlJldCA9IENyZWF0ZShmbGFncyk7CisgICAgYm9vbCBiUmV0ID0gQ3JlYXRlKGZsYWdzKTsKICAgICBpZiAoIWJSZXQgfHwgIShmbGFncyAmIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUpKSB7CiAgICAgICAgIENsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBiUmV0OwogfQotRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQorYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQogewogICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOworICAgIGJvb2wgYlJldCA9IENyZWF0ZShmbGFncyk7CiAgICAgaWYgKCFiUmV0IHx8ICEoZmxhZ3MgJiBGUERGQ1JFQVRFX1BST0dSRVNTSVZFKSkgewogICAgICAgICBDbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKIH0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoSUZYX1N0cmVhbVdyaXRlKiBwRmlsZSwgRlhfRFdPUkQgZmxhZ3MpCitib29sIENQREZfQ3JlYXRvcjo6Q3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzKQogewogICAgIGlmICghcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUocEZpbGUsIEZBTFNFKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX0ZpbGUuQXR0YWNoRmlsZShwRmlsZSwgZmFsc2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIENyZWF0ZShmbGFncyk7CiB9Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6Q3JlYXRlKEZYX0RXT1JEIGZsYWdzKQorYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZShGWF9EV09SRCBmbGFncykKIHsKICAgICBtX2R3RmxhZ3MgPSBmbGFnczsKICAgICBtX2lTdGFnZSA9IDA7CkBAIC0yMDE5LDE0ICsyMDE5LDE0IEBACiAgICAgbV9OZXdPYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKICAgICBJbml0SUQoKTsKICAgICBpZiAoZmxhZ3MgJiBGUERGQ1JFQVRFX1BST0dSRVNTSVZFKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIENvbnRpbnVlKE5VTEwpID4gLTE7CiB9Ci12b2lkIENQREZfQ3JlYXRvcjo6SW5pdElEKEZYX0JPT0wgYkRlZmF1bHQgKQordm9pZCBDUERGX0NyZWF0b3I6OkluaXRJRChib29sIGJEZWZhdWx0ICkKIHsKICAgICBDUERGX0FycmF5KiBwT2xkSURBcnJheSA9IG1fcFBhcnNlciA/IG1fcFBhcnNlci0+R2V0SURBcnJheSgpIDogTlVMTDsKLSAgICBGWF9CT09MIGJOZXdJZCA9ICFtX3BJREFycmF5OworICAgIGJvb2wgYk5ld0lkID0gIW1fcElEQXJyYXk7CiAgICAgaWYgKCFtX3BJREFycmF5KSB7CiAgICAgICAgIEZYX0RXT1JEKiBwQnVmZmVyID0gTlVMTDsKICAgICAgICAgbV9wSURBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwpAQCAtMjAzNyw3ICsyMDM3LDcgQEAKICAgICAgICAgICAgIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9EV09SRCwgNCk7CiAgICAgICAgICAgICBQREZfR2VuZXJhdGVGaWxlSUQoKEZYX0RXT1JEKSh1aW50cHRyX3QpdGhpcywgbV9kd0xhc3RPYmpOdW0sIHBCdWZmZXIpOwogICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzQnVmZmVyKChjb25zdCB1aW50OF90KilwQnVmZmVyLCA0ICogc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgICAgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgVFJVRSksIG1fcERvY3VtZW50KTsKKyAgICAgICAgICAgIG1fcElEQXJyYXktPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGJzQnVmZmVyLCB0cnVlKSwgbV9wRG9jdW1lbnQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQnVmZmVyKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOwpAQCAtMjA1NSw3ICsyMDU1LDcgQEAKICAgICAgICAgRlhfRFdPUkQqIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9EV09SRCwgNCk7CiAgICAgICAgIFBERl9HZW5lcmF0ZUZpbGVJRCgoRlhfRFdPUkQpKHVpbnRwdHJfdCl0aGlzLCBtX2R3TGFzdE9iak51bSwgcEJ1ZmZlcik7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0J1ZmZlcigoY29uc3QgdWludDhfdCopcEJ1ZmZlciwgNCAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgVFJVRSksIG1fcERvY3VtZW50KTsKKyAgICAgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIHRydWUpLCBtX3BEb2N1bWVudCk7CiAgICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMDcxLDggKzIwNzEsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IG5ldyBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjsKICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsICZoYW5kbGVyKTsKLSAgICAgICAgICAgIG1fYk5ld0NyeXB0byA9IFRSVUU7Ci0gICAgICAgICAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgbV9iTmV3Q3J5cHRvID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMTAzLDE4ICsyMTAzLDE4IEBACiAgICAgfQogICAgIHJldHVybiBtX2lTdGFnZTsKIH0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpTZXRGaWxlVmVyc2lvbihpbnQzMl90IGZpbGVWZXJzaW9uICkKK2Jvb2wgQ1BERl9DcmVhdG9yOjpTZXRGaWxlVmVyc2lvbihpbnQzMl90IGZpbGVWZXJzaW9uICkKIHsKICAgICBpZiAoZmlsZVZlcnNpb24gPCAxMCB8fCBmaWxlVmVyc2lvbiA+IDE3KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0ZpbGVWZXJzaW9uID0gZmlsZVZlcnNpb247Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfQ3JlYXRvcjo6UmVtb3ZlU2VjdXJpdHkoKQogewogICAgIFJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOwotICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IFRSVUU7CisgICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gdHJ1ZTsKICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CiAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CiB9CkBAIC0yMTI0LDcgKzIxMjQsNyBAQAogICAgICAgICBkZWxldGUgbV9wQ3J5cHRvSGFuZGxlcjsKICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CiAgICAgfQotICAgIG1fYk5ld0NyeXB0byA9IEZBTFNFOworICAgIG1fYk5ld0NyeXB0byA9IGZhbHNlOwogICAgIGlmICghbV9iU3RhbmRhcmRTZWN1cml0eSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjEzMiw1ICsyMTMyLDUgQEAKICAgICAgICAgbV9wRW5jcnlwdERpY3QtPlJlbGVhc2UoKTsKICAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwogICAgIH0KLSAgICBtX2JTdGFuZGFyZFNlY3VyaXR5ID0gRkFMU0U7CisgICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcAppbmRleCA1YTVmYjk0Li4zNjIxYzc5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcApAQCAtMTIsNyArMTIsNyBAQAogewogICAgIG1fcFJvb3REaWN0ID0gTlVMTDsKICAgICBtX3BJbmZvRGljdCA9IE5VTEw7Ci0gICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOworICAgIG1fYkxpbmVhcml6ZWQgPSBmYWxzZTsKICAgICBtX2R3Rmlyc3RQYWdlTm8gPSAwOwogICAgIG1fZHdGaXJzdFBhZ2VPYmpOdW0gPSAwOwogICAgIG1fcERvY1BhZ2UgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgIH0KICAgICBGWF9GcmVlKHdpZHRocyk7CiB9Ci1DUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkKK0NQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkV2luZG93c0ZvbnQoTE9HRk9OVFcqIHBMb2dGb250LCBib29sIGJWZXJ0LCBib29sIGJUcmFuc2xhdGVOYW1lKQogewogICAgIExPR0ZPTlRBIGxmYTsKICAgICBGWFNZU19tZW1jcHkoJmxmYSwgcExvZ0ZvbnQsIChjaGFyKilsZmEubGZGYWNlTmFtZSAtIChjaGFyKikmbGZhKTsKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpCitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRBKiBwTG9nRm9udCwgYm9vbCBiVmVydCwgYm9vbCBiVHJhbnNsYXRlTmFtZSkKIHsKICAgICBwTG9nRm9udC0+bGZIZWlnaHQgPSAtMTAwMDsKICAgICBwTG9nRm9udC0+bGZXaWR0aCA9IDA7CkBAIC0yNjksNyArMjY5LDcgQEAKICAgICBpZiAoKHBMb2dGb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgMHhmOCkgPT0gRkZfU0NSSVBUKSB7CiAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU0NSSVBUOwogICAgIH0KLSAgICBGWF9CT09MIGJDSksgPSBwTG9nRm9udC0+bGZDaGFyU2V0ID09IENISU5FU0VCSUc1X0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCB8fAorICAgIGJvb2wgYkNKSyA9IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fCBwTG9nRm9udC0+bGZDaGFyU2V0ID09IEdCMjMxMl9DSEFSU0VUIHx8CiAgICAgICAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBIQU5HRVVMX0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBTSElGVEpJU19DSEFSU0VUOwogICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250OwogICAgIGlmIChiVHJhbnNsYXRlTmFtZSAmJiBiQ0pLKSB7CkBAIC01NDksNyArNTQ5LDcgQEAKICAgICBkZXN0ID0gKEZYX0NIQVIqKXBCdWZmZXI7CiAgICAgZnJlZShwQnVmZmVyKTsKIH0KLUZYX0JPT0wgSXNIYXNDaGFyU2V0KENGQXJyYXlSZWYgbGFuZ3VhZ2VzLCBjb25zdCBDRlhfRFdvcmRBcnJheSAmY2hhclNldHMpCitib29sIElzSGFzQ2hhclNldChDRkFycmF5UmVmIGxhbmd1YWdlcywgY29uc3QgQ0ZYX0RXb3JkQXJyYXkgJmNoYXJTZXRzKQogewogICAgIGludCBpQ291bnQgPSBjaGFyU2V0cy5HZXRTaXplKCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDRkFycmF5R2V0Q291bnQobGFuZ3VhZ2VzKTsgKytpKSB7CkBAIC01NTcsMTEgKzU1NywxMSBAQAogICAgICAgICBGWF9EV09SRCBDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21MYW5nKENGU3RyaW5nR2V0Q1N0cmluZ1B0cihsYW5ndWFnZSwga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbiksIC0xKTsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpQ291bnQ7ICsraikgewogICAgICAgICAgICAgaWYgKENoYXJTZXQgPT0gY2hhclNldHNbal0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBGWF9HZXRDaGFyV2lkdGgoQ1RGb250UmVmIGZvbnQsIFVuaUNoYXIgc3RhcnQsIFVuaUNoYXIgZW5kLCBpbnQqIHdpZHRoKQogewpAQCAtNTk5LDcgKzU5OSw3IEBACiAgICAgfQogICAgIEZYX0ZyZWUod2lkdGhzKTsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkTWFjRm9udChDVEZvbnRSZWYgcEZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpCitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBib29sIGJWZXJ0LCBib29sIGJUcmFuc2xhdGVOYW1lKQogewogICAgIENURm9udFJlZiBmb250ID0gKENURm9udFJlZilwRm9udDsKICAgICBDVEZvbnREZXNjcmlwdG9yUmVmIGRlc2NyaXB0b3IgPSBDVEZvbnRDb3B5Rm9udERlc2NyaXB0b3IoZm9udCk7CkBAIC02MDcsNyArNjA3LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250OwotICAgIEZYX0JPT0wgYkNKSyA9IEZBTFNFOworICAgIGJvb2wgYkNKSyA9IGZhbHNlOwogICAgIGludCBmbGFncyA9IDAsIGl0YWxpY2FuZ2xlID0gMCwgYXNjZW5kID0gMCwgZGVzY2VuZCA9IDAsIGNhcGhlaWdodCA9IDAsIGJib3hbNF07CiAgICAgRlhTWVNfbWVtc2V0KGJib3gsIDAsIHNpemVvZihpbnQpICogNCk7CiAgICAgQ0ZBcnJheVJlZiBsYW5ndWFnZXMgPSAoQ0ZBcnJheVJlZilDVEZvbnREZXNjcmlwdG9yQ29weUF0dHJpYnV0ZShkZXNjcmlwdG9yLCBrQ1RGb250TGFuZ3VhZ2VzQXR0cmlidXRlKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOwogICAgIGlmIChJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKLSAgICAgICAgYkNKSyA9IFRSVUU7CisgICAgICAgIGJDSksgPSB0cnVlOwogICAgIH0KICAgICBDRlJlbGVhc2UoZGVzY3JpcHRvcik7CiAgICAgQ0ZEaWN0aW9uYXJ5UmVmIHRyYWl0cyA9IChDRkRpY3Rpb25hcnlSZWYpQ1RGb250Q29weVRyYWl0cyhmb250KTsKQEAgLTczNyw3ICs3MzcsNyBAQAogICAgICAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBvcmRlcmluZzsKICAgICAgICAgaW50IHN1cHBsZW1lbnQ7Ci0gICAgICAgIEZYX0JPT0wgYkZvdW5kID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkZvdW5kID0gZmFsc2U7CiAgICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7CiAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwogICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiAgICAgICAgICAgICBzdXBwbGVtZW50ID0gNDsKICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOwogICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGJGb3VuZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CiAgICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfR0IyMzEyX0NIQVJTRVQpOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDIwLCBwV2lkdGhBcnJheSk7CiAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOwogICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMSwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGJGb3VuZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CiAgICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKQEAgLTc2OCw3ICs3NjgsNyBAQAogICAgICAgICAgICAgc3VwcGxlbWVudCA9IDI7CiAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBiRm91bmQgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwogICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOwpAQCAtODY3LDEyICs4NjcsMTIgQEAKICAgICB9CiAgICAgRlhfRnJlZSh3aWR0aHMpOwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpCitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZEZvbnQoQ0ZYX0ZvbnQqIHBGb250LCBpbnQgY2hhcnNldCwgYm9vbCBiVmVydCkKIHsKICAgICBpZiAocEZvbnQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgRlhfQk9PTCBiQ0pLID0gY2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCB8fAorICAgIGJvb2wgYkNKSyA9IGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDsKICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udCA9IHBGb250LT5HZXRGYW1pbHlOYW1lKCk7CiAgICAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKQEAgLTEwNTIsNyArMTA1Miw3IEBACiAgICAgcmV0dXJuIExvYWRGb250KHBCYXNlRGljdCk7CiB9CiBzdGF0aWMgaW50IEluc2VydERlbGV0ZVBERlBhZ2UoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlc1RvR28sIENQREZfRGljdGlvbmFyeSogcFBhZ2UsIEZYX0JPT0wgYkluc2VydCwgQ0ZYX1B0ckFycmF5JiBzdGFja0xpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlc1RvR28sIENQREZfRGljdGlvbmFyeSogcFBhZ2UsIGJvb2wgYkluc2VydCwgQ0ZYX1B0ckFycmF5JiBzdGFja0xpc3QpCiB7CiAgICAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwUGFnZXMtPkdldEFycmF5KCJLaWRzIik7CiAgICAgaWYgKCFwS2lkTGlzdCkgewpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBDRlhfUHRyQXJyYXkgc3RhY2s7CiAgICAgICAgIHN0YWNrLkFkZChwUGFnZXMpOwotICAgICAgICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZShwRG9jLCBwUGFnZXMsIGlQYWdlLCBwUGFnZURpY3QsIFRSVUUsIHN0YWNrKSA8IDApIHsKKyAgICAgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcFBhZ2VzLCBpUGFnZSwgcFBhZ2VEaWN0LCB0cnVlLCBzdGFjaykgPCAwKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTY1LDcgKzExNjUsNyBAQAogICAgIH0KICAgICBDRlhfUHRyQXJyYXkgc3RhY2s7CiAgICAgc3RhY2suQWRkKHBQYWdlcyk7Ci0gICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UodGhpcywgcFBhZ2VzLCBpUGFnZSwgTlVMTCwgRkFMU0UsIHN0YWNrKSA8IDApIHsKKyAgICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZSh0aGlzLCBwUGFnZXMsIGlQYWdlLCBOVUxMLCBmYWxzZSwgc3RhY2spIDwgMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1fUGFnZUxpc3QuUmVtb3ZlQXQoaVBhZ2UpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAKaW5kZXggZGFkNzMyNi4uMjFjZTMxZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgaW50MzJfdCBudW1fY29tcHM7CiAgICAgaW50MzJfdCBiaXRzOwotICAgIEZYX0JPT0wgY29sb3JfdHJhbnM7CisgICAgYm9vbCBjb2xvcl90cmFuczsKICAgICBpZiAoIUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT4KICAgICAgICAgICAgIExvYWRJbmZvKHBEYXRhLCBzaXplLCB3aWR0aCwgaGVpZ2h0LCBudW1fY29tcHMsIGJpdHMsIGNvbG9yX3RyYW5zKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgcERpY3QtPlNldEF0KCJEZWNvZGVQYXJtcyIsIHBQYXJtcyk7CiAgICAgICAgIHBQYXJtcy0+U2V0QXRJbnRlZ2VyKCJDb2xvclRyYW5zZm9ybSIsIDApOwogICAgIH0KLSAgICBtX2JJc01hc2sgPSBGQUxTRTsKKyAgICBtX2JJc01hc2sgPSBmYWxzZTsKICAgICBtX1dpZHRoID0gd2lkdGg7CiAgICAgbV9IZWlnaHQgPSBoZWlnaHQ7CiAgICAgaWYgKG1fcFN0cmVhbSA9PSBOVUxMKSB7CkBAIC05Miw3ICs5Miw3IEBACiB2b2lkIF9EQ1RFbmNvZGVCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5ICpwQml0bWFwRGljdCwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgcXVhbGl0eSwgdWludDhfdCogJmJ1ZiwgRlhfU1RSU0laRSAmc2l6ZSkKIHsKIH0KLXZvaWQgX0pCSUcyRW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSAqcEJpdG1hcERpY3QsIGNvbnN0IENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgQ1BERl9Eb2N1bWVudCAqcERvYywgdWludDhfdCogJmJ1ZiwgRlhfU1RSU0laRSAmc2l6ZSwgRlhfQk9PTCBiTG9zc0xlc3MpCit2b2lkIF9KQklHMkVuY29kZUJpdG1hcChDUERGX0RpY3Rpb25hcnkgKnBCaXRtYXBEaWN0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIENQREZfRG9jdW1lbnQgKnBEb2MsIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUsIGJvb2wgYkxvc3NMZXNzKQogewogfQogdm9pZCBDUERGX0ltYWdlOjpTZXRJbWFnZShjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QgaUNvbXByZXNzLCBJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzaywgY29uc3QgQ1BERl9JbWFnZVNldFBhcmFtKiBwUGFyYW0pCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICB1aW50OF90KiBzcmNfYnVmID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CiAgICAgaW50MzJfdCBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwogICAgIGludDMyX3QgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCk7Ci0gICAgRlhfQk9PTCBiVXNlTWF0dGUgPSBwUGFyYW0gJiYgcFBhcmFtLT5wTWF0dGVDb2xvciAmJiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisgICAgYm9vbCBiVXNlTWF0dGUgPSBwUGFyYW0gJiYgcFBhcmFtLT5wTWF0dGVDb2xvciAmJiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CiAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiVHlwZSIpLCBGWF9CU1RSQygiWE9iamVjdCIpKTsKICAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksIEZYX0JTVFJDKCJJbWFnZSIpKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgICAgICAgICAgQXJnYkRlY29kZShwQml0bWFwLT5HZXRQYWxldHRlQXJnYigxKSwgc2V0X2EsIHNldF9yLCBzZXRfZywgc2V0X2IpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzZXRfYSA9PSAwIHx8IHJlc2V0X2EgPT0gMCkgewotICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJJbWFnZU1hc2siKSwgbmV3IENQREZfQm9vbGVhbihUUlVFKSk7CisgICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkltYWdlTWFzayIpLCBuZXcgQ1BERl9Cb29sZWFuKHRydWUpKTsKICAgICAgICAgICAgIGlmIChyZXNldF9hID09IDApIHsKICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKICAgICAgICAgICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMSk7CkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICAgICAgICAgIHBCdWZbNF0gPSAoRlhfQ0hBUilzZXRfZzsKICAgICAgICAgICAgIHBCdWZbNV0gPSAoRlhfQ0hBUilzZXRfYjsKICAgICAgICAgICAgIGN0LlJlbGVhc2VCdWZmZXIoNik7Ci0gICAgICAgICAgICBwQ1MtPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGN0LCBUUlVFKSk7CisgICAgICAgICAgICBwQ1MtPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGN0LCB0cnVlKSk7CiAgICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgcENTKTsKICAgICAgICAgfQogICAgICAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDEpOwpAQCAtMTk0LDEwICsxOTQsMTAgQEAKICAgICAgICAgfQogICAgIH0KICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrQml0bWFwID0gTlVMTDsKLSAgICBGWF9CT09MIGJEZWxldGVNYXNrID0gRkFMU0U7CisgICAgYm9vbCBiRGVsZXRlTWFzayA9IGZhbHNlOwogICAgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpKSB7CiAgICAgICAgIHBNYXNrQml0bWFwID0gcEJpdG1hcC0+R2V0QWxwaGFNYXNrKCk7Ci0gICAgICAgIGJEZWxldGVNYXNrID0gVFJVRTsKKyAgICAgICAgYkRlbGV0ZU1hc2sgPSB0cnVlOwogICAgIH0KICAgICBpZiAoIXBNYXNrQml0bWFwICYmIHBNYXNrKSB7CiAgICAgICAgIEZYRElCX0Zvcm1hdCBtYXNrRm9ybWF0ID0gcE1hc2stPkdldEZvcm1hdCgpOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgICAgIGlmIChwTWFza0JpdG1hcC0+R2V0QlBQKCkgPT0gOCAmJiAoaUNvbXByZXNzICYgUERGX0lNQUdFX01BU0tfTE9TU1lfQ09NUFJFU1MpICE9IDApIHsKICAgICAgICAgICAgIF9EQ1RFbmNvZGVCaXRtYXAocE1hc2tEaWN0LCBwTWFza0JpdG1hcCwgcFBhcmFtID8gcFBhcmFtLT5uUXVhbGl0eSA6IDc1LCBtYXNrX2J1ZiwgbWFza19zaXplKTsKICAgICAgICAgfSBlbHNlIGlmIChwTWFza0JpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcE1hc2spIHsKLSAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwTWFza0RpY3QsIHBNYXNrQml0bWFwLCBtX3BEb2N1bWVudCwgbWFza19idWYsIG1hc2tfc2l6ZSwgVFJVRSk7CisgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocE1hc2tEaWN0LCBwTWFza0JpdG1hcCwgbV9wRG9jdW1lbnQsIG1hc2tfYnVmLCBtYXNrX3NpemUsIHRydWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWFza19idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1hc2tIZWlnaHQsIG1hc2tXaWR0aCk7CiAgICAgICAgICAgICBtYXNrX3NpemUgPSBtYXNrSGVpZ2h0ICogbWFza1dpZHRoOyAgLy8gU2FmZSBzaW5jZSBjaGVja2VkIGFsbG9jIHJldHVybmVkLgpAQCAtMjQ1LDE1ICsyNDUsMTUgQEAKICAgICAgICAgICAgIGRlbGV0ZSBwTWFza0JpdG1hcDsKICAgICAgICAgfQogICAgIH0KLSAgICBGWF9CT09MIGJTdHJlYW0gPSBwRmlsZVdyaXRlICE9IE5VTEwgJiYgcEZpbGVSZWFkICE9IE5VTEw7CisgICAgYm9vbCBiU3RyZWFtID0gcEZpbGVXcml0ZSAhPSBOVUxMICYmIHBGaWxlUmVhZCAhPSBOVUxMOwogICAgIGlmIChvcFR5cGUgPT0gMCkgewogICAgICAgICBpZiAoaUNvbXByZXNzICYgUERGX0lNQUdFX0xPU1NMRVNTX0NPTVBSRVNTKSB7CiAgICAgICAgICAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsIFRSVUUpOworICAgICAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBtX3BEb2N1bWVudCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgZmFsc2UpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChwQml0bWFwLT5HZXRCUFAoKSA+PSA4ICYmIHBCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwTmV3Qml0bWFwID0gbmV3IENGWF9ESUJpdG1hcCgpOwogICAgICAgICAgICAgICAgIHBOZXdCaXRtYXAtPkNvcHkocEJpdG1hcCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaAppbmRleCBmNTdlNTI3Li5lNTI1NDA4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmgKQEAgLTEyLDE1ICsxMiwxNSBAQAogcHVibGljOgogICAgIENQREZfQ01hcE1hbmFnZXIoKTsKICAgICB+Q1BERl9DTWFwTWFuYWdlcigpOwotICAgIHZvaWQqCQkJCUdldFBhY2thZ2UoRlhfQk9PTCBiUHJvbXB0KTsKLSAgICBDUERGX0NNYXAqCQkJCUdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHQpOwotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHQpOworICAgIHZvaWQqCQkJCUdldFBhY2thZ2UoYm9vbCBiUHJvbXB0KTsKKyAgICBDUERGX0NNYXAqCQkJCUdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJQcm9tcHQpOworICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBib29sIGJQcm9tcHQpOwogICAgIHZvaWQJCQkJCVJlbG9hZEFsbCgpOwogcHJpdmF0ZToKLSAgICBDUERGX0NNYXAqCQkJCUxvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgIEZYX0JPT0wgYlByb21wdCk7Ci0gICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJTG9hZENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHQpOwotICAgIHZvaWQJCQkJCURyb3BBbGwoRlhfQk9PTCBiUmVsb2FkKTsKLSAgICBGWF9CT09MCQkJCQltX2JQcm9tcHRlZDsKKyAgICBDUERGX0NNYXAqCQkJCUxvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgIGJvb2wgYlByb21wdCk7CisgICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJTG9hZENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBib29sIGJQcm9tcHQpOworICAgIHZvaWQJCQkJCURyb3BBbGwoYm9vbCBiUmVsb2FkKTsKKyAgICBib29sCQkJCQltX2JQcm9tcHRlZDsKICAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fQ01hcHM7CiAgICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJbV9DSUQyVW5pY29kZU1hcHNbNl07CiB9OwpAQCAtNTYsNyArNTYsNyBAQAogcHVibGljOgogICAgIENQREZfQ01hcFBhcnNlcigpOwogICAgIH5DUERGX0NNYXBQYXJzZXIoKSB7fQotICAgIEZYX0JPT0wJSW5pdGlhbGl6ZShDUERGX0NNYXAqKTsKKyAgICBib29sCUluaXRpYWxpemUoQ1BERl9DTWFwKik7CiAgICAgdm9pZAlQYXJzZVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwogICAgIENGWF9CaW5hcnlCdWYJbV9BZGRNYXBzOwogcHJpdmF0ZToKQEAgLTgwLDEwICs4MCwxMCBAQAogewogcHVibGljOgogICAgIENQREZfQ01hcCgpOwotICAgIEZYX0JPT0wJCQkJCUxvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSyk7Ci0gICAgRlhfQk9PTAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOworICAgIGJvb2wJCQkJCUxvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIGJvb2wgYlByb21wdENKSyk7CisgICAgYm9vbAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwogICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKLSAgICBGWF9CT09MCQkJCQlJc0xvYWRlZCgpIGNvbnN0CisgICAgYm9vbAkJCQkJSXNMb2FkZWQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkxvYWRlZDsKICAgICB9CkBAIC05MSw3ICs5MSw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbV9DaGFyc2V0OwogICAgIH0KLSAgICBGWF9CT09MCQkJCQlJc1ZlcnRXcml0aW5nKCkgY29uc3QKKyAgICBib29sCQkJCQlJc1ZlcnRXcml0aW5nKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JWZXJ0aWNhbDsKICAgICB9CkBAIC0xMDksMTQgKzEwOSwxNCBAQAogICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfQ0lERm9udDsKIHByb3RlY3RlZDoKICAgICBDRlhfQnl0ZVN0cmluZwkJCW1fUHJlZGVmaW5lZENNYXA7Ci0gICAgRlhfQk9PTAkJCQkJbV9iVmVydGljYWw7CisgICAgYm9vbAkJCQkJbV9iVmVydGljYWw7CiAgICAgaW50CQkJCQkJbV9DaGFyc2V0LCBtX0NvZGluZzsKICAgICBDb2RpbmdTY2hlbWUJCQltX0NvZGluZ1NjaGVtZTsKICAgICBpbnQJCQkJCQltX25Db2RlUmFuZ2VzOwogICAgIHVpbnQ4X3QqCQkJCW1fcExlYWRpbmdCeXRlczsKICAgICBGWF9XT1JEKgkJCQltX3BNYXBwaW5nOwogICAgIHVpbnQ4X3QqCQkJCW1fcEFkZE1hcHBpbmc7Ci0gICAgRlhfQk9PTAkJCQkJbV9iTG9hZGVkOworICAgIGJvb2wJCQkJCW1fYkxvYWRlZDsKICAgICBjb25zdCBGWENNQVBfQ01hcCoJCW1fcEVtYmVkTWFwOwogICAgIENQREZfQ01hcCoJCQkJbV9wVXNlTWFwOwogfTsKQEAgLTE0Niw5ICsxNDYsOSBAQAogcHVibGljOgogICAgIENQREZfQ0lEMlVuaWNvZGVNYXAoKTsKICAgICB+Q1BERl9DSUQyVW5pY29kZU1hcCgpOwotICAgIEZYX0JPT0wJCUluaXRpYWxpemUoKTsKLSAgICBGWF9CT09MCQlJc0xvYWRlZCgpOwotICAgIHZvaWQJCUxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSyk7CisgICAgYm9vbAkJSW5pdGlhbGl6ZSgpOworICAgIGJvb2wJCUlzTG9hZGVkKCk7CisgICAgdm9pZAkJTG9hZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBpbnQgY2hhcnNldCwgYm9vbCBiUHJvbXB0Q0pLKTsKICAgICBGWF9XQ0hBUglVbmljb2RlRnJvbUNJRChGWF9XT1JEIENJRCk7CiBwcm90ZWN0ZWQ6CiAgICAgaW50CQkJbV9DaGFyc2V0OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAKaW5kZXggODAzN2E4Yy4uYWZjY2U2ZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnQuY3BwCkBAIC0xMiwxNiArMTIsMTYgQEAKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgImZvbnRfaW50LmgiCiAKLUZYX0JPT0wgRlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgcGxhdGZvcm1faWQsIGludCBlbmNvZGluZ19pZCkKK2Jvb2wgRlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgcGxhdGZvcm1faWQsIGludCBlbmNvZGluZ19pZCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOyBpICsrKSB7CiAgICAgICAgIGlmIChGWEZUX0dldF9DaGFybWFwX1BsYXRmb3JtSUQoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSkgPT0gcGxhdGZvcm1faWQgJiYKICAgICAgICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nSUQoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSkgPT0gZW5jb2RpbmdfaWQpIHsKICAgICAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX0ZvbnRHbG9iYWxzOjpDUERGX0ZvbnRHbG9iYWxzKCkKICAgICA6IG1fcENvbnRyYXN0UmFtcHMoTlVMTCkKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgIG1fcEZvbnRGaWxlID0gTlVMTDsKICAgICBtX0ZsYWdzID0gMDsKICAgICBtX3BUb1VuaWNvZGVNYXAgPSBOVUxMOwotICAgIG1fYlRvVW5pY29kZUxvYWRlZCA9IEZBTFNFOworICAgIG1fYlRvVW5pY29kZUxvYWRlZCA9IGZhbHNlOwogICAgIG1fcENoYXJNYXAgPSBuZXcgQ1BERl9Gb250Q2hhck1hcCh0aGlzKTsKIH0KIENQREZfRm9udDo6fkNQREZfRm9udCgpCkBAIC0xMzUsOSArMTM1LDkgQEAKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYygoQ1BERl9TdHJlYW0qKW1fcEZvbnRGaWxlLT5HZXRTdHJlYW0oKSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdAorYm9vbCBDUERGX0ZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdAogewotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgICAgYm9vbCBiVmVydFdyaXRpbmcgPSBmYWxzZTsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gR2V0Q0lERm9udCgpOwogICAgIGlmIChwQ0lERm9udCkgewogICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwpAQCAtMjM2LDMzICsyMzYsMzMgQEAKIHsKICAgICBtX0ZsYWdzID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGbGFncyIpLCBQREZGT05UX05PTlNZTUJPTElDKTsKICAgICBpbnQgSXRhbGljQW5nbGUgPSAwOwotICAgIEZYX0JPT0wgYkV4aXN0SXRhbGljQW5nbGUgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdEl0YWxpY0FuZ2xlID0gZmFsc2U7CiAgICAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkl0YWxpY0FuZ2xlIikpKSB7CiAgICAgICAgIEl0YWxpY0FuZ2xlID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJJdGFsaWNBbmdsZSIpKTsKLSAgICAgICAgYkV4aXN0SXRhbGljQW5nbGUgPSBUUlVFOworICAgICAgICBiRXhpc3RJdGFsaWNBbmdsZSA9IHRydWU7CiAgICAgfQogICAgIGlmIChJdGFsaWNBbmdsZSA8IDApIHsKICAgICAgICAgbV9GbGFncyB8PSBQREZGT05UX0lUQUxJQzsKICAgICAgICAgbV9JdGFsaWNBbmdsZSA9IEl0YWxpY0FuZ2xlOwogICAgIH0KLSAgICBGWF9CT09MIGJFeGlzdFN0ZW1WID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3RTdGVtViA9IGZhbHNlOwogICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJTdGVtViIpKSkgewogICAgICAgICBtX1N0ZW1WID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJTdGVtViIpKTsKLSAgICAgICAgYkV4aXN0U3RlbVYgPSBUUlVFOworICAgICAgICBiRXhpc3RTdGVtViA9IHRydWU7CiAgICAgfQotICAgIEZYX0JPT0wgYkV4aXN0QXNjZW50ID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3RBc2NlbnQgPSBmYWxzZTsKICAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiQXNjZW50IikpKSB7CiAgICAgICAgIG1fQXNjZW50ID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJBc2NlbnQiKSk7Ci0gICAgICAgIGJFeGlzdEFzY2VudCA9IFRSVUU7CisgICAgICAgIGJFeGlzdEFzY2VudCA9IHRydWU7CiAgICAgfQotICAgIEZYX0JPT0wgYkV4aXN0RGVzY2VudCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0RGVzY2VudCA9IGZhbHNlOwogICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJEZXNjZW50IikpKSB7CiAgICAgICAgIG1fRGVzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRGVzY2VudCIpKTsKLSAgICAgICAgYkV4aXN0RGVzY2VudCA9IFRSVUU7CisgICAgICAgIGJFeGlzdERlc2NlbnQgPSB0cnVlOwogICAgIH0KLSAgICBGWF9CT09MIGJFeGlzdENhcEhlaWdodCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0Q2FwSGVpZ2h0ID0gZmFsc2U7CiAgICAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkNhcEhlaWdodCIpKSkgewotICAgICAgICBiRXhpc3RDYXBIZWlnaHQgPSBUUlVFOworICAgICAgICBiRXhpc3RDYXBIZWlnaHQgPSB0cnVlOwogICAgIH0KICAgICBpZiAoYkV4aXN0SXRhbGljQW5nbGUgJiYgYkV4aXN0QXNjZW50ICYmIGJFeGlzdENhcEhlaWdodCAmJiBiRXhpc3REZXNjZW50ICYmIGJFeGlzdFN0ZW1WKSB7CiAgICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9VU0VFWFRFUk5BVFRSOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgICAgICAgICBtX0FzY2VudCA9IFRUMlBERihGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKICAgICAgICAgICAgIG1fRGVzY2VudCA9IFRUMlBERihGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgICAgICAgICAgICBib29sIGJGaXJzdCA9IHRydWU7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewogICAgICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdDsKICAgICAgICAgICAgICAgICBHZXRDaGFyQkJveChpLCByZWN0KTsKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0KSB7CiAgICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3ggPSByZWN0OwotICAgICAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYkZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRm9udEJCb3gudG9wIDwgcmVjdC50b3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3gudG9wID0gcmVjdC50b3A7CkBAIC0zNjEsNyArMzYxLDcgQEAKIH0KIHZvaWQgQ1BERl9Gb250OjpMb2FkVW5pY29kZU1hcCgpCiB7Ci0gICAgbV9iVG9Vbmljb2RlTG9hZGVkID0gVFJVRTsKKyAgICBtX2JUb1VuaWNvZGVMb2FkZWQgPSB0cnVlOwogICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbV9wRm9udERpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiVG9Vbmljb2RlIikpOwogICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDY2LDEwICs0NjYsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIHBGb250OwogfQotRlhfQk9PTCBDUERGX0ZvbnQ6OkxvYWQoKQorYm9vbCBDUERGX0ZvbnQ6OkxvYWQoKQogewogICAgIGlmIChtX3BGb250RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKTsKICAgICBtX0Jhc2VGb250ID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7CkBAIC02MjMsNyArNjIzLDcgQEAKIHsKICAgICBpbnQgQ0lEU2V0ID0gMDsKICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBzdHJlYW0uTG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UpOwogICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcihzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpKTsKICAgICBtX01hcC5Fc3RpbWF0ZVNpemUoc3RyZWFtLkdldFNpemUoKSAvIDgsIDEwMjQpOwogICAgIHdoaWxlICgxKSB7CkBAIC03MTksMTIgKzcxOSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChDSURTZXQpIHsKLSAgICAgICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKENJRFNldCwgRkFMU0UpOworICAgICAgICBtX3BCYXNlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAoQ0lEU2V0LCBmYWxzZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9wQmFzZU1hcCA9IE5VTEw7CiAgICAgfQogfQotc3RhdGljIEZYX0JPT0wgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGludCYgYmFzZW1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHZhbHVlKQorc3RhdGljIGJvb2wgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGludCYgYmFzZW1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHZhbHVlKQogewogICAgIGlmICh2YWx1ZSA9PSBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIikpIHsKICAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsKQEAgLTczNSwxMiArNzM1LDEyIEBACiAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBGWF9CU1RSQygiUERGRG9jRW5jb2RpbmciKSkgewogICAgICAgICBiYXNlbWFwID0gUERGRk9OVF9FTkNPRElOR19QREZET0M7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0ZvbnQ6OkxvYWRQREZFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nLCBpbnQmIGlCYXNlRW5jb2RpbmcsIENGWF9CeXRlU3RyaW5nKiYgcENoYXJOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW1iZWRkZWQsIEZYX0JPT0wgYlRydWVUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJFbWJlZGRlZCwgYm9vbCBiVHJ1ZVR5cGUpCiB7CiAgICAgaWYgKHBFbmNvZGluZyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChtX0Jhc2VGb250ID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgewpAQCAtODAyLDE4ICs4MDIsMTggQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9Gb250OjpJc1N0YW5kYXJkRm9udCgpIGNvbnN0Citib29sIENQREZfRm9udDo6SXNTdGFuZGFyZEZvbnQoKSBjb25zdAogewogICAgIGlmIChtX0ZvbnRUeXBlICE9IFBERkZPTlRfVFlQRTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BGb250RmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKChDUERGX1R5cGUxRm9udCopdGhpcyktPkdldEJhc2UxNEZvbnQoKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9TaW1wbGVGb250OjpDUERGX1NpbXBsZUZvbnQoaW50IGZvbnR0eXBlKSA6IENQREZfRm9udChmb250dHlwZSkKIHsKQEAgLTgyOCwxMCArODI4LDEwIEBACiB7CiAgICAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOwogfQotaW50IENQREZfU2ltcGxlRm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpCitpbnQgQ1BERl9TaW1wbGVGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgYm9vbCAqcFZlcnRHbHlwaCkKIHsKICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOworICAgICAgICAqcFZlcnRHbHlwaCA9IGZhbHNlOwogICAgIH0KICAgICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTkyMyw3ICs5MjMsNyBAQAogICAgIH0KICAgICByZXR1cm4gbmFtZTsKIH0KLUZYX0JPT0wgQ1BERl9TaW1wbGVGb250OjpMb2FkQ29tbW9uKCkKK2Jvb2wgQ1BERl9TaW1wbGVGb250OjpMb2FkQ29tbW9uKCkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250RGVzY3JpcHRvciIpKTsKICAgICBpZiAocEZvbnREZXNjKSB7CkBAIC05MzEsOSArOTMxLDkgQEAKICAgICB9CiAgICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBtX3BGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldpZHRocyIpKTsKICAgICBpbnQgd2lkdGhfc3RhcnQgPSAwLCB3aWR0aF9lbmQgPSAtMTsKLSAgICBtX2JVc2VGb250V2lkdGggPSBUUlVFOworICAgIG1fYlVzZUZvbnRXaWR0aCA9IHRydWU7CiAgICAgaWYgKHBXaWR0aEFycmF5KSB7Ci0gICAgICAgIG1fYlVzZUZvbnRXaWR0aCA9IEZBTFNFOworICAgICAgICBtX2JVc2VGb250V2lkdGggPSBmYWxzZTsKICAgICAgICAgaWYgKHBGb250RGVzYyAmJiBwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJNaXNzaW5nV2lkdGgiKSkpIHsKICAgICAgICAgICAgIGludCBNaXNzaW5nV2lkdGggPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIk1pc3NpbmdXaWR0aCIpKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7CkBAIC05NzAsNyArOTcwLDcgQEAKICAgICBkZWxldGVbXSBtX3BDaGFyTmFtZXM7CiAgICAgbV9wQ2hhck5hbWVzID0gTlVMTDsKICAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fRmxhZ3MgJiBQREZGT05UX0FMTENBUCkgewogICAgICAgICB1bnNpZ25lZCBjaGFyIGxvd2VyY2FzZXNbXSA9IHsnYScsICd6JywgMHhlMCwgMHhmNiwgMHhmOCwgMHhmZH07CkBAIC05ODgsNyArOTg4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBDaGVja0ZvbnRNZXRyaWNzKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfU2ltcGxlRm9udDo6TG9hZFN1YnN0Rm9udCgpCiB7CkBAIC0xMDEzLDcgKzEwMTMsNyBAQAogICAgIGlmIChtX0ZvbnQubV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTk9OU1lNQk9MKSB7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1NpbXBsZUZvbnQ6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAorYm9vbCBDUERGX1NpbXBsZUZvbnQ6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAogewogICAgIHJldHVybiBtX0Jhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4gJiYgbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0wgJiYKICAgICAgICAgICAgbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFM7CkBAIC0xMDIyLDcgKzEwMjIsNyBAQAogewogICAgIG1fQmFzZTE0Rm9udCA9IC0xOwogfQotRlhfQk9PTCBDUERGX1R5cGUxRm9udDo6X0xvYWQoKQorYm9vbCBDUERGX1R5cGUxRm9udDo6X0xvYWQoKQogewogICAgIG1fQmFzZTE0Rm9udCA9IF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShtX0Jhc2VGb250KTsKICAgICBpZiAobV9CYXNlMTRGb250ID49IDApIHsKQEAgLTEwNDYsMjEgKzEwNDYsMjEgQEAKICAgICB9CiAgICAgcmV0dXJuIExvYWRDb21tb24oKTsKIH0KLXN0YXRpYyBGWF9CT09MIEZUX1VzZVR5cGUxQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSkKK3N0YXRpYyBib29sIEZUX1VzZVR5cGUxQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSkKIHsKICAgICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpID09IDEgJiYKICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKSA9PSBGWEZUX0VOQ09ESU5HX1VOSUNPREUpIHsKICAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzFdKTsKICAgICB9IGVsc2UgewogICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGV4dGVybiBGWF9XQ0hBUiBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKGludCBlbmNvZGluZywgRlhfRFdPUkQgY2hhcmNvZGUpOwogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwpAQCAtMTExMiwyMSArMTExMiwyMSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIEZYX0JPT0wgYkNvcmVUZXh0ID0gVFJVRTsKKyAgICBib29sIGJDb3JlVGV4dCA9IHRydWU7CiAgICAgQ1F1YXJ0ejJEICYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwogICAgIGlmICghbV9Gb250Lm1fcFBsYXRmb3JtRm9udCkgewogICAgICAgICBpZiAobV9Gb250LkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIGJDb3JlVGV4dCA9IEZBTFNFOworICAgICAgICAgICAgYkNvcmVUZXh0ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9Gb250Lm1fcFBsYXRmb3JtRm9udCA9IHF1YXJ0ejJkLkNyZWF0ZUZvbnQobV9Gb250Lm1fcEZvbnREYXRhLCBtX0ZvbnQubV9kd1NpemUpOwogICAgICAgICBpZiAoTlVMTCA9PSBtX0ZvbnQubV9wUGxhdGZvcm1Gb250KSB7Ci0gICAgICAgICAgICBiQ29yZVRleHQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJDb3JlVGV4dCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCiAgICAgaWYgKCFJc0VtYmVkZGVkKCkgJiYgKG1fQmFzZTE0Rm9udCA8IDEyKSAmJiBtX0ZvbnQuSXNUVEZvbnQoKSkgewogICAgICAgICBpZiAoRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDApKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYkdvdE9uZSA9IGZhbHNlOwogICAgICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByZWZpeFs0XSA9IHsweDAwLCAweGYwLCAweGYxLCAweGYyfTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGogKyspIHsKQEAgLTExNDMsNyArMTE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiR290T25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTIzNyw5ICsxMjM3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJVbmljb2RlID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlVuaWNvZGUgPSBmYWxzZTsKICAgICAgICAgaWYgKDAgPT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7Ci0gICAgICAgICAgICBiVW5pY29kZSA9IFRSVUU7CisgICAgICAgICAgICBiVW5pY29kZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKQEAgLTEzMTUsOSArMTMxNSw5IEBACiAjZW5kaWYKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBGWF9CT09MIGJVbmljb2RlID0gRkFMU0U7CisgICAgYm9vbCBiVW5pY29kZSA9IGZhbHNlOwogICAgIGlmICgwID09IEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgICBiVW5pY29kZSA9IFRSVUU7CisgICAgICAgIGJVbmljb2RlID0gdHJ1ZTsKICAgICB9CiAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwpAQCAtMTM2Myw3ICsxMzYzLDcgQEAKICAgICAgICAgICAgIG1fVW5pY29kZXNbaV0gPSBwU3JjW2ldOwogICAgICAgICB9CiB9Ci1GWF9CT09MIENQREZfRm9udEVuY29kaW5nOjpJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0Citib29sIENQREZfRm9udEVuY29kaW5nOjpJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIEZYU1lTX21lbWNtcChtX1VuaWNvZGVzLCBwQW5vdGhlci0+bV9Vbmljb2Rlcywgc2l6ZW9mKG1fVW5pY29kZXMpKSA9PSAwOwogfQpAQCAtMTM3MiwxMCArMTM3MiwxMCBAQAogICAgIGludCBwcmVkZWZpbmVkID0gMDsKICAgICBmb3IgKGludCBjcyA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsgY3MgPCBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUzsgY3MgKyspIHsKICAgICAgICAgY29uc3QgRlhfV09SRCogcFNyYyA9IFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGNzKTsKLSAgICAgICAgRlhfQk9PTCBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJvb2wgbWF0Y2ggPSB0cnVlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAgICAgICAgICAgICBpZiAobV9Vbmljb2Rlc1tpXSAhPSBwU3JjW2ldKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDEzLDcgKzE0MTMsNyBAQAogQ1BERl9UcnVlVHlwZUZvbnQ6OkNQREZfVHJ1ZVR5cGVGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UUlVFVFlQRSkKIHsKIH0KLUZYX0JPT0wgQ1BERl9UcnVlVHlwZUZvbnQ6Ol9Mb2FkKCkKK2Jvb2wgQ1BERl9UcnVlVHlwZUZvbnQ6Ol9Mb2FkKCkKIHsKICAgICByZXR1cm4gTG9hZENvbW1vbigpOwogfQpAQCAtMTQyNiwxNCArMTQyNiwxNCBAQAogICAgIGlmIChtX3BGb250RmlsZSAmJiBtX0ZvbnQubV9GYWNlLT5udW1fY2hhcm1hcHMgPiAwCiAgICAgICAgICAgICAmJiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gfHwgYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSkKICAgICAgICAgICAgICYmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykpIHsKLSAgICAgICAgRlhfQk9PTCBiU3VwcG9ydFdpbiA9IEZBTFNFOwotICAgICAgICBGWF9CT09MIGJTdXBwb3J0TWFjID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlN1cHBvcnRXaW4gPSBmYWxzZTsKKyAgICAgICAgYm9vbCBiU3VwcG9ydE1hYyA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KG1fRm9udC5tX0ZhY2UpOyBpKyspIHsKICAgICAgICAgICAgIGludCBwbGF0Zm9ybV9pZCA9IEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRChGWEZUX0dldF9GYWNlX0NoYXJtYXBzKG1fRm9udC5tX0ZhY2UpW2ldKTsKICAgICAgICAgICAgIGlmIChwbGF0Zm9ybV9pZCA9PSAwIHx8IHBsYXRmb3JtX2lkID09IDMpIHsKLSAgICAgICAgICAgICAgICBiU3VwcG9ydFdpbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlN1cHBvcnRXaW4gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybV9pZCA9PSAwIHx8IHBsYXRmb3JtX2lkID09IDEpIHsKLSAgICAgICAgICAgICAgICBiU3VwcG9ydE1hYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlN1cHBvcnRNYWMgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJICYmICFiU3VwcG9ydFdpbikgewpAQCAtMTQ1OSw4ICsxNDU5LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7Ci0gICAgICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0UsIGJNU1N5bWJvbCA9IEZBTFNFOworICAgICAgICBib29sIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7CisgICAgICAgIGJvb2wgYk1hY1JvbWFuID0gZmFsc2UsIGJNU1N5bWJvbCA9IGZhbHNlOwogICAgICAgICBpZiAoIWJNU1VuaWNvZGUpIHsKICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9OT05TWU1CT0xJQykgewogICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKTsKQEAgLTE0NzAsNyArMTQ3MCw3IEBACiAgICAgICAgICAgICAgICAgYk1hY1JvbWFuID0gIWJNU1N5bWJvbCAmJiBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiVG9Vbmljb2RlID0gbV9wRm9udERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJUb1VuaWNvZGUiKSk7CisgICAgICAgIGJvb2wgYlRvVW5pY29kZSA9IG1fcEZvbnREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVG9Vbmljb2RlIikpOwogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewogICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUoYmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKICAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKQEAgLTE1MjMsMTMgKzE1MjMsMTMgQEAKICAgICB9CiAgICAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKSkgewogICAgICAgICBjb25zdCB1aW50OF90IHByZWZpeFs0XSA9IHsweDAwLCAweGYwLCAweGYxLCAweGYyfTsKLSAgICAgICAgRlhfQk9PTCBiR290T25lID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkdvdE9uZSA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqICsrKSB7CiAgICAgICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gcHJlZml4W2pdICogMjU2ICsgY2hhcmNvZGU7CiAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJHb3RPbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTUyLDEyICsxNTUyLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKSkgewotICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiR290T25lID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBjaGFyY29kZSk7CiAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gRlRfVW5pY29kZUZyb21DaGFyQ29kZShGWEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOLCBjaGFyY29kZSk7CiAgICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgewotICAgICAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOworICAgICAgICAgICAgICAgIGJHb3RPbmUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BGb250RmlsZSB8fCBiR290T25lKSB7CkBAIC0xNTY1LDcgKzE1NjUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgewotICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiR290T25lID0gZmFsc2U7CiAgICAgICAgIGNvbnN0IEZYX1dPUkQqIHBVbmljb2RlcyA9IFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGJhc2VFbmNvZGluZyk7CiAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7CiAgICAgICAgICAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCkgewpAQCAtMTU4MCw3ICsxNTgwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOwogICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiR290T25lID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYkdvdE9uZSkgewpAQCAtMTYxNCw3ICsxNjE0LDcgQEAKICAgICAgICAgZGVsZXRlIChDUERGX1R5cGUzQ2hhciopa2V5OwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9UeXBlM0ZvbnQ6Ol9Mb2FkKCkKK2Jvb2wgQ1BERl9UeXBlM0ZvbnQ6Ol9Mb2FkKCkKIHsKICAgICBtX3BGb250UmVzb3VyY2VzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKICAgICBDUERGX0FycmF5KiBwTWF0cml4ID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJGb250TWF0cml4IikpOwpAQCAtMTY0OCw3ICsxNjQ4LDcgQEAKICAgICBtX3BDaGFyUHJvY3MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiQ2hhclByb2NzIikpOwogICAgIENQREZfT2JqZWN0KiBwRW5jb2RpbmcgPSBtX3BGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKICAgICBpZiAocEVuY29kaW5nKSB7Ci0gICAgICAgIExvYWRQREZFbmNvZGluZyhwRW5jb2RpbmcsIG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgIExvYWRQREZFbmNvZGluZyhwRW5jb2RpbmcsIG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIGlmIChtX3BDaGFyTmFtZXMpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7CiAgICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2ldID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG1fcENoYXJOYW1lc1tpXSk7CkBAIC0xNjU4LDcgKzE2NTgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX1R5cGUzRm9udDo6Q2hlY2tUeXBlM0ZvbnRNZXRyaWNzKCkKIHsKQEAgLTE3MzYsOCArMTczNiw4IEBACiB7CiAgICAgbV9wRm9ybSA9IE5VTEw7CiAgICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICBtX2JQYWdlUmVxdWlyZWQgPSBGQUxTRTsKLSAgICBtX2JDb2xvcmVkID0gRkFMU0U7CisgICAgbV9iUGFnZVJlcXVpcmVkID0gZmFsc2U7CisgICAgbV9iQ29sb3JlZCA9IGZhbHNlOwogfQogQ1BERl9UeXBlM0NoYXI6On5DUERGX1R5cGUzQ2hhcigpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaWQuY3BwCmluZGV4IGY3MGI5ZWMuLjhmOTVlNTkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaWQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaWQuY3BwCkBAIC0xMywxOCArMTMsMTggQEAKICNpbmNsdWRlICJmb250X2ludC5oIgogCiBleHRlcm4gc2hvcnQgVFQyUERGKGludCBtLCBGWEZUX0ZhY2UgZmFjZSk7Ci1leHRlcm4gRlhfQk9PTCBGVF9Vc2VUVENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBwbGF0Zm9ybV9pZCwgaW50IGVuY29kaW5nX2lkKTsKK2V4dGVybiBib29sIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpOwogCiBDUERGX0NNYXBNYW5hZ2VyOjpDUERGX0NNYXBNYW5hZ2VyKCkKIHsKLSAgICBtX2JQcm9tcHRlZCA9IEZBTFNFOworICAgIG1fYlByb21wdGVkID0gZmFsc2U7CiAgICAgRlhTWVNfbWVtc2V0KG1fQ0lEMlVuaWNvZGVNYXBzLCAwLCBzaXplb2YgbV9DSUQyVW5pY29kZU1hcHMpOwogfQogQ1BERl9DTWFwTWFuYWdlcjo6fkNQREZfQ01hcE1hbmFnZXIoKQogewotICAgIERyb3BBbGwoRkFMU0UpOworICAgIERyb3BBbGwoZmFsc2UpOwogfQotQ1BERl9DTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiUHJvbXB0Q0pLKQorQ1BERl9DTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiUHJvbXB0Q0pLKQogewogICAgIENQREZfQ01hcCogcENNYXA7CiAgICAgaWYgKG1fQ01hcHMuTG9va3VwKG5hbWUsICh2b2lkKiYpcENNYXApKSB7CkBAIC0zNyw3ICszNyw3IEBACiAgICAgbV9DTWFwcy5TZXRBdChuYW1lLCBwQ01hcCk7CiAgICAgcmV0dXJuIHBDTWFwOwogfQotQ1BERl9DTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKK0NQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6TG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJQcm9tcHRDSkspCiB7CiAgICAgQ1BERl9DTWFwKiBwQ01hcCA9IG5ldyBDUERGX0NNYXA7CiAgICAgY29uc3QgRlhfQ0hBUiogcG5hbWUgPSBuYW1lOwpAQCAtNTksOSArNTksOSBAQAogfQogdm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpSZWxvYWRBbGwoKQogewotICAgIERyb3BBbGwoVFJVRSk7CisgICAgRHJvcEFsbCh0cnVlKTsKIH0KLXZvaWQgQ1BERl9DTWFwTWFuYWdlcjo6RHJvcEFsbChGWF9CT09MIGJSZWxvYWQpCit2b2lkIENQREZfQ01hcE1hbmFnZXI6OkRyb3BBbGwoYm9vbCBiUmVsb2FkKQogewogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fQ01hcHMuR2V0U3RhcnRQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChiUmVsb2FkKSB7Ci0gICAgICAgICAgICBwQ01hcC0+TG9hZFByZWRlZmluZWQodGhpcywgbmFtZSwgRkFMU0UpOworICAgICAgICAgICAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIG5hbWUsIGZhbHNlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlbGV0ZSBwQ01hcDsKICAgICAgICAgfQpAQCAtODMsMjAgKzgzLDIwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoYlJlbG9hZCkgewotICAgICAgICAgICAgcE1hcC0+TG9hZCh0aGlzLCBpLCBGQUxTRSk7CisgICAgICAgICAgICBwTWFwLT5Mb2FkKHRoaXMsIGksIGZhbHNlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlbGV0ZSBwTWFwOwogICAgICAgICB9CiAgICAgfQogfQotQ1BERl9DSUQyVW5pY29kZU1hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0Q0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSykKK0NQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBib29sIGJQcm9tcHRDSkspCiB7CiAgICAgaWYgKG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID09IE5VTEwpIHsKICAgICAgICAgbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF0gPSBMb2FkQ0lEMlVuaWNvZGVNYXAoY2hhcnNldCwgYlByb21wdENKSyk7CiAgICAgfQogICAgIHJldHVybiBtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XTsKIH0KLUNQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQorQ1BERl9DSUQyVW5pY29kZU1hcCogQ1BERl9DTWFwTWFuYWdlcjo6TG9hZENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBib29sIGJQcm9tcHRDSkspCiB7CiAgICAgQ1BERl9DSUQyVW5pY29kZU1hcCogcE1hcCA9IG5ldyBDUERGX0NJRDJVbmljb2RlTWFwKCk7CiAgICAgaWYgKCFwTWFwLT5Jbml0aWFsaXplKCkpIHsKQEAgLTExMiwxMyArMTEyLDEzIEBACiAgICAgbV9TdGF0dXMgPSAwOwogICAgIG1fQ29kZVNlcSA9IDA7CiB9Ci1GWF9CT09MCUNQREZfQ01hcFBhcnNlcjo6SW5pdGlhbGl6ZShDUERGX0NNYXAqIHBDTWFwKQorYm9vbAlDUERGX0NNYXBQYXJzZXI6OkluaXRpYWxpemUoQ1BERl9DTWFwKiBwQ01hcCkKIHsKICAgICBtX3BDTWFwID0gcENNYXA7CiAgICAgbV9TdGF0dXMgPSAwOwogICAgIG1fQ29kZVNlcSA9IDA7CiAgICAgbV9BZGRNYXBzLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgRlhfRFdPUkQgQ01hcF9HZXRDb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCkKIHsKQEAgLTE0NywxMCArMTQ3LDEwIEBACiAgICAgfQogICAgIHJldHVybiBudW07CiB9Ci1zdGF0aWMgRlhfQk9PTCBfQ01hcF9HZXRDb2RlUmFuZ2UoX0NNYXBfQ29kZVJhbmdlJiByYW5nZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaXJzdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzZWNvbmQpCitzdGF0aWMgYm9vbCBfQ01hcF9HZXRDb2RlUmFuZ2UoX0NNYXBfQ29kZVJhbmdlJiByYW5nZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaXJzdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzZWNvbmQpCiB7CiAgICAgaWYgKGZpcnN0LkdldExlbmd0aCgpID09IDAgfHwgZmlyc3QuR2V0QXQoMCkgIT0gJzwnKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAxOyBpIDwgZmlyc3QuR2V0TGVuZ3RoKCk7IGkgKyspCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgICAgfQogICAgIHJhbmdlLm1fQ2hhclNpemUgPSAoaSAtIDEpIC8gMjsKICAgICBpZiAocmFuZ2UubV9DaGFyU2l6ZSA+IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZS5tX0NoYXJTaXplOyBpICsrKSB7CiAgICAgICAgIHVpbnQ4X3QgZGlnaXQxID0gZmlyc3QuR2V0QXQoaSAqIDIgKyAxKTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgICAgICBieXRlID0gYnl0ZSAqIDE2ICsgKChkaWdpdDIgPj0gJzAnICYmIGRpZ2l0MiA8PSAnOScpID8gKGRpZ2l0MiAtICcwJykgOiAoKGRpZ2l0MiAmIDB4ZGYpIC0gJ0EnICsgMTApKTsKICAgICAgICAgcmFuZ2UubV9VcHBlcltpXSA9IGJ5dGU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIENGWF9CeXRlU3RyaW5nIENNYXBfR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCkKIHsKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgIG1fQ29kaW5nID0gQ0lEQ09ESU5HX1VOS05PV047CiAgICAgbV9Db2RpbmdTY2hlbWUgPSBUd29CeXRlczsKICAgICBtX2JWZXJ0aWNhbCA9IDA7Ci0gICAgbV9iTG9hZGVkID0gRkFMU0U7CisgICAgbV9iTG9hZGVkID0gZmFsc2U7CiAgICAgbV9wTWFwcGluZyA9IE5VTEw7CiAgICAgbV9wTGVhZGluZ0J5dGVzID0gTlVMTDsKICAgICBtX3BBZGRNYXBwaW5nID0gTlVMTDsKQEAgLTM0NiwxNCArMzQ2LDE0IEBACiB9OwogZXh0ZXJuIHZvaWQgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKGNvbnN0IGNoYXIqIG5hbWUsIGludCBjaGFyc2V0LCBpbnQgY29kaW5nLCBjb25zdCBGWENNQVBfQ01hcComIHBNYXApOwogZXh0ZXJuIEZYX1dPUkQgRlBERkFQSV9DSURGcm9tQ2hhckNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX0RXT1JEIGNoYXJjb2RlKTsKLUZYX0JPT0wgQ1BERl9DTWFwOjpMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBjb25zdCBGWF9DSEFSKiBwTmFtZSwgRlhfQk9PTCBiUHJvbXB0Q0pLKQorYm9vbCBDUERGX0NNYXA6OkxvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGNvbnN0IEZYX0NIQVIqIHBOYW1lLCBib29sIGJQcm9tcHRDSkspCiB7CiAgICAgbV9QcmVkZWZpbmVkQ01hcCA9IHBOYW1lOwogICAgIGlmIChtX1ByZWRlZmluZWRDTWFwID09IEZYX0JTVFJDKCJJZGVudGl0eS1IIikgfHwgbV9QcmVkZWZpbmVkQ01hcCA9PSBGWF9CU1RSQygiSWRlbnRpdHktViIpKSB7CiAgICAgICAgIG1fQ29kaW5nID0gQ0lEQ09ESU5HX0NJRDsKICAgICAgICAgbV9iVmVydGljYWwgPSBwTmFtZVs5XSA9PSAnVic7Ci0gICAgICAgIG1fYkxvYWRlZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBtX2JMb2FkZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcGlkID0gbV9QcmVkZWZpbmVkQ01hcDsKICAgICBtX2JWZXJ0aWNhbCA9IGNtYXBpZC5SaWdodCgxKSA9PSBGWF9CU1RSQygiViIpOwpAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgaW50IGluZGV4ID0gMDsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoZ19QcmVkZWZpbmVkQ01hcHNbaW5kZXhdLm1fcE5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjbWFwaWQgPT0gQ0ZYX0J5dGVTdHJpbmdDKGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XS5tX3BOYW1lKSkgewogICAgICAgICAgICAgYnJlYWs7CkBAIC0zODQsMTAgKzM4NCwxMCBAQAogICAgIH0KICAgICBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAocE5hbWUsIG1fQ2hhcnNldCwgbV9Db2RpbmcsIG1fcEVtYmVkTWFwKTsKICAgICBpZiAobV9wRW1iZWRNYXApIHsKLSAgICAgICAgbV9iTG9hZGVkID0gVFJVRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIG1fYkxvYWRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogZXh0ZXJuICJDIiB7CiAgICAgc3RhdGljIGludCBjb21wYXJlX2R3b3JkKGNvbnN0IHZvaWQqIGRhdGExLCBjb25zdCB2b2lkKiBkYXRhMikKQEAgLTM5NSw3ICszOTUsNyBAQAogICAgICAgICByZXR1cm4gKCooRlhfRFdPUkQqKWRhdGExKSAtICgqKEZYX0RXT1JEKilkYXRhMik7CiAgICAgfQogfTsKLUZYX0JPT0wgQ1BERl9DTWFwOjpMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpCitib29sIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQogewogICAgIG1fcE1hcHBpbmcgPSBGWF9BbGxvYyhGWF9XT1JELCA2NTUzNik7CiAgICAgQ1BERl9DTWFwUGFyc2VyIHBhcnNlcjsKQEAgLTQxNCw3ICs0MTQsNyBAQAogICAgICAgICBGWFNZU19tZW1jcHkobV9wQWRkTWFwcGluZyArIDQsIHBhcnNlci5tX0FkZE1hcHMuR2V0QnVmZmVyKCksIHBhcnNlci5tX0FkZE1hcHMuR2V0U2l6ZSgpKTsKICAgICAgICAgRlhTWVNfcXNvcnQobV9wQWRkTWFwcGluZyArIDQsIHBhcnNlci5tX0FkZE1hcHMuR2V0U2l6ZSgpIC8gOCwgOCwgY29tcGFyZV9kd29yZCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogZXh0ZXJuICJDIiB7CiAgICAgc3RhdGljIGludCBjb21wYXJlQ0lEKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkKQEAgLTY2OCwxMSArNjY4LDExIEBACiBDUERGX0NJRDJVbmljb2RlTWFwOjp+Q1BERl9DSUQyVW5pY29kZU1hcCgpCiB7CiB9Ci1GWF9CT09MIENQREZfQ0lEMlVuaWNvZGVNYXA6OkluaXRpYWxpemUoKQorYm9vbCBDUERGX0NJRDJVbmljb2RlTWFwOjpJbml0aWFsaXplKCkKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SXNMb2FkZWQoKQorYm9vbCBDUERGX0NJRDJVbmljb2RlTWFwOjpJc0xvYWRlZCgpCiB7CiAgICAgcmV0dXJuIG1fRW1iZWRkZWRDb3VudCAhPSAwOwogfQpAQCAtNjg3LDcgKzY4Nyw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiB2b2lkIEZQREZBUElfTG9hZENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBjb25zdCBGWF9XT1JEKiYgcE1hcCwgRlhfRFdPUkQmIGNvdW50KTsKLXZvaWQgQ1BERl9DSUQyVW5pY29kZU1hcDo6TG9hZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQordm9pZCBDUERGX0NJRDJVbmljb2RlTWFwOjpMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGludCBjaGFyc2V0LCBib29sIGJQcm9tcHRDSkspCiB7CiAgICAgbV9DaGFyc2V0ID0gY2hhcnNldDsKICAgICBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChjaGFyc2V0LCBtX3BFbWJlZGRlZE1hcCwgbV9FbWJlZGRlZENvdW50KTsKQEAgLTcwMCw4ICs3MDAsOCBAQAogICAgIG1fcENJRDJVbmljb2RlTWFwID0gTlVMTDsKICAgICBtX3BBbnNpV2lkdGhzID0gTlVMTDsKICAgICBtX3BDSURUb0dJRE1hcCA9IE5VTEw7Ci0gICAgbV9iQ0lESXNHSUQgPSBGQUxTRTsKLSAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBGQUxTRTsKKyAgICBtX2JDSURJc0dJRCA9IGZhbHNlOworICAgIG1fYkFkb2JlQ291cmllclN0ZCA9IGZhbHNlOwogICAgIG1fcFRUR1NVQlRhYmxlID0gTlVMTDsKICAgICBGWFNZU19tZW1zZXQobV9DaGFyQkJveCwgMHhmZiwgMjU2ICogc2l6ZW9mKEZYX1NNQUxMX1JFQ1QpKTsKIH0KQEAgLTcyMSw5ICs3MjEsOSBAQAogICAgIH0KICAgICByZXR1cm4gbV9wQ01hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKIH0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKK2Jvb2wgQ1BERl9DSURGb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9wQ01hcCA/IG1fcENNYXAtPklzVmVydFdyaXRpbmcoKSA6IEZBTFNFOworICAgIHJldHVybiBtX3BDTWFwID8gbV9wQ01hcC0+SXNWZXJ0V3JpdGluZygpIDogZmFsc2U7CiB9CiBleHRlcm4gRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKTsKIHN0YXRpYyBGWF9EV09SRCBfRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwRW1iZWRNYXAsIGludCBjaGFyc2V0LCBGWF9XQ0hBUiB1bmljb2RlKQpAQCAtODczLDI3ICs4NzMsMjcgQEAKICAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCAqRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6Ol9Mb2FkKCkKK2Jvb2wgQ1BERl9DSURGb250OjpfTG9hZCgpCiB7CiAgICAgaWYgKG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIlRydWVUeXBlIikpIHsKICAgICAgICAgcmV0dXJuIExvYWRHQjIzMTIoKTsKICAgICB9CiAgICAgQ1BERl9BcnJheSogcEZvbnRzID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZXNjZW5kYW50Rm9udHMiKSk7CiAgICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocEZvbnRzLT5HZXRDb3VudCgpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcENJREZvbnREaWN0ID0gcEZvbnRzLT5HZXREaWN0KDApOwogICAgIGlmIChwQ0lERm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9CYXNlRm9udCA9IHBDSURGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlRm9udCIpKTsKICAgICBpZiAoKG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZCIpID09IDAgfHwgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGQiKSA9PSAwCiAgICAgICAgICAgICB8fCBtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQtQm9sZE9ibGlxdWUiKSA9PSAwIHx8IG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1PYmxpcXVlIikgPT0gMCkKICAgICAgICAgICAgICYmICFJc0VtYmVkZGVkKCkpIHsKLSAgICAgICAgbV9iQWRvYmVDb3VyaWVyU3RkID0gVFJVRTsKKyAgICAgICAgbV9iQWRvYmVDb3VyaWVyU3RkID0gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBwQ0lERm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwogICAgIGlmIChwRm9udERlc2MpIHsKQEAgLTkwMSwxMiArOTAxLDEyIEBACiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwRW5jb2RpbmcgPSBtX3BGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKICAgICBpZiAocEVuY29kaW5nID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIHN1YnR5cGUgPSBwQ0lERm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKTsKLSAgICBtX2JUeXBlMSA9IEZBTFNFOworICAgIG1fYlR5cGUxID0gZmFsc2U7CiAgICAgaWYgKHN1YnR5cGUgPT0gRlhfQlNUUkMoIkNJREZvbnRUeXBlMCIpKSB7Ci0gICAgICAgIG1fYlR5cGUxID0gVFJVRTsKKyAgICAgICAgbV9iVHlwZTEgPSB0cnVlOwogICAgIH0KICAgICBpZiAocEVuY29kaW5nLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcCA9IHBFbmNvZGluZy0+R2V0U3RyaW5nKCk7CkBAIC05MTYsMTMgKzkxNiwxMyBAQAogICAgICAgICBtX3BBbGxvY2F0ZWRDTWFwID0gbV9wQ01hcCA9IG5ldyBDUERGX0NNYXA7CiAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwRW5jb2Rpbmc7CiAgICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKICAgICAgICAgbV9wQ01hcC0+TG9hZEVtYmVkZGVkKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wQ01hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0NoYXJzZXQgPSBtX3BDTWFwLT5tX0NoYXJzZXQ7CiAgICAgaWYgKG1fQ2hhcnNldCA9PSBDSURTRVRfVU5LTk9XTikgewpAQCAtOTU1LDE0ICs5NTUsMTQgQEAKICAgICAgICAgICAgIGlmIChwbWFwKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBtYXAtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fcENJRFRvR0lETWFwID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgICAgICAgICAgICAgICAgICBtX3BDSURUb0dJRE1hcC0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwbWFwLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIG1fcENJRFRvR0lETWFwLT5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBtYXAsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBtYXAtPkdldFN0cmluZygpID09IEZYX0JTVFJDKCJJZGVudGl0eSIpKSB7CiAjaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCiAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ0lESXNHSUQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ0lESXNHSUQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAjZWxzZQotICAgICAgICAgICAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIG1fYkNJRElzR0lEID0gdHJ1ZTsKICNlbmRpZgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTk4Myw3ICs5ODMsNyBAQAogICAgICAgICAgICAgbV9EZWZhdWx0VzEgPSAtMTAwMDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIEZYX0ZMT0FUIF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHVpbnQ4X3QgY2gpCiB7CkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogICAgICAgICByZWN0LnRvcCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlRvcDsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBGWF9CT09MIGJWZXJ0ID0gRkFMU0U7CisgICAgYm9vbCBiVmVydCA9IGZhbHNlOwogICAgIGludCBnbHlwaF9pbmRleCA9IEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlLCAmYlZlcnQpOwogICAgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKICAgICAgICAgcmVjdCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7CkBAIC0xMTIwLDEwICsxMTIwLDEwIEBACiAgICAgdnggPSAoc2hvcnQpZHdXaWR0aCAvIDI7CiAgICAgdnkgPSAoc2hvcnQpbV9EZWZhdWx0Vlk7CiB9Ci1pbnQJQ1BERl9DSURGb250OjpHZXRHbHlwaEluZGV4KEZYX0RXT1JEIHVuaWNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpCitpbnQJQ1BERl9DSURGb250OjpHZXRHbHlwaEluZGV4KEZYX0RXT1JEIHVuaWNvZGUsIGJvb2wgKnBWZXJ0R2x5cGgpCiB7CiAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKKyAgICAgICAgKnBWZXJ0R2x5cGggPSBmYWxzZTsKICAgICB9CiAgICAgaW50IGluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlICk7CiAgICAgaWYgKHVuaWNvZGUgPT0gMHgyNTAyKSB7CkBAIC0xMTM2LDcgKzExMzYsNyBAQAogICAgICAgICAgICAgaWYgKHZpbmRleCkgewogICAgICAgICAgICAgICAgIGluZGV4ID0gdmluZGV4OwogICAgICAgICAgICAgICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgKnBWZXJ0R2x5cGggPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBpbmRleDsKQEAgLTExNTcsMjEgKzExNTcsMjEgQEAKICAgICAgICAgICAgIGlmICh2aW5kZXgpIHsKICAgICAgICAgICAgICAgICBpbmRleCA9IHZpbmRleDsKICAgICAgICAgICAgICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAgICAgICAgICAgICAqcFZlcnRHbHlwaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICpwVmVydEdseXBoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgIH0KICAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOworICAgICAgICAqcFZlcnRHbHlwaCA9IGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CiB9Ci1pbnQgQ1BERl9DSURGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCkKK2ludCBDUERGX0NJREZvbnQ6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBib29sICpwVmVydEdseXBoKQogewogICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICpwVmVydEdseXBoID0gRkFMU0U7CisgICAgICAgICpwVmVydEdseXBoID0gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMICYmIG1fcENJRFRvR0lETWFwID09IE5VTEwpIHsKICAgICAgICAgRlhfV09SRCBjaWQgPSBDSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwpAQCAtMTIwNiw4ICsxMjA2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNoYXJjb2RlICs9IDMxOwogICAgICAgICAgICAgaW50IGluZGV4ID0gMCwgaUJhc2VFbmNvZGluZzsKLSAgICAgICAgICAgIEZYX0JPT0wgYk1TVW5pY29kZSA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAxKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7CisgICAgICAgICAgICBib29sIGJNYWNSb21hbiA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKCFiTVNVbmljb2RlKSB7CiAgICAgICAgICAgICAgICAgYk1hY1JvbWFuID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOwogICAgICAgICAgICAgfQpAQCAtMTMyNywxNiArMTMyNywxNiBAQAogewogICAgIHJldHVybiBtX3BDTWFwLT5BcHBlbmRDaGFyKHN0ciwgY2hhcmNvZGUpOwogfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAorYm9vbCBDUERGX0NJREZvbnQ6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAogewogICAgIGlmICghbV9wQ01hcC0+SXNMb2FkZWQoKSB8fCBtX3BDSUQyVW5pY29kZU1hcCA9PSBOVUxMIHx8ICFtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkgewogICAgICAgICByZXR1cm4gbV9wQ01hcC0+bV9Db2RpbmcgIT0gQ0lEQ09ESU5HX1VOS05PV047CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzRm9udFN0eWxlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAorYm9vbCBDUERGX0NJREZvbnQ6OklzRm9udFN0eWxlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0NJREZvbnQ6OkxvYWRTdWJzdEZvbnQoKQogewpAQCAtMTM5MCw3ICsxMzkwLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpMb2FkR0IyMzEyKCkKK2Jvb2wgQ1BERl9DSURGb250OjpMb2FkR0IyMzEyKCkKIHsKICAgICBtX0Jhc2VGb250ID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7CkBAIC0xMzk4LDEwICsxMzk4LDEwIEBACiAgICAgICAgIExvYWRGb250RGVzY3JpcHRvcihwRm9udERlc2MpOwogICAgIH0KICAgICBtX0NoYXJzZXQgPSBDSURTRVRfR0IxOwotICAgIG1fYlR5cGUxID0gRkFMU0U7CisgICAgbV9iVHlwZTEgPSBmYWxzZTsKICAgICBtX3BDTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0UHJlZGVmaW5lZENNYXAoCi0gICAgICAgICAgICAgICAgICBGWF9CU1RSQygiR0JLLUVVQy1IIiksIEZBTFNFKTsKLSAgICBtX3BDSUQyVW5pY29kZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKG1fQ2hhcnNldCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgRlhfQlNUUkMoIkdCSy1FVUMtSCIpLCBmYWxzZSk7CisgICAgbV9wQ0lEMlVuaWNvZGVNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChtX0NoYXJzZXQsIGZhbHNlKTsKICAgICBpZiAoIUlzRW1iZWRkZWQoKSkgewogICAgICAgICBMb2FkU3Vic3RGb250KCk7CiAgICAgfQpAQCAtMTQxMSw3ICsxNDExLDcgQEAKICAgICBmb3IgKGludCBpID0gMzI7IGkgPCAxMjc7IGkgKyspIHsKICAgICAgICAgbV9wQW5zaVdpZHRoc1tpXSA9IDUwMDsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjb25zdCBzdHJ1Y3QgX0NJRFRyYW5zZm9ybSB7CiAgICAgRlhfV09SRAkJQ0lEOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuY3BwCmluZGV4IGE2NTM1OWMuLjk4MGUxNmMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5jcHAKQEAgLTQ4LDE1ICs0OCwxNSBAQAogICAgIH0KICAgICBtX0J1ZmZlci5JbnNlcnRCbG9jayhsb3cgKiBzaXplb2YoX0ludFBhaXIpLCAmcGFpciwgc2l6ZW9mKF9JbnRQYWlyKSk7CiB9Ci1GWF9CT09MIENGWF9HbHlwaE1hcDo6TG9va3VwKGludCBrZXksIGludCAmdmFsdWUpCitib29sIENGWF9HbHlwaE1hcDo6TG9va3VwKGludCBrZXksIGludCAmdmFsdWUpCiB7CiAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJmtleSwgbV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfSW50UGFpciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfSW50UGFpciksIF9Db21wYXJlSW50KTsKICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2YWx1ZSA9ICgoRlhfRFdPUkQqKXBSZXN1bHQpWzFdOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpMb2FkR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpCiB7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbV9iRmVhdXR1cmVNYXBMb2FkID0gVFJVRTsKKyAgICAgICAgbV9iRmVhdXR1cmVNYXBMb2FkID0gdHJ1ZTsKICAgICB9CiAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9mZWF0dXJlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC00MjAsNyArNDIwLDcgQEAKICAgICAgICAgcmVjLT5TdWJzdGl0dXRlW2ldID0gR2V0VUludDE2KHNwKTsKICAgICB9CiB9Ci1GWF9CT09MIENGWF9HU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pCitib29sIENGWF9HU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pCiB7CiAgICAgcmV0dXJuIG1fR3N1YkltcC5HZXRWZXJ0aWNhbEdseXBoKGdseXBobnVtLCB2Z2x5cGhudW0pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmgKaW5kZXggMWIxOGY4Mi4uMTMzNjY3YiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5oCkBAIC0xNywxNSArMTcsMTUgQEAKICAgICBDRlhfR2x5cGhNYXAoKTsKICAgICB+Q0ZYX0dseXBoTWFwKCk7CiAgICAgdm9pZAlTZXRBdChpbnQga2V5LCBpbnQgdmFsdWUpOwotICAgIEZYX0JPT0wJTG9va3VwKGludCBrZXksIGludCAmdmFsdWUpOworICAgIGJvb2wJTG9va3VwKGludCBrZXksIGludCAmdmFsdWUpOwogcHJvdGVjdGVkOgogICAgIENGWF9CaW5hcnlCdWYJbV9CdWZmZXI7CiB9OwogY2xhc3MgQ0ZYX0NUVEdTVUJUYWJsZQogewogcHVibGljOgotICAgIENGWF9DVFRHU1VCVGFibGUodm9pZCk6IG1fYkZlYXV0dXJlTWFwTG9hZChGQUxTRSksIGxvYWRlZChmYWxzZSkge307Ci0gICAgQ0ZYX0NUVEdTVUJUYWJsZShGVF9CeXRlcyBnc3ViKTogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKQorICAgIENGWF9DVFRHU1VCVGFibGUodm9pZCk6IG1fYkZlYXV0dXJlTWFwTG9hZChmYWxzZSksIGxvYWRlZChmYWxzZSkge307CisgICAgQ0ZYX0NUVEdTVUJUYWJsZShGVF9CeXRlcyBnc3ViKTogbV9iRmVhdXR1cmVNYXBMb2FkKGZhbHNlKSwgbG9hZGVkKGZhbHNlKQogICAgIHsKICAgICAgICAgTG9hZEdTVUJUYWJsZShnc3ViKTsKICAgICB9CkBAIC0zOTUsNyArMzk1LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQgbV9mZWF0dXJlTWFwOwotICAgIEZYX0JPT0wJbV9iRmVhdXR1cmVNYXBMb2FkOworICAgIGJvb2wJbV9iRmVhdXR1cmVNYXBMb2FkOwogICAgIGJvb2wgbG9hZGVkOwogICAgIHN0cnVjdCB0dF9nc3ViX2hlYWRlciBoZWFkZXI7CiAgICAgc3RydWN0IFRTY3JpcHRMaXN0IFNjcmlwdExpc3Q7CkBAIC00MDYsNyArNDA2LDcgQEAKIHsKIHB1YmxpYzoKICAgICB+Q0ZYX0dTVUJUYWJsZSgpIG92ZXJyaWRlIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIEdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBHZXRWZXJ0aWNhbEdseXBoKEZYX0RXT1JEIGdseXBobnVtLCBGWF9EV09SRCogdmdseXBobnVtKSBvdmVycmlkZTsKIAogICAgIENGWF9DVFRHU1VCVGFibGUgbV9Hc3ViSW1wOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwCmluZGV4IGMwY2RiMjIuLjZiMTViZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlLmNwcApAQCAtNDQsNyArNDQsNyBAQAogICAgIG1fVG9wID0gcFNyYy0+bV9Ub3A7CiAgICAgbV9Cb3R0b20gPSBwU3JjLT5tX0JvdHRvbTsKIH0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0OjpBcHBlbmRDbGlwUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSkKK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpBcHBlbmRDbGlwUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIGJvb2wgYkF1dG9NZXJnZSkKIHsKICAgICBtX0NsaXBQYXRoLkFwcGVuZFBhdGgocGF0aCwgdHlwZSwgYkF1dG9NZXJnZSk7CiB9CkBAIC0zNTMsNyArMzUzLDcgQEAKIHsKICAgICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwogICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKKyAgICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOwogICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOwogICAgIGlmIChwQ0lERm9udCkgewogICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwpAQCAtMzczLDcgKzM3Myw3IEBACiAgICAgICAgIHJldHVybiBHZXRDaGFyV2lkdGgoY2hhckNvZGUpOwogICAgIH0KICAgICBGWF9GTE9BVCBmb250U2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyA0MDAwLjBmOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgICAgYm9vbCBiVmVydFdyaXRpbmcgPSBmYWxzZTsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTM4OCw3ICszODgsNyBAQAogdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJSZWN0KGludCBpbmRleCwgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QKIHsKICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgICAgYm9vbCBiVmVydFdyaXRpbmcgPSBmYWxzZTsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTQ0MSw3ICs0NDEsNyBAQAogICAgIEZYX0ZMT0FUIG1pbl95ID0gMTAwMDAgKiAxLjBmOwogICAgIEZYX0ZMT0FUIG1heF95ID0gLTEwMDAwICogMS4wZjsKICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgICAgYm9vbCBiVmVydFdyaXRpbmcgPSBmYWxzZTsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKICAgICBpZiAocENJREZvbnQpIHsKICAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKQEAgLTU3MCw3ICs1NzAsNyBAQAogdm9pZCBDUERGX1RleHRPYmplY3Q6OkNhbGNDaGFyUG9zKEZYX0ZMT0FUKiBwUG9zQXJyYXkpIGNvbnN0CiB7CiAgICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CiAgICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CiAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CkBAIC03MjAsOSArNzIwLDkgQEAKICAgICBtX1JpZ2h0ID0gZm9ybV9yZWN0LnJpZ2h0OwogICAgIG1fVG9wID0gZm9ybV9yZWN0LnRvcDsKIH0KLUNQREZfUGFnZU9iamVjdHM6OkNQREZfUGFnZU9iamVjdHMoRlhfQk9PTCBiUmVsZWFzZU1lbWJlcnMpIDogbV9PYmplY3RMaXN0KDEyOCkKK0NQREZfUGFnZU9iamVjdHM6OkNQREZfUGFnZU9iamVjdHMoYm9vbCBiUmVsZWFzZU1lbWJlcnMpIDogbV9PYmplY3RMaXN0KDEyOCkKIHsKLSAgICBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBGQUxTRTsKKyAgICBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBmYWxzZTsKICAgICBtX2JSZWxlYXNlTWVtYmVycyA9IGJSZWxlYXNlTWVtYmVyczsKICAgICBtX1BhcnNlU3RhdGUgPSBQREZfQ09OVEVOVF9OT1RfUEFSU0VEOwogICAgIG1fcFBhcnNlciA9IE5VTEw7CkBAIC04NTgsNyArODU4LDcgQEAKIHsKICAgICBtX3BQYWdlUmVuZGVyID0gTlVMTDsKIH0KLXZvaWQgQ1BERl9QYWdlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JPT0wgYlBhZ2VDYWNoZSkKK3ZvaWQgQ1BERl9QYWdlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIGJvb2wgYlBhZ2VDYWNoZSkKIHsKICAgICBtX3BEb2N1bWVudCA9IChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQ7CiAgICAgbV9wRm9ybURpY3QgPSBwUGFnZURpY3Q7CkBAIC05MjUsNyArOTI1LDcgQEAKICAgICBtX1RyYW5zcGFyZW5jeSA9IFBERlRSQU5TX0lTT0xBVEVEOwogICAgIExvYWRUcmFuc0luZm8oKTsKIH0KLXZvaWQgQ1BERl9QYWdlOjpTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgRlhfQk9PTCBiUmVQYXJzZSkKK3ZvaWQgQ1BERl9QYWdlOjpTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgYm9vbCBiUmVQYXJzZSkKIHsKICAgICBpZiAoYlJlUGFyc2UpIHsKICAgICAgICAgQ2xlYXJDYWNoZU9iamVjdHMoKTsKQEAgLTkzNyw3ICs5MzcsNyBAQAogICAgIG1fcFBhcnNlci0+U3RhcnQodGhpcywgcE9wdGlvbnMpOwogICAgIG1fUGFyc2VTdGF0ZSA9IFBERl9DT05URU5UX1BBUlNJTkc7CiB9Ci12b2lkIENQREZfUGFnZTo6UGFyc2VDb250ZW50KENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgRlhfQk9PTCBiUmVQYXJzZSkKK3ZvaWQgQ1BERl9QYWdlOjpQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBib29sIGJSZVBhcnNlKQogewogICAgIFN0YXJ0UGFyc2UocE9wdGlvbnMsIGJSZVBhcnNlKTsKICAgICBDb250aW51ZVBhcnNlKE5VTEwpOwpAQCAtMTA3MCw4ICsxMDcwLDggQEAKIH0KIENQREZfUGFyc2VPcHRpb25zOjpDUERGX1BhcnNlT3B0aW9ucygpCiB7Ci0gICAgbV9iVGV4dE9ubHkgPSBGQUxTRTsKLSAgICBtX2JNYXJrZWRDb250ZW50ID0gVFJVRTsKLSAgICBtX2JTZXBhcmF0ZUZvcm0gPSBUUlVFOwotICAgIG1fYkRlY29kZUlubGluZUltYWdlID0gRkFMU0U7CisgICAgbV9iVGV4dE9ubHkgPSBmYWxzZTsKKyAgICBtX2JNYXJrZWRDb250ZW50ID0gdHJ1ZTsKKyAgICBtX2JTZXBhcmF0ZUZvcm0gPSB0cnVlOworICAgIG1fYkRlY29kZUlubGluZUltYWdlID0gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwCmluZGV4IDE5ODA1NGUuLmIxYzg4MzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIGZhbWlseSwgQ29tcG9uZW50c0ZvckZhbWlseShmYW1pbHkpKSB7CiB9CiAKLUZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX0RldmljZUNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CiB7CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewogICAgICAgICBSID0gcEJ1ZlswXTsKQEAgLTgxLDU2ICs4MSw1NiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTU0VSVChtX0ZhbWlseSA9PSBQREZDU19QQVRURVJOKTsKICAgICAgICAgUiA9IEcgPSBCID0gMDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RldmljZUNTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAorYm9vbCBDUERGX0RldmljZUNTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAogewogICAgIGlmIChtX0ZhbWlseSAhPSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBjID0gcEJ1ZlswXTsKICAgICBtID0gcEJ1ZlsxXTsKICAgICB5ID0gcEJ1ZlsyXTsKICAgICBrID0gcEJ1ZlszXTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAorYm9vbCBDUERGX0RldmljZUNTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiB7CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewogICAgICAgICBwQnVmWzBdID0gUjsKICAgICAgICAgcEJ1ZlsxXSA9IEc7CiAgICAgICAgIHBCdWZbMl0gPSBCOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7CiAgICAgICAgIGlmIChSID09IEcgJiYgUiA9PSBCKSB7CiAgICAgICAgICAgICAqcEJ1ZiA9IFI7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewogICAgICAgICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RldmljZUNTOjp2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0Citib29sIENQREZfRGV2aWNlQ1M6OnZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKIHsKICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7CiAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCKGMsIG0sIHksIGssIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0pOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CiAgICAgICAgIHBCdWZbMF0gPSBjOwogICAgICAgICBwQnVmWzFdID0gbTsKICAgICAgICAgcEJ1ZlsyXSA9IHk7CiAgICAgICAgIHBCdWZbM10gPSBrOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBzdGF0aWMgdm9pZCBSZXZlcnNlUkdCKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzKQogewpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICBwU3JjQnVmICs9IDM7CiAgICAgICAgIH0KIH0KLXZvaWQgQ1BERl9EZXZpY2VDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKK3ZvaWQgQ1BERl9EZXZpY2VDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBpZiAoYlRyYW5zTWFzayAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7CkBAIC0yNzQsMTEgKzI3NCwxMSBAQAogICAgIGV4cGxpY2l0IENQREZfQ2FsR3JheShDUERGX0RvY3VtZW50KiBwRG9jKQogICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxHUkFZLCAxKSB7CiAgICAgfQotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgIEZYX0ZMT0FUIG1fR2FtbWE7CiB9OwogCi1GWF9CT09MIENQREZfQ2FsR3JheTo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK2Jvb2wgQ1BERl9DYWxHcmF5Ojp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3QoMSk7CiAgICAgQ1BERl9BcnJheSogcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXaGl0ZVBvaW50IikpOwpAQCAtMzAyLDIyICszMDIsMjIgQEAKICAgICBpZiAobV9HYW1tYSA9PSAwKSB7CiAgICAgICAgIG1fR2FtbWEgPSAxLjBmOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9DYWxHcmF5OjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0Citib29sIENQREZfQ2FsR3JheTo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIFIgPSBHID0gQiA9ICpwQnVmOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0NhbEdyYXk6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKK2Jvb2wgQ1BERl9DYWxHcmF5OjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiB7CiAgICAgaWYgKFIgPT0gRyAmJiBSID09IEIpIHsKICAgICAgICAgKnBCdWYgPSBSOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci12b2lkIENQREZfQ2FsR3JheTo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKK3ZvaWQgQ1BERl9DYWxHcmF5OjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrKSBjb25zdAogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7CiAgICAgICAgICpwRGVzdEJ1ZiArKyA9IHBTcmNCdWZbaV07CkBAIC0zMzEsMjQgKzMzMSwyNCBAQAogICAgIGV4cGxpY2l0IENQREZfQ2FsUkdCKENQREZfRG9jdW1lbnQqIHBEb2MpCiAgICAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0NBTFJHQiwgMykgewogICAgIH0KLSAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MIFNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKIAogICAgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKICAgICBGWF9GTE9BVCBtX0JsYWNrUG9pbnRbM107CiAgICAgRlhfRkxPQVQgbV9HYW1tYVszXTsKICAgICBGWF9GTE9BVCBtX01hdHJpeFs5XTsKLSAgICBGWF9CT09MIG1fYkdhbW1hOwotICAgIEZYX0JPT0wgbV9iTWF0cml4OworICAgIGJvb2wgbV9iR2FtbWE7CisgICAgYm9vbCBtX2JNYXRyaXg7CiB9OwotRlhfQk9PTCBDUERGX0NhbFJHQjo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK2Jvb2wgQ1BERl9DYWxSR0I6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKICAgICBpZiAoIXBEaWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKICAgICBpbnQgaTsKQEAgLTM2MSwyNSArMzYxLDI1IEBACiAgICAgfQogICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiR2FtbWEiKSk7CiAgICAgaWYgKHBQYXJhbSkgewotICAgICAgICBtX2JHYW1tYSA9IFRSVUU7CisgICAgICAgIG1fYkdhbW1hID0gdHJ1ZTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKICAgICAgICAgICAgIG1fR2FtbWFbaV0gPSBwUGFyYW0tPkdldE51bWJlcihpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fYkdhbW1hID0gRkFMU0U7CisgICAgICAgIG1fYkdhbW1hID0gZmFsc2U7CiAgICAgfQogICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiTWF0cml4IikpOwogICAgIGlmIChwUGFyYW0pIHsKLSAgICAgICAgbV9iTWF0cml4ID0gVFJVRTsKKyAgICAgICAgbV9iTWF0cml4ID0gdHJ1ZTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDk7IGkgKyspIHsKICAgICAgICAgICAgIG1fTWF0cml4W2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBtX2JNYXRyaXggPSBGQUxTRTsKKyAgICAgICAgbV9iTWF0cml4ID0gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0NhbFJHQjo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX0NhbFJHQjo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIEZYX0ZMT0FUIEFfID0gcEJ1ZlswXTsKICAgICBGWF9GTE9BVCBCXyA9IHBCdWZbMV07CkBAIC00MDAsMTYgKzQwMCwxNiBAQAogICAgICAgICBaID0gQ187CiAgICAgfQogICAgIFhZWl90b19zUkdCX1doaXRlUG9pbnQoWCwgWSwgWiwgUiwgRywgQiwgbV9XaGl0ZVBvaW50WzBdLCBtX1doaXRlUG9pbnRbMV0sIG1fV2hpdGVQb2ludFsyXSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfQ2FsUkdCOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0Citib29sIENQREZfQ2FsUkdCOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiB7CiAgICAgcEJ1ZlswXSA9IFI7CiAgICAgcEJ1ZlsxXSA9IEc7CiAgICAgcEJ1ZlsyXSA9IEI7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci12b2lkIENQREZfQ2FsUkdCOjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdAordm9pZCBDUERGX0NhbFJHQjo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBpZiAoYlRyYW5zTWFzaykgewogICAgICAgICBGWF9GTE9BVCBDYWxbM107CkBAIC00MzUsMjEgKzQzNSwyMSBAQAogICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19MQUIsIDMpIHsKICAgICB9CiAgICAgdm9pZCBHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsIEZYX0ZMT0FUJiB2YWx1ZSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgYm9vbAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LCBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107CiAgICAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOwogICAgIEZYX0ZMT0FUIG1fUmFuZ2VzWzRdOwogfTsKLUZYX0JPT0wgQ1BERl9MYWJDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK2Jvb2wgQ1BERl9MYWJDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOwogICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKICAgICBpbnQgaTsKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICsrKSB7CiAgICAgICAgIG1fUmFuZ2VzW2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiBkZWZfcmFuZ2VzW2ldOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9MYWJDUzo6R2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0CiB7CkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9MYWJDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX0xhYkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CiB7CiAgICAgRlhfRkxPQVQgTHN0YXIgPSBwQnVmWzBdOwogICAgIEZYX0ZMT0FUIGFzdGFyID0gcEJ1ZlsxXTsKQEAgLTUwOSwxMyArNTA5LDEzIEBACiAgICAgICAgIFogPSAxLjA4ODlmICogTiAqIE4gKiBOOwogICAgIH0KICAgICBYWVpfdG9fc1JHQihYLCBZLCBaLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAorYm9vbCBDUERGX0xhYkNTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXZvaWQgQ1BERl9MYWJDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKK3ZvaWQgQ1BERl9MYWJDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewogICAgICAgICBGWF9GTE9BVCBsYWJbM107CkBAIC01MzIsMTIgKzUzMiwxMiBAQAogICAgIH0KIH0KIENQREZfSWNjUHJvZmlsZTo6Q1BERl9JY2NQcm9maWxlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOgotICAgIG1fYnNSR0IoRkFMU0UpLAorICAgIG1fYnNSR0IoZmFsc2UpLAogICAgIG1fcFRyYW5zZm9ybShOVUxMKSwKICAgICBtX25TcmNDb21wb25lbnRzKDApCiB7CiAgICAgaWYgKGR3U2l6ZSA9PSAzMTQ0ICYmIEZYU1lTX21lbWNtcChwRGF0YSArIDB4MTkwLCAic1JHQiBJRUM2MTk2Ni0yLjEiLCAxNykgPT0gMCkgewotICAgICAgICBtX2JzUkdCID0gVFJVRTsKKyAgICAgICAgbV9ic1JHQiA9IHRydWU7CiAgICAgICAgIG1fblNyY0NvbXBvbmVudHMgPSAzOwogICAgIH0KICAgICBlbHNlIGlmIChDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpKSB7CkBAIC01NTksMjMgKzU1OSwyMyBAQAogICAgICAgICAgIG1fcFByb2ZpbGUobnVsbHB0ciksCiAgICAgICAgICAgbV9wQ2FjaGUobnVsbHB0ciksCiAgICAgICAgICAgbV9wUmFuZ2VzKG51bGxwdHIpLAotICAgICAgICAgIG1fYk93bihGQUxTRSkgeworICAgICAgICAgIG1fYk93bihmYWxzZSkgewogICAgIH0KICAgICB+Q1BERl9JQ0NCYXNlZENTKCkgb3ZlcnJpZGU7CiAKLSAgICBGWF9CT09MCXZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAl2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgYm9vbAl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpIG92ZXJyaWRlOwogICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKIAogICAgIENQREZfQ29sb3JTcGFjZSogbV9wQWx0ZXJDUzsKICAgICBDUERGX0ljY1Byb2ZpbGUqIG1fcFByb2ZpbGU7CiAgICAgdWludDhfdCogbV9wQ2FjaGU7CiAgICAgRlhfRkxPQVQqIG1fcFJhbmdlczsKLSAgICBGWF9CT09MCW1fYk93bjsKKyAgICBib29sCW1fYk93bjsKIH07CiAKIENQREZfSUNDQmFzZWRDUzo6fkNQREZfSUNDQmFzZWRDUygpCkBAIC01OTQsMTUgKzU5NCwxNSBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitib29sIENQREZfSUNDQmFzZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBBcnJheS0+R2V0U3RyZWFtKDEpOwogICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcFByb2ZpbGUgPSBwRG9jLT5Mb2FkSWNjUHJvZmlsZShwU3RyZWFtKTsKICAgICBpZiAoIW1fcFByb2ZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fbkNvbXBvbmVudHMgPSBtX3BQcm9maWxlLT5HZXRDb21wb25lbnRzKCk7IC8vVHJ5IHVzaW5nIHRoZSBuQ29tcG9uZW50cyBmcm9tIElDQyBwcm9maWxlCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKQEAgLTYxNSwxMyArNjE1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwQWx0ZXJDUy0+Q291bnRDb21wb25lbnRzKCkgPiAwKSB7IC8vIFVzZSBBbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzID0gcEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IHBBbHRlckNTOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iT3duID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIE5vIHZhbGlkIGFsdGVybmF0aXZlIGNvbG9yc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHRlckNTLT5SZWxlYXNlQ1MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRpY3RDb21wb25lbnRzID0gcERpY3QgPyBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTiIpKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobkRpY3RDb21wb25lbnRzICE9IDEgJiYgbkRpY3RDb21wb25lbnRzICE9IDMgJiYgbkRpY3RDb21wb25lbnRzICE9IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IG5EaWN0Q29tcG9uZW50czsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjMzLDcgKzYzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBbHRlckNTID0gcEFsdGVyQ1M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JPd24gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgbV9iT3duID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTY2MSwxNSArNjYxLDE1IEBACiAgICAgICAgICAgICBtX3BSYW5nZXNbaV0gPSAwOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9JQ0NCYXNlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0CiB7CiAgICAgaWYgKG1fcFByb2ZpbGUgJiYgbV9wUHJvZmlsZS0+bV9ic1JHQikgewogICAgICAgICBSID0gcEJ1ZlswXTsKICAgICAgICAgRyA9IHBCdWZbMV07CiAgICAgICAgIEIgPSBwQnVmWzJdOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIElDb2RlY19JY2NNb2R1bGUgKnBJY2NNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpOwogICAgIGlmIChtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0gPT0gTlVMTCB8fCBwSWNjTW9kdWxlID09IE5VTEwpIHsKQEAgLTY3OCw3ICs2NzgsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUiA9IEcgPSBCID0gMC4wZjsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0ZMT0FUIHJnYlszXTsKICAgICBwSWNjTW9kdWxlLT5TZXRDb21wb25lbnRzKG1fbkNvbXBvbmVudHMpOwpAQCAtNjg2LDMxICs2ODYsMzEgQEAKICAgICBSID0gcmdiWzBdOwogICAgIEcgPSByZ2JbMV07CiAgICAgQiA9IHJnYlsyXTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAorYm9vbCBDUERGX0lDQ0Jhc2VkQ1M6OnZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0CiB7CiAgICAgaWYgKG1fbkNvbXBvbmVudHMgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgYyA9IHBCdWZbMF07CiAgICAgbSA9IHBCdWZbMV07CiAgICAgeSA9IHBCdWZbMl07CiAgICAgayA9IHBCdWZbM107Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfSUNDQmFzZWRDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAorYm9vbCBDUERGX0lDQ0Jhc2VkQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotdm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkKK3ZvaWQgQ1BERl9JQ0NCYXNlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpCiB7CiAgICAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKICAgICBpZiAobV9wQWx0ZXJDUykgewogICAgICAgICBtX3BBbHRlckNTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKICAgICB9CiB9Ci12b2lkIENQREZfSUNDQmFzZWRDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKK3ZvaWQgQ1BERl9JQ0NCYXNlZENTOjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgYm9vbCBiVHJhbnNNYXNrKSBjb25zdAogewogICAgIGlmIChtX3BQcm9maWxlLT5tX2JzUkdCKSB7CiAgICAgICAgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7CkBAIC03NjUsMTAgKzc2NSwxMCBAQAogICAgIH0KICAgICB+Q1BERl9JbmRleGVkQ1MoKSBvdmVycmlkZTsKIAotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgYm9vbAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwogICAgIENQREZfQ29sb3JTcGFjZSogR2V0QmFzZUNTKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOworICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKIAogICAgIENQREZfQ29sb3JTcGFjZSogbV9wQmFzZUNTOwogICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRCYXNlQ1M7CkBAIC03ODcsMTkgKzc4NywxOSBAQAogICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfSW5kZXhlZENTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorYm9vbCBDUERGX0luZGV4ZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpIDwgNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QqIHBCYXNlT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7CiAgICAgaWYgKHBCYXNlT2JqID09IG1fcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBwRG9jLT5HZXRQYWdlRGF0YSgpOwogICAgIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQmFzZU9iaiwgTlVMTCk7CiAgICAgaWYgKG1fcEJhc2VDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOwogICAgIG1fbkJhc2VDb21wb25lbnRzID0gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKTsKQEAgLTgxMiwyOSArODEyLDI5IEBACiAgICAgbV9NYXhJbmRleCA9IHBBcnJheS0+R2V0SW50ZWdlcigyKTsKICAgICBDUERGX09iamVjdCogcFRhYmxlT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMyk7CiAgICAgaWYgKHBUYWJsZU9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocFRhYmxlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewogICAgICAgICBtX1RhYmxlID0gKChDUERGX1N0cmluZyopcFRhYmxlT2JqKS0+R2V0U3RyaW5nKCk7CiAgICAgfSBlbHNlIGlmIChwVGFibGVPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgYWNjLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcFRhYmxlT2JqLCBGQUxTRSk7CisgICAgICAgIGFjYy5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBUYWJsZU9iaiwgZmFsc2UpOwogICAgICAgICBtX1RhYmxlID0gQ0ZYX0J5dGVTdHJpbmdDKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUERGX0luZGV4ZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX0luZGV4ZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGludCBpbmRleCA9IChpbnQzMl90KSgqcEJ1Zik7CiAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG1fTWF4SW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX25CYXNlQ29tcG9uZW50cykgewogICAgICAgICBpZiAoaW5kZXggPT0gSU5UX01BWCB8fCAoaW5kZXggKyAxKSA+IElOVF9NQVggLyBtX25CYXNlQ29tcG9uZW50cyB8fAogICAgICAgICAgICAgICAgIChpbmRleCArIDEpKm1fbkJhc2VDb21wb25lbnRzID4gKGludCltX1RhYmxlLkdldExlbmd0aCgpKSB7CiAgICAgICAgICAgICBSID0gRyA9IEIgPSAwOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBDb21wcyhtX25CYXNlQ29tcG9uZW50cyk7CkBAIC04NDQsMTMgKzg0NCwxMyBAQAogICAgICAgICBjb21wc1tpXSA9IG1fcENvbXBNaW5NYXhbaSAqIDJdICsgbV9wQ29tcE1pbk1heFtpICogMiArIDFdICogcFRhYmxlW2luZGV4ICogbV9uQmFzZUNvbXBvbmVudHMgKyBpXSAvIDI1NTsKICAgICB9CiAgICAgbV9wQmFzZUNTLT5HZXRSR0IoY29tcHMsIFIsIEcsIEIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9Db2xvclNwYWNlKkNQREZfSW5kZXhlZENTOjpHZXRCYXNlQ1MoKSBjb25zdAogewogICAgIHJldHVybiBtX3BCYXNlQ1M7CiB9Ci12b2lkIENQREZfSW5kZXhlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQREZfSW5kZXhlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpCiB7CiAgICAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKICAgICBpZiAobV9wQmFzZUNTKSB7CkBAIC04NzEsMzkgKzg3MSwzOSBAQAogCSAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfUGF0dGVybkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQorYm9vbCBDUERGX1BhdHRlcm5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKIHsKICAgICBDUERGX09iamVjdCogcEJhc2VDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDEpOwogICAgIGlmIChwQmFzZUNTID09IG1fcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBwRG9jLT5HZXRQYWdlRGF0YSgpOwogICAgIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQmFzZUNTLCBOVUxMKTsKICAgICBpZiAobV9wQmFzZUNTKSB7CiAgICAgICAgIGlmIChtX3BCYXNlQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOwogICAgICAgICBtX25Db21wb25lbnRzID0gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSArIDE7CiAgICAgICAgIGlmIChtX3BCYXNlQ1MtPkNvdW50Q29tcG9uZW50cygpID4gTUFYX1BBVFRFUk5fQ09MT1JDT01QUykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1BhdHRlcm5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX1BhdHRlcm5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGlmIChtX3BCYXNlQ1MpIHsKICAgICAgICAgQVNTRVJUKG1fcEJhc2VDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTik7CiAgICAgICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopcEJ1ZjsKICAgICAgICAgaWYgKG1fcEJhc2VDUy0+R2V0UkdCKHB2YWx1ZS0+bV9Db21wcywgUiwgRywgQikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgUiA9IEcgPSBCID0gMC43NWY7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfQ29sb3JTcGFjZSogQ1BERl9QYXR0ZXJuQ1M6OkdldEJhc2VDUygpIGNvbnN0CiB7CkBAIC05MTksOSArOTE5LDkgQEAKICAgICB9CiAgICAgfkNQREZfU2VwYXJhdGlvbkNTKCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsIEZYX0ZMT0FUJiB2YWx1ZSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOworICAgIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKIAogICAgIENQREZfQ29sb3JTcGFjZSogbV9wQWx0Q1M7CiAgICAgQ1BERl9GdW5jdGlvbiogbV9wRnVuYzsKQEAgLTk0MCw3ICs5NDAsNyBAQAogICAgIG1pbiA9IDA7CiAgICAgbWF4ID0gMS4wZjsKIH0KLUZYX0JPT0wgQ1BERl9TZXBhcmF0aW9uQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCitib29sIENQREZfU2VwYXJhdGlvbkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQogewogICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwQXJyYXktPkdldFN0cmluZygxKTsKICAgICBpZiAobmFtZSA9PSBGWF9CU1RSQygiTm9uZSIpKSB7CkBAIC05NDksMTEgKzk0OSwxMSBAQAogICAgICAgICBtX1R5cGUgPSBDb2xvcmFudDsKICAgICAgICAgQ1BERl9PYmplY3QqIHBBbHRDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDIpOwogICAgICAgICBpZiAocEFsdENTID09IG1fcEFycmF5KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7CiAgICAgICAgIGlmICghbV9wQWx0Q1MpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBDUERGX09iamVjdCogcEZ1bmNPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgzKTsKICAgICAgICAgaWYgKHBGdW5jT2JqICYmIHBGdW5jT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKQEAgLTk2NCwxNiArOTY0LDE2IEBACiAgICAgICAgICAgICBtX3BGdW5jID0gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TZXBhcmF0aW9uQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKK2Jvb2wgQ1BERl9TZXBhcmF0aW9uQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKIHsKICAgICBpZiAobV9UeXBlID09IE5vbmUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BGdW5jID09IE5VTEwpIHsKICAgICAgICAgaWYgKG1fcEFsdENTID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpbnQgbkNvbXBzID0gbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0cyhuQ29tcHMpOwpAQCAtOTgxLDIyICs5ODEsMjIgQEAKICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSAqcEJ1ZjsKICAgICAgICAgfQogICAgICAgICBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKICAgICBpbnQgbnJlc3VsdHMgPSAwOwogICAgIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgMSwgcmVzdWx0cywgbnJlc3VsdHMpOwogICAgIGlmIChucmVzdWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wQWx0Q1MpIHsKICAgICAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBSID0gRyA9IEIgPSAwOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci12b2lkIENQREZfU2VwYXJhdGlvbkNTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQREZfU2VwYXJhdGlvbkNTOjpFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpCiB7CiAgICAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKICAgICBpZiAobV9wQWx0Q1MpIHsKQEAgLTEwMTMsOSArMTAxMyw5IEBACiAgICAgfQogICAgIH5DUERGX0RldmljZU5DUygpIG92ZXJyaWRlOwogICAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKKyAgICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkgb3ZlcnJpZGU7CiAKICAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdENTOwogICAgIENQREZfRnVuY3Rpb24qIG1fcEZ1bmM7CkBAIC0xMDMzLDQ1ICsxMDMzLDQ1IEBACiAgICAgbWluID0gMDsKICAgICBtYXggPSAxLjBmOwogfQotRlhfQk9PTCBDUERGX0RldmljZU5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKK2Jvb2wgQ1BERl9EZXZpY2VOQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKICAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX25Db21wb25lbnRzID0gKChDUERGX0FycmF5KilwT2JqKS0+R2V0Q291bnQoKTsKICAgICBDUERGX09iamVjdCogcEFsdENTID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMik7CiAgICAgaWYgKCFwQWx0Q1MgfHwgcEFsdENTID09IG1fcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BBbHRDUyA9IExvYWQocERvYywgcEFsdENTKTsKICAgICBtX3BGdW5jID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgzKSk7CiAgICAgaWYgKG1fcEFsdENTID09IE5VTEwgfHwgbV9wRnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkgPCBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RldmljZU5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAorYm9vbCBDUERGX0RldmljZU5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAogewogICAgIGlmIChtX3BGdW5jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKICAgICBpbnQgbnJlc3VsdHMgPSAwOwogICAgIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgbV9uQ29tcG9uZW50cywgcmVzdWx0cywgbnJlc3VsdHMpOwogICAgIGlmIChucmVzdWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotdm9pZCBDUERGX0RldmljZU5DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUERGX0RldmljZU5DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKQogewogICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CiAgICAgaWYgKG1fcEFsdENTKSB7CkBAIC0xMTk3LDMzICsxMTk3LDMzIEBACiAgICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwogICAgIHJldHVybiAoRlhfRkxPQVQqKXBCdWY7CiB9Ci1GWF9CT09MIENQREZfQ29sb3JTcGFjZTo6c1JHQigpIGNvbnN0Citib29sIENQREZfQ29sb3JTcGFjZTo6c1JHQigpIGNvbnN0CiB7CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0ZhbWlseSAhPSBQREZDU19JQ0NCQVNFRCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9JQ0NCYXNlZENTKiBwQ1MgPSAoQ1BERl9JQ0NCYXNlZENTKil0aGlzOwogICAgIHJldHVybiBwQ1MtPm1fcFByb2ZpbGUtPm1fYnNSR0I7CiB9Ci1GWF9CT09MIENQREZfQ29sb3JTcGFjZTo6R2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0Citib29sIENQREZfQ29sb3JTcGFjZTo6R2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0CiB7CiAgICAgaWYgKHZfR2V0Q01ZSyhwQnVmLCBjLCBtLCB5LCBrKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0ZMT0FUIFIsIEcsIEI7CiAgICAgaWYgKCFHZXRSR0IocEJ1ZiwgUiwgRywgQikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHNSR0JfdG9fQWRvYmVDTVlLKFIsIEcsIEIsIGMsIG0sIHksIGspOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OlNldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0Citib29sIENQREZfQ29sb3JTcGFjZTo6U2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKIHsKICAgICBpZiAodl9TZXRDTVlLKHBCdWYsIGMsIG0sIHksIGspKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfRkxPQVQgUiwgRywgQjsKICAgICBBZG9iZUNNWUtfdG9fc1JHQihjLCBtLCB5LCBrLCBSLCBHLCBCKTsKQEAgLTEyNDcsNyArMTI0Nyw3IEBACiAgICAgQ1BERl9JbmRleGVkQ1MqIHBDUyA9IChDUERGX0luZGV4ZWRDUyopdGhpczsKICAgICByZXR1cm4gcENTLT5tX01heEluZGV4OwogfQotdm9pZCBDUERGX0NvbG9yU3BhY2U6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Cit2b2lkIENQREZfQ29sb3JTcGFjZTo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIGJvb2wgYlRyYW5zTWFzaykgY29uc3QKIHsKICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gc3JjYnVmKG1fbkNvbXBvbmVudHMpOwogICAgIEZYX0ZMT0FUKiBzcmMgPSBzcmNidWY7CkBAIC0xMjY1LDcgKzEyNjUsNyBAQAogICAgICAgICAqZGVzdF9idWYgKysgPSAoaW50MzJfdCkoUiAqIDI1NSk7CiAgICAgfQogfQotdm9pZCBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkKK3ZvaWQgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpCiB7CiAgICAgaWYgKGJFbmFibGVkKSB7CiAgICAgICAgIG1fZHdTdGRDb252ZXJzaW9uICsrOwpAQCAtMTM5NywyMyArMTM5NywyMyBAQAogICAgIGlmIChtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewogICAgICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKICAgICAgICAgaWYgKHB2YWx1ZS0+bV9wUGF0dGVybiAmJiBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50KSB7Ci0gICAgICAgICAgICBwdmFsdWUtPm1fcFBhdHRlcm4gPSBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRQYXR0ZXJuKHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wUGF0dGVybk9iaiwgRkFMU0UsICZwdmFsdWUtPm1fcFBhdHRlcm4tPm1fUGFyZW50TWF0cml4KTsKKyAgICAgICAgICAgIHB2YWx1ZS0+bV9wUGF0dGVybiA9IHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldFBhdHRlcm4ocHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqLCBmYWxzZSwgJnB2YWx1ZS0+bV9wUGF0dGVybi0+bV9QYXJlbnRNYXRyaXgpOwogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0NvbG9yOjpHZXRSR0IoaW50JiBSLCBpbnQmIEcsIGludCYgQikgY29uc3QKK2Jvb2wgQ1BERl9Db2xvcjo6R2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0CiB7CiAgICAgaWYgKG1fcENTID09IE5VTEwgfHwgbV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZMT0FUIHI9MC4wZiwgZz0wLjBmLCBiPTAuMGY7CiAgICAgaWYgKCFtX3BDUy0+R2V0UkdCKG1fcEJ1ZmZlciwgciwgZywgYikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIFIgPSAoaW50MzJfdCkociAqIDI1NSArIDAuNWYpOwogICAgIEcgPSAoaW50MzJfdCkoZyAqIDI1NSArIDAuNWYpOwogICAgIEIgPSAoaW50MzJfdCkoYiAqIDI1NSArIDAuNWYpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9QYXR0ZXJuKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuKCkgY29uc3QKIHsKQEAgLTE0MzgsMTAgKzE0MzgsMTAgQEAKICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKICAgICByZXR1cm4gcHZhbHVlLT5tX25Db21wcyA/IHB2YWx1ZS0+bV9Db21wcyA6IE5VTEw7CiB9Ci1GWF9CT09MIENQREZfQ29sb3I6OklzRXF1YWwoY29uc3QgQ1BERl9Db2xvciYgb3RoZXIpIGNvbnN0Citib29sIENQREZfQ29sb3I6OklzRXF1YWwoY29uc3QgQ1BERl9Db2xvciYgb3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKG1fcENTICE9IG90aGVyLm1fcENTIHx8IG1fcENTID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBGWFNZU19tZW1jbXAobV9wQnVmZmVyLCBvdGhlci5tX3BCdWZmZXIsIG1fcENTLT5HZXRCdWZTaXplKCkpID09IDA7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwCmluZGV4IDA1MjMzYTEuLjU2ODg2M2EgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwCkBAIC03OCw3ICs3OCw3IEBACiB9CiB2b2lkIENQREZfUGFnZU1vZHVsZTo6Q2xlYXJEb2MoQ1BERl9Eb2N1bWVudCogcERvYykKIHsKLSAgICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5DbGVhcihGQUxTRSk7CisgICAgcERvYy0+R2V0UGFnZURhdGEoKS0+Q2xlYXIoZmFsc2UpOwogfQogdm9pZCBDUERGX1BhZ2VNb2R1bGU6Ok5vdGlmeUNKS0F2YWlsYWJsZSgpCiB7CkBAIC04OCw3ICs4OCw3IEBACiBDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkxvYWRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KQogewogICAgIEFTU0VSVChwRm9udERpY3QpOwotICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEZvbnQocEZvbnREaWN0LCBGQUxTRSk7CisgICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Rm9udChwRm9udERpY3QsIGZhbHNlKTsKIH0KIAogQ1BERl9TdHJlYW1BY2MqIENQREZfRG9jdW1lbnQ6OkxvYWRGb250RmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSkKQEAgLTEwMSw3ICsxMDEsNyBAQAogewogICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldENvbG9yU3BhY2UocENTT2JqLCBwUmVzb3VyY2VzKTsKIH0KLUNQREZfUGF0dGVybiogQ1BERl9Eb2N1bWVudDo6TG9hZFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCitDUERGX1BhdHRlcm4qIENQREZfRG9jdW1lbnQ6OkxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgYm9vbCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KQogewogICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldFBhdHRlcm4ocFBhdHRlcm5PYmosIGJTaGFkaW5nLCBtYXRyaXgpOwogfQpAQCAtMTI2LDE0ICsxMjYsMTQgQEAKIH0KIENQREZfRG9jUGFnZURhdGE6OkNQREZfRG9jUGFnZURhdGEoQ1BERl9Eb2N1bWVudCogcFBERkRvYykKICAgICA6IG1fcFBERkRvYyhwUERGRG9jKSwKLSAgICAgIG1fYkZvcmNlQ2xlYXIoRkFMU0UpCisgICAgICBtX2JGb3JjZUNsZWFyKGZhbHNlKQogewogfQogCiBDUERGX0RvY1BhZ2VEYXRhOjp+Q1BERl9Eb2NQYWdlRGF0YSgpCiB7Ci0gICAgQ2xlYXIoRkFMU0UpOwotICAgIENsZWFyKFRSVUUpOworICAgIENsZWFyKGZhbHNlKTsKKyAgICBDbGVhcih0cnVlKTsKIAogICAgIGZvciAoYXV0byYgaXQgOiBtX1BhdHRlcm5NYXApCiAgICAgICAgIGRlbGV0ZSBpdC5zZWNvbmQ7CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICBtX0NvbG9yU3BhY2VNYXAuY2xlYXIoKTsKIH0KIAotdm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpDbGVhcihGWF9CT09MIGJGb3JjZVJlbGVhc2UpCit2b2lkIENQREZfRG9jUGFnZURhdGE6OkNsZWFyKGJvb2wgYkZvcmNlUmVsZWFzZSkKIHsKICAgICBtX2JGb3JjZUNsZWFyID0gYkZvcmNlUmVsZWFzZTsKIApAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgfQogfQogCi1DUERGX0ZvbnQqIENQREZfRG9jUGFnZURhdGE6OkdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIEZYX0JPT0wgZmluZE9ubHkpCitDUERGX0ZvbnQqIENQREZfRG9jUGFnZURhdGE6OkdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIGJvb2wgZmluZE9ubHkpCiB7CiAgICAgaWYgKCFwRm9udERpY3QpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MzIsNyArNDMyLDcgQEAKICAgICB9CiB9CiAKLUNQREZfUGF0dGVybiogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIEZYX0JPT0wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCkKK0NQREZfUGF0dGVybiogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIGJvb2wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCkKIHsKICAgICBpZiAoIXBQYXR0ZXJuT2JqKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTQ1NSw3ICs0NTUsNyBAQAogICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkgewogICAgICAgICAgICAgICAgIHBQYXR0ZXJuID0gbmV3IENQREZfVGlsaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBtYXRyaXgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKLSAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1NoYWRpbmdQYXR0ZXJuKG1fcFBERkRvYywgcFBhdHRlcm5PYmosIEZBTFNFLCBtYXRyaXgpOworICAgICAgICAgICAgICAgIHBQYXR0ZXJuID0gbmV3IENQREZfU2hhZGluZ1BhdHRlcm4obV9wUERGRG9jLCBwUGF0dGVybk9iaiwgZmFsc2UsIG1hdHJpeCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01MDEsNyArNTAxLDcgQEAKICAgICB9CiAKICAgICBDUERGX0ltYWdlKiBwSW1hZ2UgPSBuZXcgQ1BERl9JbWFnZShtX3BQREZEb2MpOwotICAgIHBJbWFnZS0+TG9hZEltYWdlRigoQ1BERl9TdHJlYW0qKXBJbWFnZVN0cmVhbSwgRkFMU0UpOworICAgIHBJbWFnZS0+TG9hZEltYWdlRigoQ1BERl9TdHJlYW0qKXBJbWFnZVN0cmVhbSwgZmFsc2UpOwogCiAgICAgQ1BERl9Db3VudGVkSW1hZ2UqIGltYWdlRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRJbWFnZShwSW1hZ2UpOwogICAgIG1fSW1hZ2VNYXBbZHdJbWFnZU9iak51bV0gPSBpbWFnZURhdGE7CkBAIC01NDAsNyArNTQwLDcgQEAKICAgICB9CiAKICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBJY2NQcm9maWxlU3RyZWFtLCBGQUxTRSk7CisgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBJY2NQcm9maWxlU3RyZWFtLCBmYWxzZSk7CiAgICAgdWludDhfdCBkaWdlc3RbMjBdOwogICAgIENQREZfU3RyZWFtKiBwQ29waWVkU3RyZWFtID0gbnVsbHB0cjsKICAgICBDUllQVF9TSEExR2VuZXJhdGUoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSwgZGlnZXN0KTsKQEAgLTU5MCwxNCArNTkwLDE0IEBACiAgICAgICAgIG9yZ19zaXplID0gMDsKIAogICAgIENQREZfU3RyZWFtQWNjKiBwRm9udEZpbGUgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgcEZvbnRGaWxlLT5Mb2FkQWxsRGF0YShwRm9udFN0cmVhbSwgRkFMU0UsIG9yZ19zaXplKTsKKyAgICBwRm9udEZpbGUtPkxvYWRBbGxEYXRhKHBGb250U3RyZWFtLCBmYWxzZSwgb3JnX3NpemUpOwogCiAgICAgQ1BERl9Db3VudGVkU3RyZWFtQWNjKiBmdERhdGEgPSBuZXcgQ1BERl9Db3VudGVkU3RyZWFtQWNjKHBGb250RmlsZSk7CiAgICAgbV9Gb250RmlsZU1hcFtwRm9udFN0cmVhbV0gPSBmdERhdGE7CiAgICAgcmV0dXJuIGZ0RGF0YS0+QWRkUmVmKCk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiRm9yY2UpCit2b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sIGJvb2wgYkZvcmNlKQogewogICAgIGlmICghcEZvbnRTdHJlYW0pCiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcAppbmRleCBjOTYxZjhiLi5hOTIyMTlkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwCkBAIC0yNSw4ICsyNSw4IEBACiB7CiBwdWJsaWM6CiAgICAgfkNQREZfUFNQcm9jKCk7Ci0gICAgRlhfQk9PTAlQYXJzZShDUERGX1NpbXBsZVBhcnNlciYgcGFyc2VyKTsKLSAgICBGWF9CT09MCUV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSk7CisgICAgYm9vbAlQYXJzZShDUERGX1NpbXBsZVBhcnNlciYgcGFyc2VyKTsKKyAgICBib29sCUV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSk7CiAgICAgQ0ZYX1B0ckFycmF5CQltX09wZXJhdG9yczsKIH07CiAjZGVmaW5lIFBTRU5HSU5FX1NUQUNLU0laRSAxMDAKQEAgLTM1LDEyICszNSwxMiBAQAogcHVibGljOgogICAgIENQREZfUFNFbmdpbmUoKTsKICAgICB+Q1BERl9QU0VuZ2luZSgpOwotICAgIEZYX0JPT0wJUGFyc2UoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgc2l6ZSk7Ci0gICAgRlhfQk9PTAlFeGVjdXRlKCkKKyAgICBib29sCVBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpOworICAgIGJvb2wJRXhlY3V0ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9NYWluUHJvYy5FeGVjdXRlKHRoaXMpOwogICAgIH0KLSAgICBGWF9CT09MCURvT3BlcmF0b3IoUERGX1BTT1Agb3ApOworICAgIGJvb2wJRG9PcGVyYXRvcihQREZfUFNPUCBvcCk7CiAgICAgdm9pZAlSZXNldCgpCiAgICAgewogICAgICAgICBtX1N0YWNrQ291bnQgPSAwOwpAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1BTUHJvYzo6RXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKQorYm9vbCBDUERGX1BTUHJvYzo6RXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKQogewogICAgIGludCBzaXplID0gbV9PcGVyYXRvcnMuR2V0U2l6ZSgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewpAQCAtODUsNyArODUsNyBAQAogICAgICAgICAgICAgaSArKzsKICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBQU09QX0lGKSB7CiAgICAgICAgICAgICBpZiAoaSA8IDIgfHwgbV9PcGVyYXRvcnNbaSAtIDJdICE9ICh2b2lkKilQU09QX1BST0MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChpbnQpcEVuZ2luZS0+UG9wKCkpIHsKICAgICAgICAgICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gMV0pLT5FeGVjdXRlKHBFbmdpbmUpOwpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfSUZFTFNFKSB7CiAgICAgICAgICAgICBpZiAoaSA8IDQgfHwgbV9PcGVyYXRvcnNbaSAtIDJdICE9ICh2b2lkKilQU09QX1BST0MgfHwKICAgICAgICAgICAgICAgICAgICAgbV9PcGVyYXRvcnNbaSAtIDRdICE9ICh2b2lkKilQU09QX1BST0MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChpbnQpcEVuZ2luZS0+UG9wKCkpIHsKICAgICAgICAgICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gM10pLT5FeGVjdXRlKHBFbmdpbmUpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgICAgICBwRW5naW5lLT5Eb09wZXJhdG9yKG9wKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfUFNFbmdpbmU6OkNQREZfUFNFbmdpbmUoKQogewpAQCAtMTQ1LDMxICsxNDUsMzEgQEAKICAgICB7ImNvcHkiLCBQU09QX0NPUFl9LCB7ImluZGV4IiwgUFNPUF9JTkRFWH0sIHsicm9sbCIsIFBTT1BfUk9MTH0sCiAgICAge05VTEwsIFBTT1BfUFJPQ30KIH07Ci1GWF9CT09MIENQREZfUFNFbmdpbmU6OlBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpCitib29sIENQREZfUFNFbmdpbmU6OlBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpCiB7CiAgICAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKCh1aW50OF90KilzdHJpbmcsIHNpemUpOwogICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKICAgICBpZiAod29yZCAhPSBGWF9CU1RSQygieyIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9NYWluUHJvYy5QYXJzZShwYXJzZXIpOwogfQotRlhfQk9PTCBDUERGX1BTUHJvYzo6UGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcikKK2Jvb2wgQ1BERl9QU1Byb2M6OlBhcnNlKENQREZfU2ltcGxlUGFyc2VyJiBwYXJzZXIpCiB7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOwogICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygifSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ7IikpIHsKICAgICAgICAgICAgIENQREZfUFNQcm9jKiBwUHJvYyA9IG5ldyBDUERGX1BTUHJvYzsKICAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZCgodm9pZCopUFNPUF9QUk9DKTsKICAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZChwUHJvYyk7CiAgICAgICAgICAgICBpZiAoIXBQcm9jLT5QYXJzZShwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCBpID0gMDsKQEAgLTE5MCw3ICsxOTAsNyBAQAogICAgIH0KIH0KICNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1ZgotRlhfQk9PTCBDUERGX1BTRW5naW5lOjpEb09wZXJhdG9yKFBERl9QU09QIG9wKQorYm9vbCBDUERGX1BTRW5naW5lOjpEb09wZXJhdG9yKFBERl9QU09QIG9wKQogewogICAgIGludCBpMSwgaTI7CiAgICAgRlhfRkxPQVQgZDEsIGQyOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgRlhfRkxPQVQgUERGX0ludGVycG9sYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHhtaW4sIEZYX0ZMT0FUIHhtYXgsIEZYX0ZMT0FUIHltaW4sIEZYX0ZMT0FUIHltYXgpCiB7CkBAIC00NDUsOCArNDQ1LDggQEAKIHB1YmxpYzoKICAgICBDUERGX1NhbXBsZWRGdW5jKCk7CiAgICAgdmlydHVhbCB+Q1BERl9TYW1wbGVkRnVuYygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CisgICAgdmlydHVhbCBib29sCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOworICAgIHZpcnR1YWwgYm9vbAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKICAgICBTYW1wbGVFbmNvZGVJbmZvKgltX3BFbmNvZGVJbmZvOwogICAgIFNhbXBsZURlY29kZUluZm8qCW1fcERlY29kZUluZm87CiAgICAgRlhfRFdPUkQJbV9uQml0c1BlclNhbXBsZTsKQEAgLTQ2OSwxMCArNDY5LDEwIEBACiAgICAgICAgIEZYX0ZyZWUobV9wRGVjb2RlSW5mbyk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1NhbXBsZWRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCitib29sIENQREZfU2FtcGxlZEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKIHsKICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CkBAIC00ODEsMTEgKzQ4MSwxMSBAQAogICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKICAgICBtX25CaXRzUGVyU2FtcGxlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJTYW1wbGUiKSk7CiAgICAgaWYgKG1fbkJpdHNQZXJTYW1wbGUgPiAzMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9TYW1wbGVNYXggPSAweGZmZmZmZmZmID4+ICgzMiAtIG1fbkJpdHNQZXJTYW1wbGUpOwogICAgIG1fcFNhbXBsZVN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICBtX3BTYW1wbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBtX3BTYW1wbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKICAgICBtX3BFbmNvZGVJbmZvID0gRlhfQWxsb2MoU2FtcGxlRW5jb2RlSW5mbywgbV9uSW5wdXRzKTsKICAgICBGWF9TQUZFX0RXT1JEIG5Ub3RhbFNhbXBsZUJpdHMgPSAxOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7CkBAIC01MTQsNyArNTE0LDcgQEAKICAgICBpZiAoIW5Ub3RhbFNhbXBsZUJ5dGVzLklzVmFsaWQoKSB8fAogICAgICAgICBuVG90YWxTYW1wbGVCeXRlcy5WYWx1ZU9yRGllKCkgPT0gMCB8fAogICAgICAgICBuVG90YWxTYW1wbGVCeXRlcy5WYWx1ZU9yRGllKCkgPiBtX3BTYW1wbGVTdHJlYW0tPkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wRGVjb2RlSW5mbyA9IEZYX0FsbG9jKFNhbXBsZURlY29kZUluZm8sIG1fbk91dHB1dHMpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSArKykgewpAQCAtNTI2LDkgKzUyNiw5IEBACiAgICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2ldLmRlY29kZV9tYXggPSBtX3BSYW5nZXNbaSAqIDIgKyAxXTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TYW1wbGVkRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAorYm9vbCBDUERGX1NhbXBsZWRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0CiB7CiAgICAgaW50IHBvcyA9IDA7CiAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGVuY29kZWRfaW5wdXRfYnVmKG1fbklucHV0cyk7CkBAIC01NTUsMjEgKzU1NSwyMSBAQAogICAgIEZYX1NBRkVfSU5UMzIgYml0c190b19vdXRwdXQgPSBtX25PdXRwdXRzOwogICAgIGJpdHNfdG9fb3V0cHV0ICo9IG1fbkJpdHNQZXJTYW1wbGU7CiAgICAgaWYgKCFiaXRzX3RvX291dHB1dC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1NBRkVfSU5UMzIgYml0cG9zID0gcG9zOwogICAgIGJpdHBvcyAqPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CiAgICAgaWYgKCFiaXRwb3MuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9TQUZFX0lOVDMyIHJhbmdlX2NoZWNrID0gYml0cG9zOwogICAgIHJhbmdlX2NoZWNrICs9IGJpdHNfdG9fb3V0cHV0LlZhbHVlT3JEaWUoKTsKICAgICBpZiAoIXJhbmdlX2NoZWNrLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY29uc3QgdWludDhfdCogcFNhbXBsZURhdGEgPSBtX3BTYW1wbGVTdHJlYW0tPkdldERhdGEoKTsKICAgICBpZiAoIXBTYW1wbGVEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fbk91dHB1dHM7IGogKyspIHsKICAgICAgICAgRlhfRFdPUkQgc2FtcGxlID0gX0dldEJpdHMzMihwU2FtcGxlRGF0YSwgYml0cG9zLlZhbHVlT3JEaWUoKSArIGogKiBtX25CaXRzUGVyU2FtcGxlLCBtX25CaXRzUGVyU2FtcGxlKTsKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICAgICAgICAgIGJpdHBvczIgKz0gajsKICAgICAgICAgICAgICAgICBiaXRwb3MyICo9IG1fbkJpdHNQZXJTYW1wbGU7CiAgICAgICAgICAgICAgICAgaWYgKCFiaXRwb3MyLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2FtcGxlMSA9IF9HZXRCaXRzMzIocFNhbXBsZURhdGEsIGJpdHBvczIuVmFsdWVPckRpZSgpLCBtX25CaXRzUGVyU2FtcGxlKTsKICAgICAgICAgICAgICAgICBlbmNvZGVkICs9IChlbmNvZGVkX2lucHV0W2ldIC0gaW5kZXhbaV0pICogKChGWF9GTE9BVClzYW1wbGUxIC0gKEZYX0ZMT0FUKXNhbXBsZSk7CkBAIC01OTUsMjMgKzU5NSwyMyBAQAogICAgICAgICByZXN1bHRzW2pdID0gUERGX0ludGVycG9sYXRlKGVuY29kZWQsIDAsIChGWF9GTE9BVCltX1NhbXBsZU1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9taW4sIG1fcERlY29kZUluZm9bal0uZGVjb2RlX21heCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ1BERl9QU0Z1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbgogewogcHVibGljOgotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CisgICAgdmlydHVhbCBib29sCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOworICAgIHZpcnR1YWwgYm9vbAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKICAgICBDUERGX1BTRW5naW5lIG1fUFM7CiB9OwotRlhfQk9PTCBDUERGX1BTRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQorYm9vbCBDUERGX1BTRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQogewogICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOwogICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOworICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CiAgICAgcmV0dXJuIG1fUFMuUGFyc2UoKGNvbnN0IEZYX0NIQVIqKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwogfQotRlhfQk9PTCBDUERGX1BTRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAorYm9vbCBDUERGX1BTRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAogewogICAgIENQREZfUFNFbmdpbmUmIFBTID0gKENQREZfUFNFbmdpbmUmKW1fUFM7CiAgICAgUFMuUmVzZXQoKTsKQEAgLTYyMSwyMCArNjIxLDIwIEBACiAgICAgfQogICAgIFBTLkV4ZWN1dGUoKTsKICAgICBpZiAoUFMuR2V0U3RhY2tTaXplKCkgPCBtX25PdXRwdXRzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSArKykgewogICAgICAgICByZXN1bHRzW21fbk91dHB1dHMgLSBpIC0gMV0gPSBQUy5Qb3AoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjbGFzcyBDUERGX0V4cEludEZ1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbgogewogcHVibGljOgogICAgIENQREZfRXhwSW50RnVuYygpOwogICAgIHZpcnR1YWwgfkNQREZfRXhwSW50RnVuYygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CisgICAgdmlydHVhbCBib29sCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOworICAgIHZpcnR1YWwgYm9vbAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKICAgICBGWF9GTE9BVAltX0V4cG9uZW50OwogICAgIEZYX0ZMT0FUKgltX3BCZWdpblZhbHVlczsKICAgICBGWF9GTE9BVCoJbV9wRW5kVmFsdWVzOwpAQCAtNjU0LDExICs2NTQsMTEgQEAKICAgICAgICAgRlhfRnJlZShtX3BFbmRWYWx1ZXMpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9FeHBJbnRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCitib29sIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CiAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBBcnJheTAgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkMwIikpOwogICAgIGlmIChtX25PdXRwdXRzID09IDApIHsKQEAgLTY3NywyNyArNjc3LDI3IEBACiAgICAgbV9FeHBvbmVudCA9IHBEaWN0LT5HZXRGbG9hdChGWF9CU1RSQygiTiIpKTsKICAgICBtX25PcmlnT3V0cHV0cyA9IG1fbk91dHB1dHM7CiAgICAgaWYgKG1fbk91dHB1dHMgJiYgbV9uSW5wdXRzID4gSU5UX01BWCAvIG1fbk91dHB1dHMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fbk91dHB1dHMgKj0gbV9uSW5wdXRzOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0V4cEludEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKK2Jvb2wgQ1BERl9FeHBJbnRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0CiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkgKyspCiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9uT3JpZ091dHB1dHM7IGogKyspIHsKICAgICAgICAgICAgIHJlc3VsdHNbaSAqIG1fbk9yaWdPdXRwdXRzICsgal0gPSBtX3BCZWdpblZhbHVlc1tqXSArIChGWF9GTE9BVClGWFNZU19wb3coaW5wdXRzW2ldLCBtX0V4cG9uZW50KSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcEVuZFZhbHVlc1tqXSAtIG1fcEJlZ2luVmFsdWVzW2pdKTsKICAgICAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ1BERl9TdGl0Y2hGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KIHsKIHB1YmxpYzoKICAgICBDUERGX1N0aXRjaEZ1bmMoKTsKICAgICB2aXJ0dWFsIH5DUERGX1N0aXRjaEZ1bmMoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CiAgICAgaW50CQkJbV9uU3ViczsKICAgICBDUERGX0Z1bmN0aW9uKiogbV9wU3ViRnVuY3Rpb25zOwogICAgIEZYX0ZMT0FUKgltX3BCb3VuZHM7CkBAIC03MjQsMTkgKzcyNCwxOSBAQAogICAgICAgICBGWF9GcmVlKG1fcEVuY29kZSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1N0aXRjaEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKK2Jvb2wgQ1BERl9TdGl0Y2hGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJGdW5jdGlvbnMiKSk7CiAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX25TdWJzID0gcEFycmF5LT5HZXRDb3VudCgpOwogICAgIGlmIChtX25TdWJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcFN1YkZ1bmN0aW9ucyA9IEZYX0FsbG9jKENQREZfRnVuY3Rpb24qLCBtX25TdWJzKTsKICAgICBtX25PdXRwdXRzID0gMDsKQEAgLTc0NCwxMSArNzQ0LDExIEBACiAgICAgZm9yIChpID0gMDsgaSA8IG1fblN1YnM7IGkgKyspIHsKICAgICAgICAgQ1BERl9PYmplY3QqIHBTdWIgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKICAgICAgICAgaWYgKHBTdWIgPT0gcE9iaikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fcFN1YkZ1bmN0aW9uc1tpXSA9IENQREZfRnVuY3Rpb246OkxvYWQocFN1Yik7CiAgICAgICAgIGlmIChtX3BTdWJGdW5jdGlvbnNbaV0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BTdWJGdW5jdGlvbnNbaV0tPkNvdW50T3V0cHV0cygpID4gbV9uT3V0cHV0cykgewogICAgICAgICAgICAgbV9uT3V0cHV0cyA9IG1fcFN1YkZ1bmN0aW9uc1tpXS0+Q291bnRPdXRwdXRzKCk7CkBAIC03NTgsNyArNzU4LDcgQEAKICAgICBtX3BCb3VuZHNbMF0gPSBtX3BEb21haW5zWzBdOwogICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQm91bmRzIikpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IG1fblN1YnMgLSAxOyBpICsrKSB7CiAgICAgICAgIG1fcEJvdW5kc1tpICsgMV0gPSBwQXJyYXktPkdldEZsb2F0KGkpOwpAQCAtNzY3LDE0ICs3NjcsMTQgQEAKICAgICBtX3BFbmNvZGUgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25TdWJzLCAyKTsKICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkVuY29kZSIpKTsKICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzICogMjsgaSArKykgewogICAgICAgICBtX3BFbmNvZGVbaV0gPSBwQXJyYXktPkdldEZsb2F0KGkpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGl0Y2hGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIG91dHB1dHMpIGNvbnN0Citib29sIENQREZfU3RpdGNoRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiBvdXRwdXRzKSBjb25zdAogewogICAgIEZYX0ZMT0FUIGlucHV0ID0gaW5wdXRzWzBdOwogICAgIGludCBpOwpAQCAtNzgzLDEyICs3ODMsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgaWYgKG1fcFN1YkZ1bmN0aW9uc1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnB1dCA9IFBERl9JbnRlcnBvbGF0ZShpbnB1dCwgbV9wQm91bmRzW2ldLCBtX3BCb3VuZHNbaSArIDFdLCBtX3BFbmNvZGVbaSAqIDJdLCBtX3BFbmNvZGVbaSAqIDIgKyAxXSk7CiAgICAgaW50IG5yZXN1bHRzOwogICAgIG1fcFN1YkZ1bmN0aW9uc1tpXS0+Q2FsbCgmaW5wdXQsIG1fbklucHV0cywgb3V0cHV0cywgbnJlc3VsdHMpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9GdW5jdGlvbiogQ1BERl9GdW5jdGlvbjo6TG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopCiB7CkBAIC04MzcsNyArODM3LDcgQEAKICAgICAgICAgbV9wUmFuZ2VzID0gTlVMTDsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfRnVuY3Rpb246OkluaXQoQ1BERl9PYmplY3QqIHBPYmopCitib29sIENQREZfRnVuY3Rpb246OkluaXQoQ1BERl9PYmplY3QqIHBPYmopCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdDsKICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKQEAgLTg0NywxMSArODQ3LDExIEBACiAgICAgfQogICAgIENQREZfQXJyYXkqIHBEb21haW5zID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEb21haW4iKSk7CiAgICAgaWYgKHBEb21haW5zID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fbklucHV0cyA9IHBEb21haW5zLT5HZXRDb3VudCgpIC8gMjsKICAgICBpZiAobV9uSW5wdXRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcERvbWFpbnMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25JbnB1dHMsIDIpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzICogMjsgaSArKykgewpAQCAtODY4LDcgKzg2OCw3IEBACiAgICAgfQogICAgIEZYX0RXT1JEIG9sZF9vdXRwdXRzID0gbV9uT3V0cHV0czsKICAgICBpZiAoIXZfSW5pdChwT2JqKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcFJhbmdlcyAmJiBtX25PdXRwdXRzID4gKGludClvbGRfb3V0cHV0cykgewogICAgICAgICBtX3BSYW5nZXMgPSBGWF9SZWFsbG9jKEZYX0ZMT0FULCBtX3BSYW5nZXMsIG1fbk91dHB1dHMgKiAyKTsKQEAgLTg3NiwxMiArODc2LDEyIEBACiAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wUmFuZ2VzICsgKG9sZF9vdXRwdXRzICogMiksIDAsIHNpemVvZihGWF9GTE9BVCkgKiAobV9uT3V0cHV0cyAtIG9sZF9vdXRwdXRzKSAqIDIpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIGludCBuaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cywgaW50JiBucmVzdWx0cykgY29uc3QKK2Jvb2wgQ1BERl9GdW5jdGlvbjo6Q2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0CiB7CiAgICAgaWYgKG1fbklucHV0cyAhPSBuaW5wdXRzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBucmVzdWx0cyA9IG1fbk91dHB1dHM7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkgKyspIHsKQEAgLTkwMSw1ICs5MDEsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAKaW5kZXggYjRkMDMwZS4uMzI2NGJlNCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZ3JhcGhfc3RhdGUuY3BwCkBAIC05Nyw3ICs5Nyw3IEBACiBDUERGX1JlY3QgQ1BERl9DbGlwUGF0aDo6R2V0Q2xpcEJveCgpIGNvbnN0CiB7CiAgICAgQ1BERl9SZWN0IHJlY3Q7Ci0gICAgRlhfQk9PTCBiU3RhcnRlZCA9IEZBTFNFOworICAgIGJvb2wgYlN0YXJ0ZWQgPSBmYWxzZTsKICAgICBpbnQgY291bnQgPSBHZXRQYXRoQ291bnQoKTsKICAgICBpZiAoY291bnQpIHsKICAgICAgICAgcmVjdCA9IEdldFBhdGgoMCkuR2V0Qm91bmRpbmdCb3goKTsKQEAgLTEwNSwyNiArMTA1LDI2IEBACiAgICAgICAgICAgICBDUERGX1JlY3QgcGF0aF9yZWN0ID0gR2V0UGF0aChpKS5HZXRCb3VuZGluZ0JveCgpOwogICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QocGF0aF9yZWN0KTsKICAgICAgICAgfQotICAgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgICAgIGJTdGFydGVkID0gdHJ1ZTsKICAgICB9CiAgICAgY291bnQgPSBHZXRUZXh0Q291bnQoKTsKICAgICBpZiAoY291bnQpIHsKICAgICAgICAgQ1BERl9SZWN0IGxheWVyX3JlY3Q7Ci0gICAgICAgIEZYX0JPT0wgYkxheWVyU3RhcnRlZCA9IEZBTFNFOworICAgICAgICBib29sIGJMYXllclN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewogICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IEdldFRleHQoaSk7CiAgICAgICAgICAgICBpZiAocFRleHRPYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmICghYlN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgcmVjdCA9IGxheWVyX3JlY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYlN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KGxheWVyX3JlY3QpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiTGF5ZXJTdGFydGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIWJMYXllclN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcmVjdCA9IHBUZXh0T2JqLT5HZXRCQm94KE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBiTGF5ZXJTdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcmVjdC5VbmlvbihwVGV4dE9iai0+R2V0QkJveChOVUxMKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgfQogICAgIHJldHVybiByZWN0OwogfQotdm9pZCBDUERGX0NsaXBQYXRoOjpBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKQordm9pZCBDUERGX0NsaXBQYXRoOjpBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgYm9vbCBiQXV0b01lcmdlKQogewogICAgIENQREZfQ2xpcFBhdGhEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwogICAgIGlmIChwRGF0YS0+bV9QYXRoQ291bnQgJiYgYkF1dG9NZXJnZSkgewpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKICAgICBwRGF0YS0+bV9GaWxsQ29sb3IuU2V0VmFsdWUocFBhdHRlcm4sIHBWYWx1ZSwgblZhbHVlcyk7CiAgICAgaW50IFIsIEcsIEI7Ci0gICAgRlhfQk9PTCByZXQgPSBwRGF0YS0+bV9GaWxsQ29sb3IuR2V0UkdCKFIsIEcsIEIpOworICAgIGJvb2wgcmV0ID0gcERhdGEtPm1fRmlsbENvbG9yLkdldFJHQihSLCBHLCBCKTsKICAgICBpZiAocFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gMSAmJiAoKENQREZfVGlsaW5nUGF0dGVybiopcFBhdHRlcm4pLT5tX2JDb2xvcmVkICYmICFyZXQpIHsKICAgICAgICAgcERhdGEtPm1fRmlsbFJHQiA9IDB4MDBCRkJGQkY7CiAgICAgICAgIHJldHVybjsKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CiAgICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuU2V0VmFsdWUocFBhdHRlcm4sIHBWYWx1ZSwgblZhbHVlcyk7CiAgICAgaW50IFIsIEcsIEI7Ci0gICAgRlhfQk9PTCByZXQgPSBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQik7CisgICAgYm9vbCByZXQgPSBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQik7CiAgICAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IDEgJiYgKChDUERGX1RpbGluZ1BhdHRlcm4qKXBQYXR0ZXJuKS0+bV9iQ29sb3JlZCAmJiAhcmV0KSB7CiAgICAgICAgIHBEYXRhLT5tX1N0cm9rZVJHQiA9IDB4MDBCRkJGQkY7CiAgICAgICAgIHJldHVybjsKQEAgLTI5NSw3ICsyOTUsNyBAQAogICAgIH0KICAgICBGWFNZU19tZW1jcHkodGhpcywgJnNyYywgc2l6ZW9mKENQREZfVGV4dFN0YXRlRGF0YSkpOwogICAgIGlmIChtX3BEb2N1bWVudCAmJiBtX3BGb250KSB7Ci0gICAgICAgIG1fcEZvbnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChtX3BGb250LT5HZXRGb250RGljdCgpLCBGQUxTRSk7CisgICAgICAgIG1fcEZvbnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChtX3BGb250LT5HZXRGb250RGljdCgpLCBmYWxzZSk7CiAgICAgfQogfQogQ1BERl9UZXh0U3RhdGVEYXRhOjp+Q1BERl9UZXh0U3RhdGVEYXRhKCkKQEAgLTU0NSw3ICs1NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPlNldEJsZW5kTW9kZShtb2RlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBHZW5lcmFsU3RhdGUtPm1fQmxlbmRUeXBlID4gRlhESUJfQkxFTkRfTVVMVElQTFkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJzZXItPkdldE9iamVjdExpc3QoKS0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJzZXItPkdldE9iamVjdExpc3QoKS0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02MzEsMTIgKzYzMSwxMiBAQAogICAgICAgICAoKENQREZfRGljdGlvbmFyeSopbV9wUGFyYW0pLT5SZWxlYXNlKCk7CiAgICAgfQogfQotRlhfQk9PTAlDUERGX0NvbnRlbnRNYXJrSXRlbTo6SGFzTUNJRCgpIGNvbnN0Citib29sCUNQREZfQ29udGVudE1hcmtJdGVtOjpIYXNNQ0lEKCkgY29uc3QKIHsKICAgICBpZiAobV9wUGFyYW0gJiYgKG1fUGFyYW1UeXBlID09IERpcmVjdERpY3QgfHwgbV9QYXJhbVR5cGUgPT0gUHJvcGVydGllc0RpY3QpKSB7CiAgICAgICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSAqKW1fcFBhcmFtKS0+S2V5RXhpc3QoRlhfQlNUUkMoIk1DSUQiKSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX0NvbnRlbnRNYXJrRGF0YTo6Q1BERl9Db250ZW50TWFya0RhdGEoY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEmIHNyYykKIHsKQEAgLTY1OCw3ICs2NTgsNyBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci12b2lkIENQREZfQ29udGVudE1hcmtEYXRhOjpBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBGWF9CT09MIGJEaXJlY3QpCit2b2lkIENQREZfQ29udGVudE1hcmtEYXRhOjpBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBib29sIGJEaXJlY3QpCiB7CiAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBtX01hcmtzLkFkZCgpOwogICAgIGl0ZW0uU2V0TmFtZShuYW1lKTsKQEAgLTY3NiwyMyArNjc2LDIzIEBACiAgICAgfQogICAgIG1fTWFya3MuUmVtb3ZlQXQoc2l6ZSAtIDEpOwogfQotRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpIYXNNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaykgY29uc3QKK2Jvb2wgQ1BERl9Db250ZW50TWFyazo6SGFzTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmspIGNvbnN0CiB7CiAgICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpICsrKSB7CiAgICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9wT2JqZWN0LT5HZXRJdGVtKGkpOwogICAgICAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gbWFyaykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0Citib29sIENQREZfQ29udGVudE1hcms6Okxvb2t1cE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrLCBDUERGX0RpY3Rpb25hcnkqJiBwRGljdCkgY29uc3QKIHsKICAgICBpZiAobV9wT2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wT2JqZWN0LT5Db3VudEl0ZW1zKCk7IGkgKyspIHsKICAgICAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBtX3BPYmplY3QtPkdldEl0ZW0oaSk7CkBAIC03MDIsOCArNzAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgaXRlbS5HZXRQYXJhbVR5cGUoKSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdCkgewogICAgICAgICAgICAgICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2ltYWdlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAKaW5kZXggYWFiZmQxNC4uNzM5YTBiZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2ltYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgQ1BERl9JbWFnZSogcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wRG9jdW1lbnQpOwogICAgIHBJbWFnZS0+TG9hZEltYWdlRigoQ1BERl9TdHJlYW0qKSgoQ1BERl9PYmplY3QqKW1fcFN0cmVhbSktPkNsb25lKCksIG1fYklubGluZSk7CiAgICAgaWYgKG1fYklubGluZSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBJbmxpbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wSW5saW5lRGljdC0+Q2xvbmUoVFJVRSk7CisgICAgICAgIENQREZfRGljdGlvbmFyeSAqcElubGluZURpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BJbmxpbmVEaWN0LT5DbG9uZSh0cnVlKTsKICAgICAgICAgcEltYWdlLT5TZXRJbmxpbmVEaWN0KHBJbmxpbmVEaWN0KTsKICAgICB9CiAgICAgcmV0dXJuIHBJbWFnZTsKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBtX3BEb2N1bWVudCA9IHBEb2M7CiAgICAgbV9wU3RyZWFtID0gTlVMTDsKICAgICBtX3BPQyA9IE5VTEw7Ci0gICAgbV9iSW5saW5lID0gRkFMU0U7CisgICAgbV9iSW5saW5lID0gZmFsc2U7CiAgICAgbV9wSW5saW5lRGljdCA9IE5VTEw7CiAgICAgbV9wRElCU291cmNlID0gTlVMTDsKICAgICBtX3BNYXNrID0gTlVMTDsKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9JbWFnZTo6TG9hZEltYWdlRihDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiSW5saW5lKQorYm9vbCBDUERGX0ltYWdlOjpMb2FkSW1hZ2VGKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJJbmxpbmUpCiB7CiAgICAgbV9wU3RyZWFtID0gcFN0cmVhbTsKICAgICBpZiAobV9iSW5saW5lICYmIG1fcElubGluZURpY3QpIHsKQEAgLTEwMSw1ICsxMDEsNSBAQAogICAgIG1fYkludGVycG9sYXRlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkludGVycG9sYXRlIikpOwogICAgIG1fSGVpZ2h0ID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKICAgICBtX1dpZHRoID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcAppbmRleCA4OTJlMjE1Li5iMjdmOTU4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKICNpbmNsdWRlICJwYWdlaW50LmgiCiAKLSNkZWZpbmUgUkVRVUlSRV9QQVJBTVMoY291bnQpIGlmIChtX1BhcmFtQ291bnQgIT0gY291bnQpIHsgbV9iQWJvcnQgPSBUUlVFOyByZXR1cm47IH0KKyNkZWZpbmUgUkVRVUlSRV9QQVJBTVMoY291bnQpIGlmIChtX1BhcmFtQ291bnQgIT0gY291bnQpIHsgbV9iQWJvcnQgPSB0cnVlOyByZXR1cm47IH0KIAogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoCiAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgbV9MZXZlbChsZXZlbCksCiAgICAgICBtX1BhcmFtU3RhcnRQb3MoMCksCiAgICAgICBtX1BhcmFtQ291bnQoMCksCi0gICAgICBtX2JBYm9ydChGQUxTRSksCisgICAgICBtX2JBYm9ydChmYWxzZSksCiAgICAgICBtX3BDdXJTdGF0ZXMobmV3IENQREZfQWxsU3RhdGVzKSwKICAgICAgIG1fcExhc3RUZXh0T2JqZWN0KG51bGxwdHIpLAogICAgICAgbV9EZWZGb250U2l6ZSgwKSwKQEAgLTQzLDkgKzQzLDkgQEAKICAgICAgIG1fcExhc3RJbWFnZShudWxscHRyKSwKICAgICAgIG1fcExhc3RJbWFnZURpY3QobnVsbHB0ciksCiAgICAgICBtX3BMYXN0Q2xvbmVJbWFnZURpY3QobnVsbHB0ciksCi0gICAgICBtX2JSZWxlYXNlTGFzdERpY3QoVFJVRSksCi0gICAgICBtX2JDb2xvcmVkKEZBTFNFKSwKLSAgICAgIG1fYlJlc291cmNlTWlzc2luZyhGQUxTRSkKKyAgICAgIG1fYlJlbGVhc2VMYXN0RGljdCh0cnVlKSwKKyAgICAgIG1fYkNvbG9yZWQoZmFsc2UpLAorICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nKGZhbHNlKQogewogICAgIGlmIChwbXRDb250ZW50VG9Vc2VyKSB7CiAgICAgICAgIG1fbXRDb250ZW50VG9Vc2VyID0gKnBtdENvbnRlbnRUb1VzZXI7CkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBpZiAocGFyYW0ubV9UeXBlID09IDApIHsKICAgICAgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdDsKICAgICB9Ci0gICAgQVNTRVJUKEZBTFNFKTsKKyAgICBBU1NFUlQoZmFsc2UpOwogICAgIHJldHVybiBOVUxMOwogfQogQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpCkBAIC0yMjYsNyArMjI2LDcgQEAKIHsKICAgICByZXR1cm4gR2V0TnVtYmVyKGluZGV4KTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiQ29sb3IsIEZYX0JPT0wgYlRleHQsIEZYX0JPT0wgYkdyYXBoKQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OlNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBib29sIGJDb2xvciwgYm9vbCBiVGV4dCwgYm9vbCBiR3JhcGgpCiB7CiAgICAgcE9iai0+bV9HZW5lcmFsU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlOwogICAgIHBPYmotPm1fQ2xpcFBhdGggPSBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGg7CkBAIC0zMTgsNyArMzE4LDcgQEAKICAgICB7RlhCU1RSX0lEKCd3JywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TGluZVdpZHRofSwKICAgICB7RlhCU1RSX0lEKCd5JywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18xM30sCiB9OwotRlhfQk9PTCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApCitib29sIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6T25PcGVyYXRvcihjb25zdCBGWF9DSEFSKiBvcCkKIHsKICAgICBpbnQgaSA9IDA7CiAgICAgRlhfRFdPUkQgb3BpZCA9IDA7CkBAIC0zMzYsNyArMzM2LDcgQEAKICAgICAgICAgaW50IGNvbXBhcmUgPSBvcGlkIC0gZ19PcENvZGVzW21pZGRsZV0ubV9PcElkOwogICAgICAgICBpZiAoY29tcGFyZSA9PSAwKSB7CiAgICAgICAgICAgICAodGhpcy0+KmdfT3BDb2Rlc1ttaWRkbGVdLm1fT3BIYW5kbGVyKSgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoY29tcGFyZSA8IDApIHsKICAgICAgICAgICAgIGhpZ2ggPSBtaWRkbGUgLSAxOwpAQCAtMzUyLDE0ICszNTIsMTQgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBIYW5kbGVfQ2xvc2VQYXRoKCk7Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgVFJVRSk7CisgICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgdHJ1ZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxTdHJva2VQYXRoKCkKIHsKICAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgVFJVRSk7CisgICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgdHJ1ZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlRU9GaWxsU3Ryb2tlUGF0aCgpCiB7CkBAIC0zNjcsMTQgKzM2NywxNCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFkZFBhdGhQb2ludChtX1BhdGhTdGFydFgsIG1fUGF0aFN0YXJ0WSwgRlhQVF9MSU5FVE8gfCBGWFBUX0NMT1NFRklHVVJFKTsKLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIFRSVUUpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX0FMVEVSTkFURSwgdHJ1ZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFN0cm9rZVBhdGgoKQogewogICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIFRSVUUpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX0FMVEVSTkFURSwgdHJ1ZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5KCkKIHsKQEAgLTM4NiwxMyArMzg2LDEzIEBACiAgICAgaWYgKHBQcm9wZXJ0eSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfQk9PTCBiRGlyZWN0ID0gVFJVRTsKKyAgICBib29sIGJEaXJlY3QgPSB0cnVlOwogICAgIGlmIChwUHJvcGVydHktPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewogICAgICAgICBwUHJvcGVydHkgPSBGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIlByb3BlcnRpZXMiKSwgcFByb3BlcnR5LT5HZXRTdHJpbmcoKSk7CiAgICAgICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGJEaXJlY3QgPSBGQUxTRTsKKyAgICAgICAgYkRpcmVjdCA9IGZhbHNlOwogICAgIH0KICAgICBpZiAocFByb3BlcnR5LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gR2V0U3RyaW5nKDApOwotICAgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkFkZE1hcmsodGFnLCBOVUxMLCBGQUxTRSk7CisgICAgbV9DdXJDb250ZW50TWFyay5HZXRNb2RpZnkoKS0+QWRkTWFyayh0YWcsIE5VTEwsIGZhbHNlKTsKIH0KIHN0cnVjdCBfRlhfQlNUUiB7CiAgICAgY29uc3QgRlhfQ0hBUioJbV9QdHI7CkBAIC02MjIsMjAgKzYyMiwyMCBAQAogewogICAgIG1fVHlwZTNEYXRhWzBdID0gR2V0TnVtYmVyKDEpOwogICAgIG1fVHlwZTNEYXRhWzFdID0gR2V0TnVtYmVyKDApOwotICAgIG1fYkNvbG9yZWQgPSBUUlVFOworICAgIG1fYkNvbG9yZWQgPSB0cnVlOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDYWNoZWREZXZpY2UoKQogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSArKykgewogICAgICAgICBtX1R5cGUzRGF0YVtpXSA9IEdldE51bWJlcig1IC0gaSk7CiAgICAgfQotICAgIG1fYkNvbG9yZWQgPSBGQUxTRTsKKyAgICBtX2JDb2xvcmVkID0gZmFsc2U7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0V4ZWN1dGVYT2JqZWN0KCkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gR2V0U3RyaW5nKDApOwogICAgIGlmIChuYW1lID09IG1fTGFzdEltYWdlTmFtZSAmJiBtX3BMYXN0SW1hZ2UgJiYgbV9wTGFzdEltYWdlLT5HZXRTdHJlYW0oKSAmJiBtX3BMYXN0SW1hZ2UtPkdldFN0cmVhbSgpLT5HZXRPYmpOdW0oKSkgewotICAgICAgICBBZGRJbWFnZShOVUxMLCBtX3BMYXN0SW1hZ2UsIEZBTFNFKTsKKyAgICAgICAgQWRkSW1hZ2UoTlVMTCwgbV9wTGFzdEltYWdlLCBmYWxzZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewpAQCAtNjczLDE0ICs2NzMsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiRm9ybTsKKyAgICAgICAgYm9vbCBiRm9ybTsKICAgICAgICAgaWYgKG1fcERvY3VtZW50LT5Jc0Zvcm1TdHJlYW0oKChDUERGX1JlZmVyZW5jZSopcFJlcyktPkdldFJlZk9iak51bSgpLCBiRm9ybSkgJiYgIWJGb3JtKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAgICAgQ1BERl9TdHJlYW0qIHBYT2JqZWN0ID0gKENQREZfU3RyZWFtKilGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIlhPYmplY3QiKSwgbmFtZSk7CiAgICAgaWYgKHBYT2JqZWN0ID09IE5VTEwgfHwgcFhPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmdDIHR5cGUgPSBwWE9iamVjdC0+R2V0RGljdCgpID8gcFhPYmplY3QtPkdldERpY3QoKS0+R2V0Q29uc3RTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgOiBDRlhfQnl0ZVN0cmluZ0MoKTsKQEAgLTY4OCw3ICs2ODgsNyBAQAogICAgICAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgQ1BERl9JbWFnZU9iamVjdCogcE9iaiA9IEFkZEltYWdlKHBYT2JqZWN0LCBOVUxMLCBGQUxTRSk7CisgICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBPYmogPSBBZGRJbWFnZShwWE9iamVjdCwgTlVMTCwgZmFsc2UpOwogICAgICAgICBtX0xhc3RJbWFnZU5hbWUgPSBuYW1lOwogICAgICAgICBtX3BMYXN0SW1hZ2UgPSBwT2JqLT5tX3BJbWFnZTsKICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIkZvcm0iKSkgewpAQCAtNzE5LDEwICs3MTksMTAgQEAKICAgICAgICAgICAgIG1fcEN1clN0YXRlcy5nZXQoKSwgbV9MZXZlbCArIDEpOwogICAgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NUTSA9IGZvcm1fbWF0cml4OwogICAgICAgICBpZiAoQ2xpcFBhdGguTm90TnVsbCgpKSB7Ci0gICAgICAgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKKyAgICAgICAgICAgIHBhcnNlci5tX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChDbGlwUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKICAgICAgICAgaWYgKHN0cmVhbS5HZXRTaXplKCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC03NDAsMTMgKzc0MCwxMyBAQAogICAgIHN0YXR1cy5tX1RleHRTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGU7CiAgICAgcEZvcm1PYmotPm1fcEZvcm0tPlBhcnNlQ29udGVudCgmc3RhdHVzLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCBtX0xldmVsICsgMSk7CiAgICAgaWYgKCFtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgJiYgcEZvcm1PYmotPm1fcEZvcm0tPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCkgewotICAgICAgICBtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBUUlVFOworICAgICAgICBtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSB0cnVlOwogICAgIH0KICAgICBwRm9ybU9iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwRm9ybU9iaiwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgU2V0R3JhcGhpY1N0YXRlcyhwRm9ybU9iaiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocEZvcm1PYmopOwogfQotQ1BERl9JbWFnZU9iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9JbWFnZSogcEltYWdlLCBGWF9CT09MIGJJbmxpbmUpCitDUERGX0ltYWdlT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEltYWdlKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0ltYWdlKiBwSW1hZ2UsIGJvb2wgYklubGluZSkKIHsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMICYmIHBJbWFnZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzYzLDcgKzc2Myw3IEBACiAgICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPSBuZXcgQ1BERl9JbWFnZShtX3BEb2N1bWVudCk7CiAgICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UtPkxvYWRJbWFnZUYocFN0cmVhbSwgYklubGluZSk7CiAgICAgfQotICAgIFNldEdyYXBoaWNTdGF0ZXMocEltYWdlT2JqLCBwSW1hZ2VPYmotPm1fcEltYWdlLT5Jc01hc2soKSwgRkFMU0UsIEZBTFNFKTsKKyAgICBTZXRHcmFwaGljU3RhdGVzKHBJbWFnZU9iaiwgcEltYWdlT2JqLT5tX3BJbWFnZS0+SXNNYXNrKCksIGZhbHNlLCBmYWxzZSk7CiAgICAgcEltYWdlT2JqLT5tX01hdHJpeCA9IEltYWdlTWF0cml4OwogICAgIHBJbWFnZU9iai0+Q2FsY0JvdW5kaW5nQm94KCk7CiAgICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocEltYWdlT2JqKTsKQEAgLTgxNywyMSArODE3LDIxIEBACiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIEZBTFNFKTsKKyAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBmYWxzZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxQYXRoT2xkKCkKIHsKICAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgRkFMU0UpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIGZhbHNlKTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsUGF0aCgpCiB7CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX0FMVEVSTkFURSwgRkFMU0UpOworICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX0FMVEVSTkFURSwgZmFsc2UpOwogfQogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRHcmF5X0ZpbGwoKQogewpAQCAtODUwLDcgKzg1MCw3IEBACiAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBHUyA9IChDUERGX0RpY3Rpb25hcnkqKUZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiRXh0R1N0YXRlIiksIG5hbWUpOwogICAgIGlmIChwR1MgPT0gTlVMTCB8fCBwR1MtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSB0cnVlOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1fcEN1clN0YXRlcy0+UHJvY2Vzc0V4dEdTKHBHUywgdGhpcyk7CkBAIC05MzQsNyArOTM0LDcgQEAKICAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQWRkUGF0aE9iamVjdCgwLCBGQUxTRSk7CisgICAgQWRkUGF0aE9iamVjdCgwLCBmYWxzZSk7CiB9CiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NhdmVHcmFwaFN0YXRlKCkKIHsKQEAgLTk5OSwxNCArOTk5LDE0IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgSGFuZGxlX0Nsb3NlUGF0aCgpOwotICAgIEFkZFBhdGhPYmplY3QoMCwgVFJVRSk7CisgICAgQWRkUGF0aE9iamVjdCgwLCB0cnVlKTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU3Ryb2tlUGF0aCgpCiB7CiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFBhdGhPYmplY3QoMCwgVFJVRSk7CisgICAgQWRkUGF0aE9iamVjdCgwLCB0cnVlKTsKIH0KIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfRmlsbCgpCiB7CkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChudmFsdWVzICE9IG5hcmdzKSB7Ci0gICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKKyAgICAgICAgQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiA9IEZpbmRQYXR0ZXJuKEdldFN0cmluZygwKSwgZmFsc2UpOwogICAgICAgICBpZiAocFBhdHRlcm4pIHsKICAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOwogICAgICAgICB9CkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChudmFsdWVzICE9IG5hcmdzKSB7Ci0gICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKKyAgICAgICAgQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiA9IEZpbmRQYXR0ZXJuKEdldFN0cmluZygwKSwgZmFsc2UpOwogICAgICAgICBpZiAocFBhdHRlcm4pIHsKICAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZVBhdHRlcm4ocFBhdHRlcm4sIHZhbHVlcywgbnZhbHVlcyk7CiAgICAgICAgIH0KQEAgLTExMTEsNyArMTExMSw3IEBACiAgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIFRSVUUpOworICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIHRydWUpOwogICAgIGlmIChwUGF0dGVybiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTI3LDcgKzExMjcsNyBAQAogICAgIH0KICAgICBDUERGX1NoYWRpbmdPYmplY3QqIHBPYmogPSBuZXcgQ1BERl9TaGFkaW5nT2JqZWN0OwogICAgIHBPYmotPm1fcFNoYWRpbmcgPSBwU2hhZGluZzsKLSAgICBTZXRHcmFwaGljU3RhdGVzKHBPYmosIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgIFNldEdyYXBoaWNTdGF0ZXMocE9iaiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAgcE9iai0+bV9NYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOwogICAgIHBPYmotPm1fTWF0cml4LkNvbmNhdChtX210Q29udGVudFRvVXNlcik7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94OwpAQCAtMTIwNiw3ICsxMjA2LDcgQEAKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKUZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiRm9udCIpLCBuYW1lKTsKICAgICBpZiAocEZvbnREaWN0ID09IE5VTEwgfHwgcEZvbnREaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gVFJVRTsKKyAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIENQREZfRm9udDo6R2V0U3RvY2tGb250KG1fcERvY3VtZW50LCBGWF9CU1RSQygiSGVsdmV0aWNhIikpOwogICAgIH0KICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRG9jdW1lbnQtPkxvYWRGb250KHBGb250RGljdCk7CkBAIC0xMjM4LDE3ICsxMjM4LDE3IEBACiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgbmFtZSk7CiAgICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRDb2xvclNwYWNlKHBDU09iaik7CiB9Ci1DUERGX1BhdHRlcm4qIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZFBhdHRlcm4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlNoYWRpbmcpCitDUERGX1BhdHRlcm4qIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZFBhdHRlcm4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGJvb2wgYlNoYWRpbmcpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBQYXR0ZXJuID0gRmluZFJlc291cmNlT2JqKGJTaGFkaW5nID8gRlhfQlNUUkMoIlNoYWRpbmciKSA6IEZYX0JTVFJDKCJQYXR0ZXJuIiksIG5hbWUpOwogICAgIGlmIChwUGF0dGVybiA9PSBOVUxMIHx8IChwUGF0dGVybi0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkpIHsKLSAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gVFJVRTsKKyAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBtX3BEb2N1bWVudC0+TG9hZFBhdHRlcm4ocFBhdHRlcm4sIGJTaGFkaW5nLCAmbV9wQ3VyU3RhdGVzLT5tX1BhcmVudE1hdHJpeCk7CkBAIC0xMjg3LDcgKzEyODcsNyBAQAogICAgIH0KICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gbmV3IENQREZfVGV4dE9iamVjdDsKICAgICBtX3BMYXN0VGV4dE9iamVjdCA9IHBUZXh0OwotICAgIFNldEdyYXBoaWNTdGF0ZXMocFRleHQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIFNldEdyYXBoaWNTdGF0ZXMocFRleHQsIHRydWUsIHRydWUsIHRydWUpOwogICAgIGlmICh0ZXh0bW9kZSAmJiB0ZXh0bW9kZSAhPSAzICYmIHRleHRtb2RlICE9IDQgJiYgdGV4dG1vZGUgIT0gNykgewogICAgICAgICBGWF9GTE9BVCogcENUTSA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9DVE07CiAgICAgICAgIHBDVE1bMF0gPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNLmE7CkBAIC0xNTAxLDcgKzE1MDEsNyBAQAogICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID0geDsKICAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WSA9IHk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIEZYX0JPT0wgYlN0cm9rZSkKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoT2JqZWN0KGludCBGaWxsVHlwZSwgYm9vbCBiU3Ryb2tlKQogewogICAgIGludCBQYXRoUG9pbnRDb3VudCA9IG1fUGF0aFBvaW50Q291bnQsIFBhdGhDbGlwVHlwZSA9IG1fUGF0aENsaXBUeXBlOwogICAgIG1fUGF0aFBvaW50Q291bnQgPSAwOwpAQCAtMTUxMCw3ICsxNTEwLDcgQEAKICAgICAgICAgaWYgKFBhdGhQb2ludENvdW50ICYmIFBhdGhDbGlwVHlwZSkgewogICAgICAgICAgICAgQ1BERl9QYXRoIHBhdGg7CiAgICAgICAgICAgICBwYXRoLk5ldygpLT5BcHBlbmRSZWN0KDAsIDAsIDAsIDApOwotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgocGF0aCwgRlhGSUxMX1dJTkRJTkcsIFRSVUUpOworICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgocGF0aCwgRlhGSUxMX1dJTkRJTkcsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTI5LDcgKzE1MjksNyBAQAogICAgICAgICBwUGF0aE9iai0+bV9GaWxsVHlwZSA9IEZpbGxUeXBlOwogICAgICAgICBwUGF0aE9iai0+bV9QYXRoID0gUGF0aDsKICAgICAgICAgcFBhdGhPYmotPm1fTWF0cml4ID0gbWF0cml4OwotICAgICAgICBTZXRHcmFwaGljU3RhdGVzKHBQYXRoT2JqLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgIFNldEdyYXBoaWNTdGF0ZXMocFBhdGhPYmosIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgcFBhdGhPYmotPkNhbGNCb3VuZGluZ0JveCgpOwogICAgICAgICBtX3BPYmplY3RMaXN0LT5tX09iamVjdExpc3QuQWRkVGFpbChwUGF0aE9iaik7CiAgICAgfQpAQCAtMTUzOCwxMyArMTUzOCwxMyBAQAogICAgICAgICAgICAgUGF0aC5UcmFuc2Zvcm0oJm1hdHJpeCk7CiAgICAgICAgICAgICBtYXRyaXguU2V0SWRlbnRpdHkoKTsKICAgICAgICAgfQotICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChQYXRoLCBQYXRoQ2xpcFR5cGUsIFRSVUUpOworICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChQYXRoLCBQYXRoQ2xpcFR5cGUsIHRydWUpOwogICAgIH0KIH0KIENGWF9CeXRlU3RyaW5nIF9GUERGX0J5dGVTdHJpbmdGcm9tSGV4KENGWF9CaW5hcnlCdWYmIHNyY19idWYpCiB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgICAgYm9vbCBiRmlyc3QgPSB0cnVlOwogICAgIGludCBjb2RlID0gMDsKICAgICBjb25zdCB1aW50OF90KiBzdHIgPSBzcmNfYnVmLkdldEJ1ZmZlcigpOwogICAgIEZYX0RXT1JEIHNpemUgPSBzcmNfYnVmLkdldFNpemUoKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcAppbmRleCAzN2ZmZWE5Li4zOTlhNGM3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGQuY3BwCkBAIC0xOCwxOCArMTgsMTggQEAKICAgICAiSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUkiCiAgICAgIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJIgogICAgICJJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSI7Ci1GWF9CT09MIF9QREZfSGFzSW52YWxpZE9wQ2hhcihjb25zdCBGWF9DSEFSKiBvcCkKK2Jvb2wgX1BERl9IYXNJbnZhbGlkT3BDaGFyKGNvbnN0IEZYX0NIQVIqIG9wKQogewogICAgIGlmKCFvcCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdWludDhfdCBjaDsKICAgICB3aGlsZSgoY2ggPSAqb3ArKykpIHsKICAgICAgICAgaWYoX1BERl9PcENoYXJUeXBlW2NoXSA9PSAnSScpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGNsYXNzIENQREZfU3RyZWFtUGFyc2VyQXV0b0NsZWFyZXIgewogICBwdWJsaWM6CkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcFN5bnRheC0+R2V0UG9zKCk7CiAgICAgICAgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkOgogICAgICAgICAgICAgICAgIGlmKCFPbk9wZXJhdG9yKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpKSAmJiBfUERGX0hhc0ludmFsaWRPcENoYXIoKGNoYXIqKXN5bnRheC5HZXRXb3JkQnVmKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYkFib3J0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iQWJvcnQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobV9iQWJvcnQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcFN5bnRheC0+R2V0UG9zKCk7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksIEZYX0JTVFJDKCJJbWFnZSIpKTsKLSAgICBDUERGX0ltYWdlT2JqZWN0ICpwSW1nT2JqID0gQWRkSW1hZ2UocFN0cmVhbSwgTlVMTCwgVFJVRSk7CisgICAgQ1BERl9JbWFnZU9iamVjdCAqcEltZ09iaiA9IEFkZEltYWdlKHBTdHJlYW0sIE5VTEwsIHRydWUpOwogICAgIGlmICghcEltZ09iaikgewogICAgICAgICBpZiAocFN0cmVhbSkgewogICAgICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgaW50IGxhc3RfcG9zID0gbV9wU3ludGF4LT5HZXRQb3MoKTsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgICAgIEZYX0JPT0wgYlByb2Nlc3NlZCA9IFRSVUU7CisgICAgICAgIGJvb2wgYlByb2Nlc3NlZCA9IHRydWU7CiAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7CkBAIC0yMDYsMTAgKzIwNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhSZWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGJQcm9jZXNzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9zID0gbV9wU3ludGF4LT5HZXRQb3MoKTsKQEAgLTIyMCwxNCArMjIwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChuUGFyYW1zID09IDYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkludGVnZXI7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYkludGVnZXI7CiAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgRlhfYXRvbnVtKENGWF9CeXRlU3RyaW5nQyhtX3BTeW50YXgtPkdldFdvcmRCdWYoKSwgbV9wU3ludGF4LT5HZXRXb3JkU2l6ZSgpKSwgYkludGVnZXIsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tuUGFyYW1zKytdID0gYkludGVnZXIgPyAoRlhfRkxPQVQpdmFsdWUgOiAqKEZYX0ZMT0FUKikmdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWJQcm9jZXNzZWQpIHsKICAgICAgICAgICAgIG1fcFN5bnRheC0+U2V0UG9zKGxhc3RfcG9zKTsKQEAgLTI3OSw3ICsyNzksNyBAQAogICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwogRlhfRFdPUkQgX0E4NURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKIEZYX0RXT1JEIF9IZXhEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1GWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAorRlhfRFdPUkQgRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKGJvb2wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENQREZfRGljdGlvbmFyeSogcFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKIEZYX0RXT1JEIFBERl9EZWNvZGVJbmxpbmVTdHJlYW0oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgbGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgQ0ZYX0J5dGVTdHJpbmcmIGRlY29kZXIsCkBAIC0yOTYsMTAgKzI5NiwxMCBAQAogICAgICAgICByZXR1cm4gX0hleERlY29kZShzcmNfYnVmLCBsaW1pdCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CiAgICAgfQogICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJGbGF0ZURlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsIikpIHsKLSAgICAgICAgcmV0dXJuIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGQUxTRSwgc3JjX2J1ZiwgbGltaXQsIHBQYXJhbSwgZGVzdF9zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShmYWxzZSwgc3JjX2J1ZiwgbGltaXQsIHBQYXJhbSwgZGVzdF9zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKICAgICB9CiAgICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkxaV0RlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkxaVyIpKSB7Ci0gICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoVFJVRSwgc3JjX2J1ZiwgbGltaXQsIHBQYXJhbSwgMCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUodHJ1ZSwgc3JjX2J1ZiwgbGltaXQsIHBQYXJhbSwgMCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CiAgICAgfQogICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJEQ1REZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJEQ1QiKSkgewogICAgICAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKApAQCAtMzEzLDcgKzMxMyw3IEBACiAgICAgZGVzdF9idWYgPSAwOwogICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKIH0KLUNQREZfU3RyZWFtKiBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZElubGluZVN0cmVhbShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX09iamVjdCogcENTT2JqLCBGWF9CT09MIGJEZWNvZGUpCitDUERGX1N0cmVhbSogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgYm9vbCBiRGVjb2RlKQogewogICAgIGlmIChtX1BvcyA9PSBtX1NpemUpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00NDcsNyArNDQ3LDcgQEAKICAgICAgICAgbV9wTGFzdE9iaiA9IE5VTEw7CiAgICAgfQogICAgIG1fV29yZFNpemUgPSAwOwotICAgIEZYX0JPT0wgYklzTnVtYmVyID0gVFJVRTsKKyAgICBib29sIGJJc051bWJlciA9IHRydWU7CiAgICAgaWYgKG1fUG9zID49IG1fU2l6ZSkgewogICAgICAgICByZXR1cm4gRW5kT2ZEYXRhOwogICAgIH0KQEAgLTQ4NSw3ICs0ODUsNyBAQAogICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgIGJJc051bWJlciA9IEZBTFNFOworICAgICAgICAgICAgYklzTnVtYmVyID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewogICAgICAgICAgICAgYnJlYWs7CkBAIC01MDYsNyArNTA2LDcgQEAKICAgICB9CiAgICAgaWYgKG1fV29yZFNpemUgPT0gNCkgewogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfVFJVRSkgewotICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKFRSVUUpOworICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKHRydWUpOwogICAgICAgICAgICAgcmV0dXJuIE90aGVyczsKICAgICAgICAgfQogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfTlVMTCkgewpAQCAtNTE1LDcgKzUxNSw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1fV29yZFNpemUgPT0gNSkgewogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfRkFMUyAmJiBtX1dvcmRCdWZmZXJbNF0gPT0gJ2UnKSB7Ci0gICAgICAgICAgICBtX3BMYXN0T2JqID0gQ1BERl9Cb29sZWFuOjpDcmVhdGUoRkFMU0UpOworICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBPdGhlcnM7CiAgICAgICAgIH0KICAgICB9CkBAIC01ODQsOSArNTg0LDkgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZE5leHRPYmplY3QoRlhfQk9PTCBiQWxsb3dOZXN0ZWRBcnJheSwgRlhfQk9PTCBiSW5BcnJheSkKK0NQREZfT2JqZWN0KiBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZE5leHRPYmplY3QoYm9vbCBiQWxsb3dOZXN0ZWRBcnJheSwgYm9vbCBiSW5BcnJheSkKIHsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBib29sIGJJc051bWJlcjsKICAgICBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmIChtX1dvcmRTaXplID09IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02MDQsNyArNjA0LDcgQEAKICAgICB9CiAgICAgaWYgKGZpcnN0X2NoYXIgPT0gJzwnKSB7CiAgICAgICAgIGlmIChtX1dvcmRTaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKFJlYWRIZXhTdHJpbmcoKSwgVFJVRSk7CisgICAgICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShSZWFkSGV4U3RyaW5nKCksIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwogICAgICAgICB3aGlsZSAoMSkgewpAQCAtNjIxLDcgKzYyMSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKTsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gUmVhZE5leHRPYmplY3QoVFJVRSk7CisgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KHRydWUpOwogICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChwRGljdCkgewogICAgICAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwpAQCAtNjQyLDcgKzY0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KGJBbGxvd05lc3RlZEFycmF5LCBUUlVFKTsKKyAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gUmVhZE5leHRPYmplY3QoYkFsbG93TmVzdGVkQXJyYXksIHRydWUpOwogICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChtX1dvcmRTaXplID09IDAgfHwgbV9Xb3JkQnVmZmVyWzBdID09ICddJykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEFycmF5OwpAQCAtNjU3LDIyICs2NTcsMjIgQEAKICAgICB9CiAgICAgaWYgKG1fV29yZFNpemUgPT0gNCkgewogICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfVFJVRSkgewotICAgICAgICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKFRSVUUpOworICAgICAgICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9OVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQ1BERl9OdWxsOjpDcmVhdGUoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobV9Xb3JkU2l6ZSA9PSA1KSB7CiAgICAgICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9GQUxTICYmIG1fV29yZEJ1ZmZlcls0XSA9PSAnZScpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZShGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gQ1BERl9Cb29sZWFuOjpDcmVhdGUoZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotdm9pZCBDUERGX1N0cmVhbVBhcnNlcjo6R2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKQordm9pZCBDUERGX1N0cmVhbVBhcnNlcjo6R2V0TmV4dFdvcmQoYm9vbCYgYklzTnVtYmVyKQogewogICAgIG1fV29yZFNpemUgPSAwOwotICAgIGJJc051bWJlciA9IFRSVUU7CisgICAgYklzTnVtYmVyID0gdHJ1ZTsKICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC03MDEsNyArNzAxLDcgQEAKICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgfQogICAgIGlmICh0eXBlID09ICdEJykgewotICAgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgYklzTnVtYmVyID0gZmFsc2U7CiAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CiAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKICAgICAgICAgICAgIHdoaWxlICgxKSB7CkBAIC03NDYsNyArNzQ2LDcgQEAKICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgICAgIGJJc051bWJlciA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTg2Miw3ICs4NjIsNyBAQAogICAgIH0KICAgICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgICAgYm9vbCBiRmlyc3QgPSB0cnVlOwogICAgIGludCBjb2RlID0gMDsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoY2ggPT0gJz4nKSB7CkBAIC05NDcsNyArOTQ3LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX3BPYmplY3RzID0gcFBhZ2U7Ci0gICAgbV9iRm9ybSA9IEZBTFNFOworICAgIG1fYkZvcm0gPSBmYWxzZTsKICAgICBpZiAocE9wdGlvbnMpIHsKICAgICAgICAgbV9PcHRpb25zID0gKnBPcHRpb25zOwogICAgIH0KQEAgLTk2Miw3ICs5NjIsNyBAQAogICAgIGlmIChwQ29udGVudC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKICAgICAgICAgbV9uU3RyZWFtcyA9IDA7CiAgICAgICAgIG1fcFNpbmdsZVN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICAgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBDb250ZW50LCBGQUxTRSk7CisgICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCwgZmFsc2UpOwogICAgIH0gZWxzZSBpZiAocENvbnRlbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50OwogICAgICAgICBtX25TdHJlYW1zID0gcEFycmF5LT5HZXRDb3VudCgpOwpAQCAtOTgxLDcgKzk4MSw3IEBACiB7CiAgICAgbV9wVHlwZTNDaGFyID0gcFR5cGUzQ2hhcjsKICAgICBtX3BPYmplY3RzID0gcEZvcm07Ci0gICAgbV9iRm9ybSA9IFRSVUU7CisgICAgbV9iRm9ybSA9IHRydWU7CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtX21hdHJpeCA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7CiAgICAgaWYgKHBHcmFwaGljU3RhdGVzKSB7CiAgICAgICAgIGZvcm1fbWF0cml4LkNvbmNhdChwR3JhcGhpY1N0YXRlcy0+bV9DVE0pOwpAQCAtMTAxMSw3ICsxMDExLDcgQEAKICAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NUTSA9IGZvcm1fbWF0cml4OwogICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fUGFyZW50TWF0cml4ID0gZm9ybV9tYXRyaXg7CiAgICAgaWYgKENsaXBQYXRoLk5vdE51bGwoKSkgewotICAgICAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKKyAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywgdHJ1ZSk7CiAgICAgfQogICAgIGlmIChwRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCkgewogICAgICAgICBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBEYXRhID0gbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCk7CkBAIC0xMDIzLDkgKzEwMjMsOSBAQAogICAgIG1fblN0cmVhbXMgPSAwOwogICAgIG1fcFNpbmdsZVN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKICAgICBpZiAocEZvcm0tPm1fcERvY3VtZW50KSB7Ci0gICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEocEZvcm0tPm1fcEZvcm1TdHJlYW0sIEZBTFNFKTsKKyAgICAgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwRm9ybS0+bV9wRm9ybVN0cmVhbSwgZmFsc2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEocEZvcm0tPm1fcEZvcm1TdHJlYW0sIEZBTFNFKTsKKyAgICAgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwRm9ybS0+bV9wRm9ybVN0cmVhbSwgZmFsc2UpOwogICAgIH0KICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fcFNpbmdsZVN0cmVhbS0+R2V0RGF0YSgpOwogICAgIG1fU2l6ZSA9IG1fcFNpbmdsZVN0cmVhbS0+R2V0U2l6ZSgpOwpAQCAtMTA3MCw3ICsxMDcwLDcgQEAKICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQ29udGVudCA9IG1fcE9iamVjdHMtPm1fcEZvcm1EaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQ29udGVudHMiKSk7CiAgICAgICAgICAgICAgICAgbV9wU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbU9iaiA9IChDUERGX1N0cmVhbSopKHBDb250ZW50ID8gcENvbnRlbnQtPkdldEVsZW1lbnRWYWx1ZShtX0N1cnJlbnRPZmZzZXQpIDogTlVMTCk7Ci0gICAgICAgICAgICAgICAgbV9wU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XS0+TG9hZEFsbERhdGEocFN0cmVhbU9iaiwgRkFMU0UpOworICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0tPkxvYWRBbGxEYXRhKHBTdHJlYW1PYmosIGZhbHNlKTsKICAgICAgICAgICAgICAgICBtX0N1cnJlbnRPZmZzZXQgKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcAppbmRleCA0OGIzYTQwLi44MjkyZDJkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdHRlcm4uY3BwCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgInBhZ2VpbnQuaCIKIAogQ1BERl9QYXR0ZXJuOjpDUERGX1BhdHRlcm4oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCkgOgotICAgIG1fcFBhdHRlcm5PYmooTlVMTCksIG1fUGF0dGVyblR5cGUoUEFUVEVSTl9USUxJTkcpLCBtX3BEb2N1bWVudChOVUxMKSwgbV9iRm9yY2VDbGVhcihGQUxTRSkKKyAgICBtX3BQYXR0ZXJuT2JqKE5VTEwpLCBtX1BhdHRlcm5UeXBlKFBBVFRFUk5fVElMSU5HKSwgbV9wRG9jdW1lbnQoTlVMTCksIG1fYkZvcmNlQ2xlYXIoZmFsc2UpCiB7CiAgICAgaWYgKHBQYXJlbnRNYXRyaXgpIHsKICAgICAgICAgbV9QYXJlbnRNYXRyaXggPSAqcFBhcmVudE1hdHJpeDsKQEAgLTM3LDI4ICszNywyOCBAQAogICAgIGRlbGV0ZSBtX3BGb3JtOwogICAgIG1fcEZvcm0gPSBOVUxMOwogfQotRlhfQk9PTCBDUERGX1RpbGluZ1BhdHRlcm46OkxvYWQoKQorYm9vbCBDUERGX1RpbGluZ1BhdHRlcm46OkxvYWQoKQogewogICAgIGlmIChtX3BGb3JtICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUGF0dGVybk9iai0+R2V0RGljdCgpOwogICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX2JDb2xvcmVkID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlBhaW50VHlwZSIpKSA9PSAxOwogICAgIG1fWFN0ZXAgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhwRGljdC0+R2V0TnVtYmVyKEZYX0JTVFJDKCJYU3RlcCIpKSk7CiAgICAgbV9ZU3RlcCA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBEaWN0LT5HZXROdW1iZXIoRlhfQlNUUkMoIllTdGVwIikpKTsKICAgICBpZiAobV9wUGF0dGVybk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKiltX3BQYXR0ZXJuT2JqOwogICAgIG1fcEZvcm0gPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBOVUxMLCBwU3RyZWFtKTsKICAgICBtX3BGb3JtLT5QYXJzZUNvbnRlbnQoTlVMTCwgJm1fUGFyZW50TWF0cml4LCBOVUxMLCBOVUxMKTsKICAgICBtX0JCb3ggPSBwRGljdC0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUNQREZfU2hhZGluZ1BhdHRlcm46OkNQREZfU2hhZGluZ1BhdHRlcm4oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpIDogQ1BERl9QYXR0ZXJuKHBhcmVudE1hdHJpeCkKK0NQREZfU2hhZGluZ1BhdHRlcm46OkNQREZfU2hhZGluZ1BhdHRlcm4oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBib29sIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpIDogQ1BERl9QYXR0ZXJuKHBhcmVudE1hdHJpeCkKIHsKICAgICBtX1BhdHRlcm5UeXBlID0gUEFUVEVSTl9TSEFESU5HOwogICAgIG1fcFBhdHRlcm5PYmogPSBiU2hhZGluZyA/IE5VTEwgOiBwUGF0dGVybk9iajsKQEAgLTEwMiwxNCArMTAyLDE0IEBACiAgICAgbV9wQ291bnRlZENTID0gTlVMTDsKICAgICBtX25GdW5jcyA9IDA7CiB9Ci1GWF9CT09MIENQREZfU2hhZGluZ1BhdHRlcm46OkxvYWQoKQorYm9vbCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpMb2FkKCkKIHsKICAgICBpZiAobV9TaGFkaW5nVHlwZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU2hhZGluZ0RpY3QgPSBtX3BTaGFkaW5nT2JqID8gbV9wU2hhZGluZ09iai0+R2V0RGljdCgpIDogTlVMTDsKICAgICBpZiAocFNoYWRpbmdEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX25GdW5jcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpICsrKQpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBwU2hhZGluZ0RpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKICAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwogICAgIG1fcENTID0gcERvY1BhZ2VEYXRhLT5HZXRDb2xvclNwYWNlKHBDU09iaiwgTlVMTCk7CkBAIC0xNDEsMTQgKzE0MSwxNCBAQAogICAgICAgICBtX3BDb3VudGVkQ1MgPSBwRG9jUGFnZURhdGEtPkZpbmRDb2xvclNwYWNlUHRyKG1fcENTLT5HZXRBcnJheSgpKTsKICAgICB9CiAgICAgbV9TaGFkaW5nVHlwZSA9IHBTaGFkaW5nRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU2hhZGluZ1R5cGUiKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU2hhZGluZ1BhdHRlcm46OlJlbG9hZCgpCitib29sIENQREZfU2hhZGluZ1BhdHRlcm46OlJlbG9hZCgpCiB7CiAgICAgQ2xlYXIoKTsKICAgICByZXR1cm4gTG9hZCgpOwogfQotRlhfQk9PTCBDUERGX01lc2hTdHJlYW06OkxvYWQoQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUykKK2Jvb2wgQ1BERl9NZXNoU3RyZWFtOjpMb2FkKENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCiB7CiAgICAgbV9TdHJlYW0uTG9hZEFsbERhdGEocFNoYWRpbmdTdHJlYW0pOwogICAgIG1fQml0U3RyZWFtLkluaXQobV9TdHJlYW0uR2V0RGF0YSgpLCBtX1N0cmVhbS5HZXRTaXplKCkpOwpAQCAtMTYwLDIxICsxNjAsMjEgQEAKICAgICBtX25Db21wQml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpOwogICAgIG1fbkZsYWdCaXRzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJGbGFnIikpOwogICAgIGlmICghbV9uQ29vcmRCaXRzIHx8ICFtX25Db21wQml0cykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IG5Db21wcyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CiAgICAgaWYgKG5Db21wcyA+IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fbkNvbXBzID0gbkZ1bmNzID8gMSA6IG5Db21wczsKICAgICBpZiAoKChpbnQpbV9uQ29tcHMgPCAwKSB8fCBtX25Db21wcyA+IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fQ29vcmRNYXggPSBtX25Db29yZEJpdHMgPT0gMzIgPyAtMSA6ICgxIDw8IG1fbkNvb3JkQml0cykgLSAxOwogICAgIG1fQ29tcE1heCA9ICgxIDw8IG1fbkNvbXBCaXRzKSAtIDE7CiAgICAgQ1BERl9BcnJheSogcERlY29kZSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOwogICAgIGlmIChwRGVjb2RlID09IE5VTEwgfHwgcERlY29kZS0+R2V0Q291bnQoKSAhPSA0ICsgbV9uQ29tcHMgKiAyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3htaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoMCk7CiAgICAgbV94bWF4ID0gcERlY29kZS0+R2V0TnVtYmVyKDEpOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIG1fQ29sb3JNaW5baV0gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyA0KTsKICAgICAgICAgbV9Db2xvck1heFtpXSA9IHBEZWNvZGUtPkdldE51bWJlcihpICogMiArIDUpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIEZYX0RXT1JEIENQREZfTWVzaFN0cmVhbTo6R2V0RmxhZygpCiB7CkBAIC0yMzEsMTggKzIzMSwxOCBAQAogICAgIG1fQml0U3RyZWFtLkJ5dGVBbGlnbigpOwogICAgIHJldHVybiBmbGFnOwogfQotRlhfQk9PTCBDUERGX01lc2hTdHJlYW06OkdldFZlcnRleFJvdyhDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwgaW50IGNvdW50LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCkKK2Jvb2wgQ1BERl9NZXNoU3RyZWFtOjpHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsIGludCBjb3VudCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApCiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewogICAgICAgICBpZiAobV9CaXRTdHJlYW0uSXNFT0YoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEdldENvb3Jkcyh2ZXJ0ZXhbaV0ueCwgdmVydGV4W2ldLnkpOwogICAgICAgICBwT2JqZWN0MkJpdG1hcC0+VHJhbnNmb3JtKHZlcnRleFtpXS54LCB2ZXJ0ZXhbaV0ueSk7CiAgICAgICAgIEdldENvbG9yKHZlcnRleFtpXS5yLCB2ZXJ0ZXhbaV0uZywgdmVydGV4W2ldLmIpOwogICAgICAgICBtX0JpdFN0cmVhbS5CeXRlQWxpZ24oKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfRmxvYXRSZWN0IF9HZXRTaGFkaW5nQkJveChDUERGX1N0cmVhbSogcFN0cmVhbSwgaW50IHR5cGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUykKQEAgLTI1NSw4ICsyNTUsOCBAQAogICAgICAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0OwotICAgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJHb3VyYXVkID0gdHlwZSA9PSA0IHx8IHR5cGUgPT0gNTsKKyAgICBib29sIGJTdGFydGVkID0gZmFsc2U7CisgICAgYm9vbCBiR291cmF1ZCA9IHR5cGUgPT0gNCB8fCB0eXBlID09IDU7CiAgICAgaW50IGZ1bGxfcG9pbnRfY291bnQgPSB0eXBlID09IDcgPyAxNiA6ICh0eXBlID09IDYgPyAxMiA6IDEpOwogICAgIGludCBmdWxsX2NvbG9yX2NvdW50ID0gKHR5cGUgPT0gNiB8fCB0eXBlID09IDcpID8gNCA6IDE7CiAgICAgd2hpbGUgKCFzdHJlYW0ubV9CaXRTdHJlYW0uSXNFT0YoKSkgewpAQCAtMjc2LDcgKzI3Niw3IEBACiAgICAgICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KHgsIHkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZWN0LkluaXRSZWN0KHgsIHkpOwotICAgICAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RyZWFtLm1fQml0U3RyZWFtLlNraXBCaXRzKHN0cmVhbS5tX25Db21wcyAqIHN0cmVhbS5tX25Db21wQml0cyAqIGNvbG9yX2NvdW50KTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaAppbmRleCBjZjFmZTQ3Li44ZmUyNTU1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgQ1BERl9TdHJlYW1QYXJzZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CiAgICAgfkNQREZfU3RyZWFtUGFyc2VyKCk7CiAKLSAgICBDUERGX1N0cmVhbSoJCVJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgRlhfQk9PTCBiRGVjb2RlKTsKKyAgICBDUERGX1N0cmVhbSoJCVJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgYm9vbCBiRGVjb2RlKTsKICAgICB0eXBlZGVmIGVudW0geyBFbmRPZkRhdGEsIE51bWJlciwgS2V5d29yZCwgTmFtZSwgT3RoZXJzIH0gU3ludGF4VHlwZTsKIAogICAgIFN5bnRheFR5cGUJCQlQYXJzZU5leHRFbGVtZW50KCk7CkBAIC00OCwxMCArNDgsMTAgQEAKICAgICAgICAgbV9Qb3MgPSBwb3M7CiAgICAgfQogCi0gICAgQ1BERl9PYmplY3QqCQlSZWFkTmV4dE9iamVjdChGWF9CT09MIGJBbGxvd05lc3RlZEFycmF5ID0gRkFMU0UsIEZYX0JPT0wgYkluQXJyYXkgPSBGQUxTRSk7CisgICAgQ1BERl9PYmplY3QqCQlSZWFkTmV4dE9iamVjdChib29sIGJBbGxvd05lc3RlZEFycmF5ID0gZmFsc2UsIGJvb2wgYkluQXJyYXkgPSBmYWxzZSk7CiAgICAgdm9pZAkJCQlTa2lwUGF0aE9iamVjdCgpOwogcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJR2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKTsKKyAgICB2b2lkCQkJCUdldE5leHRXb3JkKGJvb2wmIGJJc051bWJlcik7CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCVJlYWRTdHJpbmcoKTsKICAgICBDRlhfQnl0ZVN0cmluZwkJUmVhZEhleFN0cmluZygpOwogICAgIGNvbnN0IHVpbnQ4X3QqCQltX3BCdWY7CkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICBpbnQJCQltX1R5cGU7CiAgICAgdW5pb24gewogICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgRlhfQk9PTAkJbV9iSW50ZWdlcjsKKyAgICAgICAgICAgIGJvb2wJCW1fYkludGVnZXI7CiAgICAgICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgaW50CQltX0ludGVnZXI7CiAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbV9GbG9hdDsKQEAgLTEzNywxMCArMTM3LDEwIEBACiAgICAgICAgIGludCBsZXZlbCk7CiAgICAgfkNQREZfU3RyZWFtQ29udGVudFBhcnNlcigpOwogCi0gICAgRlhfQk9PTCBTaG91bGRBYm9ydCgpIGNvbnN0IHsgcmV0dXJuIG1fYkFib3J0OyB9CisgICAgYm9vbCBTaG91bGRBYm9ydCgpIGNvbnN0IHsgcmV0dXJuIG1fYkFib3J0OyB9CiAgICAgQ1BERl9QYWdlT2JqZWN0cyogR2V0T2JqZWN0TGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdExpc3Q7IH0KICAgICBDUERGX0FsbFN0YXRlcyogR2V0Q3VyU3RhdGVzKCkgY29uc3QgeyByZXR1cm4gbV9wQ3VyU3RhdGVzLmdldCgpOyB9Ci0gICAgRlhfQk9PTCBJc0NvbG9yZWQoKSBjb25zdCB7IHJldHVybiBtX2JDb2xvcmVkOyB9CisgICAgYm9vbCBJc0NvbG9yZWQoKSBjb25zdCB7IHJldHVybiBtX2JDb2xvcmVkOyB9CiAgICAgY29uc3QgRlhfRkxPQVQqIEdldFR5cGUzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTNEYXRhOyB9CiAKICAgICB2b2lkCQkJCUFkZE51bWJlclBhcmFtKGNvbnN0IEZYX0NIQVIqIHN0ciwgaW50IGxlbik7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAoaW50MzJfdCkoR2V0TnVtYmVyKGluZGV4KSk7CiAgICAgfQotICAgIEZYX0JPT0wJCQkJT25PcGVyYXRvcihjb25zdCBGWF9DSEFSKiBvcCk7CisgICAgYm9vbAkJCQlPbk9wZXJhdG9yKGNvbnN0IEZYX0NIQVIqIG9wKTsKICAgICB2b2lkCQkJCUJpZ0Nhc2VDYWxsZXIoaW50IGluZGV4KTsKICAgICBGWF9EV09SRAkJCUdldFBhcnNlUG9zKCkKICAgICB7CkBAIC0xNzEsMTYgKzE3MSwxNiBAQAogICAgIHZvaWQJCQkJUGFyc2VQYXRoT2JqZWN0KCk7CiAgICAgdm9pZAkJCQlBZGRQYXRoUG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgaW50IGZsYWcpOwogICAgIHZvaWQJCQkJQWRkUGF0aFJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgdywgRlhfRkxPQVQgaCk7Ci0gICAgdm9pZAkJCQlBZGRQYXRoT2JqZWN0KGludCBGaWxsVHlwZSwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICBDUERGX0ltYWdlT2JqZWN0KglBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9JbWFnZSogcEltYWdlLCBGWF9CT09MIGJJbmxpbmUpOworICAgIHZvaWQJCQkJQWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIGJvb2wgYlN0cm9rZSk7CisgICAgQ1BERl9JbWFnZU9iamVjdCoJQWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfSW1hZ2UqIHBJbWFnZSwgYm9vbCBiSW5saW5lKTsKICAgICB2b2lkCQkJCUFkZER1cGxpY2F0ZUltYWdlKCk7CiAgICAgdm9pZAkJCQlBZGRGb3JtKENQREZfU3RyZWFtKik7Ci0gICAgdm9pZAkJCQlTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiQ29sb3IsIEZYX0JPT0wgYlRleHQsIEZYX0JPT0wgYkdyYXBoKTsKKyAgICB2b2lkCQkJCVNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBib29sIGJDb2xvciwgYm9vbCBiVGV4dCwgYm9vbCBiR3JhcGgpOwogICAgIHZvaWQJCQkJU2F2ZVN0YXRlcyhDUERGX0FsbFN0YXRlcyopOwogICAgIHZvaWQJCQkJUmVzdG9yZVN0YXRlcyhDUERGX0FsbFN0YXRlcyopOwogICAgIENQREZfRm9udCoJCQlGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CiAgICAgQ1BERl9Db2xvclNwYWNlKglGaW5kQ29sb3JTcGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7Ci0gICAgQ1BERl9QYXR0ZXJuKgkJRmluZFBhdHRlcm4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlNoYWRpbmcpOworICAgIENQREZfUGF0dGVybioJCUZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJTaGFkaW5nKTsKICAgICBDUERGX09iamVjdCoJCUZpbmRSZXNvdXJjZU9iaihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKIAogcHJvdGVjdGVkOgpAQCAtMjc3LDcgKzI3Nyw3IEBACiAgICAgX0NvbnRlbnRQYXJhbSBtX1BhcmFtQnVmMVtQQVJBTV9CVUZfU0laRV07CiAgICAgRlhfRFdPUkQgbV9QYXJhbVN0YXJ0UG9zOwogICAgIEZYX0RXT1JEIG1fUGFyYW1Db3VudDsKLSAgICBGWF9CT09MIG1fYkFib3J0OworICAgIGJvb2wgbV9iQWJvcnQ7CiAgICAgQ1BERl9TdHJlYW1QYXJzZXIqIG1fcFN5bnRheDsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BbGxTdGF0ZXM+IG1fcEN1clN0YXRlczsKICAgICBDUERGX0NvbnRlbnRNYXJrIG1fQ3VyQ29udGVudE1hcms7CkBAIC0yOTksMTEgKzI5OSwxMSBAQAogICAgIENGWF9CaW5hcnlCdWYgbV9MYXN0SW1hZ2VEYXRhOwogICAgIENQREZfRGljdGlvbmFyeSogbV9wTGFzdEltYWdlRGljdDsKICAgICBDUERGX0RpY3Rpb25hcnkqIG1fcExhc3RDbG9uZUltYWdlRGljdDsKLSAgICBGWF9CT09MIG1fYlJlbGVhc2VMYXN0RGljdDsKLSAgICBGWF9CT09MIG1fYlNhbWVMYXN0RGljdDsKLSAgICBGWF9CT09MIG1fYkNvbG9yZWQ7CisgICAgYm9vbCBtX2JSZWxlYXNlTGFzdERpY3Q7CisgICAgYm9vbCBtX2JTYW1lTGFzdERpY3Q7CisgICAgYm9vbCBtX2JDb2xvcmVkOwogICAgIEZYX0ZMT0FUIG1fVHlwZTNEYXRhWzZdOwotICAgIEZYX0JPT0wgbV9iUmVzb3VyY2VNaXNzaW5nOworICAgIGJvb2wgbV9iUmVzb3VyY2VNaXNzaW5nOwogICAgIENGWF9QdHJBcnJheSBtX1N0YXRlU3RhY2s7CiB9OwogY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyCkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICB2b2lkCQkJCUNsZWFyKCk7CiAgICAgUGFyc2VTdGF0dXMJCQltX1N0YXR1czsKICAgICBDUERGX1BhZ2VPYmplY3RzKgltX3BPYmplY3RzOwotICAgIEZYX0JPT0wJCQkJbV9iRm9ybTsKKyAgICBib29sCQkJCW1fYkZvcm07CiAgICAgQ1BERl9QYXJzZU9wdGlvbnMJbV9PcHRpb25zOwogICAgIENQREZfVHlwZTNDaGFyKgkJbV9wVHlwZTNDaGFyOwogICAgIGludAkJCQkJbV9JbnRlcm5hbFN0YWdlOwpAQCAtMzU3LDIyICszNTcsMjIgQEAKICAgICBleHBsaWNpdCBDUERGX0RvY1BhZ2VEYXRhKENQREZfRG9jdW1lbnQgKnBQREZEb2MpOwogICAgIH5DUERGX0RvY1BhZ2VEYXRhKCk7CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IEZBTFNFKTsKLSAgICBDUERGX0ZvbnQqICAgICAgICAgICAgICAgICAgR2V0Rm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCwgRlhfQk9PTCBmaW5kT25seSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyKGJvb2wgYlJlbGVhc2UgPSBmYWxzZSk7CisgICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgICAgIEdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIGJvb2wgZmluZE9ubHkpOwogICAgIENQREZfRm9udCogICAgICAgICAgICAgICAgICBHZXRTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250TmFtZSwgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKICAgICBDUERGX0NvbG9yU3BhY2UqICAgICAgICAgICAgR2V0Q29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpOwogICAgIENQREZfQ29sb3JTcGFjZSogICAgICAgICAgICBHZXRDb3BpZWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmopOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlQ29sb3JTcGFjZShDUERGX09iamVjdCogcENvbG9yU3BhY2UpOwotICAgIENQREZfUGF0dGVybiogICAgICAgICAgICAgICBHZXRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KTsKKyAgICBDUERGX1BhdHRlcm4qICAgICAgICAgICAgICAgR2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIGJvb2wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaik7CiAgICAgQ1BERl9JbWFnZSogICAgICAgICAgICAgICAgIEdldEltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlSW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSk7CiAgICAgQ1BERl9JY2NQcm9maWxlKiAgICAgICAgICAgIEdldEljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBJY2NQcm9maWxlU3RyZWFtKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUljY1Byb2ZpbGUoQ1BERl9JY2NQcm9maWxlKiBwSWNjUHJvZmlsZSk7CiAgICAgQ1BERl9TdHJlYW1BY2MqICAgICAgICAgICAgIEdldEZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sIEZYX0JPT0wgYkZvcmNlID0gRkFMU0UpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBJc0ZvcmNlQ2xlYXIoKSBjb25zdCB7cmV0dXJuIG1fYkZvcmNlQ2xlYXI7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLCBib29sIGJGb3JjZSA9IGZhbHNlKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgSXNGb3JjZUNsZWFyKCkgY29uc3Qge3JldHVybiBtX2JGb3JjZUNsZWFyO30KICAgICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiAgICAgRmluZENvbG9yU3BhY2VQdHIoQ1BERl9PYmplY3QqIHBDU09iaikgY29uc3Q7CiAgICAgQ1BERl9Db3VudGVkUGF0dGVybiogICAgICAgIEZpbmRQYXR0ZXJuUHRyKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaikgY29uc3Q7CiAKQEAgLTM5MSw3ICszOTEsNyBAQAogCiAgICAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wUERGRG9jOwogICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIgbV9IYXNoUHJvZmlsZU1hcDsKLSAgICBGWF9CT09MIG1fYkZvcmNlQ2xlYXI7CisgICAgYm9vbCBtX2JGb3JjZUNsZWFyOwogCiAgICAgQ1BERl9Db2xvclNwYWNlTWFwIG1fQ29sb3JTcGFjZU1hcDsKICAgICBDUERGX0ZvbnRGaWxlTWFwIG1fRm9udEZpbGVNYXA7CkBAIC00MDYsNyArNDA2LDcgQEAKIHB1YmxpYzoKICAgICBzdGF0aWMgQ1BERl9GdW5jdGlvbioJTG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopOwogICAgIHZpcnR1YWwgfkNQREZfRnVuY3Rpb24oKTsKLSAgICBGWF9CT09MCQlDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIGludCBuaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cywgaW50JiBucmVzdWx0cykgY29uc3Q7CisgICAgYm9vbAkJQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0OwogICAgIGludAkJCUNvdW50SW5wdXRzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX25JbnB1dHM7CkBAIC00MjAsOSArNDIwLDkgQEAKICAgICBpbnQJCQltX25JbnB1dHMsIG1fbk91dHB1dHM7CiAgICAgRlhfRkxPQVQqCW1fcERvbWFpbnM7CiAgICAgRlhfRkxPQVQqCW1fcFJhbmdlczsKLSAgICBGWF9CT09MCQlJbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgPSAwOworICAgIGJvb2wJCUluaXQoQ1BERl9PYmplY3QqIHBPYmopOworICAgIHZpcnR1YWwgYm9vbAl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdCA9IDA7CiB9OwogY2xhc3MgQ1BERl9JY2NQcm9maWxlCiB7CkBAIC00MzAsNyArNDMwLDcgQEAKICAgICBDUERGX0ljY1Byb2ZpbGUoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CiAgICAgfkNQREZfSWNjUHJvZmlsZSgpOwogICAgIGludDMyX3QgR2V0Q29tcG9uZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fblNyY0NvbXBvbmVudHM7IH0KLSAgICBGWF9CT09MCQkJCQltX2JzUkdCOworICAgIGJvb2wJCQkJCW1fYnNSR0I7CiAgICAgdm9pZCoJCQkJbV9wVHJhbnNmb3JtOwogcHJpdmF0ZToKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fblNyY0NvbXBvbmVudHM7CkBAIC00NDEsMjAgKzQ0MSwyMCBAQAogcHVibGljOgogICAgIENQREZfRGV2aWNlQ1MoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGZhbWlseSk7CiAKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCiAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAogICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAorICAgIGJvb2wgdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MIHZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICBib29sIHZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjLAogICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCiAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKQEAgLTQ2NCw3ICs0NjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIENQREZfUGF0dGVybkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZQpAQCAtNDc2LDggKzQ3Niw4IEBACiAgICAgICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSB7CiAgICAgfQogICAgIH5DUERGX1BhdHRlcm5DUygpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmgKaW5kZXggMmVjNTRmYi4uYzI3YWRlOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZmlsdGVyc19pbnQuaApAQCAtMzEsMTEgKzMxLDExIEBACiBjbGFzcyBDUERGX0x6d0ZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgogewogcHVibGljOgotICAgIENQREZfTHp3RmlsdGVyKEZYX0JPT0wgYkVhcmx5Q2hhbmdlKTsKKyAgICBDUERGX0x6d0ZpbHRlcihib29sIGJFYXJseUNoYW5nZSk7CiAgICAgdmlydHVhbCB+Q1BERl9MendGaWx0ZXIoKSB7fQogICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CiAgICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIEZYX0JPT0wJCQltX2JFYXJseUNoYW5nZTsKKyAgICBib29sCQkJbV9iRWFybHlDaGFuZ2U7CiAgICAgRlhfRFdPUkQJCW1fQ29kZUFycmF5WzUwMjFdOwogICAgIEZYX0RXT1JECQltX25Db2RlczsKICAgICBGWF9EV09SRAkJbV9Db2RlTGVuOwpAQCAtNTQsNyArNTQsNyBAQAogICAgIHZpcnR1YWwgfkNQREZfUHJlZGljdG9yRmlsdGVyKCk7CiAgICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKICAgICB2aXJ0dWFsIHZvaWQJdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHt9Ci0gICAgRlhfQk9PTAkJCW1fYlRpZmY7CisgICAgYm9vbAkJCW1fYlRpZmY7CiAgICAgRlhfRFdPUkQJCW1fUGl0Y2gsIG1fQnBwOwogICAgIHVpbnQ4X3QqCQltX3BSZWZMaW5lOwogICAgIHVpbnQ4X3QqCQltX3BDdXJMaW5lOwpAQCAtMTAyLDE0ICsxMDIsMTQgQEAKICAgICBDRlhfQmluYXJ5QnVmCW1fSW5wdXRCdWY7CiAgICAgdWludDhfdCoJCW1fcFNjYW5saW5lOwogICAgIGludAkJCQltX1BpdGNoLCBtX0hlaWdodCwgbV9XaWR0aCwgbV9uQ29tcHMsIG1faUxpbmU7Ci0gICAgRlhfQk9PTAkJCW1fYkdvdEhlYWRlcjsKKyAgICBib29sCQkJbV9iR290SGVhZGVyOwogfTsKIGNsYXNzIENQREZfRmF4RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCiB7CiBwdWJsaWM6CiAgICAgQ1BERl9GYXhGaWx0ZXIoKTsKICAgICB2aXJ0dWFsIH5DUERGX0ZheEZpbHRlcigpOwotICAgIEZYX0JPT0wJCQlJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucyk7CisgICAgYm9vbAkJCUluaXRpYWxpemUoaW50IEVuY29kaW5nLCBpbnQgYkVuZE9mTGluZSwgaW50IGJCeXRlQWxpZ24sIGludCBiQmxhY2ssIGludCBuUm93cywgaW50IG5Db2x1bW5zKTsKICAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwogICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CiAgICAgaW50CQkJCW1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKQEAgLTExOCw5ICsxMTgsOSBAQAogCXVpbnQ4X3QqCQltX3BSZWZCdWY7CiAgICAgQ0ZYX0JpbmFyeUJ1ZgltX0lucHV0QnVmOwogICAgIGludAkJCQltX0lucHV0Qml0UG9zOwotICAgIHZvaWQJCQlQcm9jZXNzRGF0YShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiBiaXRwb3MsIEZYX0JPT0wgYkZpbmlzaCwKKyAgICB2b2lkCQkJUHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBib29sIGJGaW5pc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICBGWF9CT09MCQkJUmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKTsKKyAgICBib29sCQkJUmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX1BBUlNFUl9GSUxURVJTX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwCmluZGV4IDQ3YzA4ZmIuLmU2MDg4OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgfQogICAgIGRlc3RfYnVmID0gRlhfQWxsb2MoIHVpbnQ4X3QsIGkgLyAyICsgMSk7CiAgICAgZGVzdF9zaXplID0gMDsKLSAgICBGWF9CT09MIGJGaXJzdERpZ2l0ID0gVFJVRTsKKyAgICBib29sIGJGaXJzdERpZ2l0ID0gdHJ1ZTsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemU7IGkgKyspIHsKICAgICAgICAgdWludDhfdCBjaCA9IHNyY19idWZbaV07CiAgICAgICAgIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdccicpIHsKQEAgLTE4Niw5ICsxODYsOSBAQAogICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpCiB7CiAgICAgaW50IEsgPSAwOwotICAgIEZYX0JPT0wgRW5kT2ZMaW5lID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBCeXRlQWxpZ24gPSBGQUxTRTsKLSAgICBGWF9CT09MIEJsYWNrSXMxID0gRkFMU0U7CisgICAgYm9vbCBFbmRPZkxpbmUgPSBmYWxzZTsKKyAgICBib29sIEJ5dGVBbGlnbiA9IGZhbHNlOworICAgIGJvb2wgQmxhY2tJczEgPSBmYWxzZTsKICAgICBpbnQgQ29sdW1ucyA9IDE3Mjg7CiAgICAgaW50IFJvd3MgPSAwOwogICAgIGlmIChwUGFyYW1zKSB7CkBAIC0yMDgsMjUgKzIwOCwyNSBAQAogICAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZheE1vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgSywgRW5kT2ZMaW5lLCBCeXRlQWxpZ24sIEJsYWNrSXMxLCBDb2x1bW5zLCBSb3dzKTsKIH0KLXN0YXRpYyBGWF9CT09MIENoZWNrRmxhdGVEZWNvZGVQYXJhbXMoaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQorc3RhdGljIGJvb2wgQ2hlY2tGbGF0ZURlY29kZVBhcmFtcyhpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCiB7CiAgICAgaWYgKENvbHVtbnMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgY2hlY2sgPSBDb2x1bW5zOwogICAgIGlmIChDb2xvcnMgPCAwIHx8IChjaGVjayA+IDAgJiYgQ29sb3JzID4gSU5UX01BWCAvIGNoZWNrKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY2hlY2sgKj0gQ29sb3JzOwogICAgIGlmIChCaXRzUGVyQ29tcG9uZW50IDwgMCB8fAogICAgICAgICAgICAgKGNoZWNrID4gMCAmJiBCaXRzUGVyQ29tcG9uZW50ID4gSU5UX01BWCAvIGNoZWNrKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY2hlY2sgKj0gQml0c1BlckNvbXBvbmVudDsKICAgICBpZiAoY2hlY2sgPiBJTlRfTUFYIC0gNykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZsYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpCkBAIC0yNDUsMTEgKzI0NSwxMSBAQAogICAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICBuQ29tcHMsIGJwYywgcHJlZGljdG9yLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOwogfQotRlhfRFdPUkQgRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENQREZfRGljdGlvbmFyeSogcFBhcmFtcywKK0ZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShib29sIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKICAgICBpbnQgcHJlZGljdG9yID0gMDsKLSAgICBGWF9CT09MIGJFYXJseUNoYW5nZSA9IFRSVUU7CisgICAgYm9vbCBiRWFybHlDaGFuZ2UgPSB0cnVlOwogICAgIGludCBDb2xvcnMgPSAwLCBCaXRzUGVyQ29tcG9uZW50ID0gMCwgQ29sdW1ucyA9IDA7CiAgICAgaWYgKHBQYXJhbXMpIHsKICAgICAgICAgcHJlZGljdG9yID0gKChDUERGX0RpY3Rpb25hcnkqKXBQYXJhbXMpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmVkaWN0b3IiKSk7CkBAIC0yNjUsMTQgKzI2NSwxNCBAQAogICAgICAgICAgICAgYkVhcmx5Q2hhbmdlLCBwcmVkaWN0b3IsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucywgZXN0aW1hdGVkX3NpemUsCiAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKIH0KLUZYX0JPT0wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCitib29sIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAogICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUsIENGWF9CeXRlU3RyaW5nJiBJbWFnZUVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywgRlhfRFdPUkQgbGFzdF9lc3RpbWF0ZWRfc2l6ZSwgRlhfQk9PTCBiSW1hZ2VBY2MpCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLCBGWF9EV09SRCBsYXN0X2VzdGltYXRlZF9zaXplLCBib29sIGJJbWFnZUFjYykKIAogewogICAgIENQREZfT2JqZWN0KiBwRGVjb2RlciA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpIDogTlVMTDsKICAgICBpZiAocERlY29kZXIgPT0gTlVMTCB8fCAocERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkgJiYgcERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwUGFyYW1zID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKSA6IE5VTEw7CiAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSBEZWNvZGVyTGlzdDsKQEAgLTMxMCwxMSArMzEwLDExIEBACiAgICAgICAgICAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7CiAgICAgICAgICAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwogICAgICAgICAgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoZmFsc2UsIGxhc3RfYnVmLCBsYXN0X3NpemUsIHBQYXJhbSwgZXN0aW1hdGVkX3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJMWldEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJMWlciKSkgewotICAgICAgICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIGxhc3RfYnVmLCBsYXN0X3NpemUsIHBQYXJhbSwgZXN0aW1hdGVkX3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKKyAgICAgICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZSh0cnVlLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUk4NURlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkE4NSIpKSB7CiAgICAgICAgICAgICBvZmZzZXQgPSBfQTg1RGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJBU0NJSUhleERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkFIeCIpKSB7CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgICAgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKICAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7CiAgICAgICAgICAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmZzZXQgPSBSdW5MZW5ndGhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzQwLDEzICszNDAsMTMgQEAKICAgICAgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwogICAgICAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7CiAgICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChsYXN0X2J1ZiAhPSBzcmNfYnVmKSB7CiAgICAgICAgICAgICBGWF9GcmVlKGxhc3RfYnVmKTsKICAgICAgICAgfQogICAgICAgICBpZiAob2Zmc2V0ID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbGFzdF9idWYgPSBuZXdfYnVmOwogICAgICAgICBsYXN0X3NpemUgPSBuZXdfc2l6ZTsKQEAgLTM1NSw3ICszNTUsNyBAQAogICAgIHBJbWFnZVBhcm1zID0gTlVMTDsKICAgICBkZXN0X2J1ZiA9IGxhc3RfYnVmOwogICAgIGRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGV4dGVybiBjb25zdCBGWF9XT1JEIFBERkRvY0VuY29kaW5nWzI1Nl0gPSB7CiAgICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsIDB4MDAwOCwgMHgwMDA5LApAQCAtMzg5LDcgKzM4OSw3IEBACiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwogICAgIGlmIChzcmNfbGVuID49IDIgJiYgKChzcmNfZGF0YVswXSA9PSAweGZlICYmIHNyY19kYXRhWzFdID09IDB4ZmYpIHx8IChzcmNfZGF0YVswXSA9PSAweGZmICYmIHNyY19kYXRhWzFdID09IDB4ZmUpKSkgewotICAgICAgICBGWF9CT09MIGJCRSA9IHNyY19kYXRhWzBdID09IDB4ZmU7CisgICAgICAgIGJvb2wgYkJFID0gc3JjX2RhdGFbMF0gPT0gMHhmZTsKICAgICAgICAgRlhfRFdPUkQgbWF4X2NoYXJzID0gKHNyY19sZW4gLSAyKSAvIDI7CiAgICAgICAgIGlmICghbWF4X2NoYXJzKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZW5jTGVuKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQotQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBGWF9CT09MIGJIZXgpCitDRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsIGJvb2wgYkhleCkKIHsKICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0OwogICAgIGludCBzcmNsZW4gPSBzcmMuR2V0TGVuZ3RoKCk7CkBAIC01MjEsNyArNTIxLDcgQEAKIHsKICAgICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CiAgICAgaWYgKHBFbmNvZGVycykgewotICAgICAgICByZXR1cm4gcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBzcmNfYnVmLCBzcmNfc2l6ZSwgRkFMU0UsIDAsIDAsIDAsIDAsIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICAgICAgICByZXR1cm4gcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKGZhbHNlLCBzcmNfYnVmLCBzcmNfc2l6ZSwgZmFsc2UsIDAsIDAsIDAsIDAsIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kb2N1bWVudC5jcHAKaW5kZXggYzBmNDVjNS4uMGVhNjkyZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kb2N1bWVudC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kb2N1bWVudC5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKICAgICBBU1NFUlQocFBhcnNlciAhPSBOVUxMKTsKICAgICBtX3BSb290RGljdCA9IE5VTEw7CiAgICAgbV9wSW5mb0RpY3QgPSBOVUxMOwotICAgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKKyAgICBtX2JMaW5lYXJpemVkID0gZmFsc2U7CiAgICAgbV9kd0ZpcnN0UGFnZU5vID0gMDsKICAgICBtX2R3Rmlyc3RQYWdlT2JqTnVtID0gMDsKICAgICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CkBAIC01OCw3ICs1OCw3IEBACiB9CiB2b2lkIENQREZfRG9jdW1lbnQ6OkxvYWRBc3luRG9jKENQREZfRGljdGlvbmFyeSAqcExpbmVhcml6ZWQpCiB7Ci0gICAgbV9iTGluZWFyaXplZCA9IFRSVUU7CisgICAgbV9iTGluZWFyaXplZCA9IHRydWU7CiAgICAgbV9MYXN0T2JqTnVtID0gbV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCk7CiAgICAgQ1BERl9PYmplY3QqIGluZGlyZWN0T2JqID0gR2V0SW5kaXJlY3RPYmplY3QobV9wUGFyc2VyLT5HZXRSb290T2JqTnVtKCkpOwogICAgIG1fcFJvb3REaWN0ID0gaW5kaXJlY3RPYmogPyBpbmRpcmVjdE9iai0+R2V0RGljdCgpIDogTlVMTDsKQEAgLTIyOCw3ICsyMjgsNyBAQAogewogICAgIEZYX0RXT1JEIG5QYWdlcyA9IG1fUGFnZUxpc3QuR2V0U2l6ZSgpOwogICAgIEZYX0RXT1JEIHNraXBfY291bnQgPSAwOwotICAgIEZYX0JPT0wgYlNraXBwZWQgPSBGQUxTRTsKKyAgICBib29sIGJTa2lwcGVkID0gZmFsc2U7CiAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5QYWdlczsgaSArKykgewogICAgICAgICBGWF9EV09SRCBvYmpudW0xID0gbV9QYWdlTGlzdC5HZXRBdChpKTsKICAgICAgICAgaWYgKG9iam51bTEgPT0gb2JqbnVtKSB7CkBAIC0yMzYsNyArMjM2LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWJTa2lwcGVkICYmIG9iam51bTEgPT0gMCkgewogICAgICAgICAgICAgc2tpcF9jb3VudCA9IGk7Ci0gICAgICAgICAgICBiU2tpcHBlZCA9IFRSVUU7CisgICAgICAgICAgICBiU2tpcHBlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogICAgIH0KICAgICByZXR1cm4gX0NvdW50UGFnZXMocFBhZ2VzLCAwKTsKIH0KLUZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFRoaXNQYWdlRGljdCkKK2Jvb2wgQ1BERl9Eb2N1bWVudDo6SXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFRoaXNQYWdlRGljdCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGFnZUxpc3QuR2V0U2l6ZSgpOyBpICsrKSB7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gR2V0UGFnZShpKTsKQEAgLTMxNiw0MiArMzE2LDQyIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoKChDUERGX1JlZmVyZW5jZSopIHBSZWYpLT5HZXRSZWZPYmpOdW0oKSA9PSBvYmpudW0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwQ29udGVudHMtPkdldE9iak51bSgpID09IG9iam51bSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfRFdPUkQgQ1BERl9Eb2N1bWVudDo6R2V0VXNlclBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24pIGNvbnN0CitGWF9EV09SRCBDUERGX0RvY3VtZW50OjpHZXRVc2VyUGVybWlzc2lvbnMoYm9vbCBiQ2hlY2tSZXZpc2lvbikgY29uc3QKIHsKICAgICBpZiAobV9wUGFyc2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwogICAgIH0KICAgICByZXR1cm4gbV9wUGFyc2VyLT5HZXRQZXJtaXNzaW9ucyhiQ2hlY2tSZXZpc2lvbik7CiB9Ci1GWF9CT09MIENQREZfRG9jdW1lbnQ6OklzT3duZXIoKSBjb25zdAorYm9vbCBDUERGX0RvY3VtZW50OjpJc093bmVyKCkgY29uc3QKIHsKICAgICBpZiAobV9wUGFyc2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gbV9wUGFyc2VyLT5Jc093bmVyKCk7CiB9Ci1GWF9CT09MIENQREZfRG9jdW1lbnQ6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKSBjb25zdAorYm9vbCBDUERGX0RvY3VtZW50OjpJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBib29sJiBiRm9ybSkgY29uc3QKIHsKICAgICB7CiAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqOwogICAgICAgICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgKHZvaWQqJilwT2JqKSkgewogICAgICAgICAgICAgYkZvcm0gPSBwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSAmJgogICAgICAgICAgICAgICAgICAgICAoKENQREZfU3RyZWFtKilwT2JqKS0+R2V0RGljdCgpLT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIkZvcm0iKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgIGJGb3JtID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBiRm9ybSA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcFBhcnNlci0+SXNGb3JtU3RyZWFtKG9iam51bSwgYkZvcm0pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAKaW5kZXggOWYzNTZhNC4uZmY2ZjBlMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2VuY3J5cHQuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgMHgyZiwgMHgwYywgMHhhOSwgMHhmZSwgMHg2NCwgMHg1MywgMHg2OSwgMHg3YQogfTsKIHZvaWQgQ2FsY0VuY3J5cHRLZXkoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdCwgY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LCBpbnQga2V5bGVuLCBGWF9CT09MIGJJZ25vcmVNZXRhLCBDUERGX0FycmF5KiBwSWRBcnJheSkKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LCBpbnQga2V5bGVuLCBib29sIGJJZ25vcmVNZXRhLCBDUERGX0FycmF5KiBwSWRBcnJheSkKIHsKICAgICBpbnQgcmV2aXNpb24gPSBwRW5jcnlwdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKTsKICAgICB1aW50OF90IHBhc3Njb2RlWzMyXTsKQEAgLTU3LDcgKzU3LDcgQEAKIHR5cGVkZWYgc3RydWN0IF9QREZfQ1JZUFRPSVRFTSAgewogICAgIGludDMyX3QJbV9DaXBoZXI7CiAgICAgaW50MzJfdAltX0tleUxlbjsKLSAgICBGWF9CT09MCQltX2JDaGVja2VkOworICAgIGJvb2wJCW1fYkNoZWNrZWQ7CiAgICAgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIqCW1fcENyeXB0b0hhbmRsZXI7CiB9IFBERl9DUllQVE9JVEVNOwogQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpCkBAIC02Niw3ICs2Niw3IEBACiAgICAgbV9SZXZpc2lvbiA9IDA7CiAgICAgbV9wUGFyc2VyID0gTlVMTDsKICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7Ci0gICAgbV9iT3duZXIgPSBGQUxTRTsKKyAgICBtX2JPd25lciA9IGZhbHNlOwogICAgIG1fUGVybWlzc2lvbnMgPSAwOwogICAgIG1fQ2lwaGVyID0gRlhDSVBIRVJfTk9ORTsKICAgICBtX0tleUxlbiA9IDA7CkBAIC03NCwzNiArNzQsMzYgQEAKIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6On5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKIHsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKK2Jvb2wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKIHsKICAgICBtX3BQYXJzZXIgPSBwUGFyc2VyOwogICAgIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gQ2hlY2tTZWN1cml0eShtX0tleUxlbik7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrU2VjdXJpdHkoaW50MzJfdCBrZXlfbGVuKQorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1NlY3VyaXR5KGludDMyX3Qga2V5X2xlbikKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBwYXNzd29yZCA9IG1fcFBhcnNlci0+R2V0UGFzc3dvcmQoKTsKLSAgICBpZiAoQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIFRSVUUsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKKyAgICBpZiAoQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIHRydWUsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKICAgICAgICAgaWYgKHBhc3N3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKCFDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgRkFMU0UsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIUNoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBmYWxzZSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtX2JPd25lciA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBtX2JPd25lciA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIEZBTFNFLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOworICAgIHJldHVybiBDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgZmFsc2UsIG1fRW5jcnlwdEtleSwga2V5X2xlbik7CiB9CiBGWF9EV09SRCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRQZXJtaXNzaW9ucygpCiB7CiAgICAgcmV0dXJuIG1fUGVybWlzc2lvbnM7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfTG9hZENyeXB0SW5mbyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGNpcGhlciwgaW50JiBrZXlsZW4pCitzdGF0aWMgYm9vbCBfTG9hZENyeXB0SW5mbyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGNpcGhlciwgaW50JiBrZXlsZW4pCiB7CiAgICAgaW50IFZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlYiKSk7CiAgICAgY2lwaGVyID0gRlhDSVBIRVJfUkM0OwpAQCAtMTExLDE0ICsxMTEsMTQgQEAKICAgICBpZiAoVmVyc2lvbiA+PSA0KSB7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcENyeXB0RmlsdGVycyA9IHBFbmNyeXB0RGljdC0+R2V0RGljdChGWF9CU1RSQygiQ0YiKSk7CiAgICAgICAgIGlmIChwQ3J5cHRGaWx0ZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAobmFtZSA9PSBGWF9CU1RSQygiSWRlbnRpdHkiKSkgewogICAgICAgICAgICAgY2lwaGVyID0gRlhDSVBIRVJfTk9ORTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERlZkZpbHRlciA9IHBDcnlwdEZpbHRlcnMtPkdldERpY3QobmFtZSk7CiAgICAgICAgICAgICBpZiAocERlZkZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBuS2V5Qml0cyA9IDA7CiAgICAgICAgICAgICBpZiAoVmVyc2lvbiA9PSA0KSB7CkBAIC0xNDIsMTQgKzE0MiwxNCBAQAogICAgICAgICBrZXlsZW4gPSBWZXJzaW9uID4gMSA/IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDQwKSAvIDggOiA1OwogICAgIH0KICAgICBpZiAoa2V5bGVuID4gMzIgfHwga2V5bGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KQorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKIHsKICAgICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKLSAgICBtX2JPd25lciA9IEZBTFNFOworICAgIG1fYk93bmVyID0gZmFsc2U7CiAgICAgbV9WZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOwogICAgIG1fUmV2aXNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7CiAgICAgbV9QZXJtaXNzaW9ucyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUCIpLCAtMSk7CkBAIC0xNTksMTcgKzE1OSwxNyBAQAogICAgIENGWF9CeXRlU3RyaW5nIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdG1GIikpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdHJGIikpOwogICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIV9Mb2FkQ3J5cHRJbmZvKHBFbmNyeXB0RGljdCwgc3RyZl9uYW1lLCBtX0NpcGhlciwgbV9LZXlMZW4pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6TG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pCitib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCB0eXBlLCBpbnQmIGNpcGhlciwgaW50JiBrZXlfbGVuKQogewogICAgIG1fcEVuY3J5cHREaWN0ID0gcEVuY3J5cHREaWN0OwotICAgIG1fYk93bmVyID0gRkFMU0U7CisgICAgbV9iT3duZXIgPSBmYWxzZTsKICAgICBtX1ZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlYiKSk7CiAgICAgbV9SZXZpc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKTsKICAgICBtX1Blcm1pc3Npb25zID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQIiksIC0xKTsKQEAgLTE3OCwyMyArMTc4LDIzIEBACiAgICAgICAgIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdG1GIikpOwogICAgICAgICBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RyRiIpKTsKICAgICAgICAgaWYgKHN0bWZfbmFtZSAhPSBzdHJmX25hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIV9Mb2FkQ3J5cHRJbmZvKHBFbmNyeXB0RGljdCwgc3RyZl9uYW1lLCBjaXBoZXIsIGtleV9sZW4pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0NpcGhlciA9IGNpcGhlcjsKICAgICBtX0tleUxlbiA9IGtleV9sZW47Ci0gICAgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgY29uc3QgdWludDhfdComIGJ1ZmZlciwgaW50JiBrZXlsZW4pCitib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgY29uc3QgdWludDhfdComIGJ1ZmZlciwgaW50JiBrZXlsZW4pCiB7CiAgICAgY2lwaGVyID0gbV9DaXBoZXI7CiAgICAgYnVmZmVyID0gbV9FbmNyeXB0S2V5OwogICAgIGtleWxlbiA9IG1fS2V5TGVuOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogI2RlZmluZSBGWF9HRVRfMzJXT1JEKG4sYixpKQkJCQkJCQkJXAogICAgIHsJCQkJCQkJCQkJCQkJCVwKQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2sodmVjdG9yLCA0OCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMTYsIFRSVUUpOworICAgICAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAxNiwgdHJ1ZSk7CiAgICAgICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwogICAgICAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgRSwgY29udGVudC5HZXRCdWZmZXIoKSwgaUJ1Zkxlbik7CiAgICAgICAgIGludCBpSGFzaCA9IDA7CkBAIC0yODgsMTYgKzI4OCwxNiBAQAogICAgICAgICBGWFNZU19tZW1jcHkoaGFzaCwgaW5wdXQsIDMyKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9DaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLAotICAgICAgICBGWF9CT09MIGJPd25lciwgdWludDhfdCoga2V5KQorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBva2V5ID0gbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJPIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKICAgICBpZiAob2tleS5HZXRMZW5ndGgoKSA8IDQ4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKICAgICBpZiAodWtleS5HZXRMZW5ndGgoKSA8IDQ4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBwa2V5ID0gYk93bmVyID8gKGNvbnN0IHVpbnQ4X3QqKW9rZXkgOiAoY29uc3QgdWludDhfdCopdWtleTsKICAgICB1aW50OF90IHNoYVsxMjhdOwpAQCAtMzE0LDEwICszMTQsMTAgQEAKICAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0KTsKICAgICB9CiAgICAgaWYgKEZYU1lTX21lbWNtcChkaWdlc3QsIHBrZXksIDMyKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoa2V5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7CiAgICAgICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCAoY29uc3QgdWludDhfdCopcGtleSArIDQwLCAoYk93bmVyID8gKGNvbnN0IHVpbnQ4X3QqKXVrZXkgOiBOVUxMKSwgZGlnZXN0KTsKQEAgLTMzMiwxOSArMzMyLDE5IEBACiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIGVrZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwogICAgIGlmIChla2V5LkdldExlbmd0aCgpIDwgMzIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QsIDMyLCBGQUxTRSk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdCwgMzIsIGZhbHNlKTsKICAgICB1aW50OF90IGl2WzE2XTsKICAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKICAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKICAgICBDUllQVF9BRVNEZWNyeXB0KGFlcywga2V5LCBla2V5LCAzMik7Ci0gICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIEZBTFNFKTsKKyAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgZmFsc2UpOwogICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwogICAgIENGWF9CeXRlU3RyaW5nIHBlcm1zID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiUGVybXMiKSk7CiAgICAgaWYgKHBlcm1zLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdWludDhfdCBwZXJtc19idWZbMTZdOwogICAgIEZYU1lTX21lbXNldChwZXJtc19idWYsIDAsIHNpemVvZihwZXJtc19idWYpKTsKQEAgLTM1NywyMSArMzU3LDIxIEBACiAgICAgQ1JZUFRfQUVTRGVjcnlwdChhZXMsIGJ1ZiwgcGVybXNfYnVmLCAxNik7CiAgICAgRlhfRnJlZShhZXMpOwogICAgIGlmIChidWZbOV0gIT0gJ2EnIHx8IGJ1ZlsxMF0gIT0gJ2QnIHx8IGJ1ZlsxMV0gIT0gJ2InKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoRlhEV09SRF9HRVRfTFNCRklSU1QoYnVmKSAhPSBtX1Blcm1pc3Npb25zKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKGJ1Zls4XSA9PSAnVCcgJiYgIUlzTWV0YWRhdGFFbmNyeXB0ZWQoKSkgfHwgKGJ1Zls4XSA9PSAnRicgJiYgSXNNZXRhZGF0YUVuY3J5cHRlZCgpKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1pbnQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCBGWF9CT09MIGJPd25lciwgdWludDhfdCoga2V5KQoraW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgYm9vbCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKIHsKICAgICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc19zaXplLCBiT3duZXIsIGtleSwgbV9LZXlMZW4pOwogfQotaW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbikKK2ludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBib29sIGJPd25lciwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCiB7CiAgICAgaWYgKG1fUmV2aXNpb24gPj0gNSkgewogICAgICAgICByZXR1cm4gQUVTMjU2X0NoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIGJPd25lciwga2V5KTsKQEAgLTM4MywxNiArMzgzLDE2IEBACiAgICAgaWYgKGJPd25lcikgewogICAgICAgICByZXR1cm4gQ2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBrZXksIGtleV9sZW4pOwogICAgIH0KLSAgICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIEZBTFNFLCBrZXksIGtleV9sZW4pIHx8IENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBUUlVFLCBrZXksIGtleV9sZW4pOworICAgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgZmFsc2UsIGtleSwga2V5X2xlbikgfHwgQ2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIHRydWUsIGtleSwga2V5X2xlbik7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgIEZYX0JPT0wgYklnbm9yZUVuY3J5cHRNZXRhLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbikKK2Jvb2wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICAgICAgYm9vbCBiSWdub3JlRW5jcnlwdE1ldGEsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKQogewogICAgIENhbGNFbmNyeXB0S2V5KG1fcEVuY3J5cHREaWN0LCBwYXNzd29yZCwgcGFzc19zaXplLCBrZXksIGtleV9sZW4sIGJJZ25vcmVFbmNyeXB0TWV0YSwKICAgICAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldElEQXJyYXkoKSk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVSIpKSA6IENGWF9CeXRlU3RyaW5nKCk7CiAgICAgaWYgKHVrZXkuR2V0TGVuZ3RoKCkgPCAxNikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdWludDhfdCB1a2V5YnVmWzMyXTsKICAgICBpZiAobV9SZXZpc2lvbiA9PSAyKSB7CkBAIC00MjUsOSArNDI1LDkgQEAKICAgICAgICAgcmV0dXJuIEZYU1lTX21lbWNtcCh0ZXN0LCB1a2V5YnVmLCAxNikgPT0gMDsKICAgICB9CiAgICAgaWYgKEZYU1lTX21lbWNtcCgodm9pZCopdWtleS5jX3N0cigpLCB1a2V5YnVmLCAxNikgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDRlhfQnl0ZVN0cmluZyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplKQogewpAQCAtNDgwLDE4ICs0ODAsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKG9rZXlidWYsIGxlbik7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAorYm9vbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja093bmVyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKICAgICAgICAgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgdXNlcl9wYXNzID0gR2V0VXNlclBhc3N3b3JkKHBhc3N3b3JkLCBwYXNzX3NpemUsIGtleV9sZW4pOwotICAgIGlmIChDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgRkFMU0UsIGtleSwga2V5X2xlbikpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBmYWxzZSwga2V5LCBrZXlfbGVuKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBUUlVFLCBrZXksIGtleV9sZW4pOworICAgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgdHJ1ZSwga2V5LCBrZXlfbGVuKTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6SXNNZXRhZGF0YUVuY3J5cHRlZCgpCitib29sIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OklzTWV0YWRhdGFFbmNyeXB0ZWQoKQogewotICAgIHJldHVybiBtX3BFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIFRSVUUpOworICAgIHJldHVybiBtX3BFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIHRydWUpOwogfQogQ1BERl9TZWN1cml0eUhhbmRsZXIqIEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKQogewpAQCAtNDk5LDcgKzQ5OSw3IEBACiB9CiB2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX0FycmF5KiBwSWRBcnJheSwKICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIGJvb2wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpCiB7CiAgICAgaW50IGNpcGhlciA9IDAsIGtleV9sZW4gPSAwOwogICAgIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0LCB0eXBlLCBjaXBoZXIsIGtleV9sZW4pKSB7CkBAIC01MTcsMTAgKzUxNywxMCBAQAogICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBtX0VuY3J5cHRLZXksIDMyKTsKICAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSJ0aGVyZSIsIDUpOwogICAgICAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBtX0VuY3J5cHRLZXkpOwotICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgRkFMU0UsIG1fRW5jcnlwdEtleSk7CisgICAgICAgIEFFUzI1Nl9TZXRQYXNzd29yZChwRW5jcnlwdERpY3QsIHVzZXJfcGFzcywgdXNlcl9zaXplLCBmYWxzZSwgbV9FbmNyeXB0S2V5KTsKICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCBUUlVFLCBtX0VuY3J5cHRLZXkpOwotICAgICAgICAgICAgQUVTMjU2X1NldFBlcm1zKHBFbmNyeXB0RGljdCwgbV9QZXJtaXNzaW9ucywgcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgVFJVRSksIG1fRW5jcnlwdEtleSk7CisgICAgICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCB0cnVlLCBtX0VuY3J5cHRLZXkpOworICAgICAgICAgICAgQUVTMjU2X1NldFBlcm1zKHBFbmNyeXB0RGljdCwgbV9QZXJtaXNzaW9ucywgcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgdHJ1ZSksIG1fRW5jcnlwdEtleSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTU1NCw3ICs1NTQsNyBAQAogICAgICAgICB9CiAgICAgICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIk8iKSwgQ0ZYX0J5dGVTdHJpbmcocGFzc2NvZGUsIDMyKSk7CiAgICAgfQotICAgIENhbGNFbmNyeXB0S2V5KG1fcEVuY3J5cHREaWN0LCAodWludDhfdCopdXNlcl9wYXNzLCB1c2VyX3NpemUsIG1fRW5jcnlwdEtleSwga2V5X2xlbiwgRkFMU0UsIHBJZEFycmF5KTsKKyAgICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgKHVpbnQ4X3QqKXVzZXJfcGFzcywgdXNlcl9zaXplLCBtX0VuY3J5cHRLZXksIGtleV9sZW4sIGZhbHNlLCBwSWRBcnJheSk7CiAgICAgaWYgKG1fUmV2aXNpb24gPCAzKSB7CiAgICAgICAgIHVpbnQ4X3QgdGVtcGJ1ZlszMl07CiAgICAgICAgIEZYU1lTX21lbWNweSh0ZW1wYnVmLCBkZWZwYXNzY29kZSwgMzIpOwpAQCAtNTg2LDEzICs1ODYsMTMgQEAKICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0RXT1JEIHR5cGUpCiB7Ci0gICAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIG93bmVyX3Bhc3MsIG93bmVyX3NpemUsIFRSVUUsIHR5cGUpOworICAgIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCB0cnVlLCB0eXBlKTsKIH0KIHZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfQXJyYXkqIHBJZEFycmF5LCBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsIEZYX0RXT1JEIHVzZXJfc2l6ZSwgRlhfRFdPUkQgdHlwZSkKIHsKLSAgICBPbkNyZWF0ZShwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgTlVMTCwgMCwgRkFMU0UsIHR5cGUpOworICAgIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBOVUxMLCAwLCBmYWxzZSwgdHlwZSk7CiB9Ci12b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9TZXRQYXNzd29yZChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYk93bmVyLCBjb25zdCB1aW50OF90KiBrZXkpCit2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9TZXRQYXNzd29yZChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIGJvb2wgYk93bmVyLCBjb25zdCB1aW50OF90KiBrZXkpCiB7CiAgICAgdWludDhfdCBzaGFbMTI4XTsKICAgICBDUllQVF9TSEExU3RhcnQoc2hhKTsKQEAgLTYyNyw3ICs2MjcsNyBAQAogICAgICAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QxKTsKICAgICB9CiAgICAgdWludDhfdCogYWVzID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7Ci0gICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdDEsIDMyLCBUUlVFKTsKKyAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwgZGlnZXN0MSwgMzIsIHRydWUpOwogICAgIHVpbnQ4X3QgaXZbMTZdOwogICAgIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOwogICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwpAQCAtNjM2LDcgKzYzNiw3IEBACiAgICAgcEVuY3J5cHREaWN0LT5TZXRBdFN0cmluZyhiT3duZXIgPyBGWF9CU1RSQygiT0UiKSA6IEZYX0JTVFJDKCJVRSIpLCBDRlhfQnl0ZVN0cmluZyhkaWdlc3QxLCAzMikpOwogfQogdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfU2V0UGVybXMoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHBlcm1pc3Npb25zLAotICAgICAgICBGWF9CT09MIGJFbmNyeXB0TWV0YWRhdGEsIGNvbnN0IHVpbnQ4X3QqIGtleSkKKyAgICAgICAgYm9vbCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpCiB7CiAgICAgdWludDhfdCBidWZbMTZdOwogICAgIGJ1ZlswXSA9ICh1aW50OF90KXBlcm1pc3Npb25zOwpAQCAtNjUyLDcgKzY1Miw3IEBACiAgICAgYnVmWzEwXSA9ICdkJzsKICAgICBidWZbMTFdID0gJ2InOwogICAgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDMyLCBUUlVFKTsKKyAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgdHJ1ZSk7CiAgICAgdWludDhfdCBpdlsxNl0sIGJ1ZjFbMTZdOwogICAgIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOwogICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwpAQCAtNjYwLDcgKzY2MCw3IEBACiAgICAgRlhfRnJlZShhZXMpOwogICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlBlcm1zIiksIENGWF9CeXRlU3RyaW5nKGJ1ZjEsIDE2KSk7CiB9Ci12b2lkIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEJsb2NrKEZYX0JPT0wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKK3ZvaWQgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0QmxvY2soYm9vbCBiRW5jcnlwdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewpAQCAtNzIwLDE4ICs3MjAsMTggQEAKIH0KIHR5cGVkZWYgc3RydWN0IF9BRVNDcnlwdENvbnRleHQgewogICAgIHVpbnQ4X3QJCW1fQ29udGV4dFsyMDQ4XTsKLSAgICBGWF9CT09MCQltX2JJVjsKKyAgICBib29sCQltX2JJVjsKICAgICB1aW50OF90CQltX0Jsb2NrWzE2XTsKICAgICBGWF9EV09SRAltX0Jsb2NrT2Zmc2V0OwogfSBBRVNDcnlwdENvbnRleHQ7Ci12b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCkKK3ZvaWQqIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBib29sIGJFbmNyeXB0KQogewogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTICYmIG1fS2V5TGVuID09IDMyKSB7CiAgICAgICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSBGWF9BbGxvYyhBRVNDcnlwdENvbnRleHQsIDEpOwotICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSBUUlVFOworICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSB0cnVlOwogICAgICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CiAgICAgICAgIENSWVBUX0FFU1NldEtleShwQ29udGV4dC0+bV9Db250ZXh0LCAxNiwgbV9FbmNyeXB0S2V5LCAzMiwgYkVuY3J5cHQpOwogICAgICAgICBpZiAoYkVuY3J5cHQpIHsKQEAgLTc1Nyw3ICs3NTcsNyBAQAogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CiAgICAgICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSBGWF9BbGxvYyhBRVNDcnlwdENvbnRleHQsIDEpOwotICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSBUUlVFOworICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSB0cnVlOwogICAgICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CiAgICAgICAgIENSWVBUX0FFU1NldEtleShwQ29udGV4dC0+bV9Db250ZXh0LCAxNiwgcmVhbGtleSwgMTYsIGJFbmNyeXB0KTsKICAgICAgICAgaWYgKGJFbmNyeXB0KSB7CkBAIC03NzIsMjUgKzc3MiwyNSBAQAogICAgIENSWVBUX0FyY0ZvdXJTZXR1cChwQ29udGV4dCwgcmVhbGtleSwgcmVhbGtleWxlbik7CiAgICAgcmV0dXJuIHBDb250ZXh0OwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KQorYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBib29sIGJFbmNyeXB0KQogewogICAgIGlmICghY29udGV4dCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9SQzQpIHsKICAgICAgICAgaW50IG9sZF9zaXplID0gZGVzdF9idWYuR2V0U2l6ZSgpOwogICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7CiAgICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdChjb250ZXh0LCBkZXN0X2J1Zi5HZXRCdWZmZXIoKSArIG9sZF9zaXplLCBzcmNfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IChBRVNDcnlwdENvbnRleHQqKWNvbnRleHQ7CiAgICAgaWYgKHBDb250ZXh0LT5tX2JJViAmJiBiRW5jcnlwdCkgewogICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhwQ29udGV4dC0+bV9CbG9jaywgMTYpOwotICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSBGQUxTRTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIHNyY19vZmYgPSAwOwogICAgIEZYX0RXT1JEIHNyY19sZWZ0ID0gc3JjX3NpemU7CkBAIC04MDYsNyArODA2LDcgQEAKICAgICAgICAgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7CiAgICAgICAgICAgICBpZiAoIWJFbmNyeXB0ICYmIHBDb250ZXh0LT5tX2JJVikgewogICAgICAgICAgICAgICAgIENSWVBUX0FFU1NldElWKHBDb250ZXh0LT5tX0NvbnRleHQsIHBDb250ZXh0LT5tX0Jsb2NrKTsKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY19vZmYgPCBzcmNfc2l6ZSkgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmxvY2tfYnVmWzE2XTsKQEAgLTgyMywxOSArODIzLDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KQorYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsIGJvb2wgYkVuY3J5cHQpCiB7CiAgICAgaWYgKCFjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9SQzQpIHsKICAgICAgICAgRlhfRnJlZShjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gKEFFU0NyeXB0Q29udGV4dCopY29udGV4dDsKICAgICBpZiAoYkVuY3J5cHQpIHsKQEAgLTg1NiwyNCArODU2LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgRlhfRnJlZShwQ29udGV4dCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKQogewotICAgIHJldHVybiBDcnlwdFN0YXJ0KG9iam51bSwgZ2VubnVtLCBGQUxTRSk7CisgICAgcmV0dXJuIENyeXB0U3RhcnQob2JqbnVtLCBnZW5udW0sIGZhbHNlKTsKIH0KIEZYX0RXT1JEIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpEZWNyeXB0R2V0U2l6ZShGWF9EV09SRCBzcmNfc2l6ZSkKIHsKICAgICByZXR1cm4gbV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTID8gc3JjX3NpemUgLSAxNiA6IHNyY19zaXplOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpCitib29sIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpJbml0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcikKIHsKICAgICBjb25zdCB1aW50OF90KiBrZXk7CiAgICAgaWYgKCFwU2VjdXJpdHlIYW5kbGVyLT5HZXRDcnlwdEluZm8obV9DaXBoZXIsIGtleSwgbV9LZXlMZW4pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9LZXlMZW4gPiAzMiB8fCBtX0tleUxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX0NpcGhlciAhPSBGWENJUEhFUl9OT05FKSB7CiAgICAgICAgIEZYU1lTX21lbWNweShtX0VuY3J5cHRLZXksIGtleSwgbV9LZXlMZW4pOwpAQCAtODgxLDkgKzg4MSw5IEBACiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewogICAgICAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pCitib29sIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpJbml0KGludCBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbikKIHsKICAgICBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewogICAgICAgICBzd2l0Y2goa2V5bGVuKSB7CkBAIC04OTIsMTUgKzg5MiwxNSBAQAogICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX0FFUzIpIHsKICAgICAgICAgaWYgKGtleWxlbiAhPSAzMikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChjaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CiAgICAgICAgIGlmIChrZXlsZW4gPCA1IHx8IGtleWxlbiA+IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoa2V5bGVuID4gMzIpIHsKQEAgLTkxMywxNiArOTEzLDE2IEBACiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewogICAgICAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKK2Jvb2wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQogewotICAgIHJldHVybiBDcnlwdFN0cmVhbShjb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIEZBTFNFKTsKKyAgICByZXR1cm4gQ3J5cHRTdHJlYW0oY29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBmYWxzZSk7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpEZWNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQorYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKLSAgICByZXR1cm4gQ3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYsIEZBTFNFKTsKKyAgICByZXR1cm4gQ3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYsIGZhbHNlKTsKIH0KIEZYX0RXT1JEIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpFbmNyeXB0R2V0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQogewpAQCAtOTMxLDExICs5MzEsMTEgQEAKICAgICB9CiAgICAgcmV0dXJuIHNyY19zaXplOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAorYm9vbCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKLSAgICBDcnlwdEJsb2NrKFRSVUUsIG9iam51bSwgZ2VubnVtLCBzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgQ3J5cHRCbG9jayh0cnVlLCBvYmpudW0sIGdlbm51bSwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0NyeXB0b0hhbmRsZXI6OkRlY3J5cHQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIENGWF9CeXRlU3RyaW5nJiBzdHIpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAKaW5kZXggMTk1OGZhYi4uZmZjZTQ2YiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcApAQCAtOSw3ICs5LDcgQEAKIHsKICAgICBtX3BSb290RGljdCA9IE5VTEw7CiAgICAgbV9wRmlsZSA9IE5VTEw7Ci0gICAgbV9iT3duRmlsZSA9IEZBTFNFOworICAgIG1fYk93bkZpbGUgPSBmYWxzZTsKIH0KIENGREZfRG9jdW1lbnQ6On5DRkRGX0RvY3VtZW50KCkKIHsKQEAgLTI2LDcgKzI2LDcgQEAKICAgICBwRG9jLT5tX3BSb290RGljdC0+U2V0QXQoRlhfQlNUUkMoIkZERiIpLCBwRkRGRGljdCk7CiAgICAgcmV0dXJuIHBEb2M7CiB9Ci1DRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkKK0NGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OlBhcnNlRmlsZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJPd25GaWxlKQogewogICBpZiAoIXBGaWxlKSB7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC00MSwxNiArNDEsMTYgQEAKIH0KIENGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OlBhcnNlTWVtb3J5KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQogewotICAgIHJldHVybiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgc2l6ZSksIFRSVUUpOworICAgIHJldHVybiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgc2l6ZSksIHRydWUpOwogfQotdm9pZCBDRkRGX0RvY3VtZW50OjpQYXJzZVN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJPd25GaWxlKQordm9pZCBDRkRGX0RvY3VtZW50OjpQYXJzZVN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBib29sIGJPd25GaWxlKQogewogICAgIG1fcEZpbGUgPSBwRmlsZTsKICAgICBtX2JPd25GaWxlID0gYk93bkZpbGU7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwogICAgIHBhcnNlci5Jbml0UGFyc2VyKG1fcEZpbGUsIDApOwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEZYX0JPT0wgYk51bWJlcjsKKyAgICAgICAgYm9vbCBiTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gcGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgICAgICBpZiAoYk51bWJlcikgewogICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKQEAgLTg1LDEwICs4NSwxMCBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDRkRGX0RvY3VtZW50OjpXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3QKK2Jvb2wgQ0ZERl9Eb2N1bWVudDo6V3JpdGVCdWYoQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIGNvbnN0CiB7CiAgICAgaWYgKG1fcFJvb3REaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGJ1ZiA8PCBGWF9CU1RSQygiJUZERi0xLjJcclxuIik7CiAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9JbmRpcmVjdE9ianMuR2V0U3RhcnRQb3NpdGlvbigpOwpAQCAtOTksNyArOTksNyBAQAogICAgICAgICBidWYgPDwgKEZYX0RXT1JEKW9iam51bSA8PCBGWF9CU1RSQygiIDAgb2JqXHJcbiIpIDw8IHBPYmogPDwgRlhfQlNUUkMoIlxyXG5lbmRvYmpcclxuXHJcbiIpOwogICAgIH0KICAgICBidWYgPDwgRlhfQlNUUkMoInRyYWlsZXJcclxuPDwvUm9vdCAiKSA8PCBtX3BSb290RGljdC0+R2V0T2JqTnVtKCkgPDwgRlhfQlNUUkMoIiAwIFI+PlxyXG4lJUVPRlxyXG4iKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9XaWRlU3RyaW5nIENGREZfRG9jdW1lbnQ6OkdldFdpbjMyUGF0aCgpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcAppbmRleCBmZWQ0NTQ2Li5mODFhYTczIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKIAogQ0ZYX0RhdGFGaWx0ZXI6OkNGWF9EYXRhRmlsdGVyKCkKIHsKLSAgICBtX2JFT0YgPSBGQUxTRTsKKyAgICBtX2JFT0YgPSBmYWxzZTsKICAgICBtX3BEZXN0RmlsdGVyID0gTlVMTDsKICAgICBtX1NyY1BvcyA9IDA7CiB9CkBAIC02OCwxNCArNjgsMTQgQEAKICAgICB9IGVsc2UgewogICAgICAgICB2X0ZpbHRlckZpbmlzaChkZXN0X2J1Zik7CiAgICAgfQotICAgIG1fYkVPRiA9IFRSVUU7CisgICAgbV9iRU9GID0gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OlJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KQogewogICAgIGlmIChtX2JFT0YpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtX2JFT0YgPSBUUlVFOworICAgIG1fYkVPRiA9IHRydWU7CiAgICAgbV9TcmNQb3MgLT0gbGVmdF9pbnB1dDsKIH0KIENGWF9EYXRhRmlsdGVyKiBGUERGX0NyZWF0ZUZpbHRlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCkBAIC0xMTMsOSArMTEzLDkgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9SdW5MZW5GaWx0ZXI7CiAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ0MnLCAnSScsICdUJyk6IHsKICAgICAgICAgICAgICAgICBpbnQgRW5jb2RpbmcgPSAwOwotICAgICAgICAgICAgICAgIGludCBiRW5kT2ZMaW5lID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaW50IGJCeXRlQWxpZ24gPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBpbnQgYkJsYWNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaW50IGJFbmRPZkxpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgYkJ5dGVBbGlnbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludCBiQmxhY2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpbnQgblJvd3MgPSAwOwogICAgICAgICAgICAgICAgIGludCBuQ29sdW1ucyA9IDE3Mjg7CiAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbSkgewpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgfQogICAgIHJldHVybiBwRmlyc3RGaWx0ZXI7CiB9Ci1DUERGX1N0cmVhbUZpbHRlciogQ1BERl9TdHJlYW06OkdldFN0cmVhbUZpbHRlcihGWF9CT09MIGJSYXcpIGNvbnN0CitDUERGX1N0cmVhbUZpbHRlciogQ1BERl9TdHJlYW06OkdldFN0cmVhbUZpbHRlcihib29sIGJSYXcpIGNvbnN0CiB7CiAgICAgQ0ZYX0RhdGFGaWx0ZXIqIHBGaXJzdEZpbHRlciA9IE5VTEw7CiAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKQEAgLTI5NCw3ICsyOTQsNyBAQAogfQogdm9pZCBDUERGX0RlY3J5cHRGaWx0ZXI6OnZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQogewotICAgIG1fYkVPRiA9IFRSVUU7CisgICAgbV9iRU9GID0gdHJ1ZTsKICAgICBpZiAobV9wQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zMzAsNyArMzMwLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUNQREZfTHp3RmlsdGVyOjpDUERGX0x6d0ZpbHRlcihGWF9CT09MIGJFYXJseUNoYW5nZSkKK0NQREZfTHp3RmlsdGVyOjpDUERGX0x6d0ZpbHRlcihib29sIGJFYXJseUNoYW5nZSkKIHsKICAgICBtX2JFYXJseUNoYW5nZSA9IGJFYXJseUNoYW5nZSA/IDEgOiAwOwogICAgIG1fQ29kZUxlbiA9IDk7CkBAIC02OTcsNyArNjk3LDcgQEAKIENQREZfSnBlZ0ZpbHRlcjo6Q1BERl9KcGVnRmlsdGVyKCkKIHsKICAgICBtX3BDb250ZXh0ID0gTlVMTDsKLSAgICBtX2JHb3RIZWFkZXIgPSBGQUxTRTsKKyAgICBtX2JHb3RIZWFkZXIgPSBmYWxzZTsKICAgICBtX3BTY2FubGluZSA9IE5VTEw7CiAgICAgbV9pTGluZSA9IDA7CiB9CkBAIC03NDIsNyArNzQyLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+U3RhcnRTY2FubGluZShtX3BDb250ZXh0LCAxKTsKLSAgICAgICAgbV9iR290SGVhZGVyID0gVFJVRTsKKyAgICAgICAgbV9iR290SGVhZGVyID0gdHJ1ZTsKICAgICAgICAgbV9QaXRjaCA9IG1fV2lkdGggKiBtX25Db21wczsKICAgICB9CiAgICAgaWYgKG1fcFNjYW5saW5lID09IE5VTEwpIHsKQEAgLTc2NSw5ICs3NjUsOSBAQAogQ1BERl9GYXhGaWx0ZXI6OkNQREZfRmF4RmlsdGVyKCkKIHsKICAgICBtX0VuY29kaW5nID0gMDsKLSAgICBtX2JFbmRPZkxpbmUgPSBGQUxTRTsKLSAgICBtX2JCeXRlQWxpZ24gPSBGQUxTRTsKLSAgICBtX2JCbGFjayA9IEZBTFNFOworICAgIG1fYkVuZE9mTGluZSA9IGZhbHNlOworICAgIG1fYkJ5dGVBbGlnbiA9IGZhbHNlOworICAgIG1fYkJsYWNrID0gZmFsc2U7CiAgICAgbV9uUm93cyA9IDA7CiAgICAgbV9uQ29sdW1ucyA9IDA7CiAgICAgbV9QaXRjaCA9IDA7CkBAIC03ODUsNyArNzg1LDcgQEAKICAgICAgICAgRlhfRnJlZShtX3BSZWZCdWYpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9GYXhGaWx0ZXI6OkluaXRpYWxpemUoaW50IEVuY29kaW5nLCBpbnQgYkVuZE9mTGluZSwgaW50IGJCeXRlQWxpZ24sIGludCBiQmxhY2ssIGludCBuUm93cywgaW50IG5Db2x1bW5zKQorYm9vbCBDUERGX0ZheEZpbHRlcjo6SW5pdGlhbGl6ZShpbnQgRW5jb2RpbmcsIGludCBiRW5kT2ZMaW5lLCBpbnQgYkJ5dGVBbGlnbiwgaW50IGJCbGFjaywgaW50IG5Sb3dzLCBpbnQgbkNvbHVtbnMpCiB7CiAgICAgbV9FbmNvZGluZyA9IEVuY29kaW5nOwogICAgIG1fYkVuZE9mTGluZSA9IGJFbmRPZkxpbmU7CkBAIC04MDAsNyArODAwLDcgQEAKICAgICBGWFNZU19tZW1zZXQobV9wUmVmQnVmLCAweGZmLCBtX1BpdGNoKTsKICAgICBtX2lSb3cgPSAwOwogICAgIG1fSW5wdXRCaXRQb3MgPSAwOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0ZheEZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCiB7CkBAIC04MjEsMTkgKzgyMSwxOSBAQAogICAgICAgICBmYXhfc3JjX3NpemUgPSBzcmNfc2l6ZTsKICAgICAgICAgYml0cG9zID0gMDsKICAgICB9Ci0gICAgUHJvY2Vzc0RhdGEoZmF4X3NyY19idWYsIGZheF9zcmNfc2l6ZSwgYml0cG9zLCBGQUxTRSwgZGVzdF9idWYpOworICAgIFByb2Nlc3NEYXRhKGZheF9zcmNfYnVmLCBmYXhfc3JjX3NpemUsIGJpdHBvcywgZmFsc2UsIGRlc3RfYnVmKTsKICAgICBpbnQgbGVmdF9iaXRzID0gZmF4X3NyY19zaXplICogOCAtIGJpdHBvczsKICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGZheF9zcmNfYnVmICsgYml0cG9zIC8gOCwgKGxlZnRfYml0cyArIDcpIC8gOCk7CiAgICAgbV9JbnB1dEJpdFBvcyA9IGJpdHBvcyAlIDg7CiB9CiB2b2lkIENQREZfRmF4RmlsdGVyOjp2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKLSAgICBQcm9jZXNzRGF0YShtX0lucHV0QnVmLkdldEJ1ZmZlcigpLCBtX0lucHV0QnVmLkdldFNpemUoKSwgbV9JbnB1dEJpdFBvcywgVFJVRSwgZGVzdF9idWYpOworICAgIFByb2Nlc3NEYXRhKG1fSW5wdXRCdWYuR2V0QnVmZmVyKCksIG1fSW5wdXRCdWYuR2V0U2l6ZSgpLCBtX0lucHV0Qml0UG9zLCB0cnVlLCBkZXN0X2J1Zik7CiB9Ci1GWF9CT09MIF9GYXhTa2lwRU9MKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7Ci1GWF9CT09MIF9GYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29sdW1ucyk7Ci1GWF9CT09MIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpOwotdm9pZCBDUERGX0ZheEZpbHRlcjo6UHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBGWF9CT09MIGJGaW5pc2gsCitib29sIF9GYXhTa2lwRU9MKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7Citib29sIF9GYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29sdW1ucyk7Citib29sIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpOwordm9pZCBDUERGX0ZheEZpbHRlcjo6UHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBib29sIGJGaW5pc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKIHsKICAgICBpbnQgYml0c2l6ZSA9IHNyY19zaXplICogODsKQEAgLTg2MywyMSArODYzLDIxIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfRmF4RmlsdGVyOjpSZWFkTGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCitib29sIENQREZfRmF4RmlsdGVyOjpSZWFkTGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCiB7CiAgICAgaWYgKCFfRmF4U2tpcEVPTChzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBGWF9CT09MIHJldDsKKyAgICBib29sIHJldDsKICAgICBpZiAobV9FbmNvZGluZyA8IDApIHsKICAgICAgICAgcmV0ID0gX0ZheEc0R2V0Um93KHNyY19idWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fcFJlZkJ1ZiwgbV9uQ29sdW1ucyk7CiAgICAgfSBlbHNlIGlmIChtX0VuY29kaW5nID09IDApIHsKICAgICAgICAgcmV0ID0gX0ZheEdldDFETGluZShzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX25Db2x1bW5zKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoYml0cG9zID09IGJpdHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJOZXh0MUQgPSBzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7CisgICAgICAgIGJvb2wgYk5leHQxRCA9IHNyY19idWZbYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvcyAlIDgpKTsKICAgICAgICAgYml0cG9zICsrOwogICAgICAgICBpZiAoYk5leHQxRCkgewogICAgICAgICAgICAgcmV0ID0gX0ZheEdldDFETGluZShzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX25Db2x1bW5zKTsKQEAgLTg4NiwxNCArODg2LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX2JFbmRPZkxpbmUpCiAgICAgICAgIGlmICghX0ZheFNraXBFT0woc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgaWYgKG1fYkJ5dGVBbGlnbikgewogICAgICAgICBiaXRwb3MgPSAoYml0cG9zICsgNykgLyA4ICogODsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcAppbmRleCBjN2QxZGVjLi45NmU2ODA3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAKQEAgLTE4MCw3ICsxODAsNyBAQAogICAgICAgICAgICAgKChDUERGX05hbWUqKXRoaXMpLT5tX05hbWUgPSBzdHI7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFTU0VSVChGQUxTRSk7CisgICAgQVNTRVJUKGZhbHNlKTsKIH0KIGludCBDUERGX09iamVjdDo6R2V0RGlyZWN0VHlwZSgpIGNvbnN0CiB7CkBAIC0xOTAsMTMgKzE5MCwxMyBAQAogICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKil0aGlzOwogICAgIHJldHVybiBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdFR5cGUocFJlZi0+bV9SZWZPYmpOdW0pOwogfQotRlhfQk9PTCBDUERGX09iamVjdDo6SXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPdGhlcikgY29uc3QKK2Jvb2wgQ1BERl9PYmplY3Q6OklzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKHRoaXMgPT0gcE90aGVyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBPdGhlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocE90aGVyLT5tX1R5cGUgIT0gbV9UeXBlKSB7CiAgICAgICAgIGlmIChtX1R5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSAmJiBHZXREaXJlY3QoKSkgewpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgIGlmIChwT3RoZXItPm1fVHlwZSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CiAgICAgICAgICAgICByZXR1cm4gSXNJZGVudGljYWwocE90aGVyLT5HZXREaXJlY3QoKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN3aXRjaCAobV9UeXBlKSB7CiAgICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CkBAIC0yMjEsMTMgKzIyMSwxMyBAQAogICAgICAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOgogICAgICAgICAgICAgcmV0dXJuICgoKENQREZfRGljdGlvbmFyeSopdGhpcyktPklkZW50aWNhbCgoQ1BERl9EaWN0aW9uYXJ5KilwT3RoZXIpKTsKICAgICAgICAgY2FzZSBQREZPQkpfTlVMTDoKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTToKICAgICAgICAgICAgIHJldHVybiAoKChDUERGX1N0cmVhbSopdGhpcyktPklkZW50aWNhbCgoQ1BERl9TdHJlYW0qKXBPdGhlcikpOwogICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6CiAgICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9SZWZlcmVuY2UqKXRoaXMpLT5JZGVudGljYWwoKENQREZfUmVmZXJlbmNlKilwT3RoZXIpKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfT2JqZWN0KiBDUERGX09iamVjdDo6R2V0RGlyZWN0KCkgY29uc3QKIHsKQEAgLTI0MCwxMiArMjQwLDEyIEBACiAgICAgfQogICAgIHJldHVybiBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5tX1JlZk9iak51bSk7CiB9Ci1DUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lKEZYX0JPT0wgYkRpcmVjdCkgY29uc3QKK0NQREZfT2JqZWN0KiBDUERGX09iamVjdDo6Q2xvbmUoYm9vbCBiRGlyZWN0KSBjb25zdAogewogICAgIENGWF9NYXBQdHJUb1B0ciB2aXNpdGVkOwogICAgIHJldHVybiBDbG9uZUludGVybmFsKGJEaXJlY3QsICZ2aXNpdGVkKTsKIH0KLUNQREZfT2JqZWN0KiBDUERGX09iamVjdDo6Q2xvbmVJbnRlcm5hbChGWF9CT09MIGJEaXJlY3QsIENGWF9NYXBQdHJUb1B0ciogdmlzaXRlZCkgY29uc3QKK0NQREZfT2JqZWN0KiBDUERGX09iamVjdDo6Q2xvbmVJbnRlcm5hbChib29sIGJEaXJlY3QsIENGWF9NYXBQdHJUb1B0ciogdmlzaXRlZCkgY29uc3QKIHsKICAgICBzd2l0Y2ggKG1fVHlwZSkgewogICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewogICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwVGhpcyA9IChDUERGX1N0cmVhbSopdGhpczsKICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBUaGlzLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBhY2MuTG9hZEFsbERhdGEocFRoaXMsIHRydWUpOwogICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cmVhbVNpemUgPSBhY2MuR2V0U2l6ZSgpOwogICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwVGhpcy0+R2V0RGljdCgpOwogICAgICAgICAgICAgICAgIGlmIChwRGljdCkKQEAgLTI5OSw3ICsyOTksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIXBSZWYtPkdldERpcmVjdCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBSZWYtPkdldERpcmVjdCgpLT5DbG9uZUludGVybmFsKFRSVUUsIHZpc2l0ZWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFJlZi0+R2V0RGlyZWN0KCktPkNsb25lSW50ZXJuYWwodHJ1ZSwgdmlzaXRlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9SZWZlcmVuY2UocFJlZi0+bV9wT2JqTGlzdCwgb2JqX251bSk7CiAgICAgICAgICAgICB9CkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICB9CiAgICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7CiAgICAgICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopdGhpcywgRkFMU0UpOworICAgICAgICBzdHJlYW0uTG9hZEFsbERhdGEoKENQREZfU3RyZWFtKil0aGlzLCBmYWxzZSk7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdCA9IFBERl9EZWNvZGVUZXh0KHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCksIHBDaGFyTWFwKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC0zMzUsMTkgKzMzNSwxOSBAQAogICAgICAgICAoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmcgPSBQREZfRW5jb2RlVGV4dChwVW5pY29kZXMsIGxlbik7CiAgICAgfSBlbHNlIGlmIChtX1R5cGUgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQgPSBQREZfRW5jb2RlVGV4dChwVW5pY29kZXMsIGxlbik7Ci0gICAgICAgICgoQ1BERl9TdHJlYW0qKXRoaXMpLT5TZXREYXRhKCh1aW50OF90KilyZXN1bHQuY19zdHIoKSwgcmVzdWx0LkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICAgICAgICAoKENQREZfU3RyZWFtKil0aGlzKS0+U2V0RGF0YSgodWludDhfdCopcmVzdWx0LmNfc3RyKCksIHJlc3VsdC5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKICAgICB9CiB9CiAKIENQREZfTnVtYmVyOjpDUERGX051bWJlcihpbnQgdmFsdWUpCi0gICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihUUlVFKSwgbV9JbnRlZ2VyKHZhbHVlKSB7CisgICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcih0cnVlKSwgbV9JbnRlZ2VyKHZhbHVlKSB7CiB9CiAKIENQREZfTnVtYmVyOjpDUERGX051bWJlcihGWF9GTE9BVCB2YWx1ZSkKLSAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKEZBTFNFKSwgbV9GbG9hdCh2YWx1ZSkgeworICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIoZmFsc2UpLCBtX0Zsb2F0KHZhbHVlKSB7CiB9CiAKLUNQREZfTnVtYmVyOjpDUERGX051bWJlcihGWF9CT09MIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKK0NQREZfTnVtYmVyOjpDUERGX051bWJlcihib29sIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKICAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKGJJbnRlZ2VyKSwgbV9JbnRlZ2VyKCooaW50KilwRGF0YSkgewogfQogCkBAIC0zNTksNyArMzU5LDcgQEAKIHsKICAgICBGWF9hdG9udW0oc3RyLCBtX2JJbnRlZ2VyLCAmbV9JbnRlZ2VyKTsKIH0KLUZYX0JPT0wgQ1BERl9OdW1iZXI6OklkZW50aWNhbChDUERGX051bWJlciogcE90aGVyKSBjb25zdAorYm9vbCBDUERGX051bWJlcjo6SWRlbnRpY2FsKENQREZfTnVtYmVyKiBwT3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYkludGVnZXIgPT0gcE90aGVyLT5tX2JJbnRlZ2VyICYmIG1fSW50ZWdlciA9PSBwT3RoZXItPm1fSW50ZWdlcjsKIH0KQEAgLTM2OSwxMCArMzY5LDEwIEBACiB9CiB2b2lkIENQREZfTnVtYmVyOjpTZXROdW1iZXIoRlhfRkxPQVQgdmFsdWUpCiB7Ci0gICAgbV9iSW50ZWdlciA9IEZBTFNFOworICAgIG1fYkludGVnZXIgPSBmYWxzZTsKICAgICBtX0Zsb2F0ID0gdmFsdWU7CiB9Ci1DUERGX1N0cmluZzo6Q1BERl9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7CitDUERGX1N0cmluZzo6Q1BERl9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KGZhbHNlKSB7CiAgICAgbV9TdHJpbmcgPSBQREZfRW5jb2RlVGV4dChzdHIpOwogfQogQ1BERl9BcnJheTo6fkNQREZfQXJyYXkoKQpAQCAtNTUzLDE2ICs1NTMsMTYgQEAKICAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7CiAgICAgQWRkKG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pKTsKIH0KLUZYX0JPT0wgQ1BERl9BcnJheTo6SWRlbnRpY2FsKENQREZfQXJyYXkqIHBPdGhlcikgY29uc3QKK2Jvb2wgQ1BERl9BcnJheTo6SWRlbnRpY2FsKENQREZfQXJyYXkqIHBPdGhlcikgY29uc3QKIHsKICAgICBpZiAobV9PYmplY3RzLkdldFNpemUoKSAhPSBwT3RoZXItPm1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9PYmplY3RzLkdldFNpemUoKTsgaSArKykKICAgICAgICAgaWYgKCEoKENQREZfT2JqZWN0KiltX09iamVjdHNbaV0pLT5Jc0lkZW50aWNhbCgoQ1BERl9PYmplY3QqKXBPdGhlci0+bV9PYmplY3RzW2ldKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX0RpY3Rpb25hcnk6On5DUERGX0RpY3Rpb25hcnkoKQogewpAQCAtNjc3LDcgKzY3Nyw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUERGX0RpY3Rpb25hcnk6OkdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0JPT0wgYkRlZmF1bHQpIGNvbnN0Citib29sIENQREZfRGljdGlvbmFyeTo6R2V0Qm9vbGVhbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgYm9vbCBiRGVmYXVsdCkgY29uc3QKIHsKICAgICBDUERGX09iamVjdCogcCA9IE5VTEw7CiAgICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgIH0KICAgICByZXR1cm4gbWF0cml4OwogfQotRlhfQk9PTCBDUERGX0RpY3Rpb25hcnk6OktleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAorYm9vbCBDUERGX0RpY3Rpb25hcnk6OktleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAogewogICAgIHZvaWQqIHZhbHVlOwogICAgIHJldHVybiBtX01hcC5Mb29rdXAoa2V5LCB2YWx1ZSk7CkBAIC03ODYsMTMgKzc4NiwxMyBAQAogICAgIG1fTWFwLlJlbW92ZUtleShvbGRrZXkpOwogICAgIG1fTWFwLlNldEF0KG5ld2tleSwgcCk7CiB9Ci1GWF9CT09MIENQREZfRGljdGlvbmFyeTo6SWRlbnRpY2FsKENQREZfRGljdGlvbmFyeSogcE90aGVyKSBjb25zdAorYm9vbCBDUERGX0RpY3Rpb25hcnk6OklkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBPdGhlcikgY29uc3QKIHsKICAgICBpZiAocE90aGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX01hcC5HZXRDb3VudCgpICE9IHBPdGhlci0+bV9NYXAuR2V0Q291bnQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKQEAgLTgwMCwxMiArODAwLDEyIEBACiAgICAgICAgIHZvaWQqIHZhbHVlOwogICAgICAgICBtX01hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKICAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKCEoKENQREZfT2JqZWN0Kil2YWx1ZSktPklzSWRlbnRpY2FsKHBPdGhlci0+R2V0RWxlbWVudChrZXkpKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgaW50IGkpCiB7CkBAIC04MzMsNyArODMzLDcgQEAKICAgICBwTnVtYmVyLT5TZXROdW1iZXIoZik7CiAgICAgU2V0QXQoa2V5LCBwTnVtYmVyKTsKIH0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0JPT0wgYlZhbHVlKQordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0Qm9vbGVhbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgYm9vbCBiVmFsdWUpCiB7CiAgICAgU2V0QXQoa2V5LCBuZXcgQ1BERl9Cb29sZWFuKGJWYWx1ZSkpOwogfQpAQCAtOTA1LDcgKzkwNSw3IEBACiAgICAgICAgIG1fcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIHNpemUpOwogICAgIH0KIH0KLXZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkNvbXByZXNzZWQsIEZYX0JPT0wgYktlZXBCdWYpCit2b2lkIENQREZfU3RyZWFtOjpTZXREYXRhKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBib29sIGJDb21wcmVzc2VkLCBib29sIGJLZWVwQnVmKQogewogICAgIGlmIChtX0dlbk51bSA9PSAoRlhfRFdPUkQpIC0gMSkgewogICAgICAgICBpZiAobV9wRGF0YUJ1ZikgewpAQCAtOTMzLDcgKzkzMyw3IEBACiAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfU3RyZWFtOjpSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBvZmZzZXQsIHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQgc2l6ZSkgY29uc3QKK2Jvb2wgQ1BERl9TdHJlYW06OlJlYWRSYXdEYXRhKEZYX0ZJTEVTSVpFIG9mZnNldCwgdWludDhfdCogYnVmLCBGWF9EV09SRCBzaXplKSBjb25zdAogewogICAgIGlmICgobV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEpICYmIG1fcEZpbGUpIHsKICAgICAgICAgcmV0dXJuIG1fcEZpbGUtPlJlYWRCbG9jayhidWYsIG1fRmlsZU9mZnNldCArIG9mZnNldCwgc2l6ZSk7CkBAIC05NDEsNyArOTQxLDcgQEAKICAgICBpZiAobV9wRGF0YUJ1ZikgewogICAgICAgICBGWFNZU19tZW1jcHkoYnVmLCBtX3BEYXRhQnVmICsgb2Zmc2V0LCBzaXplKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfU3RyZWFtOjpJbml0U3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGUsIENQREZfRGljdGlvbmFyeSogcERpY3QpCiB7CkBAIC05NTIsMjMgKzk1MiwyMyBAQAogICAgICAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBtX2R3U2l6ZSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1N0cmVhbTo6SWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0Citib29sIENQREZfU3RyZWFtOjpJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3QKIHsKICAgICBpZiAoIW1fcERpY3QpCi0gICAgICAgIHJldHVybiBwT3RoZXItPm1fcERpY3QgPyBGQUxTRSA6IFRSVUU7CisgICAgICAgIHJldHVybiBwT3RoZXItPm1fcERpY3QgPyBmYWxzZSA6IHRydWU7CiAKICAgICBpZiAoIW1fcERpY3QtPklkZW50aWNhbChwT3RoZXItPm1fcERpY3QpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9kd1NpemUgIT0gcE90aGVyLT5tX2R3U2l6ZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxICYmIHBPdGhlci0+bV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEpIHsKICAgICAgICAgaWYgKG1fcEZpbGUgPT0gcE90aGVyLT5tX3BGaWxlICYmIG1fcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW1fcEZpbGUgfHwgIXBPdGhlci0+bV9wRmlsZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHVpbnQ4X3Qgc3JjQnVmWzEwMjRdOwogICAgICAgICB1aW50OF90IGRlc3RCdWZbMTAyNF07CkBAIC05NzYsMjAgKzk3NiwyMCBAQAogICAgICAgICBGWF9EV09SRCBzcmNPZmZzZXQgPSBtX0ZpbGVPZmZzZXQ7CiAgICAgICAgIEZYX0RXT1JEIGRlc3RPZmZzZXQgPSBwT3RoZXItPm1fRmlsZU9mZnNldDsKICAgICAgICAgaWYgKG1fcEZpbGUgPT0gcE90aGVyLT5tX3BGaWxlICYmIHNyY09mZnNldCA9PSBkZXN0T2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChzaXplID4gMCkgewogICAgICAgICAgICAgRlhfRFdPUkQgYWN0dWFsU2l6ZSA9IHNpemUgPiAxMDI0ID8gMTAyNCA6IHNpemU7CiAgICAgICAgICAgICBtX3BGaWxlLT5SZWFkQmxvY2soc3JjQnVmLCBzcmNPZmZzZXQsIGFjdHVhbFNpemUpOwogICAgICAgICAgICAgcE90aGVyLT5tX3BGaWxlLT5SZWFkQmxvY2soZGVzdEJ1ZiwgZGVzdE9mZnNldCwgYWN0dWFsU2l6ZSk7CiAgICAgICAgICAgICBpZiAoRlhTWVNfbWVtY21wKHNyY0J1ZiwgZGVzdEJ1ZiwgYWN0dWFsU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplIC09IGFjdHVhbFNpemU7CiAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gYWN0dWFsU2l6ZTsKICAgICAgICAgICAgIGRlc3RPZmZzZXQgKz0gYWN0dWFsU2l6ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSB8fCBwT3RoZXItPm1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSB7CiAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUgPSBOVUxMOwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKICAgICAgICAgICAgIG9mZnNldCA9IG1fRmlsZU9mZnNldDsKICAgICAgICAgfQogICAgICAgICBpZiAoTlVMTCA9PSBwQnVmKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdWludDhfdCBzcmNCdWZbMTAyNF07CiAgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX2R3U2l6ZTsKQEAgLTEwMTMsMTcgKzEwMTMsMTcgQEAKICAgICAgICAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzdGQ6Om1pbihzaXplLCAxMDI0VSk7CiAgICAgICAgICAgICBwRmlsZS0+UmVhZEJsb2NrKHNyY0J1Ziwgb2Zmc2V0LCBhY3R1YWxTaXplKTsKICAgICAgICAgICAgIGlmIChGWFNZU19tZW1jbXAoc3JjQnVmLCBwQnVmLCBhY3R1YWxTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBCdWYgKz0gYWN0dWFsU2l6ZTsKICAgICAgICAgICAgIHNpemUgLT0gYWN0dWFsU2l6ZTsKICAgICAgICAgICAgIG9mZnNldCArPSBhY3R1YWxTaXplOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIEZYU1lTX21lbWNtcChtX3BEYXRhQnVmLCBwT3RoZXItPm1fcERhdGFCdWYsIG1fZHdTaXplKSA9PSAwOwogfQotQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtOjpDbG9uZShGWF9CT09MIGJEaXJlY3QsIEZQREZfTFBGQ2xvbmVTdHJlYW1DYWxsYmFjayBscGZDYWxsYmFjaywgdm9pZCogcFVzZXJEYXRhKSBjb25zdAorQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtOjpDbG9uZShib29sIGJEaXJlY3QsIEZQREZfTFBGQ2xvbmVTdHJlYW1DYWxsYmFjayBscGZDYWxsYmFjaywgdm9pZCogcFVzZXJEYXRhKSBjb25zdAogewogICAgIENQREZfRGljdGlvbmFyeSAqcENsb25lRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcERpY3QtPkNsb25lKGJEaXJlY3QpOwogICAgIElGWF9GaWxlU3RyZWFtICpwRlMgPSBOVUxMOwpAQCAtMTAzMiwxMiArMTAzMiwxMiBAQAogICAgIH0KICAgICBpZiAoIXBGUykgewogICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgIGFjYy5Mb2FkQWxsRGF0YSh0aGlzLCBUUlVFKTsKKyAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHRoaXMsIHRydWUpOwogICAgICAgICBGWF9EV09SRCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKICAgICAgICAgcmV0dXJuIG5ldyBDUERGX1N0cmVhbShhY2MuRGV0YWNoRGF0YSgpLCBzdHJlYW1TaXplLCBwQ2xvbmVEaWN0KTsKICAgICB9CiAgICAgQ1BERl9TdHJlYW0qIHBPYmogPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgQ1BERl9TdHJlYW1GaWx0ZXIgKnBTRiA9IEdldFN0cmVhbUZpbHRlcihUUlVFKTsKKyAgICBDUERGX1N0cmVhbUZpbHRlciAqcFNGID0gR2V0U3RyZWFtRmlsdGVyKHRydWUpOwogICAgIGlmIChwU0YpIHsKICAgICAgICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIDQwOTYpOwogICAgICAgICBGWF9EV09SRCBkd1JlYWQ7CkBAIC0xMDU0LDIwICsxMDU0LDIwIEBACiAgICAgcE9iai0+SW5pdFN0cmVhbSgoSUZYX0ZpbGVSZWFkKilwRlMsIHBDbG9uZURpY3QpOwogICAgIHJldHVybiBwT2JqOwogfQotZXh0ZXJuIEZYX0JPT0wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCitleHRlcm4gYm9vbCBQREZfRGF0YURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIEZYX0JPT0wgYkltYWdlQWNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgYm9vbCBiSW1hZ2VBY2MpOwogQ1BERl9TdHJlYW1BY2M6OkNQREZfU3RyZWFtQWNjKCkKIHsKLSAgICBtX2JOZXdCdWYgPSBGQUxTRTsKKyAgICBtX2JOZXdCdWYgPSBmYWxzZTsKICAgICBtX3BEYXRhID0gTlVMTDsKICAgICBtX2R3U2l6ZSA9IDA7CiAgICAgbV9wSW1hZ2VQYXJhbSA9IE5VTEw7CiAgICAgbV9wU3RyZWFtID0gTlVMTDsKICAgICBtX3BTcmNEYXRhID0gTlVMTDsKIH0KLXZvaWQgQ1BERl9TdHJlYW1BY2M6OkxvYWRBbGxEYXRhKGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSYXdBY2Nlc3MsIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1hZ2VBY2MpCit2b2lkIENQREZfU3RyZWFtQWNjOjpMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiUmF3QWNjZXNzLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltYWdlQWNjKQogewogICAgIGlmIChwU3RyZWFtID09IE5VTEwgfHwgcFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTExMSw3ICsxMTExLDcgQEAKICAgICAgICAgbV9wRGF0YSA9IHBEZWNyeXB0ZWREYXRhOwogICAgICAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBQREZfRGF0YURlY29kZShwRGVjcnlwdGVkRGF0YSwgZHdEZWNyeXB0ZWRTaXplLCBtX3BTdHJlYW0tPkdldERpY3QoKSwKKyAgICAgICAgYm9vbCBiUmV0ID0gUERGX0RhdGFEZWNvZGUocERlY3J5cHRlZERhdGEsIGR3RGVjcnlwdGVkU2l6ZSwgbV9wU3RyZWFtLT5HZXREaWN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERhdGEsIG1fZHdTaXplLCBtX0ltYWdlRGVjb2RlciwgbV9wSW1hZ2VQYXJhbSwgZXN0aW1hdGVkX3NpemUsIGJJbWFnZUFjYyk7CiAgICAgICAgIGlmICghYlJldCkgewogICAgICAgICAgICAgbV9wRGF0YSA9IHBEZWNyeXB0ZWREYXRhOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwCmluZGV4IDg1NGJlNzUuLjA3ZjZjYTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAKQEAgLTEzLDE5ICsxMywxOSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgogI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAKLUZYX0JPT0wgSXNTaWduYXR1cmVEaWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QpCitib29sIElzU2lnbmF0dXJlRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQogewogICAgIENQREZfT2JqZWN0KiBwVHlwZSA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIlR5cGUiKSk7CiAgICAgaWYgKCFwVHlwZSkgewogICAgICAgICBwVHlwZSA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZUIikpOwogICAgICAgICBpZiAoIXBUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBUeXBlLT5HZXRTdHJpbmcoKSA9PSBGWF9CU1RSQygiU2lnIikpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogc3RhdGljIGludCBfQ29tcGFyZUZpbGVTaXplKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKIHsKQEAgLTQ4LDEzICs0OCwxMyBAQAogICAgIG1fcExpbmVhcml6ZWQgPSBOVUxMOwogICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7CiAgICAgbV9kd1hyZWZTdGFydE9iak51bSA9IDA7Ci0gICAgbV9iT3duRmlsZVJlYWQgPSBUUlVFOworICAgIG1fYk93bkZpbGVSZWFkID0gdHJ1ZTsKICAgICBtX0ZpbGVWZXJzaW9uID0gMDsKLSAgICBtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlciA9IEZBTFNFOworICAgIG1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyID0gZmFsc2U7CiB9CiBDUERGX1BhcnNlcjo6fkNQREZfUGFyc2VyKCkKIHsKLSAgICBDbG9zZVBhcnNlcihGQUxTRSk7CisgICAgQ2xvc2VQYXJzZXIoZmFsc2UpOwogfQogRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkdldExhc3RPYmpOdW0oKQogewpAQCAtNjUsOSArNjUsOSBAQAogewogICAgIG1fcEVuY3J5cHREaWN0ID0gcERpY3Q7CiB9Ci12b2lkIENQREZfUGFyc2VyOjpDbG9zZVBhcnNlcihGWF9CT09MIGJSZVBhcnNlKQordm9pZCBDUERGX1BhcnNlcjo6Q2xvc2VQYXJzZXIoYm9vbCBiUmVQYXJzZSkKIHsKLSAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IEZBTFNFOworICAgIG1fYlZlcnNpb25VcGRhdGVkID0gZmFsc2U7CiAgICAgaWYgKCFiUmVQYXJzZSkgewogICAgICAgICBkZWxldGUgbV9wRG9jdW1lbnQ7CiAgICAgICAgIG1fcERvY3VtZW50ID0gTlVMTDsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSkKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydFBhcnNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBib29sIGJSZVBhcnNlKQogewogICAgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChmaWxlbmFtZSk7CiAgICAgaWYgKCFwRmlsZUFjY2VzcykgewpAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgfQogICAgIHJldHVybiBTdGFydFBhcnNlKHBGaWxlQWNjZXNzLCBiUmVQYXJzZSk7CiB9Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UpCitGWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIGJvb2wgYlJlUGFyc2UpCiB7CiAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcyA9IEZYX0NyZWF0ZUZpbGVSZWFkKGZpbGVuYW1lKTsKICAgICBpZiAoIXBGaWxlQWNjZXNzKSB7CkBAIC0xNDIsMTAgKzE0MiwxMCBAQAogfQogQ1BERl9TZWN1cml0eUhhbmRsZXIqIEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVB1YktleUhhbmRsZXIodm9pZCopOwotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfQk9PTCBiUmVQYXJzZSwgRlhfQk9PTCBiT3duRmlsZVJlYWQpCitGWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBib29sIGJSZVBhcnNlLCBib29sIGJPd25GaWxlUmVhZCkKIHsKICAgICBDbG9zZVBhcnNlcihiUmVQYXJzZSk7Ci0gICAgbV9iWFJlZlN0cmVhbSA9IEZBTFNFOworICAgIG1fYlhSZWZTdHJlYW0gPSBmYWxzZTsKICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKICAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKICAgICBpbnQzMl90IG9mZnNldCA9IEdldEhlYWRlck9mZnNldChwRmlsZUFjY2Vzcyk7CkBAIC0xNzYsMTUgKzE3NiwxNSBAQAogICAgIGlmICghYlJlUGFyc2UpIHsKICAgICAgICAgbV9wRG9jdW1lbnQgPSBuZXcgQ1BERl9Eb2N1bWVudCh0aGlzKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiWFJlZlJlYnVpbHQgPSBGQUxTRTsKLSAgICBpZiAobV9TeW50YXguU2VhcmNoV29yZChGWF9CU1RSQygic3RhcnR4cmVmIiksIFRSVUUsIEZBTFNFLCA0MDk2KSkgeworICAgIGJvb2wgYlhSZWZSZWJ1aWx0ID0gZmFsc2U7CisgICAgaWYgKG1fU3ludGF4LlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCB0cnVlLCBmYWxzZSwgNDA5NikpIHsKICAgICAgICAgRlhfRklMRVNJWkUgc3RhcnR4cmVmX29mZnNldCA9IG1fU3ludGF4LlNhdmVQb3MoKTsKICAgICAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnN0YXJ0eHJlZl9vZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKICAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewogICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKHN0YXJ0eHJlZl9vZmZzZXQpOwogICAgICAgICB9CiAgICAgICAgIG1fU3ludGF4LkdldEtleXdvcmQoKTsKLSAgICAgICAgRlhfQk9PTCBiTnVtYmVyOworICAgICAgICBib29sIGJOdW1iZXI7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7CiAgICAgICAgIGlmICghYk51bWJlcikgewogICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKQEAgLTE5NCwxNCArMTk0LDE0IEBACiAgICAgICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7CisgICAgICAgICAgICBiWFJlZlJlYnVpbHQgPSB0cnVlOwogICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7CiAgICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgICAgICB9Ci0gICAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7CisgICAgICAgIGJYUmVmUmVidWlsdCA9IHRydWU7CiAgICAgfQogICAgIEZYX0RXT1JEIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKICAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgewpAQCAtMzQwLDI2ICszNDAsMjYgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1zdGF0aWMgRlhfQk9PTCBDaGVja0RpcmVjdFR5cGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludDMyX3QgaVR5cGUpCitzdGF0aWMgYm9vbCBDaGVja0RpcmVjdFR5cGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludDMyX3QgaVR5cGUpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwRGljdC0+R2V0RWxlbWVudChrZXkpOwogICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBwT2JqLT5HZXRUeXBlKCkgPT0gaVR5cGU7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSB4cmVmcG9zKQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcykKIHsKLSAgICBpZiAoIUxvYWRDcm9zc1JlZlY0KHhyZWZwb3MsIDAsIFRSVUUsIEZBTFNFKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCB0cnVlLCBmYWxzZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOwogICAgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOwogICAgIGlmICh4cmVmc2l6ZSA8PSAwIHx8IHhyZWZzaXplID4gKDEgPDwgMjApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0Nyb3NzUmVmLlNldFNpemUoeHJlZnNpemUpOwogICAgIG1fVjVUeXBlLlNldFNpemUoeHJlZnNpemUpOwpAQCAtMzY3LDUxICszNjcsNTEgQEAKICAgICBDcm9zc1JlZkxpc3QuQWRkKHhyZWZwb3MpOwogICAgIFhSZWZTdHJlYW1MaXN0LkFkZChHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJYUmVmU3RtIikpKTsKICAgICBpZiAoIUNoZWNrRGlyZWN0VHlwZShtX3BUcmFpbGVyLCBGWF9CU1RSQygiUHJldiIpLCBQREZPQkpfTlVNQkVSKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgbmV3eHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSk7CiAgICAgaWYgKG5ld3hyZWZwb3MgPT0geHJlZnBvcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgeHJlZnBvcyA9IG5ld3hyZWZwb3M7CiAgICAgd2hpbGUgKHhyZWZwb3MpIHsKICAgICAgICAgQ3Jvc3NSZWZMaXN0Lkluc2VydEF0KDAsIHhyZWZwb3MpOwotICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSk7CisgICAgICAgIExvYWRDcm9zc1JlZlY0KHhyZWZwb3MsIDAsIHRydWUsIGZhbHNlKTsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IExvYWRUcmFpbGVyVjQoKTsKICAgICAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIUNoZWNrRGlyZWN0VHlwZShwRGljdCwgRlhfQlNUUkMoIlByZXYiKSwgUERGT0JKX05VTUJFUikpIHsKICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbmV3eHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocERpY3QsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgICAgICBpZiAobmV3eHJlZnBvcyA9PSB4cmVmcG9zKSB7CiAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHhyZWZwb3MgPSBuZXd4cmVmcG9zOwogICAgICAgICBYUmVmU3RyZWFtTGlzdC5JbnNlcnRBdCgwLCBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiWFJlZlN0bSIpKSk7CiAgICAgICAgIG1fVHJhaWxlcnMuQWRkKHBEaWN0KTsKICAgICB9CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQ3Jvc3NSZWZMaXN0LkdldFNpemUoKTsgaSArKykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSwgaSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY0KENyb3NzUmVmTGlzdFtpXSwgWFJlZlN0cmVhbUxpc3RbaV0sIGZhbHNlLCBpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSB4cmVmcG9zLCBGWF9EV09SRCBkd09iakNvdW50KQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpCiB7CiAgICAgaWYgKCFMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoeHJlZnBvcywgZHdPYmpDb3VudCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7CiAgICAgaWYgKG1fcFRyYWlsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlNpemUiKSk7CiAgICAgaWYgKHhyZWZzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9GaWxlU2l6ZUFycmF5IENyb3NzUmVmTGlzdCwgWFJlZlN0cmVhbUxpc3Q7CiAgICAgQ3Jvc3NSZWZMaXN0LkFkZCh4cmVmcG9zKTsKQEAgLTQxOSwyMiArNDE5LDIyIEBACiAgICAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSk7CiAgICAgd2hpbGUgKHhyZWZwb3MpIHsKICAgICAgICAgQ3Jvc3NSZWZMaXN0Lkluc2VydEF0KDAsIHhyZWZwb3MpOwotICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSk7CisgICAgICAgIExvYWRDcm9zc1JlZlY0KHhyZWZwb3MsIDAsIHRydWUsIGZhbHNlKTsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IExvYWRUcmFpbGVyVjQoKTsKICAgICAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwRGljdCwgRlhfQlNUUkMoIlByZXYiKSk7CiAgICAgICAgIFhSZWZTdHJlYW1MaXN0Lkluc2VydEF0KDAsIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJYUmVmU3RtIikpKTsKICAgICAgICAgbV9UcmFpbGVycy5BZGQocERpY3QpOwogICAgIH0KICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBDcm9zc1JlZkxpc3QuR2V0U2l6ZSgpOyBpICsrKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY0KENyb3NzUmVmTGlzdFtpXSwgWFJlZlN0cmVhbUxpc3RbaV0sIEZBTFNFLCBpID09IDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgZmFsc2UsIGkgPT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCkKK2Jvb2wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpCiB7CiAgICAgRlhfRklMRVNJWkUgZHdTdGFydFBvcyA9IHBvcyAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoZHdTdGFydFBvcyk7CkBAIC00NTQsMTEgKzQ1NCwxMSBAQAogICAgICAgICBGWF9EV09SRCBkd1JlYWRTaXplID0gYmxvY2tfc2l6ZSAqIHJlY29yZHNpemU7CiAgICAgICAgIGlmICgoRlhfRklMRVNJWkUpKGR3U3RhcnRQb3MgKyBkd1JlYWRTaXplKSA+IG1fU3ludGF4Lm1fRmlsZUxlbikgewogICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW1fU3ludGF4LlJlYWRCbG9jaygodWludDhfdCopcEJ1ZiwgZHdSZWFkU2l6ZSkpIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSArKykgewogICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gc3RhcnRfb2JqbnVtICsgYmxvY2sgKiAxMDI0ICsgaTsKQEAgLTQ3MiwxNCArNDcyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBjID0gMDsgYyA8IDEwOyBjICsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5W2NdIDwgJzAnIHx8IHBFbnRyeVtjXSA+ICc5JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIG9mZnNldCk7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uID0gRlhTWVNfYXRvaShwRW50cnkgKyAxMSk7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gMSkgewotICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0R3JvdyhvYmpudW0sIHZlcnNpb24pOwogICAgICAgICAgICAgICAgIGlmIChtX0Nyb3NzUmVmW29iam51bV0gPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKQEAgLTQ5NCwxMyArNDk0LDEzIEBACiAgICAgfQogICAgIEZYX0ZyZWUocEJ1Zik7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyArIGNvdW50ICogcmVjb3Jkc2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywgRlhfQk9PTCBiU2tpcCwgRlhfQk9PTCBiRmlyc3QpCitib29sIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywgYm9vbCBiU2tpcCwgYm9vbCBiRmlyc3QpCiB7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwogICAgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gRlhfQlNUUkMoInhyZWYiKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwogICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKQEAgLTUxNCwxMCArNTE0LDEwIEBACiAgICAgfQogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICAgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWJJc051bWJlcikgewogICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CkBAIC01MjUsMjIgKzUyNSwyMiBAQAogICAgICAgICB9CiAgICAgICAgIEZYX0RXT1JEIHN0YXJ0X29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CiAgICAgICAgIGlmIChzdGFydF9vYmpudW0gPj0gKDEgPDwgMjApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhfRFdPUkQgY291bnQgPSBtX1N5bnRheC5HZXREaXJlY3ROdW0oKTsKICAgICAgICAgbV9TeW50YXguVG9OZXh0V29yZCgpOwogICAgICAgICBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgRlhfQk9PTCBiRmlyc3RJdGVtID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkZpcnN0SXRlbSA9IGZhbHNlOwogICAgICAgICBpbnQzMl90IHJlY29yZHNpemUgPSAyMDsKICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgYkZpcnN0SXRlbSA9IFRSVUU7CisgICAgICAgICAgICBiRmlyc3RJdGVtID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBtX2R3WHJlZlN0YXJ0T2JqTnVtID0gc3RhcnRfb2JqbnVtOwogICAgICAgICBpZiAoIWJTa2lwKSB7CiAgICAgICAgICAgICBjaGFyKiBwQnVmID0gRlhfQWxsb2MoY2hhciwgMTAyNCAqIHJlY29yZHNpemUgKyAxKTsKICAgICAgICAgICAgIHBCdWZbMTAyNCAqIHJlY29yZHNpemVdID0gJ1wwJzsKICAgICAgICAgICAgIGludDMyX3QgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7Ci0gICAgICAgICAgICBGWF9CT09MIGJGaXJzdEJsb2NrID0gVFJVRTsKKyAgICAgICAgICAgIGJvb2wgYkZpcnN0QmxvY2sgPSB0cnVlOwogICAgICAgICAgICAgZm9yIChpbnQzMl90IGJsb2NrID0gMDsgYmxvY2sgPCBuQmxvY2tzOyBibG9jayArKykgewogICAgICAgICAgICAgICAgIGludDMyX3QgYmxvY2tfc2l6ZSA9IGJsb2NrID09IG5CbG9ja3MgLSAxID8gY291bnQgJSAxMDI0IDogMTAyNDsKICAgICAgICAgICAgICAgICBtX1N5bnRheC5SZWFkQmxvY2soKHVpbnQ4X3QqKXBCdWYsIGJsb2NrX3NpemUgKiByZWNvcmRzaXplKTsKQEAgLTU1MCw3ICs1NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5WzE3XSA9PSAnZicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RJdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJGaXJzdEJsb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2F0b2k2NChwRW50cnkpOwpAQCAtNTY4LDE0ICs1NjgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYyArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5W2NdIDwgJzAnIHx8IHBFbnRyeVtjXSA+ICc5JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXRHcm93KG9iam51bSwgdmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9Dcm9zc1JlZltvYmpudW1dIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7CkBAIC01ODcsNyArNTg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RCbG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgYkZpcnN0QmxvY2sgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEJsb2NrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC01OTYsMjUgKzU5NiwyNSBAQAogICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zICsgY291bnQgKiByZWNvcmRzaXplKTsKICAgICB9CiAgICAgaWYgKHN0cmVhbXBvcykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNShzdHJlYW1wb3MsIHN0cmVhbXBvcywgRkFMU0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoc3RyZWFtcG9zLCBzdHJlYW1wb3MsIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSB4cmVmcG9zKQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKIHsKLSAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIFRSVUUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIHRydWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgd2hpbGUgKHhyZWZwb3MpCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgRkFMU0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgRkFMU0UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fT2JqZWN0U3RyZWFtTWFwLkluaXRIYXNoVGFibGUoMTAxLCBmYWxzZSk7CisgICAgbV9iWFJlZlN0cmVhbSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpSZWJ1aWxkQ3Jvc3NSZWYoKQorYm9vbCBDUERGX1BhcnNlcjo6UmVidWlsZENyb3NzUmVmKCkKIHsKICAgICBtX0Nyb3NzUmVmLlJlbW92ZUFsbCgpOwogICAgIG1fVjVUeXBlLlJlbW92ZUFsbCgpOwpAQCAtNjMzLDcgKzYzMyw3IEBACiAgICAgRlhfRklMRVNJWkUgc3RhcnRfcG9zID0gMCwgc3RhcnRfcG9zMSA9IDA7CiAgICAgRlhfRklMRVNJWkUgbGFzdF9vYmogPSAtMSwgbGFzdF94cmVmID0gLTEsIGxhc3RfdHJhaWxlciA9IC0xOwogICAgIHdoaWxlIChwb3MgPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKLSAgICAgICAgRlhfQk9PTCBiT3ZlckZsb3cgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiT3ZlckZsb3cgPSBmYWxzZTsKICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IChGWF9EV09SRCkobV9TeW50YXgubV9GaWxlTGVuIC0gcG9zKTsKICAgICAgICAgaWYgKHNpemUgPiA0MDk2KSB7CiAgICAgICAgICAgICBzaXplID0gNDA5NjsKQEAgLTgxMiw3ICs4MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBuTGVuID0gb2JqX2VuZCAtIG9ial9wb3MgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRlhfRFdPUkQpbkxlbiA+IHNpemUgLSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBvYmpfZW5kICsgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT3ZlckZsb3cgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk92ZXJGbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gKEZYX0RXT1JEKW5MZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTgyMiw3ICs4MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWZbb2JqbnVtXSA9IG9ial9wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0KG9iam51bSwgKGludDE2X3QpZ2VubnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkZ2VuICE9IGdlbm51bSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC04ODEsNyArODgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgZHdTYXZlUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJXb3JkID0gbV9TeW50YXguR2V0S2V5d29yZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cldvcmQuQ29tcGFyZShGWF9CU1RSQygic3RhcnR4cmVmIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk51bWJlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPZmZzZXQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IEZYU1lTX2F0b2koYnNPZmZzZXQpOwpAQCAtOTgyLDcgKzk4Miw3IEBACiAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvZmZzZXQpOwogICAgIH0KICAgICBGWF9GcmVlKGJ1ZmZlcik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgRlhfRFdPUkQgX0dldFZhckludChjb25zdCB1aW50OF90KiBwLCBpbnQzMl90IG4pCiB7CkBAIC05OTIsMTEgKzk5MiwxMSBAQAogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSYgcHJldiwgRlhfQk9PTCBiTWFpblhSZWYpCitib29sIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFJiBwcmV2LCBib29sIGJNYWluWFJlZikKIHsKICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopUGFyc2VJbmRpcmVjdE9iamVjdEF0KG1fcERvY3VtZW50LCBwb3MsIDAsIE5VTEwpOwogICAgIGlmICghcFN0cmVhbSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcERvY3VtZW50KSB7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSAqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKQEAgLTEwMDYsMTcgKzEwMDYsMTcgQEAKICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHByZXYgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIlByZXYiKSk7CiAgICAgaW50MzJfdCBzaXplID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJTaXplIikpOwogICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoYk1haW5YUmVmKSB7CiAgICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7CkBAIC0xMDUwLDcgKzEwNTAsNyBAQAogICAgIHBBcnJheSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIlciKSk7CiAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7CiAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9EV29yZEFycmF5IFdpZHRoQXJyYXk7CiAgICAgRlhfU0FGRV9EV09SRCBkd0FjY1dpZHRoID0gMDsKQEAgLTEwNjAsNyArMTA2MCw3IEBACiAgICAgfQogICAgIGlmICghZHdBY2NXaWR0aC5Jc1ZhbGlkKCkgfHwgV2lkdGhBcnJheS5HZXRTaXplKCkgPCAzKSB7CiAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIHRvdGFsV2lkdGggPSBkd0FjY1dpZHRoLlZhbHVlT3JEaWUoKTsKICAgICBDUERGX1N0cmVhbUFjYyBhY2M7CkBAIC0xMTIwLDcgKzExMjAsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBtX1Y1VHlwZS5HZXRTaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZVtvZmZzZXRdID0gMjU1OwogICAgICAgICAgICAgICAgIH0KQEAgLTExMjksNyArMTEyOSw3IEBACiAgICAgICAgIHNlZ2luZGV4ICs9IGNvdW50OwogICAgIH0KICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX0FycmF5KiBDUERGX1BhcnNlcjo6R2V0SURBcnJheSgpCiB7CkBAIC0xMTYyLDMyICsxMTYyLDMyIEBACiAgICAgfQogICAgIHJldHVybiAoKENQREZfUmVmZXJlbmNlKikgcFJlZiktPkdldFJlZk9iak51bSgpOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pCitib29sIENQREZfUGFyc2VyOjpJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBib29sJiBiRm9ybSkKIHsKLSAgICBiRm9ybSA9IEZBTFNFOworICAgIGJGb3JtID0gZmFsc2U7CiAgICAgaWYgKG9iam51bSA+PSAoRlhfRFdPUkQpbV9Dcm9zc1JlZi5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fQ3Jvc3NSZWZbb2JqbnVtXTsKICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CiAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICgoRlhfRklMRVNJWkUqKXBSZXN1bHQgLSAoRlhfRklMRVNJWkUqKW1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSA9PSBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBzaXplID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV0gLSBwb3M7CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgIGJGb3JtID0gbV9TeW50YXguU2VhcmNoTXVsdGlXb3JkKEZYX0JTVFJDKCIvRm9ybVwwc3RyZWFtIiksIFRSVUUsIHNpemUpID09IDA7CisgICAgYkZvcm0gPSBtX1N5bnRheC5TZWFyY2hNdWx0aVdvcmQoRlhfQlNUUkMoIi9Gb3JtXDBzdHJlYW0iKSwgdHJ1ZSwgc2l6ZSkgPT0gMDsKICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENQREZfT2JqZWN0KiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQpCiB7CkBAIC0xMjA5LDcgKzEyMDksNyBAQAogICAgICAgICBpbnQzMl90IG4gPSBwT2JqU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIk4iKSk7CiAgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdCIpKTsKICAgICAgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcE9ialN0cmVhbS0+R2V0RGF0YSgpLCAoc2l6ZV90KXBPYmpTdHJlYW0tPkdldFNpemUoKSwgRkFMU0UpKTsKKyAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKHVpbnQ4X3QqKXBPYmpTdHJlYW0tPkdldERhdGEoKSwgKHNpemVfdClwT2JqU3RyZWFtLT5HZXRTaXplKCksIGZhbHNlKSk7CiAgICAgICAgIHN5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwogICAgICAgICBDUERGX09iamVjdCogcFJldCA9IE5VTEw7CiAgICAgICAgIHdoaWxlIChuKSB7CkBAIC0xMjgyLDcgKzEyODIsNyBAQAogICAgICAgICBDUERGX1N5bnRheFBhcnNlciBzeW50YXg7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBEYXRhID0gcE9ialN0cmVhbS0+R2V0RGF0YSgpOwogICAgICAgICBGWF9EV09SRCB0b3RhbHNpemUgPSBwT2JqU3RyZWFtLT5HZXRTaXplKCk7Ci0gICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgKHNpemVfdCl0b3RhbHNpemUsIEZBTFNFKSk7CisgICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgKHNpemVfdCl0b3RhbHNpemUsIGZhbHNlKSk7CiAgICAgICAgIHN5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwogICAgICAgICB3aGlsZSAobikgewogICAgICAgICAgICAgRlhfRFdPUkQgdGhpc251bSA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICAgIGJvb2wgYklzTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwpAQCAtMTMzNiwxNiArMTMzNiwxNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIEZYX0ZJTEVTSVpFIG5leHRvZmYgPSAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0KVsxXTsKLSAgICAgICAgRlhfQk9PTCBiTmV4dE9mZlZhbGlkID0gRkFMU0U7CisgICAgICAgIGJvb2wgYk5leHRPZmZWYWxpZCA9IGZhbHNlOwogICAgICAgICBpZiAobmV4dG9mZiAhPSBwb3MpIHsKICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MobmV4dG9mZik7CiAgICAgICAgICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ4cmVmIikpIHsKLSAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYklzTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgICAgICAgICAgaWYgKGJJc051bWJlciAmJiBtX1N5bnRheC5HZXRLZXl3b3JkKCkgPT0gRlhfQlNUUkMoIm9iaiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJOZXh0T2ZmVmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNzMsNyArMTM3Myw3IEBACiB7CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CiAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgIGJvb2wgYklzTnVtYmVyOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmICghYklzTnVtYmVyKSB7CiAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwpAQCAtMTQxNiw3ICsxNDE2LDcgQEAKIHsKICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CkBAIC0xNDU4LDcgKzE0NTgsNyBAQAogICAgIH0KICAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopcE9iajsKIH0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uKQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkdldFBlcm1pc3Npb25zKGJvb2wgYkNoZWNrUmV2aXNpb24pCiB7CiAgICAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKQEAgLTE0NzMsMTEgKzE0NzMsMTEgQEAKICAgICB9CiAgICAgcmV0dXJuIGR3UGVybWlzc2lvbjsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OklzT3duZXIoKQorYm9vbCBDUERGX1BhcnNlcjo6SXNPd25lcigpCiB7Ci0gICAgcmV0dXJuIG1fcFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMID8gVFJVRSA6IG1fcFNlY3VyaXR5SGFuZGxlci0+SXNPd25lcigpOworICAgIHJldHVybiBtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCA/IHRydWUgOiBtX3BTZWN1cml0eUhhbmRsZXItPklzT3duZXIoKTsKIH0KLXZvaWQgQ1BERl9QYXJzZXI6OlNldFNlY3VyaXR5SGFuZGxlcihDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciwgRlhfQk9PTCBiRm9yY2VkKQordm9pZCBDUERGX1BhcnNlcjo6U2V0U2VjdXJpdHlIYW5kbGVyKENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyLCBib29sIGJGb3JjZWQpCiB7CiAgICAgQVNTRVJUKG1fcFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMKTsKICAgICBpZiAoIW1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyKSB7CkBAIC0xNDkyLDI5ICsxNDkyLDI5IEBACiAgICAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlciA9IHBTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKTsKICAgICBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyLT5Jbml0KE5VTEwsIHBTZWN1cml0eUhhbmRsZXIpOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpCitib29sIENQREZfUGFyc2VyOjpJc0xpbmVhcml6ZWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0RXT1JEIG9mZnNldCkKIHsKICAgICBtX1N5bnRheC5Jbml0UGFyc2VyKHBGaWxlQWNjZXNzLCBvZmZzZXQpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MobV9TeW50YXgubV9IZWFkZXJPZmZzZXQgKyA5KTsKICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBib29sIGJJc051bWJlcjsKICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgZ2VubnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKICAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgewogICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcExpbmVhcml6ZWQgPSBtX1N5bnRheC5HZXRPYmplY3QoTlVMTCwgb2JqbnVtLCBnZW5udW0sIDApOwogICAgIGlmICghbV9wTGluZWFyaXplZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSAmJiBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkxpbmVhcml6ZWQiKSkpIHsKICAgICAgICAgbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKQEAgLTE1MjIsMTAgKzE1MjIsMTAgQEAKICAgICAgICAgaWYgKCFwTGVuKSB7CiAgICAgICAgICAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7CiAgICAgICAgICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocExlbi0+R2V0SW50ZWdlcigpICE9IChpbnQpcEZpbGVBY2Nlc3MtPkdldFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIENQREZfT2JqZWN0ICpwTm8gPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIlAiKSk7CiAgICAgICAgIGlmIChwTm8gJiYgcE5vLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewpAQCAtMTUzNSwxNiArMTUzNSwxNiBAQAogICAgICAgICBpZiAocFRhYmxlICYmIHBUYWJsZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKICAgICAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSBwVGFibGUtPkdldEludGVnZXIoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0QXN5blBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0JPT0wgYlJlUGFyc2UsIEZYX0JPT0wgYk93bkZpbGVSZWFkKQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0QXN5blBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIGJvb2wgYlJlUGFyc2UsIGJvb2wgYk93bkZpbGVSZWFkKQogewogICAgIENsb3NlUGFyc2VyKGJSZVBhcnNlKTsKLSAgICBtX2JYUmVmU3RyZWFtID0gRkFMU0U7CisgICAgbV9iWFJlZlN0cmVhbSA9IGZhbHNlOwogICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwogICAgIG1fYk93bkZpbGVSZWFkID0gYk93bkZpbGVSZWFkOwogICAgIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KHBGaWxlQWNjZXNzKTsKQEAgLTE1NTksMTkgKzE1NTksMTkgQEAKICAgICAgICAgbV9wRG9jdW1lbnQgPSBuZXcgQ1BERl9Eb2N1bWVudCh0aGlzKTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgZHdGaXJzdFhSZWZPZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgRlhfQk9PTCBiWFJlZlJlYnVpbHQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJMb2FkVjQgPSBGQUxTRTsKLSAgICBpZiAoIShiTG9hZFY0ID0gTG9hZENyb3NzUmVmVjQoZHdGaXJzdFhSZWZPZmZzZXQsIDAsIEZBTFNFLCBGQUxTRSkpICYmICFMb2FkQ3Jvc3NSZWZWNShkd0ZpcnN0WFJlZk9mZnNldCwgZHdGaXJzdFhSZWZPZmZzZXQsIFRSVUUpKSB7CisgICAgYm9vbCBiWFJlZlJlYnVpbHQgPSBmYWxzZTsKKyAgICBib29sIGJMb2FkVjQgPSBmYWxzZTsKKyAgICBpZiAoIShiTG9hZFY0ID0gTG9hZENyb3NzUmVmVjQoZHdGaXJzdFhSZWZPZmZzZXQsIDAsIGZhbHNlLCBmYWxzZSkpICYmICFMb2FkQ3Jvc3NSZWZWNShkd0ZpcnN0WFJlZk9mZnNldCwgZHdGaXJzdFhSZWZPZmZzZXQsIHRydWUpKSB7CiAgICAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpIHsKICAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CiAgICAgICAgIH0KLSAgICAgICAgYlhSZWZSZWJ1aWx0ID0gVFJVRTsKKyAgICAgICAgYlhSZWZSZWJ1aWx0ID0gdHJ1ZTsKICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAgICAgfQogICAgIGlmIChiTG9hZFY0KSB7CiAgICAgICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7CiAgICAgICAgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiU2l6ZSIpKTsKICAgICAgICAgaWYgKHhyZWZzaXplID4gMCkgewpAQCAtMTYyMywxOCArMTYyMywxOCBAQAogICAgIH0KICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSB4cmVmcG9zKQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCiB7Ci0gICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgZmFsc2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgd2hpbGUgKHhyZWZwb3MpCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgRkFMU0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgRkFMU0UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fT2JqZWN0U3RyZWFtTWFwLkluaXRIYXNoVGFibGUoMTAxLCBmYWxzZSk7CisgICAgbV9iWFJlZlN0cmVhbSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBGWF9EV09SRCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCkKIHsKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAgICAgbV9wRmlsZUJ1ZiA9IE5VTEw7CiAgICAgbV9NZXRhZGF0YU9iam51bSA9IDA7CiAgICAgbV9kd1dvcmRQb3MgPSAwOwotICAgIG1fYkZpbGVTdHJlYW0gPSBGQUxTRTsKKyAgICBtX2JGaWxlU3RyZWFtID0gZmFsc2U7CiB9CiBDUERGX1N5bnRheFBhcnNlcjo6fkNQREZfU3ludGF4UGFyc2VyKCkKIHsKQEAgLTE2OTYsMTkgKzE2OTYsMTkgQEAKICAgICAgICAgRlhfRnJlZShtX3BGaWxlQnVmKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkKK2Jvb2wgQ1BERl9TeW50YXhQYXJzZXI6OkdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKQogewogICAgIEZYX0ZJTEVTSVpFIHNhdmVfcG9zID0gbV9Qb3M7CiAgICAgbV9Qb3MgPSBwb3M7Ci0gICAgRlhfQk9PTCByZXQgPSBHZXROZXh0Q2hhcihjaCk7CisgICAgYm9vbCByZXQgPSBHZXROZXh0Q2hhcihjaCk7CiAgICAgbV9Qb3MgPSBzYXZlX3BvczsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dENoYXIodWludDhfdCYgY2gpCitib29sIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0Q2hhcih1aW50OF90JiBjaCkKIHsKICAgICBGWF9GSUxFU0laRSBwb3MgPSBtX1BvcyArIG1fSGVhZGVyT2Zmc2V0OwogICAgIGlmIChwb3MgPj0gbV9GaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9CdWZPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9CdWZPZmZzZXQgKyBtX0J1ZlNpemUpIDw9IHBvcykgewogICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKQEAgLTE3MjUsMTkgKzE3MjUsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhtX3BGaWxlQnVmLCByZWFkX3BvcywgcmVhZF9zaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CiAgICAgfQogICAgIGNoID0gbV9wRmlsZUJ1Zltwb3MgLSBtX0J1Zk9mZnNldF07CiAgICAgbV9Qb3MgKys7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKQorYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkKIHsKICAgICBwb3MgKz0gbV9IZWFkZXJPZmZzZXQ7CiAgICAgaWYgKHBvcyA+PSBtX0ZpbGVMZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX0J1Zk9mZnNldCA+PSBwb3MgfHwgKEZYX0ZJTEVTSVpFKShtX0J1Zk9mZnNldCArIG1fQnVmU2l6ZSkgPD0gcG9zKSB7CiAgICAgICAgIEZYX0ZJTEVTSVpFIHJlYWRfcG9zOwpAQCAtMTc1NiwyNiArMTc1NiwyNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9CdWZPZmZzZXQgPSByZWFkX3BvczsKICAgICB9CiAgICAgY2ggPSBtX3BGaWxlQnVmW3BvcyAtIG1fQnVmT2Zmc2V0XTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRCbG9jayh1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKQorYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6UmVhZEJsb2NrKHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpCiB7CiAgICAgaWYgKCFtX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2socEJ1ZiwgbV9Qb3MgKyBtX0hlYWRlck9mZnNldCwgc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fUG9zICs9IHNpemU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAjZGVmaW5lIE1BWF9XT1JEX0JVRkZFUiAyNTYKIHZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkKCkKIHsKICAgICBtX1dvcmRTaXplID0gMDsKLSAgICBtX2JJc051bWJlciA9IFRSVUU7CisgICAgbV9iSXNOdW1iZXIgPSB0cnVlOwogICAgIHVpbnQ4X3QgY2g7CiAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTgwMiw3ICsxODAyLDcgQEAKICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgfQogICAgIGlmICh0eXBlID09ICdEJykgewotICAgICAgICBtX2JJc051bWJlciA9IEZBTFNFOworICAgICAgICBtX2JJc051bWJlciA9IGZhbHNlOwogICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgICAgICAgICB3aGlsZSAoMSkgewpAQCAtMTg0NCw3ICsxODQ0LDcgQEAKICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICBtX2JJc051bWJlciA9IEZBTFNFOworICAgICAgICAgICAgbV9iSXNOdW1iZXIgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTk1MCw3ICsxOTUwLDcgQEAKICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CiAgICAgfQogICAgIENGWF9CaW5hcnlCdWYgYnVmOwotICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKKyAgICBib29sIGJGaXJzdCA9IHRydWU7CiAgICAgdWludDhfdCBjb2RlID0gMDsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoY2ggPT0gJz4nKSB7CkBAIC0yMDM2LDcgKzIwMzYsNyBAQAogICAgIH0KICAgICBtX1BvcyAtLTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpCitDRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dFdvcmQoYm9vbCYgYklzTnVtYmVyKQogewogICAgIEdldE5leHRXb3JkKCk7CiAgICAgYklzTnVtYmVyID0gbV9iSXNOdW1iZXI7CkBAIC0yMDQ3LDE1ICsyMDQ3LDE1IEBACiAgICAgR2V0TmV4dFdvcmQoKTsKICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKW1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CiB9Ci1DUERGX09iamVjdCogQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwgRlhfQk9PTCBiRGVjcnlwdCkKK0NQREZfT2JqZWN0KiBDUERGX1N5bnRheFBhcnNlcjo6R2V0T2JqZWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LCBib29sIGJEZWNyeXB0KQogewogICAgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOwogICAgIGlmICgrK3NfQ3VycmVudFJlY3Vyc2lvbkRlcHRoID4ga1BhcnNlck1heFJlY3Vyc2lvbkRlcHRoKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgIGJvb2wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOworICAgIGJvb2wgYklzTnVtYmVyOwogICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgIGlmICh3b3JkLkdldExlbmd0aCgpID09IDApIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjEwMiw3ICsyMTAyLDcgQEAKICAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgYkRlY3J5cHQpIHsKICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBGQUxTRSk7CisgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgZmFsc2UpOwogICAgIH0KICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiPCIpKSB7CiAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKQEAgLTIxMTIsNyArMjExMiw3IEBACiAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyICYmIGJEZWNyeXB0KSB7CiAgICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgVFJVRSk7CisgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgdHJ1ZSk7CiAgICAgfQogICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJbIikpIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjE0NSw3ICsyMTQ1LDcgQEAKICAgICAgICAgaW50MzJfdCBuS2V5cyA9IDA7CiAgICAgICAgIEZYX0ZJTEVTSVpFIGR3U2lnblZhbHVlUG9zID0gMDsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgICAgICAgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAocERpY3QpCkBAIC0yMTgzLDcgKzIxODMsNyBAQAogICAgICAgICBpZiAoSXNTaWduYXR1cmVEaWN0KHBEaWN0KSkgewogICAgICAgICAgICAgRlhfRklMRVNJWkUgZHdTYXZlUG9zID0gbV9Qb3M7CiAgICAgICAgICAgICBtX1BvcyA9IGR3U2lnblZhbHVlUG9zOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0sIE5VTEwsIGZhbHNlKTsKICAgICAgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiQ29udGVudHMiKSwgcE9iaik7CiAgICAgICAgICAgICBtX1BvcyA9IGR3U2F2ZVBvczsKICAgICAgICAgfQpAQCAtMjE5NCw3ICsyMTk0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICAgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICAgICAgaWYgKG5leHR3b3JkID09IEZYX0JTVFJDKCJzdHJlYW0iKSkgewogICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBSZWFkU3RyZWFtKHBEaWN0LCBwQ29udGV4dCwgb2JqbnVtLCBnZW5udW0pOwpAQCAtMjIyNSw4ICsyMjI1LDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgRlhfQk9PTCBiVHlwZU9ubHkgPSBwQ29udGV4dCAmJiAocENvbnRleHQtPm1fRmxhZ3MgJiBQREZQQVJTRV9UWVBFT05MWSk7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgYm9vbCBiVHlwZU9ubHkgPSBwQ29udGV4dCAmJiAocENvbnRleHQtPm1fRmxhZ3MgJiBQREZQQVJTRV9UWVBFT05MWSk7CisgICAgYm9vbCBiSXNOdW1iZXI7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgaWYgKHdvcmQuR2V0TGVuZ3RoKCkgPT0gMCkgewogICAgICAgICBpZiAoYlR5cGVPbmx5KSB7CkBAIC0yMjczLDcgKzIyNzMsNyBAQAogICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlcikgewogICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBmYWxzZSk7CiAgICAgfQogICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8IikpIHsKICAgICAgICAgaWYgKGJUeXBlT25seSkgewpAQCAtMjI4Myw3ICsyMjgzLDcgQEAKICAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKICAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBUUlVFKTsKKyAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCB0cnVlKTsKICAgICB9CiAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIlsiKSkgewogICAgICAgICBpZiAoYlR5cGVPbmx5KSB7CkBAIC0yMzE5LDcgKzIzMTksNyBAQAogICAgICAgICB9CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICAgICAgICBib29sIGJJc051bWJlcjsKICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7CiAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwogICAgICAgICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpIHsKQEAgLTIzNjYsNyArMjM2Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICAgIGJvb2wgYklzTnVtYmVyOwogICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CiAgICAgICAgIGlmIChuZXh0d29yZCA9PSBGWF9CU1RSQygic3RyZWFtIikpIHsKICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gUmVhZFN0cmVhbShwRGljdCwgcENvbnRleHQsIG9iam51bSwgZ2VubnVtKTsKQEAgLTI0OTUsMzIgKzI0OTUsMzIgQEAKICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOwogICAgIHJldHVybiBGWFNZU19hdG9pKChjb25zdCBGWF9DSEFSKiltX1dvcmRCdWZmZXIpOwogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6SXNXaG9sZVdvcmQoRlhfRklMRVNJWkUgc3RhcnRwb3MsIEZYX0ZJTEVTSVpFIGxpbWl0LCBjb25zdCB1aW50OF90KiB0YWcsIEZYX0RXT1JEIHRhZ2xlbikKK2Jvb2wgQ1BERl9TeW50YXhQYXJzZXI6OklzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pCiB7CiAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW3RhZ1swXV07Ci0gICAgRlhfQk9PTCBiQ2hlY2tMZWZ0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7CisgICAgYm9vbCBiQ2hlY2tMZWZ0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7CiAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVt0YWdbdGFnbGVuIC0gMV1dOwotICAgIEZYX0JPT0wgYkNoZWNrUmlnaHQgPSB0eXBlICE9ICdEJyAmJiB0eXBlICE9ICdXJzsKKyAgICBib29sIGJDaGVja1JpZ2h0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7CiAgICAgdWludDhfdCBjaDsKICAgICBpZiAoYkNoZWNrUmlnaHQgJiYgc3RhcnRwb3MgKyAoaW50MzJfdCl0YWdsZW4gPD0gbGltaXQgJiYgR2V0Q2hhckF0KHN0YXJ0cG9zICsgKGludDMyX3QpdGFnbGVuLCBjaCkpIHsKICAgICAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKICAgICAgICAgaWYgKHR5cGUgPT0gJ04nIHx8IHR5cGUgPT0gJ1InKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGJDaGVja0xlZnQgJiYgc3RhcnRwb3MgPiAwICYmIEdldENoYXJBdChzdGFydHBvcyAtIDEsIGNoKSkgewogICAgICAgICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgICAgICBpZiAodHlwZSA9PSAnTicgfHwgdHlwZSA9PSAnUicpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlNlYXJjaFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsIEZYX0JPT0wgYldob2xlV29yZCwgRlhfQk9PTCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpCitib29sIENQREZfU3ludGF4UGFyc2VyOjpTZWFyY2hXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLCBib29sIGJXaG9sZVdvcmQsIGJvb2wgYkZvcndhcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KQogewogICAgIGludDMyX3QgdGFnbGVuID0gdGFnLkdldExlbmd0aCgpOwogICAgIGlmICh0YWdsZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7CiAgICAgaW50MzJfdCBvZmZzZXQgPSAwOwpAQCAtMjUzMywyMCArMjUzMywyMCBAQAogICAgICAgICBpZiAoYkZvcndhcmQpIHsKICAgICAgICAgICAgIGlmIChsaW1pdCkgewogICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gbV9Qb3MgKyBsaW1pdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIUdldENoYXJBdChwb3MsIGJ5dGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChsaW1pdCkgewogICAgICAgICAgICAgICAgIGlmIChwb3MgPD0gbV9Qb3MgLSBsaW1pdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIUdldENoYXJBdEJhY2t3YXJkKHBvcywgYnl0ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChieXRlID09IHRhZ19kYXRhW29mZnNldF0pIHsKQEAgLTI1NjYsNyArMjU2Niw3IEBACiAgICAgICAgICAgICBGWF9GSUxFU0laRSBzdGFydHBvcyA9IGJGb3J3YXJkID8gcG9zIC0gdGFnbGVuICsgMSA6IHBvczsKICAgICAgICAgICAgIGlmICghYldob2xlV29yZCB8fCBJc1dob2xlV29yZChzdGFydHBvcywgbGltaXQsIHRhZy5HZXRQdHIoKSwgdGFnbGVuKSkgewogICAgICAgICAgICAgICAgIG1fUG9zID0gc3RhcnRwb3M7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJGb3J3YXJkKSB7CkBAIC0yNTc3LDE3ICsyNTc3LDE3IEBACiAgICAgICAgICAgICBwb3MgLS07CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogc3RydWN0IF9TZWFyY2hUYWdSZWNvcmQgewogICAgIGNvbnN0IHVpbnQ4X3QqCW1fcFRhZzsKICAgICBGWF9EV09SRAltX0xlbjsKICAgICBGWF9EV09SRAltX09mZnNldDsKIH07Ci1pbnQzMl90IENQREZfU3ludGF4UGFyc2VyOjpTZWFyY2hNdWx0aVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWdzLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KQoraW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoTXVsdGlXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFncywgYm9vbCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCkKIHsKICAgICBpbnQzMl90IG50YWdzID0gMSwgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgdGFncy5HZXRMZW5ndGgoKTsgaSArKykKQEAgLTI2OTUsMTcgKzI2OTUsMTcgQEAKICAgICBDUERGX0RhdGFBdmFpbChJRlhfRmlsZUF2YWlsKiBwRmlsZUF2YWlsLCBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCk7CiAgICAgfkNQREZfRGF0YUF2YWlsKCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpICBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgICAgICAgICBJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpICBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpICBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICAgICAgIElzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgSXNGb3JtQXZhaWwoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykgIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgSXNMaW5lYXJpemVkUERGKCkgIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgSXNMaW5lYXJpemVkKCkgIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICAgSXNMaW5lYXJpemVkKCkgIG92ZXJyaWRlCiAgICAgewogICAgICAgICByZXR1cm4gbV9iTGluZWFyaXplZDsKICAgICB9CkBAIC0yNzE3LDUyICsyNzE3LDUyIEBACiAgICAgc3RhdGljIGludCBzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aDsKIAogICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9GSUxFU0laRSYgb2Zmc2V0KTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgRlhfQk9PTCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fubm90cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fjcm9Gb3JtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWNyb0Zvcm1TdWJPYmplY3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZVN0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FsbENyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzT2JqZWN0c0F2YWlsKENGWF9QdHJBcnJheSYgb2JqX2FycmF5LCBib29sIGJQYXJzZVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIENGWF9QdHJBcnJheSAmcmV0X2FycmF5KTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0RvY1N0YXR1cyhJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0hlYWRlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ZpcnN0UGFnZShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0VuZChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ3Jvc3NSZWZJdGVtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrVHJhaWxlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Jvb3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tJbmZvKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUmVzb3VyY2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQW5ub3RzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1RyYWlsZXJBcHBlbmQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cywgRlhfRklMRVNJWkUgJnhyZWZfb2Zmc2V0KTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0xpbmVhcml6ZWRGaWxlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd0xlbik7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFN0YXJ0T2Zmc2V0KEZYX0ZJTEVTSVpFIGR3T2Zmc2V0KTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROZXh0VG9rZW4oQ0ZYX0J5dGVTdHJpbmcgJnRva2VuKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROZXh0Q2hhcih1aW50OF90ICZjaCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbik7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dENoYXIodWludDhfdCAmY2gpOwogICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIFBhcnNlSW5kaXJlY3RPYmplY3RBdChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIG9iam51bSk7Ci0gICAgQ1BERl9PYmplY3QJKiAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgRlhfQk9PTCAqcEV4aXN0SW5GaWxlKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYWdlS2lkcyhDUERGX1BhcnNlciAqcFBhcnNlciwgQ1BERl9PYmplY3QgKnBQYWdlcyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcGFyZVBhZ2VJdGVtKCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGaWxlUmVzb3VyY2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZUFubm90cyhpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIGJvb2wgKnBFeGlzdEluRmlsZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIgKnBQYXJzZXIsIENQREZfT2JqZWN0ICpwUGFnZXMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXBhcmVQYWdlSXRlbSgpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0xpbmVhcml6ZWREYXRhKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRmlsZVJlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VBbm5vdHMoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGluZWFyaXplZEZpcnN0UGFnZShpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNGaXJzdENoZWNrKGludCBpUGFnZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGF2ZVJlc291cmNlQW5jZXN0b3IoQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWREb2NQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRG9jUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VOb2RlKENQREZfUGFnZU5vZGUgJnBhZ2VOb2RlcywgaW50MzJfdCBpUGFnZSwgaW50MzJfdCAmaUNvdW50LCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Vua293blBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQXJyYXlQYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VDb3VudChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0ZpcnN0Q2hlY2soaW50IGlQYWdlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNldEZpcnN0Q2hlY2soaW50IGlQYWdlKTsKIAogICAgIENQREZfUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFyc2VyOwpAQCAtMjc3OSw3ICsyNzc5LDcgQEAKIAogICAgIENQREZfT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICptX3BUcmFpbGVyOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9jQXZhaWw7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9jQXZhaWw7CiAKICAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3SGVhZGVyT2Zmc2V0OwogCkBAIC0yODIzLDMxICsyODIzLDMxIEBACiAKICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VzT2JqTnVtOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JMaW5lYXJpemVkOwogCiAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0ZpcnN0UGFnZU5vOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyZWREYXRhT0s7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyZWREYXRhT0s7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JNYWluWFJlZkxvYWRUcmllZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JNYWluWFJlZkxvYWRUcmllZDsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1haW5YUmVmTG9hZGVkT0s7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTWFpblhSZWZMb2FkZWRPSzsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZDsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlBhZ2VzTG9hZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlc0xvYWQ7CiAKICAgICBDUERGX1BhcnNlciAqICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50UGFyc2VyOwogCiAgICAgRlhfRklMRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0N1cnJlbnRYUmVmU3RlYW07CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBbm5vdHNMb2FkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkFubm90c0xvYWQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JIYXZlQWNyb0Zvcm07CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtOwogCiAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0Fjcm9Gb3JtT2JqTnVtOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQWNyb0Zvcm1Mb2FkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkFjcm9Gb3JtTG9hZDsKIAogICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIG1fcEFjcm9Gb3JtOwogCkBAIC0yODU3LDExICsyODU3LDExIEBACiAKICAgICBDUERGX09iamVjdCAqICAgICAgICAgICAgICAgICAgICAgICBtX3BQYWdlUmVzb3VyY2U7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSzsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0s7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZDsKIAogICAgIENGWF9QdHJBcnJheSAgICAgICAgICAgICAgICAgICAgICAgIG1fUGFnZXNBcnJheTsKIApAQCAtMjg2OSw5ICsyODY5LDkgQEAKIAogICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldDsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0s7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0s7CiAKICAgICBDUERGX1BhZ2VOb2RlICAgICAgICAgICAgICAgICAgICAgICBtX3BhZ2VOb2RlczsKIApAQCAtMjkxNiwxOSArMjkxNiwxOSBAQAogICAgIG1fZHdFbmNyeXB0T2JqTnVtID0gMDsKICAgICBtX2R3UHJldlhSZWZPZmZzZXQgPSAwOwogICAgIG1fZHdMYXN0WFJlZk9mZnNldCA9IDA7Ci0gICAgbV9iRG9jQXZhaWwgPSBGQUxTRTsKLSAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IEZBTFNFOwotICAgIG1fYkRvY0F2YWlsID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VzTG9hZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBGQUxTRTsKLSAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gRkFMU0U7Ci0gICAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOwotICAgIG1fYkhhdmVBY3JvRm9ybSA9IEZBTFNFOwotICAgIG1fYkFjcm9Gb3JtTG9hZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOwotICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBGQUxTRTsKKyAgICBtX2JEb2NBdmFpbCA9IGZhbHNlOworICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gZmFsc2U7CisgICAgbV9iRG9jQXZhaWwgPSBmYWxzZTsKKyAgICBtX2JMaW5lYXJpemVkID0gZmFsc2U7CisgICAgbV9iUGFnZXNMb2FkID0gZmFsc2U7CisgICAgbV9iUGFnZXNUcmVlTG9hZCA9IGZhbHNlOworICAgIG1fYk1haW5YUmVmTG9hZGVkT0sgPSBmYWxzZTsKKyAgICBtX2JBbm5vdHNMb2FkID0gZmFsc2U7CisgICAgbV9iSGF2ZUFjcm9Gb3JtID0gZmFsc2U7CisgICAgbV9iQWNyb0Zvcm1Mb2FkID0gZmFsc2U7CisgICAgbV9iUGFnZUxvYWRlZE9LID0gZmFsc2U7CisgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBmYWxzZTsKKyAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IGZhbHNlOwogICAgIG1fcExpbmVhcml6ZWQgPSBOVUxMOwogICAgIG1fcFJvb3QgPSBOVUxMOwogICAgIG1fcFRyYWlsZXIgPSBOVUxMOwpAQCAtMjkzOCwxMCArMjkzOCwxMCBAQAogICAgIG1fcFBhZ2VSZXNvdXJjZSA9IE5VTEw7CiAgICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZSA9IE5VTEw7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0hFQURFUjsKLSAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOwotICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gRkFMU0U7Ci0gICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICBtX2JMaW5lYXJlZERhdGFPSyA9IEZBTFNFOworICAgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gZmFsc2U7CisgICAgbV9iVG90YWxMb2FkUGFnZVRyZWUgPSBmYWxzZTsKKyAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IGZhbHNlOworICAgIG1fYkxpbmVhcmVkRGF0YU9LID0gZmFsc2U7CiAgICAgbV9wYWdlc0xvYWRTdGF0ZSA9IE5VTEw7CiB9CiBDUERGX0RhdGFBdmFpbDo6fkNQREZfRGF0YUF2YWlsKCkKQEAgLTI5OTUsMTAgKzI5OTUsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgRlhfQk9PTCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSkKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OklzT2JqZWN0c0F2YWlsKENGWF9QdHJBcnJheSYgb2JqX2FycmF5LCBib29sIGJQYXJzZVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIENGWF9QdHJBcnJheSAmcmV0X2FycmF5KQogewogICAgIGlmICghb2JqX2FycmF5LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0RXT1JEIGNvdW50ID0gMDsKICAgICBDRlhfUHRyQXJyYXkgbmV3X29ial9hcnJheTsKQEAgLTMwODgsNDIgKzMwODgsNDIgQEAKICAgICAgICAgICAgICAgICByZXRfYXJyYXkuQWRkKHBPYmopOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBvYmpfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgb2JqX2FycmF5LkFwcGVuZChuZXdfb2JqX2FycmF5KTsKLSAgICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCByZXRfYXJyYXkpOworICAgIHJldHVybiBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIGZhbHNlLCBwSGludHMsIHJldF9hcnJheSk7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKCFtX2R3RmlsZUxlbiAmJiBtX3BGaWxlUmVhZCkgewogICAgICAgICBtX2R3RmlsZUxlbiA9IChGWF9EV09SRCltX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOwogICAgICAgICBpZiAoIW1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHdoaWxlICghbV9iRG9jQXZhaWwpIHsKICAgICAgICAgaWYgKCFDaGVja0RvY1N0YXR1cyhwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7CiAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgbV9vYmpudW1fYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7CiAgICAgICAgIG9ial9hcnJheS5BcHBlbmQobV9hcnJheUFjcm9mb3Jtcyk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICAgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOwogICAgICAgICBpZiAoYlJldCkgewogICAgICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiUmV0OwogICAgIH0KICAgICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7Ci0gICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CiAgICAgaWYgKGJSZXQpIHsKICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IG1fYXJyYXlBY3JvZm9ybXMuR2V0U2l6ZSgpOwogICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7CkBAIC0zMTM2LDI2ICszMTM2LDI2IEBACiAgICAgfQogICAgIHJldHVybiBiUmV0OwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKICAgICBtX3BBY3JvRm9ybSA9IEdldE9iamVjdChtX2R3QWNyb0Zvcm1PYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghbV9wQWNyb0Zvcm0pIHsKICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fYXJyYXlBY3JvZm9ybXMuQWRkKG1fcEFjcm9Gb3JtKTsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0RvY1N0YXR1cyhJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKIHsKICAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9IRUFERVI6CkBAIC0zMTk1LDE3ICszMTk1LDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIENoZWNrUGFnZShwSGludHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VfTEFURVJMT0FEOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgogICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CiAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDoKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbV9iRG9jQXZhaWwgPSBUUlVFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX2JEb2NBdmFpbCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9Ci1GWF9CT09MCUNQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wJQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZVN0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOgpAQCAtMzIxNSwzNiArMzIxNSwzNiBAQAogICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRVJST1I6CiAgICAgICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOwotICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IHRydWU7CisgICAgICAgICAgICBtX2JQYWdlc0xvYWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZEFsbEZpbGUoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwgKEZYX0RXT1JEKW1fZHdGaWxlTGVuKSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBwSGludHMtPkFkZFNlZ21lbnQoMCwgKEZYX0RXT1JEKW1fZHdGaWxlTGVuKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZEFsbFhyZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgbV9wYXJzZXIubV9TeW50YXguSW5pdFBhcnNlcihtX3BGaWxlUmVhZCwgKEZYX0RXT1JEKW1fZHdIZWFkZXJPZmZzZXQpOwotICAgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gRkFMU0U7CisgICAgbV9wYXJzZXIubV9iT3duRmlsZVJlYWQgPSBmYWxzZTsKICAgICBpZiAoIW1fcGFyc2VyLkxvYWRBbGxDcm9zc1JlZlY0KG1fZHdMYXN0WFJlZk9mZnNldCkgJiYgIW1fcGFyc2VyLkxvYWRBbGxDcm9zc1JlZlY1KG1fZHdMYXN0WFJlZk9mZnNldCkpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhTWVNfcXNvcnQobV9wYXJzZXIubV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX3BhcnNlci5tX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwogICAgIG1fZHdSb290T2JqTnVtID0gbV9wYXJzZXIuR2V0Um9vdE9iak51bSgpOwogICAgIG1fZHdJbmZvT2JqTnVtID0gbV9wYXJzZXIuR2V0SW5mb09iak51bSgpOwogICAgIG1fcEN1cnJlbnRQYXJzZXIgPSAmbV9wYXJzZXI7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1JPT1Q7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1DUERGX09iamVjdCogQ1BERl9EYXRhQXZhaWw6OkdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIEZYX0JPT0wgKnBFeGlzdEluRmlsZSkKK0NQREZfT2JqZWN0KiBDUERGX0RhdGFBdmFpbDo6R2V0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgYm9vbCAqcEV4aXN0SW5GaWxlKQogewogICAgIENQREZfT2JqZWN0ICpwUmV0ICAgICAgICAgPSBOVUxMOwogICAgIEZYX0RXT1JEICAgIG9yaWdpbmFsX3NpemUgPSAwOwpAQCAtMzI1Miw3ICszMjUyLDcgQEAKICAgICBDUERGX1BhcnNlciAqcFBhcnNlciAgICAgID0gTlVMTDsKIAogICAgIGlmIChwRXhpc3RJbkZpbGUpIHsKLSAgICAgICAgKnBFeGlzdEluRmlsZSA9IFRSVUU7CisgICAgICAgICpwRXhpc3RJbkZpbGUgPSB0cnVlOwogICAgIH0KIAogICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMKSB7CkBAIC0zMjY3LDcgKzMyNjcsNyBAQAogICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRFdPUkQ+IHNpemUgPSBvcmlnaW5hbF9zaXplOwogICAgIGlmIChzaXplLlZhbHVlT3JEZWZhdWx0KDApID09IDAgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9kd0ZpbGVMZW4pIHsKICAgICAgICAgaWYgKHBFeGlzdEluRmlsZSkKLSAgICAgICAgICAgKnBFeGlzdEluRmlsZSA9IEZBTFNFOworICAgICAgICAgICAqcEV4aXN0SW5GaWxlID0gZmFsc2U7CiAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzI5OCwxNSArMzI5OCwxNSBAQAogICAgIH0KIAogICAgIGlmICghcFJldCAmJiBwRXhpc3RJbkZpbGUpIHsKLSAgICAgICAgKnBFeGlzdEluRmlsZSA9IEZBTFNFOworICAgICAgICAqcEV4aXN0SW5GaWxlID0gZmFsc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHBSZXQ7CiB9CiAKLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tJbmZvKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgIENQREZfT2JqZWN0ICpwSW5mbyA9IEdldE9iamVjdChtX2R3SW5mb09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICBpZiAoIWJFeGlzdCkgewogICAgICAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtKSB7CkBAIC0zMzE0LDE3ICszMzE0LDE3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoIXBJbmZvKSB7CiAgICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX1BvcyA9PSBtX2R3RmlsZUxlbikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocEluZm8pIHsKICAgICAgICAgcEluZm8tPlJlbGVhc2UoKTsKQEAgLTMzMzQsMzcgKzMzMzQsMzcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1Jvb3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgbV9wUm9vdCA9IEdldE9iamVjdChtX2R3Um9vdE9iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICBpZiAoIWJFeGlzdCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFtX3BSb290KSB7CiAgICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUm9vdC0+R2V0RGljdCgpOwogICAgIGlmICghcERpY3QpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKXBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQYWdlcyIpKTsKICAgICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fUGFnZXNPYmpOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKICAgICBDUERGX1JlZmVyZW5jZSogcEFjcm9Gb3JtUmVmID0gKENQREZfUmVmZXJlbmNlKiltX3BSb290LT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkFjcm9Gb3JtIikpOwogICAgIGlmIChwQWNyb0Zvcm1SZWYgJiYgcEFjcm9Gb3JtUmVmLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICBtX2JIYXZlQWNyb0Zvcm0gPSBUUlVFOworICAgICAgICBtX2JIYXZlQWNyb0Zvcm0gPSB0cnVlOwogICAgICAgICBtX2R3QWNyb0Zvcm1PYmpOdW0gPSBwQWNyb0Zvcm1SZWYtPkdldFJlZk9iak51bSgpOwogICAgIH0KICAgICBpZiAobV9kd0luZm9PYmpOdW0pIHsKQEAgLTMzNzYsMjIgKzMzNzYsMjIgQEAKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OlByZXBhcmVQYWdlSXRlbSgpCitib29sIENQREZfRGF0YUF2YWlsOjpQcmVwYXJlUGFnZUl0ZW0oKQogewogICAgIENQREZfRGljdGlvbmFyeSAqcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gcFJvb3QgPyAoQ1BERl9SZWZlcmVuY2UqKXBSb290LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQYWdlcyIpKSA6IE5VTEw7CiAgICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CiAgICAgbV9wQ3VycmVudFBhcnNlciA9IChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpJc0ZpcnN0Q2hlY2soaW50IGlQYWdlKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNGaXJzdENoZWNrKGludCBpUGFnZSkKIHsKICAgICBpZiAoTlVMTCA9PSBtX3BhZ2VNYXBDaGVja1N0YXRlKSB7CiAgICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBuZXcgQ0ZYX0NNYXBEV29yZFRvRFdvcmQoKTsKQEAgLTMzOTksMTMgKzMzOTksMTMgQEAKICAgICBGWF9EV09SRCBkd1ZhbHVlID0gMDsKICAgICBpZiAoIW1fcGFnZU1hcENoZWNrU3RhdGUtPkxvb2t1cChpUGFnZSwgZHdWYWx1ZSkpIHsKICAgICAgICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZS0+U2V0QXQoaVBhZ2UsIDEpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChkd1ZhbHVlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAxKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9EYXRhQXZhaWw6OlJlc2V0Rmlyc3RDaGVjayhpbnQgaVBhZ2UpCiB7CkBAIC0zNDE4LDEzICszNDE4LDEzIEBACiAgICAgfQogICAgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAwKTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7CiAgICAgRlhfRFdPUkQgaVBhZ2VPYmpzID0gbV9QYWdlT2JqTGlzdC5HZXRTaXplKCk7CiAgICAgQ0ZYX0RXb3JkQXJyYXkgVW5hdmFpbE9iakxpc3Q7CiAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGlQYWdlT2JqczsgKytpKSB7CiAgICAgICAgIEZYX0RXT1JEIGR3UGFnZU9iak51bSA9IG1fUGFnZU9iakxpc3QuR2V0QXQoaSk7Ci0gICAgICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgICAgIENQREZfT2JqZWN0ICpwT2JqID0gR2V0T2JqZWN0KGR3UGFnZU9iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKICAgICAgICAgaWYgKCFwT2JqKSB7CiAgICAgICAgICAgICBpZiAoYkV4aXN0KSB7CkBAIC0zNDU5LDcgKzM0NTksNyBAQAogICAgIG1fUGFnZU9iakxpc3QuUmVtb3ZlQWxsKCk7CiAgICAgaWYgKFVuYXZhaWxPYmpMaXN0LkdldFNpemUoKSkgewogICAgICAgICBtX1BhZ2VPYmpMaXN0LkFwcGVuZChVbmF2YWlsT2JqTGlzdCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9EV09SRCBpUGFnZXMgPSBtX1BhZ2VzQXJyYXkuR2V0U2l6ZSgpOwogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZXM7IGkrKykgewpAQCAtMzQ3NSw3ICszNDc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fUGFnZXNBcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKICAgICB9CkBAIC0zNDgzLDE4ICszNDgzLDE4IEBACiAgICAgaWYgKCFtX1BhZ2VPYmpMaXN0LkdldFNpemUoKSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXRQYWdlS2lkcyhDUERGX1BhcnNlciAqcFBhcnNlciwgQ1BERl9PYmplY3QgKnBQYWdlcykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkdldFBhZ2VLaWRzKENQREZfUGFyc2VyICpwUGFyc2VyLCBDUERGX09iamVjdCAqcFBhZ2VzKQogewogICAgIGlmICghcFBhcnNlcikgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2VzLT5HZXREaWN0KCk7CiAgICAgQ1BERl9PYmplY3QgKnBLaWRzID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiS2lkcyIpKSA6IE5VTEw7CiAgICAgaWYgKCFwS2lkcykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHN3aXRjaCAocEtpZHMtPkdldFR5cGUoKSkgewogICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKQEAgLTM1MTQsMzUgKzM1MTQsMzUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgQ1BERl9PYmplY3QgKnBQYWdlcyA9IEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoIXBQYWdlcykgewogICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFHZXRQYWdlS2lkcyhtX3BDdXJyZW50UGFyc2VyLCBwUGFnZXMpKSB7CiAgICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSGVhZGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0hlYWRlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIEZYX0RXT1JEIHJlcV9zaXplID0gMTAyNDsKICAgICBpZiAoKEZYX0ZJTEVTSVpFKXJlcV9zaXplID4gbV9kd0ZpbGVMZW4pIHsKQEAgLTM1NTUsMzQgKzM1NTUsMzQgQEAKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRU5EOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcEhpbnRzLT5BZGRTZWdtZW50KDAsIHJlcV9zaXplKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKTsKICAgICBDUERGX09iamVjdCAqcEVuZE9mZlNldCA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIkUiKSkgOiBOVUxMOwogICAgIGlmICghcEVuZE9mZlNldCkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX09iamVjdCAqcFhSZWZPZmZzZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJUIikpIDogTlVMTDsKICAgICBpZiAoIXBYUmVmT2Zmc2V0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfT2JqZWN0ICpwRmlsZUxlbiA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIkwiKSkgOiBOVUxMOwogICAgIGlmICghcEZpbGVMZW4pIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgRlhfQk9PTCBiTmVlZERvd25Mb2FkID0gRkFMU0U7CisgICAgYm9vbCBiTmVlZERvd25Mb2FkID0gZmFsc2U7CiAgICAgaWYgKHBFbmRPZmZTZXQtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CiAgICAgICAgIEZYX0RXT1JEIGR3RW5kID0gcEVuZE9mZlNldC0+R2V0SW50ZWdlcigpOwogICAgICAgICBkd0VuZCArPSA1MTI7CkBAIC0zNTkzLDcgKzM1OTMsNyBAQAogICAgICAgICBpbnQzMl90IGlTaXplID0gZHdFbmQgPiAxMDI0ID8gZHdFbmQgLSAxMDI0IDogMDsKICAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKGlTdGFydFBvcywgaVNpemUpKSB7CiAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQoaVN0YXJ0UG9zLCBpU2l6ZSk7Ci0gICAgICAgICAgICBiTmVlZERvd25Mb2FkID0gVFJVRTsKKyAgICAgICAgICAgIGJOZWVkRG93bkxvYWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIG1fZHdMYXN0WFJlZk9mZnNldCA9IDA7CkBAIC0zNjE5LDE2ICszNjE5LDE2IEBACiAgICAgfQogICAgIGlmICghYk5lZWREb3duTG9hZCAmJiBtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRV9QUkVQQVJFKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BERl9PYmplY3QJKiBDUERGX0RhdGFBdmFpbDo6UGFyc2VJbmRpcmVjdE9iamVjdEF0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtKQogewogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOwogICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBib29sIGJJc051bWJlcjsKICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKICAgICBpZiAoIWJJc051bWJlcikgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM2NzAsMjEgKzM2NzAsMjEgQEAKICAgICB9CiAgICAgcmV0dXJuIFBERl9OT1RfTElORUFSSVpFRDsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pCiB7Ci0gICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocERhdGEsIChzaXplX3QpZHdMZW4sIEZBTFNFKSk7CisgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocERhdGEsIChzaXplX3QpZHdMZW4sIGZhbHNlKSk7CiAgICAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQoZmlsZS5HZXQoKSk7CiAgICAgaWYgKG9mZnNldCA9PSAtMSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX2R3SGVhZGVyT2Zmc2V0ID0gb2Zmc2V0OwogICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgb2Zmc2V0KTsKICAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKG1fc3ludGF4UGFyc2VyLm1fSGVhZGVyT2Zmc2V0ICsgOSk7Ci0gICAgRlhfQk9PTCBiTnVtYmVyID0gRkFMU0U7CisgICAgYm9vbCBiTnVtYmVyID0gZmFsc2U7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZE9iak51bSA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgIGlmICghYk51bWJlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkT2JqTnVtKTsKICAgICBpZiAobV9wTGluZWFyaXplZCkgewpAQCAtMzY5Myw1OCArMzY5Myw1OCBAQAogICAgIH0KICAgICBtX3BMaW5lYXJpemVkID0gUGFyc2VJbmRpcmVjdE9iamVjdEF0KG1fc3ludGF4UGFyc2VyLm1fSGVhZGVyT2Zmc2V0ICsgOSwgb2JqbnVtKTsKICAgICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BMaW5lYXJpemVkLT5HZXREaWN0KCkgJiYgbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMaW5lYXJpemVkIikpKSB7CiAgICAgICAgIENQREZfT2JqZWN0ICpwTGVuID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMIikpOwogICAgICAgICBpZiAoIXBMZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKXBMZW4tPkdldEludGVnZXIoKSAhPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbV9iTGluZWFyaXplZCA9IFRSVUU7CisgICAgICAgIG1fYkxpbmVhcml6ZWQgPSB0cnVlOwogICAgICAgICBDUERGX09iamVjdCAqcE5vID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQIikpOwogICAgICAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKICAgICAgICAgICAgIG1fZHdGaXJzdFBhZ2VObyA9IHBOby0+R2V0SW50ZWdlcigpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0VuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIEZYX0RXT1JEIHJlcV9wb3MgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuID4gMTAyNCA/IG1fZHdGaWxlTGVuIC0gMTAyNCA6IDApOwogICAgIEZYX0RXT1JEIGR3U2l6ZSA9IChGWF9EV09SRCkobV9kd0ZpbGVMZW4gLSByZXFfcG9zKTsKICAgICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChyZXFfcG9zLCBkd1NpemUpKSB7CiAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzEwMjRdOwogICAgICAgICBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgcmVxX3BvcywgZHdTaXplKTsKLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYnVmZmVyLCAoc2l6ZV90KWR3U2l6ZSwgRkFMU0UpKTsKKyAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYnVmZmVyLCAoc2l6ZV90KWR3U2l6ZSwgZmFsc2UpKTsKICAgICAgICAgbV9zeW50YXhQYXJzZXIuSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKICAgICAgICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhkd1NpemUgLSAxKTsKLSAgICAgICAgaWYgKG1fc3ludGF4UGFyc2VyLlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCBUUlVFLCBGQUxTRSwgZHdTaXplKSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTnVtYmVyOworICAgICAgICBpZiAobV9zeW50YXhQYXJzZXIuU2VhcmNoV29yZChGWF9CU1RSQygic3RhcnR4cmVmIiksIHRydWUsIGZhbHNlLCBkd1NpemUpKSB7CisgICAgICAgICAgICBib29sIGJOdW1iZXI7CiAgICAgICAgICAgICBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7CiAgICAgICAgICAgICBpZiAoIWJOdW1iZXIpIHsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fZHdYUmVmT2Zmc2V0ID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2F0b2k2NCh4cmVmcG9zX3N0cik7CiAgICAgICAgICAgICBpZiAoIW1fZHdYUmVmT2Zmc2V0IHx8IG1fZHdYUmVmT2Zmc2V0ID4gbV9kd0ZpbGVMZW4pIHsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSBtX2R3WFJlZk9mZnNldDsKICAgICAgICAgICAgIFNldFN0YXJ0T2Zmc2V0KG1fZHdYUmVmT2Zmc2V0KTsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRjsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHBIaW50cy0+QWRkU2VnbWVudChyZXFfcG9zLCBkd1NpemUpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBpbnQzMl90IENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIEZYX0ZJTEVTSVpFICZ4cmVmX29mZnNldCkKIHsKQEAgLTM3NTUsOSArMzc1NSw5IEBACiAgICAgICAgIENGWF9CaW5hcnlCdWYgYnVmKGlTaXplKTsKICAgICAgICAgdWludDhfdCogcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKICAgICAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3Q3VycmVudFhSZWZTdGVhbSwgaVNpemUpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBGQUxTRSkpOworICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBmYWxzZSkpOwogICAgICAgICBtX3BhcnNlci5tX1N5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiTnVtYmVyID0gZmFsc2U7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIG9iam51bSA9IG1fcGFyc2VyLm1fU3ludGF4LkdldE5leHRXb3JkKGJOdW1iZXIpOwogICAgICAgICBpZiAoIWJOdW1iZXIpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTM3ODksMTggKzM3ODksMTggQEAKICAgICBtX1BvcyA9IGR3T2Zmc2V0OwogfQogI2RlZmluZSBNQVhfV09SRF9CVUZGRVIgMjU2Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXROZXh0VG9rZW4oQ0ZYX0J5dGVTdHJpbmcgJnRva2VuKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbikKIHsKICAgICBtX1dvcmRTaXplID0gMDsKICAgICB1aW50OF90IGNoOwogICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIHdoaWxlICh0eXBlID09ICdXJykgewogICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgICAgIH0KQEAgLTM4MDksNyArMzgwOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM4MjIsMTQgKzM4MjIsMTQgQEAKICAgICAgICAgaWYgKGNoID09ICcvJykgewogICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gJ1InICYmIHR5cGUgIT0gJ04nKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fUG9zIC0tOwogICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKICAgICAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKQEAgLTM4MzcsNyArMzgzNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7CiAgICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7CiAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKQEAgLTM4NDYsNyArMzg0Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7CiAgICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2ggPT0gJz4nKSB7CiAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKQEAgLTM4NTYsMTQgKzM4NTYsMTQgQEAKICAgICAgICAgfQogICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKICAgICAgICAgdG9rZW4gPSByZXQ7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKICAgICAgICAgaWYgKHR5cGUgPT0gJ0QnIHx8IHR5cGUgPT0gJ1cnKSB7CkBAIC0zODczLDEzICszODczLDEzIEBACiAgICAgfQogICAgIENGWF9CeXRlU3RyaW5nIHJldChtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwogICAgIHRva2VuID0gcmV0OwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dENoYXIodWludDhfdCAmY2gpCitib29sIENQREZfRGF0YUF2YWlsOjpHZXROZXh0Q2hhcih1aW50OF90ICZjaCkKIHsKICAgICBGWF9GSUxFU0laRSBwb3MgPSBtX1BvczsKICAgICBpZiAocG9zID49IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9idWZmZXJPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9idWZmZXJPZmZzZXQgKyBtX2J1ZmZlclNpemUpIDw9IHBvcykgewogICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKQEAgLTM4OTEsMTYgKzM4OTEsMTYgQEAKICAgICAgICAgICAgIHJlYWRfcG9zID0gbV9kd0ZpbGVMZW4gLSByZWFkX3NpemU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKG1fYnVmZmVyRGF0YSwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX2J1ZmZlck9mZnNldCA9IHJlYWRfcG9zOwogICAgICAgICBtX2J1ZmZlclNpemUgPSByZWFkX3NpemU7CiAgICAgfQogICAgIGNoID0gbV9idWZmZXJEYXRhW3BvcyAtIG1fYnVmZmVyT2Zmc2V0XTsKICAgICBtX1BvcyArKzsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWZJdGVtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQogewogICAgIGludDMyX3QgaVNpemUgPSAwOwogICAgIENGWF9CeXRlU3RyaW5nIHRva2VuOwpAQCAtMzkwOCwxNiArMzkwOCwxNiBAQAogICAgICAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKICAgICAgICAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICh0b2tlbiA9PSAidHJhaWxlciIpIHsKICAgICAgICAgICAgIG1fZHdUcmFpbGVyT2Zmc2V0ID0gbV9Qb3M7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUjsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0FsbENyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0FsbENyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCiB7CiAgICAgRlhfRklMRVNJWkUgeHJlZl9vZmZzZXQgPSAwOwogICAgIGludDMyX3QgblJldCA9IENoZWNrQ3Jvc3NSZWZTdHJlYW0ocEhpbnRzLCB4cmVmX29mZnNldCk7CkBAIC0zOTI4LDIxICszOTI4LDIxIEBACiAgICAgICAgICAgICBtX2R3Q3VycmVudFhSZWZTdGVhbSA9IHhyZWZfb2Zmc2V0OwogICAgICAgICAgICAgbV9Qb3MgPSB4cmVmX29mZnNldDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChuUmV0ID09IC0xKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpbnQzMl90IGlTaXplID0gMDsKICAgICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKICAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKICAgICAgICAgaVNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOwogICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh0b2tlbiA9PSAieHJlZiIpIHsKICAgICAgICAgbV9Dcm9zc09mZnNldC5JbnNlcnRBdCgwLCBtX2R3WFJlZk9mZnNldCk7CkBAIC0zOTUxLDI4ICszOTUxLDI4IEBACiAgICAgICAgICAgICAgICAgaVNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOwogICAgICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOwogICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7CiAgICAgICAgICAgICAgICAgbV9kd1RyYWlsZXJPZmZzZXQgPSBtX1BvczsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUjsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1RyYWlsZXJBcHBlbmQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAobV9Qb3MgPCBtX2R3RmlsZUxlbikgewogICAgICAgICBGWF9GSUxFU0laRSBkd0FwcGVuZFBvcyA9IG1fUG9zICsgbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOwogICAgICAgICBpbnQzMl90IGlTaXplID0gKGludDMyX3QpKGR3QXBwZW5kUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIGR3QXBwZW5kUG9zIDogNTEyKTsKICAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKGR3QXBwZW5kUG9zLCBpU2l6ZSkpIHsKICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChkd0FwcGVuZFBvcywgaVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQpIHsKQEAgLTM5ODEsOSArMzk4MSw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExDUlNPU1NSRUY7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpbnQzMl90IGlUcmFpbGVyU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7CiAgICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9Qb3MsIGlUcmFpbGVyU2l6ZSkpIHsKQEAgLTM5OTIsMjEgKzM5OTIsMjEgQEAKICAgICAgICAgdWludDhfdCogcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKICAgICAgICAgaWYgKCFwQnVmKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKHBCdWYsIG1fZHdUcmFpbGVyT2Zmc2V0LCBpU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBGQUxTRSkpOworICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBmYWxzZSkpOwogICAgICAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwogICAgICAgICBDUERGX09iamVjdCAqcFRyYWlsZXIgPSBtX3N5bnRheFBhcnNlci5HZXRPYmplY3QoTlVMTCwgMCwgMCwgMCk7CiAgICAgICAgIGlmICghcFRyYWlsZXIpIHsKICAgICAgICAgICAgIG1fUG9zICs9IG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVRyYWlsZXJTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFRyYWlsZXItPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcFRyYWlsZXJEaWN0ID0gcFRyYWlsZXItPkdldERpY3QoKTsKICAgICAgICAgaWYgKHBUcmFpbGVyRGljdCkgewpAQCAtNDAxNCw3ICs0MDE0LDcgQEAKICAgICAgICAgICAgIGlmIChwRW5jcnlwdCAmJiBwRW5jcnlwdC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CiAgICAgICAgICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBGWF9EV09SRCB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwVHJhaWxlci0+R2V0RGljdCgpLCBGWF9CU1RSQygiUHJldiIpKTsKQEAgLTQwMzIsNjAgKzQwMzIsNjAgQEAKICAgICAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOwogICAgICAgICBwVHJhaWxlci0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVRyYWlsZXJTaXplKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICB3aGlsZSAoVFJVRSkgeworICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKICAgICAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKICAgICAgICAgICAgICAgICBpZiAoIUxvYWREb2NQYWdlcyhwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFOgogICAgICAgICAgICAgICAgIGlmICghTG9hZERvY1BhZ2UoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgogICAgICAgICAgICAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkID0gVFJVRTsKLSAgICAgICAgICAgICAgICBtX2JQYWdlc0xvYWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2JQYWdlc0xvYWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wJQ1BERl9EYXRhQXZhaWw6OkNoZWNrQXJyYXlQYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbAlDUERGX0RhdGFBdmFpbDo6Q2hlY2tBcnJheVBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCiB7Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgICBib29sIGJFeGlzdCA9IGZhbHNlOwogICAgIENQREZfT2JqZWN0ICpwUGFnZXMgPSBHZXRPYmplY3QoZHdQYWdlTm8sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFwUGFnZXMpIHsKICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBQYWdlcy0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewogICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcFBhZ2VOb2RlLT5tX3R5cGUgPSBQREZfUEFHRU5PREVfUEFHRVM7CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBQYWdlczsKQEAgLTQwOTksMzMgKzQwOTksMzMgQEAKICAgICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSAoKENQREZfUmVmZXJlbmNlKilwS2lkKS0+R2V0UmVmT2JqTnVtKCk7CiAgICAgfQogICAgIHBQYWdlcy0+UmVsZWFzZSgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKICAgICBDUERGX09iamVjdCAqcFBhZ2UgPSBHZXRPYmplY3QoZHdQYWdlTm8sIHBIaW50cywgJmJFeGlzdCk7CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFwUGFnZSkgewogICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgcFBhZ2VOb2RlLT5tX2R3UGFnZU5vID0gZHdQYWdlTm87CiAgICAgICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX0FSUkFZOwogICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwUGFnZS0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CiAgICAgICAgIHBQYWdlLT5SZWxlYXNlKCk7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+R2V0RGljdCgpOwpAQCAtNDEzNSw3ICs0MTM1LDcgQEAKICAgICAgICAgQ1BERl9PYmplY3QgKnBLaWRzID0gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIktpZHMiKSk7CiAgICAgICAgIGlmICghcEtpZHMpIHsKICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKICAgICAgICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewpAQCAtNDE2NiwxNyArNDE2NiwxNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHBQYWdlLT5SZWxlYXNlKCk7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHBQYWdlLT5SZWxlYXNlKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VOb2RlKENQREZfUGFnZU5vZGUgJnBhZ2VOb2RlcywgaW50MzJfdCBpUGFnZSwgaW50MzJfdCAmaUNvdW50LCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpbnQzMl90IGlTaXplID0gcGFnZU5vZGVzLm1fY2hpbGROb2RlLkdldFNpemUoKTsKICAgICBpZiAoaVNpemUgPD0gMCB8fCBpUGFnZSA+PSBpU2l6ZSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7CiAgICAgICAgIENQREZfUGFnZU5vZGUgKnBOb2RlID0gKENQREZfUGFnZU5vZGUqKXBhZ2VOb2Rlcy5tX2NoaWxkTm9kZS5HZXRBdChpKTsKQEAgLTQxODYsNyArNDE4Niw3IEBACiAgICAgICAgIHN3aXRjaCAocE5vZGUtPm1fdHlwZSkgewogICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfVU5LT1dOOgogICAgICAgICAgICAgICAgIGlmICghQ2hlY2tVbmtvd25QYWdlTm9kZShwTm9kZS0+bV9kd1BhZ2VObywgcE5vZGUsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC0taTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQxOTgsMTk5ICs0MTk4LDE5OSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfUEFHRVM6CiAgICAgICAgICAgICAgICAgaWYgKCFDaGVja1BhZ2VOb2RlKCpwTm9kZSwgaVBhZ2UsIGlDb3VudCwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBERl9QQUdFTk9ERV9BUlJBWToKICAgICAgICAgICAgICAgICBpZiAoIUNoZWNrQXJyYXlQYWdlTm9kZShwTm9kZS0+bV9kd1BhZ2VObywgcE5vZGUsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC0taTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoaVBhZ2UgPT0gaUNvdW50KSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkRG9jUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAobV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpIDw9IGlQYWdlIHx8IG1fcERvY3VtZW50LT5tX1BhZ2VMaXN0LkdldEF0KGlQYWdlKSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9wYWdlTm9kZXMubV90eXBlID09IFBERl9QQUdFTk9ERV9QQUdFKSB7CiAgICAgICAgIGlmIChpUGFnZSA9PSAwKSB7CiAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludDMyX3QgaUNvdW50ID0gLTE7CiAgICAgcmV0dXJuIENoZWNrUGFnZU5vZGUobV9wYWdlTm9kZXMsIGlQYWdlLCBpQ291bnQsIHBIaW50cyk7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VDb3VudChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgQ1BERl9PYmplY3QgKnBQYWdlcyA9IEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwogICAgIGlmICghYkV4aXN0KSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghcFBhZ2VzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlc0RpY3QgPSBwUGFnZXMtPkdldERpY3QoKTsKICAgICBpZiAoIXBQYWdlc0RpY3QpIHsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghcFBhZ2VzRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaW50IGNvdW50ID0gcFBhZ2VzRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ291bnQiKSk7CiAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIUNoZWNrVW5rb3duUGFnZU5vZGUobV9QYWdlc09iak51bSwgJm1fcGFnZU5vZGVzLCBwSGludHMpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoQ2hlY2tQYWdlQ291bnQocEhpbnRzKSkgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICBtX2JUb3RhbExvYWRQYWdlVHJlZSA9IFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIHdoaWxlICghbV9iUGFnZXNUcmVlTG9hZCkgewogICAgICAgICBpZiAoIUNoZWNrUGFnZVN0YXR1cyhwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fYlBhZ2VzTG9hZCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fcERvY3VtZW50LT5Mb2FkUGFnZXMoKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRGF0YShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRGF0YShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmIChtX2JMaW5lYXJlZERhdGFPSykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgaWYgKCFtX2JNYWluWFJlZkxvYWRUcmllZCkgewogICAgICAgICBGWF9TQUZFX0RXT1JEIGRhdGFfc2l6ZSA9IG1fZHdGaWxlTGVuOwogICAgICAgICBkYXRhX3NpemUgLT0gbV9kd0xhc3RYUmVmT2Zmc2V0OwogICAgICAgICBpZiAoIWRhdGFfc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9kd0xhc3RYUmVmT2Zmc2V0LCBkYXRhX3NpemUuVmFsdWVPckRpZSgpKSkgewogICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fZHdMYXN0WFJlZk9mZnNldCwgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhfRFdPUkQgZHdSZXQgPSAoKENQREZfUGFyc2VyICopbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpKS0+TG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7Ci0gICAgICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gVFJVRTsKKyAgICAgICAgbV9iTWFpblhSZWZMb2FkVHJpZWQgPSB0cnVlOwogICAgICAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICghUHJlcGFyZVBhZ2VJdGVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gVFJVRTsKLSAgICAgICAgbV9iTGluZWFyZWREYXRhT0sgICA9IFRSVUU7CisgICAgICAgIG1fYk1haW5YUmVmTG9hZGVkT0sgPSB0cnVlOworICAgICAgICBtX2JMaW5lYXJlZERhdGFPSyAgID0gdHJ1ZTsKICAgICB9CiAKICAgICByZXR1cm4gbV9iTGluZWFyZWREYXRhT0s7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VBbm5vdHMoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZUFubm90cyhpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBQYWdlRGljdCA9IG1fcERvY3VtZW50LT5HZXRQYWdlKGlQYWdlKTsKICAgICAgICAgaWYgKCFwUGFnZURpY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgQ1BERl9PYmplY3QgKnBBbm5vdHMgPSBwUGFnZURpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIkFubm90cyIpKTsKICAgICAgICAgaWYgKCFwQW5ub3RzKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7CiAgICAgICAgIG9ial9hcnJheS5BZGQocEFubm90cyk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICAgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOwogICAgICAgICBpZiAoYlJldCkgewogICAgICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiUmV0OwogICAgIH0KICAgICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7Ci0gICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CiAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIGlmICghYlJldCkgewogICAgICAgICBtX29ianNfYXJyYXkuQXBwZW5kKG5ld19vYmpzX2FycmF5KTsKICAgICB9CiAgICAgcmV0dXJuIGJSZXQ7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZEZpcnN0UGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9iQW5ub3RzTG9hZCkgewogICAgICAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOworICAgICAgICBtX2JBbm5vdHNMb2FkID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fYkFubm90c0xvYWQpIHsKICAgICAgICAgaWYgKCFDaGVja0xpbmVhcml6ZWREYXRhKHBIaW50cykpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fYlBhZ2VMb2FkZWRPSyA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SGF2ZVJlc291cmNlQW5jZXN0b3IoQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCkKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpCiB7CiAgICAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aCk7CiAgICAgaWYgKCsrc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGggPiBrTWF4RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfT2JqZWN0ICpwUGFyZW50ID0gcERpY3QtPkdldEVsZW1lbnQoIlBhcmVudCIpOwogICAgIGlmICghcFBhcmVudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFyZW50RGljdCA9IHBQYXJlbnQtPkdldERpY3QoKTsKICAgICBpZiAoIXBQYXJlbnREaWN0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX09iamVjdCAqcFJldCA9IHBQYXJlbnREaWN0LT5HZXRFbGVtZW50KCJSZXNvdXJjZXMiKTsKICAgICBpZiAocFJldCkgewogICAgICAgICBtX3BQYWdlUmVzb3VyY2UgPSBwUmV0OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBIYXZlUmVzb3VyY2VBbmNlc3RvcihwUGFyZW50RGljdCk7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpJc1BhZ2VBdmFpbChpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNQYWdlQXZhaWwoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKIHsKICAgICBpZiAoIW1fcERvY3VtZW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoSXNGaXJzdENoZWNrKGlQYWdlKSkgewotICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IEZBTFNFOwotICAgICAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKLSAgICAgICAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOwotICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOworICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IGZhbHNlOworICAgICAgICBtX2JQYWdlTG9hZGVkT0sgPSBmYWxzZTsKKyAgICAgICAgbV9iQW5ub3RzTG9hZCA9IGZhbHNlOworICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IGZhbHNlOwogICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIH0KQEAgLTQzOTksNDYgKzQzOTksNDYgQEAKICAgICB9CiAgICAgRlhfRFdPUkQgZHdQYWdlTG9hZCA9IDA7CiAgICAgaWYgKG1fcGFnZXNMb2FkU3RhdGUtPkxvb2t1cChpUGFnZSwgZHdQYWdlTG9hZCkgJiYgZHdQYWdlTG9hZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fYkxpbmVhcml6ZWQpIHsKICAgICAgICAgaWYgKChGWF9EV09SRClpUGFnZSA9PSBtX2R3Rmlyc3RQYWdlTm8pIHsKLSAgICAgICAgICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgbV9wYWdlc0xvYWRTdGF0ZS0+U2V0QXQoaVBhZ2UsIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFDaGVja0xpbmVhcml6ZWREYXRhKHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9iTWFpblhSZWZMb2FkZWRPSykgewogICAgICAgICAgICAgaWYgKG1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFMb2FkUGFnZXMocEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICghbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYgIUNoZWNrUGFnZShpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoIUxvYWRBbGxGaWxlKHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSktPlJlYnVpbGRDcm9zc1JlZigpOwogICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGlQYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIW1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7CiAgICAgICAgICAgICBpZiAoIW1fYkN1clBhZ2VEaWN0TG9hZE9LICYmICFDaGVja1BhZ2UoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JIYXZlQWNyb0Zvcm0gJiYgIW1fYkFjcm9Gb3JtTG9hZCkgewogICAgICAgICBpZiAoIUNoZWNrQWNyb0Zvcm1TdWJPYmplY3QocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIG1fYkFjcm9Gb3JtTG9hZCA9IFRSVUU7CisgICAgICAgIG1fYkFjcm9Gb3JtTG9hZCA9IHRydWU7CiAgICAgfQogICAgIGlmICghbV9iUGFnZUxvYWRlZE9LKSB7CiAgICAgICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewpAQCAtNDQ0NywyMyArNDQ0NywyMyBAQAogICAgICAgICAgICAgbV9wUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7CiAgICAgICAgICAgICBpZiAoIW1fcFBhZ2VEaWN0KSB7CiAgICAgICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGlQYWdlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7CiAgICAgICAgICAgICBvYmpfYXJyYXkuQWRkKG1fcFBhZ2VEaWN0KTsKLSAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgVFJVRSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOworICAgICAgICAgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCB0cnVlLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CiAgICAgICAgICAgICBpZiAoYlJldCkgewogICAgICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0sgPSBUUlVFOworICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBiUmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgICAgICAgICAgICBib29sIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIGZhbHNlLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICAgICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0sgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtX29ianNfYXJyYXkuQXBwZW5kKG5ld19vYmpzX2FycmF5KTsKICAgICAgICAgICAgICAgICByZXR1cm4gYlJldDsKQEAgLTQ0NzMsOSArNDQ3Myw5IEBACiAgICAgaWYgKG1fYlBhZ2VMb2FkZWRPSykgewogICAgICAgICBpZiAoIW1fYkFubm90c0xvYWQpIHsKICAgICAgICAgICAgIGlmICghQ2hlY2tQYWdlQW5ub3RzKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOworICAgICAgICAgICAgbV9iQW5ub3RzTG9hZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fcFBhZ2VEaWN0ICYmICFtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewpAQCAtNDQ4MywzNyArNDQ4MywzNyBAQAogICAgICAgICBpZiAoIW1fcFBhZ2VSZXNvdXJjZSkgewogICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBIYXZlUmVzb3VyY2VBbmNlc3RvcihtX3BQYWdlRGljdCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IFRSVUU7CisgICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fYk5lZWREb3duTG9hZFJlc291cmNlKSB7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IENoZWNrUmVzb3VyY2VzKHBIaW50cyk7CisgICAgICAgIGJvb2wgYlJldCA9IENoZWNrUmVzb3VyY2VzKHBIaW50cyk7CiAgICAgICAgIGlmICghYlJldCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7CisgICAgICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gZmFsc2U7CiAgICAgfQotICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOwotICAgIG1fYkFubm90c0xvYWQgPSBGQUxTRTsKLSAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IEZBTFNFOworICAgIG1fYlBhZ2VMb2FkZWRPSyA9IGZhbHNlOworICAgIG1fYkFubm90c0xvYWQgPSBmYWxzZTsKKyAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IGZhbHNlOwogICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgbV9wYWdlc0xvYWRTdGF0ZS0+U2V0QXQoaVBhZ2UsIFRSVUUpOwotICAgIHJldHVybiBUUlVFOworICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUmVzb3VyY2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCitib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQogewogICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7CiAgICAgICAgIG9ial9hcnJheS5BZGQobV9wUGFnZVJlc291cmNlKTsKLSAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBUUlVFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgdHJ1ZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOwogICAgICAgICBpZiAoYlJldCkgewogICAgICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiUmV0OwogICAgIH0KICAgICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7Ci0gICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgICAgYm9vbCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CiAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIGlmICghYlJldCkgewogICAgICAgICBtX29ianNfYXJyYXkuQXBwZW5kKG5ld19vYmpzX2FycmF5KTsKQEAgLTQ1NDksMTAgKzQ1NDksMTAgQEAKICAgICAgICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7CiAgICAgICAgICAgICBtX29ianNfYXJyYXkuQWRkKHBBY3JvRm9ybS0+R2V0RGljdCgpKTsKICAgICAgICAgfQotICAgICAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IFRSVUU7CisgICAgICAgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIGJvb2wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CkBAIC00NTY4LDEyICs0NTY4LDEyIEBACiAgICAgfQogICAgIG1fbnVtYmVyX2FycmF5Lkluc2VydEF0KGlOZXh0LCBkd09iak51bSk7CiB9Ci1GWF9CT09MIENQREZfU29ydE9iak51bUFycmF5OjpGaW5kKEZYX0RXT1JEIGR3T2JqTnVtKQorYm9vbCBDUERGX1NvcnRPYmpOdW1BcnJheTo6RmluZChGWF9EV09SRCBkd09iak51bSkKIHsKICAgICBpbnQzMl90IGlOZXh0ID0gMDsKICAgICByZXR1cm4gQmluYXJ5U2VhcmNoKGR3T2JqTnVtLCBpTmV4dCk7CiB9Ci1GWF9CT09MIENQREZfU29ydE9iak51bUFycmF5OjpCaW5hcnlTZWFyY2goRlhfRFdPUkQgdmFsdWUsIGludDMyX3QgJmlOZXh0KQorYm9vbCBDUERGX1NvcnRPYmpOdW1BcnJheTo6QmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQzMl90ICZpTmV4dCkKIHsKICAgICBpbnQzMl90IGlMb3cgPSAwOwogICAgIGludDMyX3QgaUhpZ2ggPSBtX251bWJlcl9hcnJheS5HZXRTaXplKCkgLSAxOwpAQCAtNDU4MSw3ICs0NTgxLDcgQEAKICAgICAgICAgaW50MzJfdCBpTWlkID0gKGlMb3cgKyBpSGlnaCkgLyAyOwogICAgICAgICBpZiAobV9udW1iZXJfYXJyYXkuR2V0QXQoaU1pZCkgPT0gdmFsdWUpIHsKICAgICAgICAgICAgIGlOZXh0ID0gaU1pZDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpID4gdmFsdWUpIHsKICAgICAgICAgICAgIGlIaWdoID0gaU1pZCAtIDE7CkBAIC00NTkwLDcgKzQ1OTAsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlOZXh0ID0gaUxvdzsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BERl9QYWdlTm9kZTo6fkNQREZfUGFnZU5vZGUoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAKaW5kZXggNDkwMzMxMi4uNzZlMjQ1YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhwU3RhcnQsIGR3U2l6ZSk7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpTZWFyY2hUb2tlbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKQorYm9vbCBDUERGX1NpbXBsZVBhcnNlcjo6U2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbikKIHsKICAgICBpbnQgdG9rZW5fbGVuID0gdG9rZW4uR2V0TGVuZ3RoKCk7CiAgICAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSAtIHRva2VuX2xlbikgewpAQCAtMjA1LDMwICsyMDUsMzAgQEAKICAgICAgICAgbV9kd0N1clBvcyArKzsKICAgICB9CiAgICAgaWYgKG1fZHdDdXJQb3MgPT0gbV9kd1NpemUgLSB0b2tlbl9sZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fZHdDdXJQb3MgKz0gdG9rZW5fbGVuOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6U2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbikKK2Jvb2wgQ1BERl9TaW1wbGVQYXJzZXI6OlNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCiB7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7CiAgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICh3b3JkID09IHRva2VuKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFpcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0YXJ0X3Rva2VuLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGVuZF90b2tlbiwKK2Jvb2wgQ1BERl9TaW1wbGVQYXJzZXI6OkZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZW5kX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHN0YXJ0X3BvcywgRlhfRFdPUkQmIGVuZF9wb3MpCiB7CiAgICAgaWYgKCFzdGFydF90b2tlbi5Jc0VtcHR5KCkpIHsKICAgICAgICAgaWYgKCFTa2lwV29yZChzdGFydF90b2tlbikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBzdGFydF9wb3MgPSBtX2R3Q3VyUG9zOwogICAgIH0KQEAgLTIzNiwxNSArMjM2LDE1IEBACiAgICAgICAgIGVuZF9wb3MgPSBtX2R3Q3VyUG9zOwogICAgICAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IEdldFdvcmQoKTsKICAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdvcmQgPT0gZW5kX3Rva2VuKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFyYW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbiwgaW50IG5QYXJhbXMpCitib29sIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFyYW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbiwgaW50IG5QYXJhbXMpCiB7CiAgICAgblBhcmFtcyArKzsKICAgICBGWF9EV09SRCogcEJ1ZiA9IEZYX0FsbG9jKEZYX0RXT1JELCBuUGFyYW1zKTsKQEAgLTI2Miw3ICsyNjIsNyBAQAogICAgICAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IEdldFdvcmQoKTsKICAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICh3b3JkID09IHRva2VuKSB7CiAgICAgICAgICAgICBpZiAoYnVmX2NvdW50IDwgblBhcmFtcykgewpAQCAtMjcwLDEwICsyNzAsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fZHdDdXJQb3MgPSBwQnVmW2J1Zl9pbmRleF07CiAgICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogc3RhdGljIGludCBfaGV4MmRlYyhjaGFyIGNoKQogewpAQCAtMzY4LDcgKzM2OCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOiB7CiAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiSGV4ID0gKChDUERGX1N0cmluZyopcE9iaiktPklzSGV4KCk7CisgICAgICAgICAgICAgICAgYm9vbCBiSGV4ID0gKChDUERGX1N0cmluZyopcE9iaiktPklzSGV4KCk7CiAgICAgICAgICAgICAgICAgYnVmIDw8IFBERl9FbmNvZGVTdHJpbmcoc3RyLCBiSGV4KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQxNywxMyArNDE3LDEzIEBACiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHAgPSAoQ1BERl9TdHJlYW0qKXBPYmo7CiAgICAgICAgICAgICAgICAgYnVmIDw8IHAtPkdldERpY3QoKSA8PCBGWF9CU1RSQygic3RyZWFtXHJcbiIpOwogICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgICAgICAgICBhY2MuTG9hZEFsbERhdGEocCwgVFJVRSk7CisgICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHAsIHRydWUpOwogICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRCbG9jayhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKICAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW0iKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICAgICAgICBBU1NFUlQoZmFsc2UpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBidWY7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwCmluZGV4IGY4YjU5OTEuLmE3MGY1YmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwCkBAIC0xOCwxMCArMTgsMTAgQEAKIAogQ1BERl9Eb2NSZW5kZXJEYXRhOjp+Q1BERl9Eb2NSZW5kZXJEYXRhKCkKIHsKLSAgICBDbGVhcihUUlVFKTsKKyAgICBDbGVhcih0cnVlKTsKIH0KIAotdm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OkNsZWFyKEZYX0JPT0wgYlJlbGVhc2UpCit2b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6Q2xlYXIoYm9vbCBiUmVsZWFzZSkKIHsKICAgICBmb3IgKGF1dG8gaXQgPSBtX1R5cGUzRmFjZU1hcC5iZWdpbigpOyBpdCAhPSBtX1R5cGUzRmFjZU1hcC5lbmQoKTspIHsKICAgICAgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSBtX3BGb250Q2FjaGU7CiAgICAgICAgICAgICBtX3BGb250Q2FjaGUgPSBOVUxMOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRm9udENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOworICAgICAgICAgICAgbV9wRm9udENhY2hlLT5GcmVlQ2FjaGUoZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTE4LDcgKzExOCw3IEBACiB2b2lkIENQREZfUmVuZGVyTW9kdWxlOjpDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKiBwKQogewogICAgIGlmIChwKSB7Ci0gICAgICAgIHAtPkNsZWFyKEZBTFNFKTsKKyAgICAgICAgcC0+Q2xlYXIoZmFsc2UpOwogICAgIH0KIH0KIHZvaWQgQ1BERl9SZW5kZXJNb2R1bGU6OkRlc3Ryb3lQYWdlQ2FjaGUoQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSkKQEAgLTE4MCwxOSArMTgwLDE5IEBACiBDUERGX1JlbmRlclN0YXR1czo6Q1BERl9SZW5kZXJTdGF0dXMoKQogewogICAgIG1fcENvbnRleHQgPSBOVUxMOwotICAgIG1fYlN0b3BwZWQgPSBGQUxTRTsKKyAgICBtX2JTdG9wcGVkID0gZmFsc2U7CiAgICAgbV9wRGV2aWNlID0gTlVMTDsKICAgICBtX3BDdXJPYmogPSBOVUxMOwogICAgIG1fcFN0b3BPYmogPSBOVUxMOwogICAgIG1fSGFsZnRvbmVMaW1pdCA9IDA7CiAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBOVUxMOwotICAgIG1fYlByaW50ID0gRkFMU0U7CisgICAgbV9iUHJpbnQgPSBmYWxzZTsKICAgICBtX1RyYW5zcGFyZW5jeSA9IDA7CiAgICAgbV9EaXRoZXJCaXRzID0gMDsKLSAgICBtX2JEcm9wT2JqZWN0cyA9IEZBTFNFOwotICAgIG1fYlN0ZENTID0gRkFMU0U7CisgICAgbV9iRHJvcE9iamVjdHMgPSBmYWxzZTsKKyAgICBtX2JTdGRDUyA9IGZhbHNlOwogICAgIG1fR3JvdXBGYW1pbHkgPSAwOwotICAgIG1fYkxvYWRNYXNrID0gRkFMU0U7CisgICAgbV9iTG9hZE1hc2sgPSBmYWxzZTsKICAgICBtX3BUeXBlM0NoYXIgPSBOVUxMOwogICAgIG1fVDNGaWxsQ29sb3IgPSAwOwogICAgIG1fcEZvcm1SZXNvdXJjZSA9IE5VTEw7CkBAIC0yMDUsMTMgKzIwNSwxMyBAQAogICAgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKIH0KIAotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGV2aWNlTWF0cml4LCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlclN0YXR1cyogcFBhcmVudFN0YXRlLCBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBJbml0aWFsU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBpbnQgdHJhbnNwYXJlbmN5LCBGWF9CT09MIGJEcm9wT2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBGWF9CT09MIGJTdGRDUywgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIGludCB0cmFuc3BhcmVuY3ksIGJvb2wgYkRyb3BPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIGJvb2wgYlN0ZENTLCBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2NvbG9yLCBGWF9EV09SRCBHcm91cEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrKQogewogICAgIG1fcENvbnRleHQgPSBwQ29udGV4dDsKICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgfQogICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKICAgICBtX1RyYW5zcGFyZW5jeSA9IHRyYW5zcGFyZW5jeTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlJlbmRlck9iamVjdExpc3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgIGluZGV4ICsrOwogICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmogPSBwT2Jqcy0+R2V0TmV4dE9iamVjdChwb3MpOwogICAgICAgICBpZiAocEN1ck9iaiA9PSBtX3BTdG9wT2JqKSB7Ci0gICAgICAgICAgICBtX2JTdG9wcGVkID0gVFJVRTsKKyAgICAgICAgICAgIG1fYlN0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmICghcEN1ck9iaikgewpAQCAtMzAxLDQyICszMDEsNDIgQEAKICAgICB9CiAgICAgUHJvY2Vzc09iamVjdE5vQ2xpcChwT2JqLCBwT2JqMkRldmljZSk7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OkNvbnRpbnVlU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX3BPYmplY3RSZW5kZXJlcikgewogICAgICAgICBpZiAobV9wT2JqZWN0UmVuZGVyZXItPkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+bV9SZXN1bHQpIHsKICAgICAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlIG1fcE9iamVjdFJlbmRlcmVyOwogICAgICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX3BDdXJPYmogPSBwT2JqOwogICAgIGlmIChtX09wdGlvbnMubV9wT0NDb250ZXh0ICYmIHBPYmotPm1fQ29udGVudE1hcmsuTm90TnVsbCgpKQogICAgICAgICBpZiAoIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT2JqZWN0VmlzaWJsZShwT2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgUHJvY2Vzc0NsaXBQYXRoKHBPYmotPm1fQ2xpcFBhdGgsIHBPYmoyRGV2aWNlKTsKICAgICBpZiAoUHJvY2Vzc1RyYW5zcGFyZW5jeShwT2JqLCBwT2JqMkRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSkgewogICAgICAgICBtX3BPYmplY3RSZW5kZXJlciA9IElQREZfT2JqZWN0UmVuZGVyZXI6OkNyZWF0ZShwT2JqLT5tX1R5cGUpOwotICAgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5TdGFydCh0aGlzLCBwT2JqLCBwT2JqMkRldmljZSwgRkFMU0UpKSB7CisgICAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPlN0YXJ0KHRoaXMsIHBPYmosIHBPYmoyRGV2aWNlLCBmYWxzZSkpIHsKICAgICAgICAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPm1fUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgRHJhd09ialdpdGhCYWNrZ3JvdW5kKHBPYmosIHBPYmoyRGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKICAgICAgICAgICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gQ29udGludWVTaW5nbGVPYmplY3QocE9iaiwgcE9iajJEZXZpY2UsIHBQYXVzZSk7CiAgICAgfQogICAgIFByb2Nlc3NPYmplY3ROb0NsaXAocE9iaiwgcE9iajJEZXZpY2UpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBJUERGX09iamVjdFJlbmRlcmVyKiBJUERGX09iamVjdFJlbmRlcmVyOjpDcmVhdGUoaW50IHR5cGUpCiB7CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIG5ldyBDUERGX0ltYWdlUmVuZGVyZXI7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJMb2dpY2FsLCBGWF9SRUNUICZyZWN0KSBjb25zdAorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6R2V0T2JqZWN0Q2xpcHBlZFJlY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiTG9naWNhbCwgRlhfUkVDVCAmcmVjdCkgY29uc3QKIHsKICAgICByZWN0ID0gcE9iai0+R2V0QkJveChwT2JqMkRldmljZSk7CiAgICAgRlhfUkVDVCBydENsaXAgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKQEAgLTM3MCw3ICszNzAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdDsKLSAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocE9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgeworICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwT2JqLCBwT2JqMkRldmljZSwgZmFsc2UsIHJlY3QpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKG1fRGl0aGVyQml0cyA9PSAyKSB7CkBAIC0zODYsNyArMzg2LDcgQEAKIH0KIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NPYmplY3ROb0NsaXAoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgICBib29sIGJSZXQgPSBmYWxzZTsKICAgICBzd2l0Y2ggKHBPYmotPm1fVHlwZSkgewogICAgICAgICBjYXNlIFBERlBBR0VfVEVYVDoKICAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzVGV4dCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSwgTlVMTCk7CkBAIC00MDgsOSArNDA4LDkgQEAKICAgICAgICAgRHJhd09ialdpdGhCYWNrZ3JvdW5kKHBPYmosIHBPYmoyRGV2aWNlKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7Ci0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgICAgYm9vbCBiUmV0ID0gZmFsc2U7CiAgICAgc3dpdGNoIChwT2JqLT5tX1R5cGUpIHsKICAgICAgICAgY2FzZSBQREZQQUdFX1BBVEg6CiAgICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc1BhdGgoKENQREZfUGF0aE9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOwpAQCAtNDMzLDcgKzQzMyw3IEBACiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3T2JqV2l0aEJhY2tncm91bmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKIHsKICAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKKyAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocE9iaiwgcE9iajJEZXZpY2UsIGZhbHNlLCByZWN0KSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGludCByZXMgPSAzMDA7CkBAIC00NTksMTEgKzQ1OSwxMSBAQAogICAgIHN0YXR1cy5SZW5kZXJTaW5nbGVPYmplY3QocE9iaiwgJm1hdHJpeCk7CiAgICAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzRm9ybShDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NGb3JtKENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIENQREZfRGljdGlvbmFyeSogcE9DID0gcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJPQyIpKTsKICAgICBpZiAocE9DICYmIG1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYgIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwRm9ybU9iai0+bV9Gb3JtTWF0cml4OwogICAgIG1hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKQEAgLTQ3MywxNSArNDczLDE1IEBACiAgICAgfQogICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIG1fcFN0b3BPYmosCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcywgcEZvcm1PYmosICZtX09wdGlvbnMsIG1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcFJlc291cmNlcywgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBGb3JtT2JqLCAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBSZXNvdXJjZXMsIGZhbHNlKTsKICAgICBzdGF0dXMubV9jdXJCbGVuZCA9IG1fY3VyQmxlbmQ7CiAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwRm9ybU9iai0+bV9wRm9ybSwgJm1hdHJpeCk7CiAgICAgbV9iU3RvcHBlZCA9IHN0YXR1cy5tX2JTdG9wcGVkOwogICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKK2Jvb2wgSXNBdmFpbGFibGVNYXRyaXgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQogewogICAgIGlmIChtYXRyaXguYSA9PSAwIHx8IG1hdHJpeC5kID09IDApIHsKICAgICAgICAgcmV0dXJuIG1hdHJpeC5iICE9IDAgJiYgbWF0cml4LmMgIT0gMDsKQEAgLTQ4OSwxNSArNDg5LDE1IEBACiAgICAgaWYgKG1hdHJpeC5iID09IDAgfHwgbWF0cml4LmMgPT0gMCkgewogICAgICAgICByZXR1cm4gbWF0cml4LmEgIT0gMCAmJiBtYXRyaXguZCAhPSAwOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1BhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgaW50IEZpbGxUeXBlID0gcFBhdGhPYmotPm1fRmlsbFR5cGU7Ci0gICAgRlhfQk9PTCBiU3Ryb2tlID0gcFBhdGhPYmotPm1fYlN0cm9rZTsKKyAgICBib29sIGJTdHJva2UgPSBwUGF0aE9iai0+bV9iU3Ryb2tlOwogICAgIFByb2Nlc3NQYXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsIEZpbGxUeXBlLCBiU3Ryb2tlKTsKICAgICBpZiAoRmlsbFR5cGUgPT0gMCAmJiAhYlN0cm9rZSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX0RXT1JEIGZpbGxfYXJnYiA9IDA7CiAgICAgaWYgKEZpbGxUeXBlKSB7CkBAIC01MTAsNyArNTEwLDcgQEAKICAgICBDRlhfQWZmaW5lTWF0cml4IHBhdGhfbWF0cml4ID0gcFBhdGhPYmotPm1fTWF0cml4OwogICAgIHBhdGhfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwogICAgIGlmICghSXNBdmFpbGFibGVNYXRyaXgocGF0aF9tYXRyaXgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKEZpbGxUeXBlICYmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9SRUNUX0FBKSkgewogICAgICAgICBGaWxsVHlwZSB8PSBGWEZJTExfUkVDVF9BQTsKQEAgLTU0Niw3ICs1NDYsNyBAQAogICAgIH0KICAgICByZXR1cm4gcERvY0NhY2hlLT5HZXRUcmFuc2ZlckZ1bmMocE9iaik7CiB9Ci1GWF9BUkdCIENQREZfUmVuZGVyU3RhdHVzOjpHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYlR5cGUzKSBjb25zdAorRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0RmlsbEFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBib29sIGJUeXBlMykgY29uc3QKIHsKICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKilwT2JqLT5tX0NvbG9yU3RhdGU7CiAgICAgaWYgKG1fcFR5cGUzQ2hhciAmJiAhYlR5cGUzICYmICghbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkIHx8IChtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgJiYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSkpKSB7CkBAIC02MTIsNyArNjEyLDcgQEAKICAgICAgICAgaWYgKG1fTGFzdENsaXBQYXRoLklzTnVsbCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoVFJVRSk7CisgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKHRydWUpOwogICAgICAgICBtX0xhc3RDbGlwUGF0aC5TZXROdWxsKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC02MjAsNyArNjIwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX0xhc3RDbGlwUGF0aCA9IENsaXBQYXRoOwotICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKFRSVUUpOworICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKHRydWUpOwogICAgIGludCBuQ2xpcFBhdGggPSBDbGlwUGF0aC5HZXRQYXRoQ291bnQoKTsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbkNsaXBQYXRoOyBpKyspIHsKQEAgLTY5MCw3ICs2OTAsNyBAQAogICAgICAgICBtX3BEZXZpY2UtPkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iajJEZXZpY2UsICZzdHJva2Vfc3RhdGUsIDAsIDB4ZmZmZjAwMDAsIGZpbGxfbW9kZSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6U2VsZWN0Q2xpcFBhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpCiB7CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBwYXRoX21hdHJpeCA9IHBQYXRoT2JqLT5tX01hdHJpeDsKICAgICBwYXRoX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKQEAgLTcwNywxMiArNzA3LDEyIEBACiAgICAgfQogICAgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGhPYmotPm1fUGF0aCwgJnBhdGhfbWF0cml4LCBmaWxsX21vZGUpOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUcmFuc3BhcmVuY3koY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbFN0YXRlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlOwogICAgIGludCBibGVuZF90eXBlID0gcEdlbmVyYWxTdGF0ZSA/IHBHZW5lcmFsU3RhdGUtPm1fQmxlbmRUeXBlIDogRlhESUJfQkxFTkRfTk9STUFMOwogICAgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX1VOU1VQUE9SVEVEKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0ID0gcEdlbmVyYWxTdGF0ZSA/IChDUERGX0RpY3Rpb25hcnkqKXBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrIDogTlVMTDsKICAgICBpZiAocFNNYXNrRGljdCkgewpAQCAtNzI0LDcgKzcyNCw3IEBACiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTDsKICAgICBGWF9GTE9BVCBncm91cF9hbHBoYSA9IDEuMGY7CiAgICAgaW50IFRyYW5zcGFyZW5jeSA9IG1fVHJhbnNwYXJlbmN5OwotICAgIEZYX0JPT0wgYkdyb3VwVHJhbnNwYXJlbnQgPSBGQUxTRTsKKyAgICBib29sIGJHcm91cFRyYW5zcGFyZW50ID0gZmFsc2U7CiAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7CiAgICAgICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKICAgICAgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhICpwU3RhdGVEYXRhID0gcEZvcm1PYmotPm1fR2VuZXJhbFN0YXRlLkdldE9iamVjdCgpOwpAQCAtNzMyLDE1ICs3MzIsMTUgQEAKICAgICAgICAgICAgIGdyb3VwX2FscGhhID0gcFN0YXRlRGF0YS0+bV9GaWxsQWxwaGE7CiAgICAgICAgIH0KICAgICAgICAgVHJhbnNwYXJlbmN5ID0gcEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5OwotICAgICAgICBiR3JvdXBUcmFuc3BhcmVudCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEID8gVFJVRSA6IEZBTFNFOworICAgICAgICBiR3JvdXBUcmFuc3BhcmVudCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICBpZiAocEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0KSB7CiAgICAgICAgICAgICBwRm9ybVJlc291cmNlID0gcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKICAgICAgICAgfQogICAgIH0KLSAgICBGWF9CT09MIGJUZXh0Q2xpcCA9IEZBTFNFOworICAgIGJvb2wgYlRleHRDbGlwID0gZmFsc2U7CiAgICAgaWYgKHBQYWdlT2JqLT5tX0NsaXBQYXRoLk5vdE51bGwoKSAmJiBwUGFnZU9iai0+bV9DbGlwUGF0aC5HZXRUZXh0Q291bnQoKSAmJgogICAgICAgICAgICAgbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfRElTUExBWSAmJiAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSkgewotICAgICAgICBiVGV4dENsaXAgPSBUUlVFOworICAgICAgICBiVGV4dENsaXAgPSB0cnVlOwogICAgIH0KICAgICBpZiAoKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX09WRVJQUklOVCkgJiYgcFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmIHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsT1AgJiYgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCkgewogICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBOVUxMOwpAQCAtNzYzLDExICs3NjMsMTEgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocFNNYXNrRGljdCA9PSBOVUxMICYmIGdyb3VwX2FscGhhID09IDEuMGYgJiYgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYgIWJUZXh0Q2xpcCAmJiAhYkdyb3VwVHJhbnNwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wgaXNvbGF0ZWQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRDsKKyAgICBib29sIGlzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7CiAgICAgaWYgKG1fYlByaW50KSB7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICAgICAgICBib29sIGJSZXQgPSBmYWxzZTsKICAgICAgICAgaW50IHJlbmRDYXBzID0gbV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCk7CiAgICAgICAgIGlmICghKChUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkgfHwgcFNNYXNrRGljdCB8fCBiVGV4dENsaXApICYmIChyZW5kQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKICAgICAgICAgICAgIGludCBvbGRCbGVuZCA9IG1fY3VyQmxlbmQ7CkBAIC03NzgsMTIgKzc3OCwxMiBAQAogICAgICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwUGFnZU9iaiwgcE9iajJEZXZpY2UpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwogICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDRlhfTWF0cml4IGRldmljZUNUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CiAgICAgRlhfRkxPQVQgc2NhbGVYID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uYSk7CkBAIC03OTUsMTIgKzc5NSwxMiBAQAogICAgIGlmICghaXNvbGF0ZWQgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsKICAgICAgICAgb3JpRGV2aWNlID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgaWYgKCFtX3BEZXZpY2UtPkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAob3JpRGV2aWNlLCB3aWR0aCwgaGVpZ2h0KSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBtX3BEZXZpY2UtPkdldERJQml0cyhvcmlEZXZpY2UsIHJlY3QubGVmdCwgcmVjdC50b3ApOwogICAgIH0KICAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX0FyZ2IsIDAsIG9yaURldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7CiAgICAgYml0bWFwLT5DbGVhcigwKTsKQEAgLTgxMiw3ICs4MTIsNyBAQAogICAgICAgICBwVGV4dE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgICAgICBpZiAoIXBUZXh0TWFzay0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgZGVsZXRlIHBUZXh0TWFzazsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcFRleHRNYXNrLT5DbGVhcigwKTsKICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgdGV4dF9kZXZpY2U7CkBAIC04MzEsNyArODMxLDcgQEAKICAgICB9CiAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKICAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0b3BPYmosIE5VTEwsIE5VTEwsICZtX09wdGlvbnMsIDAsIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RvcE9iaiwgTlVMTCwgTlVMTCwgJm1fT3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIHRydWUpOwogICAgIGJpdG1hcF9yZW5kZXIuUHJvY2Vzc09iamVjdE5vQ2xpcChwUGFnZU9iaiwgJm5ld19tYXRyaXgpOwogICAgIG1fYlN0b3BwZWQgPSBiaXRtYXBfcmVuZGVyLm1fYlN0b3BwZWQ7CiAgICAgaWYgKHBTTWFza0RpY3QpIHsKQEAgLTg1OCwxMCArODU4LDEwIEBACiAgICAgfQogICAgIENvbXBvc2l0ZURJQml0bWFwKGJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgMCwgMjU1LCBibGVuZF90eXBlLCBUcmFuc3BhcmVuY3kpOwogICAgIGRlbGV0ZSBvcmlEZXZpY2U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfRElCaXRtYXAqIENQREZfUmVuZGVyU3RhdHVzOjpHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IEZYX1JFQ1QmIHJlY3QsIGludCYgbGVmdCwgaW50JiB0b3AsCi0gICAgICAgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkKQorICAgICAgICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCkKIHsKICAgICBGWF9SRUNUIGJib3ggPSByZWN0OwogICAgIGJib3guSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKQEAgLTg4Miw3ICs4ODIsNyBAQAogICAgICAgICBkZWxldGUgcEJhY2tkcm9wOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgRlhfQk9PTCBiTmVlZERyYXc7CisgICAgYm9vbCBiTmVlZERyYXc7CiAgICAgaWYgKHBCYWNrZHJvcC0+SGFzQWxwaGEoKSkgewogICAgICAgICBiTmVlZERyYXcgPSAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpOwogICAgIH0gZWxzZSB7CkBAIC05MTEsNyArOTExLDcgQEAKICAgICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIDB4ZmZmZmZmZmYpOwogICAgIFJlbmRlcigmZGV2aWNlLCBwT2JqLCBwT3B0aW9ucywgcEZpbmFsTWF0cml4KTsKIH0KLUNQREZfR3JhcGhpY1N0YXRlcyogQ1BERl9SZW5kZXJTdGF0dXM6OkNsb25lT2JqU3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFNyY1N0YXRlcywgRlhfQk9PTCBiU3Ryb2tlKQorQ1BERl9HcmFwaGljU3RhdGVzKiBDUERGX1JlbmRlclN0YXR1czo6Q2xvbmVPYmpTdGF0ZXMoY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3JjU3RhdGVzLCBib29sIGJTdHJva2UpCiB7CiAgICAgaWYgKCFwU3JjU3RhdGVzKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTMyLDE0ICs5MzIsMTQgQEAKIHsKIH0KIHZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpDcmVhdGUoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBQYWdlQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIEZYX0JPT0wgYkZpcnN0TGF5ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIGJvb2wgYkZpcnN0TGF5ZXIpCiB7CiAgICAgbV9wRG9jdW1lbnQgPSBwRG9jOwogICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBwUGFnZVJlc291cmNlczsKICAgICBtX3BQYWdlQ2FjaGUgPSBwUGFnZUNhY2hlOwogICAgIG1fYkZpcnN0TGF5ZXIgPSBiRmlyc3RMYXllcjsKIH0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpDcmVhdGUoQ1BERl9QYWdlKiBwUGFnZSwgRlhfQk9PTCBiRmlyc3RMYXllcikKK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpDcmVhdGUoQ1BERl9QYWdlKiBwUGFnZSwgYm9vbCBiRmlyc3RMYXllcikKIHsKICAgICBtX3BEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKICAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXM7CkBAIC05NTQsNyArOTU0LDcgQEAKICAgICBtX3BEb2N1bWVudCA9IE5VTEw7CiAgICAgbV9wUGFnZVJlc291cmNlcyA9IE5VTEw7CiAgICAgbV9wUGFnZUNhY2hlID0gTlVMTDsKLSAgICBtX2JGaXJzdExheWVyID0gVFJVRTsKKyAgICBtX2JGaXJzdExheWVyID0gdHJ1ZTsKICAgICBtX0NvbnRlbnRMaXN0LlJlbW92ZUFsbCgpOwogfQogdm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkFwcGVuZE9iamVjdExpc3QoQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKQpAQCAtOTg0LDcgKzk4NCw3IEBACiAgICAgICAgICAgICBGaW5hbE1hdHJpeC5Db25jYXQoKnBMYXN0TWF0cml4KTsKICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKICAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKHRoaXMsIHBEZXZpY2UsIHBMYXN0TWF0cml4LCBwU3RvcE9iaiwgTlVMTCwgTlVMTCwgcE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIEZBTFNFLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgZmFsc2UsIE5VTEwpOwogICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEl0ZW0tPm1fcE9iamVjdExpc3QsICZGaW5hbE1hdHJpeCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzLm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7CiAgICAgICAgICAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7CkBAIC05OTYsNyArOTk2LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKICAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKHRoaXMsIHBEZXZpY2UsIE5VTEwsIHBTdG9wT2JqLCBOVUxMLCBOVUxMLCBwT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgRkFMU0UsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBmYWxzZSwgTlVMTCk7CiAgICAgICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwSXRlbS0+bV9wT2JqZWN0TGlzdCwgJnBJdGVtLT5tX01hdHJpeCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzLm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7CiAgICAgICAgICAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7CkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLnJlc2V0KG5ldyBDUERGX1JlbmRlclN0YXR1cygpKTsKICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+SW5pdGlhbGl6ZSgKICAgICAgICAgICAgICAgICBtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIG1fcE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBmYWxzZSwgTlVMTCk7CiAgICAgICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwogICAgICAgICAgICAgbV9DbGlwUmVjdCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOwogICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBkZXZpY2Uyb2JqZWN0OwpAQCAtMTE3MSwxMCArMTE3MSwxMCBAQAogICAgIH0KIAogICAgIENQREZfRnVuY3Rpb24qIHBGdW5jc1szXSA9IHsgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciB9OwotICAgIEZYX0JPT0wgYlVuaVRyYW5zZmVyID0gVFJVRTsKLSAgICBGWF9CT09MIGJJZGVudGl0eSA9IFRSVUU7CisgICAgYm9vbCBiVW5pVHJhbnNmZXIgPSB0cnVlOworICAgIGJvb2wgYklkZW50aXR5ID0gdHJ1ZTsKICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBiVW5pVHJhbnNmZXIgPSBGQUxTRTsKKyAgICAgICAgYlVuaVRyYW5zZmVyID0gZmFsc2U7CiAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOwogICAgICAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpIDwgMykKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKICAgICAgICAgICAgICAgICBwRnVuY3NbMF0tPkNhbGwoJmlucHV0LCAxLCBvdXRwdXQsIG5vdXRwdXQpOwogICAgICAgICAgICAgaW50IG8gPSBGWFNZU19yb3VuZChvdXRwdXRbMF0gKiAyNTUpOwogICAgICAgICAgICAgaWYgKG8gIT0gdikKLSAgICAgICAgICAgICAgICBiSWRlbnRpdHkgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiSWRlbnRpdHkgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gbzsKICAgICAgICAgICAgIH0KQEAgLTEyMTgsNyArMTIxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBGdW5jc1tpXS0+Q2FsbCgmaW5wdXQsIDEsIG91dHB1dCwgbm91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIGludCBvID0gRlhTWVNfcm91bmQob3V0cHV0WzBdICogMjU1KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG8gIT0gdikKLSAgICAgICAgICAgICAgICAgICAgICAgIGJJZGVudGl0eSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYklkZW50aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IG87CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gdjsKQEAgLTEyNTgsNyArMTI1OCw3IEBACiB7CiAgICAgZGVsZXRlIG1fcEJpdG1hcDsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VCdWZmZXI6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCitib29sIENQREZfRGV2aWNlQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGludCBtYXhfZHBpKQogewogICAgIG1fcERldmljZSA9IHBEZXZpY2U7CkBAIC0xMjg5LDcgKzEyODksNyBAQAogICAgIEZYX1JFQ1QgYml0bWFwX3JlY3QgPSByZWN0LkdldE91dHRlclJlY3QoKTsKICAgICBtX3BCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIG1fcEJpdG1hcC0+Q3JlYXRlKGJpdG1hcF9yZWN0LldpZHRoKCksIGJpdG1hcF9yZWN0LkhlaWdodCgpLCBGWERJQl9BcmdiKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1BERl9EZXZpY2VCdWZmZXI6Ok91dHB1dFRvRGV2aWNlKCkKIHsKQEAgLTEzMTYsMTMgKzEzMTYsMTMgQEAKICAgICBkZWxldGUgbV9wQml0bWFwRGV2aWNlOwogfQogI2RlZmluZSBfRlBERkFQSV9JTUFHRVNJWkVfTElNSVRfCSgzMCAqIDEwMjQgKiAxMDI0KQotRlhfQk9PTCBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKK2Jvb2wgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCiAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zICpwT3B0aW9ucywgaW50IG1heF9kcGkpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KHBSZWN0ICE9IE5VTEwpOwogICAgIG1fcERldmljZSA9IHBEZXZpY2U7CiAgICAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfR0VUX0JJVFMpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7CiAgICAgbV9SZWN0ID0gKnBSZWN0OwpAQCAtMTM1Nyw3ICsxMzU3LDcgQEAKICAgICAgICAgaUhlaWdodCA9IGJpdG1hcF9yZWN0LkhlaWdodCgpOwogICAgICAgICBpUGl0Y2ggPSAoaVdpZHRoICogYnBwICsgMzEpIC8gMzIgKiA0OwogICAgICAgICBpZiAoaVdpZHRoICogaUhlaWdodCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoaVBpdGNoICogaUhlaWdodCA8PSBfRlBERkFQSV9JTUFHRVNJWkVfTElNSVRfICYmCiAgICAgICAgICAgICAgICAgbV9wQml0bWFwRGV2aWNlLT5DcmVhdGUoaVdpZHRoLCBpSGVpZ2h0LCBkaWJGb3JtYXQpKSB7CkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogICAgICAgICBtX01hdHJpeC5TY2FsZSgwLjVmLCAwLjVmKTsKICAgICB9CiAgICAgbV9wQ29udGV4dC0+R2V0QmFja2dyb3VuZChtX3BCaXRtYXBEZXZpY2UtPkdldEJpdG1hcCgpLCBtX3BPYmplY3QsIHBPcHRpb25zLCAmbV9NYXRyaXgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6T3V0cHV0VG9EZXZpY2UoKQogewpAQCAtMTM3NCw3ICsxMzc0LDcgQEAKICAgICAgICAgbV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcEJpdG1hcERldmljZS0+R2V0Qml0bWFwKCksIG1fUmVjdC5sZWZ0LCBtX1JlY3QudG9wLCBtX1JlY3QuV2lkdGgoKSwgbV9SZWN0LkhlaWdodCgpKTsKICAgICB9CiB9Ci1GWF9CT09MIElQREZfT0NDb250ZXh0OjpDaGVja09iamVjdFZpc2libGUoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKQorYm9vbCBJUERGX09DQ29udGV4dDo6Q2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikKIHsKICAgICBjb25zdCBDUERGX0NvbnRlbnRNYXJrRGF0YSogcERhdGEgPSBwT2JqLT5tX0NvbnRlbnRNYXJrOwogICAgIGludCBuSXRlbXMgPSBwRGF0YS0+Q291bnRJdGVtcygpOwpAQCAtMTM4Myw5ICsxMzgzLDkgQEAKICAgICAgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09IEZYX0JTVFJDKCJPQyIpICYmIGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OlByb3BlcnRpZXNEaWN0KSB7CiAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBPQ0cgPSAoQ1BERl9EaWN0aW9uYXJ5KilpdGVtLkdldFBhcmFtKCk7CiAgICAgICAgICAgICBpZiAoIUNoZWNrT0NHVmlzaWJsZShwT0NHKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfY2FjaGUuY3BwCmluZGV4IGNkYmVjZDYuLmQ5NzY3YjQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfY2FjaGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfY2FjaGUuY3BwCkBAIC0xMDgsMTYgKzEwOCwxNiBAQAogICAgIHJldHVybiBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CiB9CiB2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAotICAgICAgICBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKKyAgICAgICAgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCiAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCiB7CiAgICAgQ1BERl9JbWFnZUNhY2hlKiBwSW1hZ2VDYWNoZTsKLSAgICBGWF9CT09MIGJGaW5kID0gbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJilwSW1hZ2VDYWNoZSk7CisgICAgYm9vbCBiRmluZCA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEltYWdlQ2FjaGUpOwogICAgIGlmICghYkZpbmQpIHsKICAgICAgICAgcEltYWdlQ2FjaGUgPSBuZXcgQ1BERl9JbWFnZUNhY2hlKG1fcFBhZ2UtPm1fcERvY3VtZW50LCBwU3RyZWFtKTsKICAgICB9CiAgICAgbV9uVGltZUNvdW50ICsrOwotICAgIEZYX0JPT0wgYkNhY2hlZCA9IHBJbWFnZUNhY2hlLT5HZXRDYWNoZWRCaXRtYXAocEJpdG1hcCwgcE1hc2ssIE1hdHRlQ29sb3IsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgZG93bnNhbXBsZVdpZHRoLCBkb3duc2FtcGxlSGVpZ2h0KTsKKyAgICBib29sIGJDYWNoZWQgPSBwSW1hZ2VDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKHBCaXRtYXAsIHBNYXNrLCBNYXR0ZUNvbG9yLCBtX3BQYWdlLT5tX3BQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CiAgICAgaWYgKCFiRmluZCkgewogICAgICAgICBtX0ltYWdlQ2FjaGVzLlNldEF0KHBTdHJlYW0sIHBJbWFnZUNhY2hlKTsKICAgICB9CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgbV9uQ2FjaGVTaXplICs9IHBJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKICAgICB9CiB9Ci1GWF9CT09MCUNQREZfUGFnZVJlbmRlckNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCitib29sCUNQREZfUGFnZVJlbmRlckNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCiB7CiAgICAgbV9iQ3VyRmluZENhY2hlID0gbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJiltX3BDdXJJbWFnZUNhY2hlKTsKICAgICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgewpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgfQogICAgIGludCByZXQgPSBtX3BDdXJJbWFnZUNhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcChwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgZG93bnNhbXBsZVdpZHRoLCBkb3duc2FtcGxlSGVpZ2h0KTsKICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX25UaW1lQ291bnQgKys7CiAgICAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpIHsKQEAgLTE0MiwxMyArMTQyLDEzIEBACiAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgbV9uQ2FjaGVTaXplICs9IG1fcEN1ckltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitib29sCUNQREZfUGFnZVJlbmRlckNhY2hlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpbnQgcmV0ID0gbV9wQ3VySW1hZ2VDYWNoZS0+Q29udGludWUocFBhdXNlKTsKICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX25UaW1lQ291bnQgKys7CiAgICAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpIHsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIGlmICghcmV0KSB7CiAgICAgICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApCiB7CkBAIC0yMjIsMTggKzIyMiwxOCBAQAogewogICAgIHJldHVybiBwRElCICYmIHBESUItPkdldEJ1ZmZlcigpID8gKEZYX0RXT1JEKXBESUItPkdldEhlaWdodCgpICogcERJQi0+R2V0UGl0Y2goKSArIChGWF9EV09SRClwRElCLT5HZXRQYWxldHRlU2l6ZSgpICogNCA6IDA7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKK2Jvb2wgQ1BERl9JbWFnZUNhY2hlOjpHZXRDYWNoZWRCaXRtYXAoQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAogICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQogewogICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKICAgICAgICAgcEJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKICAgICAgICAgcE1hc2sgPSBtX3BDYWNoZWRNYXNrOwogICAgICAgICBNYXR0ZUNvbG9yID0gbV9NYXR0ZUNvbG9yOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghcFJlbmRlclN0YXR1cykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9SZW5kZXJDb250ZXh0KnBDb250ZXh0ID0gcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpOwogICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZVJlbmRlckNhY2hlID0gcENvbnRleHQtPm1fcFBhZ2VDYWNoZTsKQEAgLTI0Myw3ICsyNDMsNyBAQAogICAgIGlmICghcFNyYy0+TG9hZChtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCAmcE1hc2tTcmMsICZNYXR0ZUNvbG9yLCBwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIHBQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spKSB7CiAgICAgICAgIGRlbGV0ZSBwU3JjOwogICAgICAgICBwQml0bWFwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fTWF0dGVDb2xvciA9IE1hdHRlQ29sb3I7CiAgICAgaWYgKHBTcmMtPkdldFBpdGNoKCkgKiBwU3JjLT5HZXRIZWlnaHQoKSA8IEZQREZfSFVHRV9JTUFHRV9TSVpFKSB7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICBwQml0bWFwID0gbV9wQ2FjaGVkQml0bWFwOwogICAgIHBNYXNrID0gbV9wQ2FjaGVkTWFzazsKICAgICBDYWxjU2l6ZSgpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDRlhfRElCU291cmNlKiBDUERGX0ltYWdlQ2FjaGU6OkRldGFjaEJpdG1hcCgpCiB7CkBAIC0yNzQsOCArMjc0LDggQEAKICAgICBtX3BDdXJNYXNrID0gTlVMTDsKICAgICByZXR1cm4gcERJQlNvdXJjZTsKIH0KLWludAlDUERGX0ltYWdlQ2FjaGU6OlN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIEZYX0JPT0wgYlN0ZENTLAotICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAoraW50CUNQREZfSW1hZ2VDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywgYm9vbCBiU3RkQ1MsCisgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCiAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCiB7CiAgICAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewpAQCAtMjg4LDcgKzI4OCw3IEBACiAgICAgfQogICAgIG1fcFJlbmRlclN0YXR1cyA9IHBSZW5kZXJTdGF0dXM7CiAgICAgbV9wQ3VyQml0bWFwID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgVFJVRSwgcEZvcm1SZXNvdXJjZXMsIHBQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOworICAgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgdHJ1ZSwgcEZvcm1SZXNvdXJjZXMsIHBQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwogICAgIGlmIChyZXQgPT0gMikgewogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgIGlmIChtX3BEb2NSZW5kZXIpIHsKICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlID0gbV9wRG9jUmVuZGVyLT5HZXRGb250Q2FjaGUoKTsKICAgICAgICAgaWYgKHBDYWNoZSkgewotICAgICAgICAgICAgcENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOworICAgICAgICAgICAgcENhY2hlLT5GcmVlQ2FjaGUoZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcAppbmRleCBmYTkzMjVhLi4yNThhZDExIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcApAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSAicmVuZGVyX2ludC5oIgogCi1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKK2Jvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQogewogICAgIENQREZfSW1hZ2VSZW5kZXJlciByZW5kZXI7CiAgICAgaWYgKHJlbmRlci5TdGFydCh0aGlzLCBwSW1hZ2VPYmosIHBPYmoyRGV2aWNlLCBtX2JTdGRDUywgbV9jdXJCbGVuZCkpIHsKQEAgLTI3LDggKzI3LDggQEAKICAgICBpZiAocERJQml0bWFwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBGWF9CT09MIGJJc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOwotICAgIEZYX0JPT0wgYkdyb3VwID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVA7CisgICAgYm9vbCBiSXNvbGF0ZWQgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRDsKKyAgICBib29sIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOwogICAgIGlmIChibGVuZF9tb2RlID09IEZYRElCX0JMRU5EX05PUk1BTCkgewogICAgICAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewogICAgICAgICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgewpAQCAtNDcsOCArNDcsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkID0gYmxlbmRfbW9kZSAmJiBiSXNvbGF0ZWQgJiYgIW1fYkRyb3BPYmplY3RzOwotICAgIEZYX0JPT0wgYkdldEJhY2tHcm91bmQgPSAoKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpKSB8fAorICAgIGJvb2wgYkJhY2tBbHBoYVJlcXVpcmVkID0gYmxlbmRfbW9kZSAmJiBiSXNvbGF0ZWQgJiYgIW1fYkRyb3BPYmplY3RzOworICAgIGJvb2wgYkdldEJhY2tHcm91bmQgPSAoKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSAmJiAobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOwogICAgIGlmIChiR2V0QmFja0dyb3VuZCkgewpAQCAtNjEsOSArNjEsOSBAQAogICAgICAgICAgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7CiAgICAgICAgICAgICByZWN0LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CiAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBDbG9uZSA9IE5VTEw7Ci0gICAgICAgICAgICBGWF9CT09MIGJDbG9uZSA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiQ2xvbmUgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkgJiYgbV9wRGV2aWNlLT5HZXRCaXRtYXAoKSkgewotICAgICAgICAgICAgICAgIGJDbG9uZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkNsb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBwQ2xvbmUgPSBtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCktPkNsb25lKCZyZWN0KTsKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKnBGb3JlQml0bWFwID0gbV9wRGV2aWNlLT5HZXRCaXRtYXAoKTsKICAgICAgICAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksIHBGb3JlQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgIHJldHVybiBGWFNZU19SR0IobV9TYW1wbGVzW0ZYU1lTX0dldFJWYWx1ZShyZ2IpXSwgbV9TYW1wbGVzWzI1NiArIEZYU1lTX0dldEdWYWx1ZShyZ2IpXSwKICAgICAgICAgICAgICAgICAgICAgIG1fU2FtcGxlc1s1MTIgKyBGWFNZU19HZXRCVmFsdWUocmdiKV0pOwogfQotQ0ZYX0RJQlNvdXJjZSogQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKQorQ0ZYX0RJQlNvdXJjZSogQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGJvb2wgYkF1dG9Ecm9wU3JjKQogewogICAgIENQREZfRElCVHJhbnNmZXJGdW5jKiBwRGVzdCA9IG5ldyBDUERGX0RJQlRyYW5zZmVyRnVuYyh0aGlzKTsKICAgICBwRGVzdC0+TG9hZFNyYyhwU3JjLCBiQXV0b0Ryb3BTcmMpOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiB2b2lkIENQREZfRElCVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVTY2FubGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZikgY29uc3QKIHsKICAgICBpbnQgaTsKLSAgICBGWF9CT09MIGJTa2lwID0gRkFMU0U7CisgICAgYm9vbCBiU2tpcCA9IGZhbHNlOwogICAgIHN3aXRjaCAobV9wU3JjLT5HZXRGb3JtYXQoKSkgewogICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKICAgICAgICAgICAgICAgICBpbnQgcjAgPSBtX1JhbXBSWzBdLCBnMCA9IG1fUmFtcEdbMF0sIGIwID0gbV9SYW1wQlswXTsKQEAgLTIxMyw3ICsyMTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgICAgICBiU2tpcCA9IFRSVUU7CisgICAgICAgICAgICBiU2tpcCA9IHRydWU7CiAgICAgICAgIGNhc2UgRlhESUJfQXJnYjoKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpICsrKSB7CiAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07CkBAIC0yNjYsMzEgKzI2NiwzMSBAQAogICAgICAgICAgICAgfQogICAgIH0KIH0KLXN0YXRpYyBGWF9CT09MIF9Jc1N1cHBvcnRlZChDUERGX0NvbG9yU3BhY2UqIHBDUykKK3N0YXRpYyBib29sIF9Jc1N1cHBvcnRlZChDUERGX0NvbG9yU3BhY2UqIHBDUykKIHsKICAgICBpZiAocENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19ERVZJQ0VSR0IgfHwgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19ERVZJQ0VHUkFZIHx8CiAgICAgICAgICAgICBwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0RFVklDRUNNWUsgfHwgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19DQUxHUkFZIHx8CiAgICAgICAgICAgICBwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0NBTFJHQikgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0lOREVYRUQgJiYgX0lzU3VwcG9ydGVkKHBDUy0+R2V0QmFzZUNTKCkpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfSW1hZ2VSZW5kZXJlcjo6Q1BERl9JbWFnZVJlbmRlcmVyKCkKIHsKICAgICBtX3BSZW5kZXJTdGF0dXMgPSBOVUxMOwogICAgIG1fcEltYWdlT2JqZWN0ID0gTlVMTDsKLSAgICBtX1Jlc3VsdCA9IFRSVUU7CisgICAgbV9SZXN1bHQgPSB0cnVlOwogICAgIG1fU3RhdHVzID0gMDsKICAgICBtX3BRdWlja1N0cmV0Y2hlciA9IE5VTEw7CiAgICAgbV9wVHJhbnNmb3JtZXIgPSBOVUxMOwogICAgIG1fRGV2aWNlSGFuZGxlID0gTlVMTDsKICAgICBtX0xvYWRIYW5kbGUgPSBOVUxMOwogICAgIG1fcENsb25lID0gTlVMTDsKLSAgICBtX2JTdGRDUyA9IEZBTFNFOwotICAgIG1fYlBhdHRlcm5Db2xvciA9IEZBTFNFOworICAgIG1fYlN0ZENTID0gZmFsc2U7CisgICAgbV9iUGF0dGVybkNvbG9yID0gZmFsc2U7CiAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CiAgICAgbV9wUGF0dGVybiA9IE5VTEw7CiAgICAgbV9wT2JqMkRldmljZSA9IE5VTEw7CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICBkZWxldGUgKENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSopbV9Mb2FkSGFuZGxlOwogICAgIGRlbGV0ZSBtX3BDbG9uZTsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydExvYWRESUJTb3VyY2UoKQorYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0TG9hZERJQlNvdXJjZSgpCiB7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCk7CiAgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKQEAgLTMyMSwxNiArMzIxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9Hcm91cEZhbWlseSwgbV9wUmVuZGVyU3RhdHVzLT5tX2JMb2FkTWFzaywgbV9wUmVuZGVyU3RhdHVzLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCkpIHsKICAgICAgICAgaWYgKG1fTG9hZEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtX1N0YXR1cyA9IDQ7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0UmVuZGVyRElCU291cmNlKCkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydFJlbmRlckRJQlNvdXJjZSgpCiB7CiAgICAgaWYgKG1fTG9hZGVyLm1fcEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0JpdG1hcEFscGhhID0gMjU1OwogICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IG1fcEltYWdlT2JqZWN0LT5tX0dlbmVyYWxTdGF0ZTsKQEAgLTM1MCwxOCArMzUwLDE4IEBACiAgICAgICAgICAgICBpZiAobV9Mb2FkZXIubV9iQ2FjaGVkICYmIG1fTG9hZGVyLm1fcE1hc2spIHsKICAgICAgICAgICAgICAgICBtX0xvYWRlci5tX3BNYXNrID0gbV9Mb2FkZXIubV9wTWFzay0+Q2xvbmUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fTG9hZGVyLm1fYkNhY2hlZCA9IEZBTFNFOworICAgICAgICAgICAgbV9Mb2FkZXIubV9iQ2FjaGVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgbV9GaWxsQXJnYiA9IDA7Ci0gICAgbV9iUGF0dGVybkNvbG9yID0gRkFMU0U7CisgICAgbV9iUGF0dGVybkNvbG9yID0gZmFsc2U7CiAgICAgbV9wUGF0dGVybiA9IE5VTEw7CiAgICAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewogICAgICAgICBDUERGX0NvbG9yKiBwQ29sb3IgPSBtX3BJbWFnZU9iamVjdC0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpOwogICAgICAgICBpZiAocENvbG9yICYmIHBDb2xvci0+SXNQYXR0ZXJuKCkpIHsKICAgICAgICAgICAgIG1fcFBhdHRlcm4gPSBwQ29sb3ItPkdldFBhdHRlcm4oKTsKICAgICAgICAgICAgIGlmIChtX3BQYXR0ZXJuICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtX2JQYXR0ZXJuQ29sb3IgPSBUUlVFOworICAgICAgICAgICAgICAgIG1fYlBhdHRlcm5Db2xvciA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbV9GaWxsQXJnYiA9IG1fcFJlbmRlclN0YXR1cy0+R2V0RmlsbEFyZ2IobV9wSW1hZ2VPYmplY3QpOwpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgfQogICAgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOwogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUpCiB7CiAgICAgbV9wUmVuZGVyU3RhdHVzID0gcFN0YXR1czsKICAgICBtX2JTdGRDUyA9IGJTdGRDUzsKQEAgLTQzOSwxNyArNDM5LDE3IEBACiAgICAgbV9wT2JqMkRldmljZSA9IHBPYmoyRGV2aWNlOwogICAgIENQREZfRGljdGlvbmFyeSogcE9DID0gbV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5HZXRPQygpOwogICAgIGlmIChwT0MgJiYgbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9wT0NDb250ZXh0ICYmICFtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0ltYWdlTWF0cml4ID0gbV9wSW1hZ2VPYmplY3QtPm1fTWF0cml4OwogICAgIG1fSW1hZ2VNYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CiAgICAgaWYgKFN0YXJ0TG9hZERJQlNvdXJjZSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIFN0YXJ0UmVuZGVyRElCU291cmNlKCk7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsIEZYX0FSR0IgYml0bWFwX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlKQorYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIEZYX0RXT1JEIGZsYWdzLCBib29sIGJTdGRDUywgaW50IGJsZW5kVHlwZSkKIHsKICAgICBtX3BSZW5kZXJTdGF0dXMgPSBwU3RhdHVzOwogICAgIG1fcERJQlNvdXJjZSA9IHBESUJTb3VyY2U7CkBAIC00NjEsMTYgKzQ2MSwxNiBAQAogICAgIG1fQmxlbmRUeXBlID0gYmxlbmRUeXBlOwogICAgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOwogfQotRlhfQk9PTAlDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpCitib29sCUNQREZfSW1hZ2VSZW5kZXJlcjo6RHJhd1BhdHRlcm5JbWFnZShjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkKIHsKICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgbV9SZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3QgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCkuR2V0T3V0dGVyUmVjdCgpOwogICAgIHJlY3QuSW50ZXJzZWN0KG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwogICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4ID0gbV9JbWFnZU1hdHJpeDsKICAgICBuZXdfbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKQEAgLTQ3OCwzMiArNDc4LDMyIEBACiAgICAgaW50IGhlaWdodCA9IHJlY3QuSGVpZ2h0KCk7CiAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTE7CiAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMS5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+Q2xlYXIoMHhmZmZmZmYpOwogICAgIHsKICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKICAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UxLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgJm1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucywgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgdHJ1ZSk7CiAgICAgICAgIENGWF9NYXRyaXggcGF0dGVybkRldmljZSA9ICpwT2JqMkRldmljZTsKICAgICAgICAgcGF0dGVybkRldmljZS5UcmFuc2xhdGUoKEZYX0ZMT0FUKSAtIHJlY3QubGVmdCwgKEZYX0ZMT0FUKSAtIHJlY3QudG9wKTsKICAgICAgICAgaWYobV9wUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSBQQVRURVJOX1RJTElORykgewotICAgICAgICAgICAgYml0bWFwX3JlbmRlci5EcmF3VGlsaW5nUGF0dGVybigoQ1BERl9UaWxpbmdQYXR0ZXJuKiltX3BQYXR0ZXJuLCBtX3BJbWFnZU9iamVjdCwgJnBhdHRlcm5EZXZpY2UsIEZBTFNFKTsKKyAgICAgICAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4oKENQREZfVGlsaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBmYWxzZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiaXRtYXBfcmVuZGVyLkRyYXdTaGFkaW5nUGF0dGVybigoQ1BERl9TaGFkaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBGQUxTRSk7CisgICAgICAgICAgICBiaXRtYXBfcmVuZGVyLkRyYXdTaGFkaW5nUGF0dGVybigoQ1BERl9TaGFkaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMjsKICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMi5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl84YnBwUmdiKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+Q2xlYXIoMCk7CiAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CiAgICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMiwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgdHJ1ZSk7CiAgICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7Ci0gICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKKyAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9wRElCU291cmNlLCAweGZmZmZmZmZmLCAyNTUsICZuZXdfbWF0cml4LCBtX0ZsYWdzLCB0cnVlKSkgewogICAgICAgICAgICAgaW1hZ2VfcmVuZGVyLkNvbnRpbnVlKE5VTEwpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX0xvYWRlci5tX01hdHRlQ29sb3IgIT0gMHhmZmZmZmZmZikgewpAQCAtNTQ5LDE4ICs1NDksMTggQEAKICAgICAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoMjU1KTsKICAgICB9CiAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cyhiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6RHJhd01hc2tlZEltYWdlKCkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpEcmF3TWFza2VkSW1hZ2UoKQogewogICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBtX1Jlc3VsdCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdCA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKS5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgcmVjdC5JbnRlcnNlY3QobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CiAgICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXggPSBtX0ltYWdlTWF0cml4OwogICAgIG5ld19tYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwpAQCAtNTY4LDI5ICs1NjgsMjkgQEAKICAgICBpbnQgaGVpZ2h0ID0gcmVjdC5IZWlnaHQoKTsKICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMTsKICAgICBpZiAoIWJpdG1hcF9kZXZpY2UxLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+Q2xlYXIoMHhmZmZmZmYpOwogICAgIHsKICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKICAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UxLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCB0cnVlKTsKICAgICAgICAgQ1BERl9JbWFnZVJlbmRlcmVyIGltYWdlX3JlbmRlcjsKLSAgICAgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9wRElCU291cmNlLCAwLCAyNTUsICZuZXdfbWF0cml4LCBtX0ZsYWdzLCBUUlVFKSkgeworICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDAsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIHRydWUpKSB7CiAgICAgICAgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMjsKICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMi5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNsZWFyKDApOwogICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOwogICAgICAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwLCBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIHRydWUpOwogICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwotICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX0xvYWRlci5tX3BNYXNrLCAweGZmZmZmZmZmLCAyNTUsICZuZXdfbWF0cml4LCBtX0ZsYWdzLCBUUlVFKSkgeworICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX0xvYWRlci5tX3BNYXNrLCAweGZmZmZmZmZmLCAyNTUsICZuZXdfbWF0cml4LCBtX0ZsYWdzLCB0cnVlKSkgewogICAgICAgICAgICAgaW1hZ2VfcmVuZGVyLkNvbnRpbnVlKE5VTEwpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX0xvYWRlci5tX01hdHRlQ29sb3IgIT0gMHhmZmZmZmZmZikgewpAQCAtNjM4LDkgKzYzOCw5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cyhiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRESUJTb3VyY2UoKQorYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkKIHsKICAgICBpZiAoIShtX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUpICYmIG1fcERJQlNvdXJjZS0+R2V0QlBQKCkgPiAxKSB7CiAgICAgICAgIGludCBpbWFnZV9zaXplID0gbV9wRElCU291cmNlLT5HZXRCUFAoKSAvIDggKiBtX3BESUJTb3VyY2UtPkdldFdpZHRoKCkgKiBtX3BESUJTb3VyY2UtPkdldEhlaWdodCgpOwpAQCAtNjUyLDkgKzY1Miw5IEBACiAgICAgICAgICAgICAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgbV9EZXZpY2VIYW5kbGUsIDAsIE5VTEwsIG1fQmxlbmRUeXBlKSkgewogICAgICAgICBpZiAobV9EZXZpY2VIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgbV9TdGF0dXMgPSAzOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCk7CiAgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKQEAgLTY2MywxNSArNjYzLDE1IEBACiAgICAgaWYgKChGWFNZU19mYWJzKG1fSW1hZ2VNYXRyaXguYikgPj0gMC41ZiB8fCBtX0ltYWdlTWF0cml4LmEgPT0gMCkgfHwKICAgICAgICAgICAgIChGWFNZU19mYWJzKG1fSW1hZ2VNYXRyaXguYykgPj0gMC41ZiB8fCBtX0ltYWdlTWF0cml4LmQgPT0gMCkgKSB7CiAgICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBtX1Jlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpOwogICAgICAgICBjbGlwX2JveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CiAgICAgICAgIG1fU3RhdHVzID0gMjsKICAgICAgICAgbV9wVHJhbnNmb3JtZXIgPSBuZXcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7CiAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5TdGFydChtX3BESUJTb3VyY2UsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLCAmY2xpcF9ib3gpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChtX0ltYWdlTWF0cml4LmEgPCAwKSB7CiAgICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKQEAgLTY4NSw3ICs2ODUsNyBAQAogICAgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSAmJiBtX0JpdG1hcEFscGhhID09IDI1NSkgewogICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAogICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CkBAIC02OTMsMTIgKzY5MywxMiBAQAogICAgICAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoQml0TWFzayhtX3BESUJTb3VyY2UsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZpbGxBcmdiLCBtX0ZsYWdzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIG1fUmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICBGWF9SRUNUIGRlc3RfcmVjdCA9IGNsaXBfYm94OwpAQCAtNzA4LDEzICs3MDgsMTMgQEAKICAgICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPSBtX3BESUJTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgJmRlc3RfY2xpcCk7CiAgICAgaWYgKHBTdHJldGNoZWQpIHsKICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5Db21wb3NpdGVESUJpdG1hcChwU3RyZXRjaGVkLCBkZXN0X3JlY3QubGVmdCwgZGVzdF9yZWN0LnRvcCwgbV9GaWxsQXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JpdG1hcEFscGhhLCBtX0JsZW5kVHlwZSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0bWFwQWxwaGEsIG1fQmxlbmRUeXBlLCBmYWxzZSk7CiAgICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwogICAgICAgICBwU3RyZXRjaGVkID0gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydEJpdG1hcEFscGhhKCkKK2Jvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydEJpdG1hcEFscGhhKCkKIHsKICAgICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkpIHsKICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CkBAIC03MjgsNyArNzI4LDcgQEAKICAgICAgICAgICAgIGludCBsZWZ0LCB0b3A7CiAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IHBBbHBoYU1hc2stPlRyYW5zZm9ybVRvKCZtX0ltYWdlTWF0cml4LCBsZWZ0LCB0b3ApOwogICAgICAgICAgICAgaWYgKHBUcmFuc2Zvcm1lZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0Qml0TWFzayhwVHJhbnNmb3JtZWQsIGxlZnQsIHRvcCwgQXJnYkVuY29kZSgweGZmLCBtX0JpdG1hcEFscGhhLCBtX0JpdG1hcEFscGhhLCBtX0JpdG1hcEFscGhhKSk7CiAgICAgICAgICAgICBkZWxldGUgcFRyYW5zZm9ybWVkOwpAQCAtNzQ2LDEzICs3NDYsMTMgQEAKICAgICAgICAgICAgIGRlbGV0ZSBwQWxwaGFNYXNrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENQREZfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fU3RhdHVzID09IDEpIHsKICAgICAgICAgaWYgKG1fcFF1aWNrU3RyZXRjaGVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BRdWlja1N0cmV0Y2hlci0+bV9wQml0bWFwLT5Jc0FscGhhTWFzaygpKQogICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2sobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcCwgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0TGVmdCwKQEAgLTc2MCwxNSArNzYwLDE1IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcCwgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0TGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0VG9wLCBtX0JsZW5kVHlwZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9TdGF0dXMgPT0gMikgewogICAgICAgICBpZiAobV9wVHJhbnNmb3JtZXItPkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOwogICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgewpAQCAtNzg0LDIwICs3ODQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLCBtX0JsZW5kVHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9TdGF0dXMgPT0gMykgewogICAgICAgICByZXR1cm4gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKG1fRGV2aWNlSGFuZGxlLCBwUGF1c2UpOwogICAgIH0KICAgICBpZiAobV9TdGF0dXMgPT0gNCkgewogICAgICAgICBpZiAobV9Mb2FkZXIuQ29udGludWUobV9Mb2FkSGFuZGxlLCBwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChTdGFydFJlbmRlckRJQlNvdXJjZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gQ29udGludWUocFBhdXNlKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BERl9RdWlja1N0cmV0Y2hlcjo6Q1BERl9RdWlja1N0cmV0Y2hlcigpCiB7CkBAIC04MTUsMTAgKzgxNSwxMCBAQAogfQogSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKLUZYX0JPT0wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6U3RhcnQoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBjb25zdCBGWF9SRUNUKiBwQ2xpcEJveCkKK2Jvb2wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6U3RhcnQoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBjb25zdCBGWF9SRUNUKiBwQ2xpcEJveCkKIHsKICAgICBpZiAoRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5hKSA8IEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YikgKiAxMCAmJiBGWFNZU19mYWJzKHBJbWFnZTJEZXZpY2UtPmQpIDwgRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5jKSAqIDEwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IHBJbWFnZTJEZXZpY2UtPkdldFVuaXRSZWN0KCk7CiAgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKQEAgLTgyOSw3ICs4MjksNyBAQAogICAgIEZYX1JFQ1QgcmVzdWx0X3JlY3QgPSAqcENsaXBCb3g7CiAgICAgcmVzdWx0X3JlY3QuSW50ZXJzZWN0KGltYWdlX3JlY3QpOwogICAgIGlmIChyZXN1bHRfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fUmVzdWx0V2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOwogICAgIG1fUmVzdWx0SGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7CkBAIC04MzksMTAgKzgzOSwxMCBAQAogICAgIG1fQ2xpcFRvcCA9IHJlc3VsdF9yZWN0LnRvcCAtIGltYWdlX3JlY3QudG9wOwogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXREaWN0KCk7CiAgICAgaWYgKHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpICE9IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlNNYXNrIikpIHx8IHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiTWFzayIpKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9TcmNXaWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKICAgICBtX1NyY0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7CkBAIC04NTAsMTQgKzg1MCwxNCBAQAogICAgIG1fQnBwID0gMzsKICAgICBDUERGX09iamVjdCogcENTT2JqID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKICAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldERvY3VtZW50KCksIHBDU09iaik7CiAgICAgaWYgKG1fcENTID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghX0lzU3VwcG9ydGVkKG1fcENTKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9CcHAgPSBtX3BDUy0+Q291bnRDb21wb25lbnRzKCk7CiAgICAgaWYgKG1fcENTLT5zUkdCKCkpIHsKQEAgLTg2NSw3ICs4NjUsNyBAQAogICAgICAgICBtX3BDUyA9IE5VTEw7CiAgICAgfQogICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEltYWdlT2JqLT5tX3BJbWFnZS0+R2V0U3RyZWFtKCk7Ci0gICAgbV9TdHJlYW1BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIG1fQnBwLCBUUlVFKTsKKyAgICBtX1N0cmVhbUFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSwgbV9TcmNXaWR0aCAqIG1fU3JjSGVpZ2h0ICogbV9CcHAsIHRydWUpOwogICAgIG1fcERlY29kZXIgPSBOVUxMOwogICAgIGlmICghbV9TdHJlYW1BY2MuR2V0SW1hZ2VEZWNvZGVyKCkuSXNFbXB0eSgpKSB7CiAgICAgICAgIGlmIChtX1N0cmVhbUFjYy5HZXRJbWFnZURlY29kZXIoKSA9PSBGWF9CU1RSQygiRENURGVjb2RlIikpIHsKQEAgLTg3OCw3ICs4NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1N0cmVhbUFjYy5HZXREYXRhKCksIG1fU3RyZWFtQWNjLkdldFNpemUoKSwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQsIG1fQnBwLCA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1N0cmVhbUFjYy5HZXRJbWFnZVBhcmFtKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fcERlY29kZXItPkRvd25TY2FsZShtX0Rlc3RXaWR0aCwgbV9EZXN0SGVpZ2h0KTsKICAgICB9CkBAIC04ODksOSArODg5LDkgQEAKICAgICBtX3BCaXRtYXAtPkNyZWF0ZShtX1Jlc3VsdFdpZHRoLCBtX1Jlc3VsdEhlaWdodCwgRlhESUJfUmdiKTsKICNlbmRpZgogICAgIG1fTGluZUluZGV4ID0gMDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENQREZfUXVpY2tTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIHVpbnQ4X3QqIHJlc3VsdF9idWYgPSBtX3BCaXRtYXAtPkdldEJ1ZmZlcigpOwogICAgIGludCBzcmNfd2lkdGggPSBtX3BEZWNvZGVyID8gbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSA6IG1fU3JjV2lkdGg7CkBAIC05NDUsMTAgKzk0NSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIG1fTGluZUluZGV4ICsrOwogICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ0ZYX0RJQml0bWFwKiBDUERGX1JlbmRlclN0YXR1czo6TG9hZFNNYXNrKENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwKICAgICAgICAgRlhfUkVDVCogcENsaXBSZWN0LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQpAQCAtOTU5LDcgKzk1OSw3IEBACiAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IE5VTEw7CiAgICAgaW50IHdpZHRoID0gcENsaXBSZWN0LT5yaWdodCAtIHBDbGlwUmVjdC0+bGVmdDsKICAgICBpbnQgaGVpZ2h0ID0gcENsaXBSZWN0LT5ib3R0b20gLSBwQ2xpcFJlY3QtPnRvcDsKLSAgICBGWF9CT09MIGJMdW1pbm9zaXR5ID0gRkFMU0U7CisgICAgYm9vbCBiTHVtaW5vc2l0eSA9IGZhbHNlOwogICAgIGJMdW1pbm9zaXR5ID0gcFNNYXNrRGljdC0+R2V0Q29uc3RTdHJpbmcoRlhfQlNUUkMoIlMiKSkgIT0gRlhfQlNUUkMoIkFscGhhIik7CiAgICAgQ1BERl9TdHJlYW0qIHBHcm91cCA9IHBTTWFza0RpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiRyIpKTsKICAgICBpZiAocEdyb3VwID09IE5VTEwpIHsKQEAgLTEwMzIsNyArMTAzMiw3IEBACiAgICAgb3B0aW9ucy5tX0NvbG9yTW9kZSA9IGJMdW1pbm9zaXR5ID8gUkVOREVSX0NPTE9SX05PUk1BTCA6IFJFTkRFUl9DT0xPUl9BTFBIQTsKICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMsIDAsIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBUUlVFLCBOVUxMLCAwLCBwQ1MgPyBwQ1MtPkdldEZhbWlseSgpIDogMCwgYkx1bWlub3NpdHkpOworICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgdHJ1ZSwgTlVMTCwgMCwgcENTID8gcENTLT5HZXRGYW1pbHkoKSA6IDAsIGJMdW1pbm9zaXR5KTsKICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdCgmZm9ybSwgJm1hdHJpeCk7CiAgICAgcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghcE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcAppbmRleCA3ZDE3ZTc4Li4wODYxMDQ4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLUNGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2U6OkxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzaywgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKSBjb25zdAorQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6TG9hZERJQlNvdXJjZShDRlhfRElCU291cmNlKiogcHBNYXNrLCBGWF9EV09SRCogcE1hdHRlQ29sb3IsIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2spIGNvbnN0CiB7CiAgICAgQ1BERl9ESUJTb3VyY2UqIHBTb3VyY2UgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CiAgICAgaWYgKHBTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgKENQREZfRElCU291cmNlKiopcHBNYXNrLCBwTWF0dGVDb2xvciwgTlVMTCwgTlVMTCwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKSkgewpAQCAtMTI2LDM2ICsxMjYsMzYgQEAKICAgICBtX3BNYXNrID0gTlVMTDsKICAgICByZXR1cm4gcEJpdG1hcDsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQorYm9vbCBDUERGX0ltYWdlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2UsIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2spCiB7CiAgICAgbV9wRElCU291cmNlID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgVFJVRSwgcEZvcm1SZXNvdXJjZSwgcFBhZ2VSZXNvdXJjZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIHRydWUsIHBGb3JtUmVzb3VyY2UsIHBQYWdlUmVzb3VyY2UsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7CiAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgZGVsZXRlIG1fcERJQlNvdXJjZTsKICAgICAgICAgbV9wRElCU291cmNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcE1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5EZXRhY2hNYXNrKCk7CiAgICAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+bV9NYXR0ZUNvbG9yOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2U6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDUERGX0ltYWdlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+Q29udGludWVMb2FkRElCU291cmNlKHBQYXVzZSk7CiAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFyZXQpIHsKICAgICAgICAgZGVsZXRlIG1fcERJQlNvdXJjZTsKICAgICAgICAgbV9wRElCU291cmNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcE1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5EZXRhY2hNYXNrKCk7CiAgICAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+bV9NYXR0ZUNvbG9yOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBDUERGX0RJQlNvdXJjZTo6Q1BERl9ESUJTb3VyY2UoKQogewpAQCAtMTY1LDI2ICsxNjUsMjYgQEAKICAgICBtX2JwcCA9IDA7CiAgICAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gMDsKICAgICBtX3BDb2xvclNwYWNlID0gTlVMTDsKLSAgICBtX2JEZWZhdWx0RGVjb2RlID0gVFJVRTsKLSAgICBtX2JJbWFnZU1hc2sgPSBGQUxTRTsKLSAgICBtX2JEb0JwY0NoZWNrID0gVFJVRTsKKyAgICBtX2JEZWZhdWx0RGVjb2RlID0gdHJ1ZTsKKyAgICBtX2JJbWFnZU1hc2sgPSBmYWxzZTsKKyAgICBtX2JEb0JwY0NoZWNrID0gdHJ1ZTsKICAgICBtX3BQYWxldHRlID0gTlVMTDsKICAgICBtX3BDb21wRGF0YSA9IE5VTEw7Ci0gICAgbV9iQ29sb3JLZXkgPSBGQUxTRTsKKyAgICBtX2JDb2xvcktleSA9IGZhbHNlOwogICAgIG1fcE1hc2tlZExpbmUgPSBtX3BMaW5lQnVmID0gTlVMTDsKICAgICBtX3BEZWNvZGVyID0gTlVMTDsKICAgICBtX25Db21wb25lbnRzID0gMDsKICAgICBtX2JwYyA9IDA7Ci0gICAgbV9iTG9hZE1hc2sgPSBGQUxTRTsKKyAgICBtX2JMb2FkTWFzayA9IGZhbHNlOwogICAgIG1fRmFtaWx5ID0gMDsKICAgICBtX3BNYXNrID0gTlVMTDsKICAgICBtX01hdHRlQ29sb3IgPSAwOwogICAgIG1fcEpiaWcyQ29udGV4dCA9IE5VTEw7CiAgICAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKLSAgICBtX2JTdGRDUyA9IEZBTFNFOworICAgIG1fYlN0ZENTID0gZmFsc2U7CiAgICAgbV9wTWFza1N0cmVhbSA9IE5VTEw7CiAgICAgbV9TdGF0dXMgPSAwOwotICAgIG1fYkhhc01hc2sgPSBGQUxTRTsKKyAgICBtX2JIYXNNYXNrID0gZmFsc2U7CiB9CiBDUERGX0RJQlNvdXJjZTo6fkNQREZfRElCU291cmNlKCkKIHsKQEAgLTIyMCw0MyArMjIwLDQzIEBACiAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9ESUJTb3VyY2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfRElCU291cmNlKiogcHBNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcE1hdHRlQ29sb3IsIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2spCitib29sIENQREZfRElCU291cmNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0RJQlNvdXJjZSoqIHBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBib29sIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIGJvb2wgYkxvYWRNYXNrKQogewogICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcERvY3VtZW50ID0gcERvYzsKICAgICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwogICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07CiAgICAgbV9XaWR0aCA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOwogICAgIG1fSGVpZ2h0ID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOwogICAgIGlmIChtX1dpZHRoIDw9IDAgfHwgbV9IZWlnaHQgPD0gMCB8fCBtX1dpZHRoID4gMHgwMWZmZmYgfHwgbV9IZWlnaHQgPiAweDAxZmZmZikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OwogICAgIG1fYkxvYWRNYXNrID0gYkxvYWRNYXNrOwogICAgIGlmICghTG9hZENvbG9ySW5mbyhtX3BTdHJlYW0tPkdldE9iak51bSgpICE9IDAgPyBOVUxMIDogcEZvcm1SZXNvdXJjZXMsIHBQYWdlUmVzb3VyY2VzKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fYkRvQnBjQ2hlY2sgJiYgKG1fYnBjID09IDAgfHwgbV9uQ29tcG9uZW50cyA9PSAwKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfU0FGRV9EV09SRCBzcmNfcGl0Y2ggPQogICAgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKICAgICBpZiAoIXNyY19waXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFLCBzcmNfcGl0Y2guVmFsdWVPckRpZSgpLCBUUlVFKTsKKyAgICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlLCBzcmNfcGl0Y2guVmFsdWVPckRpZSgpLCB0cnVlKTsKICAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPT0gMCB8fCBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIUNyZWF0ZURlY29kZXIoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fYkltYWdlTWFzaykgewogICAgICAgICBtX2JwcCA9IDE7CkBAIC0yNzIsMTEgKzI3MiwxMSBAQAogICAgIH0KICAgICBGWF9TQUZFX0RXT1JEIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7CiAgICAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcExpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBwaXRjaC5WYWx1ZU9yRGllKCkpOwogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIGJTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKFRSVUUpOworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKHRydWUpOwogICAgIH0KICAgICBMb2FkUGFsZXR0ZSgpOwogICAgIGlmIChtX2JDb2xvcktleSkgewpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgICAgIG1fQWxwaGFGbGFnID0gMjsKICAgICAgICAgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDMyKG1fYnBwLCBtX1dpZHRoKTsKICAgICAgICAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX3BNYXNrZWRMaW5lID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKICAgICB9CkBAIC0yOTMsOSArMjkzLDkgQEAKICAgICAgICAgKnBwTWFzayA9IExvYWRNYXNrKCpwTWF0dGVDb2xvcik7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIGJTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihmYWxzZSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50CUNQREZfRElCU291cmNlOjpDb250aW51ZVRvTG9hZE1hc2soKQogewpAQCAtMzIwLDcgKzMyMCw3IEBACiAgICAgfQogICAgIG1fcExpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBwaXRjaC5WYWx1ZU9yRGllKCkpOwogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oVFJVRSk7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24odHJ1ZSk7CiAgICAgfQogICAgIExvYWRQYWxldHRlKCk7CiAgICAgaWYgKG1fYkNvbG9yS2V5KSB7CkBAIC0zMzUsOSArMzM1LDkgQEAKICAgICBtX1BpdGNoID0gcGl0Y2guVmFsdWVPckRpZSgpOwogICAgIHJldHVybiAxOwogfQotaW50CUNQREZfRElCU291cmNlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkhhc01hc2ssCitpbnQJQ1BERl9ESUJTb3VyY2U6OlN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiSGFzTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaykKIHsKICAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBtX3BTdHJlYW1BY2MgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgVFJVRSk7CisgICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgdHJ1ZSk7CiAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID09IDAgfHwgbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0zOTMsNyArMzkzLDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQpAQCAtNDEyLDcgKzQxMiw3IEBACiAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBHbG9iYWxzID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCktPkdldFN0cmVhbShGWF9CU1RSQygiSkJJRzJHbG9iYWxzIikpOwogICAgICAgICAgICAgICAgIGlmIChwR2xvYmFscykgewogICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbS0+TG9hZEFsbERhdGEocEdsb2JhbHMsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtLT5Mb2FkQWxsRGF0YShwR2xvYmFscywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldCA9IHBKYmlnMk1vZHVsZS0+U3RhcnREZWNvZGUobV9wSmJpZzJDb250ZXh0LCBtX1dpZHRoLCBtX0hlaWdodCwgbV9wU3RyZWFtQWNjLT5HZXREYXRhKCksIG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpLApAQCAtNDM4LDcgKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJldDE7CiAgICAgICAgIH0KQEAgLTQ2Myw3ICs0NjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDE7CiAgICAgfQpAQCAtNDcyLDExICs0NzIsMTEgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1GWF9CT09MIENQREZfRElCU291cmNlOjpMb2FkQ29sb3JJbmZvKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpCitib29sIENQREZfRElCU291cmNlOjpMb2FkQ29sb3JJbmZvKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpCiB7CiAgICAgbV9icGNfb3JpZyA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSk7CiAgICAgaWYgKG1fcERpY3QtPkdldEludGVnZXIoIkltYWdlTWFzayIpKSB7Ci0gICAgICAgIG1fYkltYWdlTWFzayA9IFRSVUU7CisgICAgICAgIG1fYkltYWdlTWFzayA9IHRydWU7CiAgICAgfQogICAgIGlmIChtX2JJbWFnZU1hc2sgfHwgIW1fcERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJDb2xvclNwYWNlIikpKSB7CiAgICAgICAgIGlmICghbV9iSW1hZ2VNYXNrKSB7CkBAIC00ODYsMjcgKzQ4NiwyNyBAQAogICAgICAgICAgICAgICAgIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcEZpbHRlci0+R2V0U3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvQnBjQ2hlY2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwRmlsdGVyOwogICAgICAgICAgICAgICAgICAgICBpZiAocEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvQnBjQ2hlY2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1fYkltYWdlTWFzayA9IFRSVUU7CisgICAgICAgIG1fYkltYWdlTWFzayA9IHRydWU7CiAgICAgICAgIG1fYnBjID0gbV9uQ29tcG9uZW50cyA9IDE7CiAgICAgICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBtX3BEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOwogICAgICAgICBtX2JEZWZhdWx0RGVjb2RlID0gcERlY29kZSA9PSBOVUxMIHx8IHBEZWNvZGUtPkdldEludGVnZXIoMCkgPT0gMDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDUERGX09iamVjdCogcENTT2JqID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOwogICAgIGlmIChwQ1NPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7CiAgICAgaWYgKHBGb3JtUmVzb3VyY2VzKSB7CkBAIC01MTYsNyArNTE2LDcgQEAKICAgICAgICAgbV9wQ29sb3JTcGFjZSA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBQYWdlUmVzb3VyY2VzKTsKICAgICB9CiAgICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9GYW1pbHkgPSBtX3BDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKICAgICBtX25Db21wb25lbnRzID0gbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCk7CkBAIC01MzMsMTEgKzUzMywxMSBAQAogICAgIFZhbGlkYXRlRGljdFBhcmFtKCk7CiAgICAgbV9wQ29tcERhdGEgPSBHZXREZWNvZGVBbmRNYXNrQXJyYXkobV9iRGVmYXVsdERlY29kZSwgbV9iQ29sb3JLZXkpOwogICAgIGlmIChtX3BDb21wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLURJQl9DT01QX0RBVEEqIENQREZfRElCU291cmNlOjpHZXREZWNvZGVBbmRNYXNrQXJyYXkoRlhfQk9PTCYgYkRlZmF1bHREZWNvZGUsIEZYX0JPT0wmIGJDb2xvcktleSkKK0RJQl9DT01QX0RBVEEqIENQREZfRElCU291cmNlOjpHZXREZWNvZGVBbmRNYXNrQXJyYXkoYm9vbCYgYkRlZmF1bHREZWNvZGUsIGJvb2wmIGJDb2xvcktleSkKIHsKICAgICBpZiAobV9wQ29sb3JTcGFjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTU2LDcgKzU1Niw3IEBACiAgICAgICAgICAgICAgICAgZGVmX21heCA9IChGWF9GTE9BVCltYXhfZGF0YTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkZWZfbWluICE9IHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbiB8fCBkZWZfbWF4ICE9IG1heCkgewotICAgICAgICAgICAgICAgIGJEZWZhdWx0RGVjb2RlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkRlZmF1bHREZWNvZGUgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fQ29sb3JLZXlNYXggPSBGWF9NSU4obWF4X251bSwgbWF4X2RhdGEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJDb2xvcktleSA9IFRSVUU7CisgICAgICAgICAgICBiQ29sb3JLZXkgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBwQ29tcERhdGE7CkBAIC02MTIsNyArNjEyLDcgQEAKICAgICAgICAgICAgIHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsCiAgICAgICAgICAgICBwUGFyYW1zID8gcFBhcmFtcy0+R2V0SW50ZWdlcigiQ29sb3JUcmFuc2Zvcm0iLCAxKSA6IDEpOwogICAgICAgICBpZiAoIW1fcERlY29kZXIpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zZm9ybSA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiVHJhbnNmb3JtID0gZmFsc2U7CiAgICAgICAgICAgICBpbnQgY29tcHMsIGJwYzsKICAgICAgICAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpOwogICAgICAgICAgICAgaWYgKHBKcGVnTW9kdWxlLT5Mb2FkSW5mbyhzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBjb21wcywgYnBjLCBiVHJhbnNmb3JtKSkgewpAQCAtNjkzLDI5ICs2OTMsMjkgQEAKICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IG91dHB1dF9uQ29tcHM7Ci0gICAgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3I7Ci0gICAgRlhfQk9PTCBiU3dhcFJHQiA9IEZBTFNFOworICAgIGJvb2wgYlRyYW5zbGF0ZUNvbG9yOworICAgIGJvb2wgYlN3YXBSR0IgPSBmYWxzZTsKICAgICBpZiAobV9wQ29sb3JTcGFjZSkgewogICAgICAgICBpZiAoY29kZXN0cmVhbV9uQ29tcHMgIT0gKEZYX0RXT1JEKW1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7Ci0gICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IEZBTFNFOworICAgICAgICBiVHJhbnNsYXRlQ29sb3IgPSBmYWxzZTsKICAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikpIHsKLSAgICAgICAgICAgIGJTd2FwUkdCID0gVFJVRTsKKyAgICAgICAgICAgIGJTd2FwUkdCID0gdHJ1ZTsKICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UgPSBudWxscHRyOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gVFJVRTsKKyAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gdHJ1ZTsKICAgICAgICAgaWYgKGltYWdlX25Db21wcykgewogICAgICAgICAgICAgb3V0cHV0X25Db21wcyA9IGltYWdlX25Db21wczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG91dHB1dF9uQ29tcHMgPSBjb2Rlc3RyZWFtX25Db21wczsKICAgICAgICAgfQogICAgICAgICBpZiAob3V0cHV0X25Db21wcyA9PSAzKSB7Ci0gICAgICAgICAgICBiU3dhcFJHQiA9IFRSVUU7CisgICAgICAgICAgICBiU3dhcFJHQiA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0X25Db21wcyA9PSA0KSB7CiAgICAgICAgICAgICBtX3BDb2xvclNwYWNlID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOwotICAgICAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gRkFMU0U7CisgICAgICAgICAgICBiVHJhbnNsYXRlQ29sb3IgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX25Db21wb25lbnRzID0gb3V0cHV0X25Db21wczsKICAgICB9CkBAIC04MjksNyArODI5LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwogICAgIH0KICAgICBpZiAoIXJldCkgewogICAgICAgICBkZWxldGUgbV9wTWFzazsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogQ1BERl9ESUJTb3VyY2UqIENQREZfRElCU291cmNlOjpMb2FkTWFza0RJQihDUERGX1N0cmVhbSogcE1hc2spCiB7CiAgICAgQ1BERl9ESUJTb3VyY2UqIHBNYXNrU291cmNlID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGlmICghcE1hc2tTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIHBNYXNrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFKSkgeworICAgIGlmICghcE1hc2tTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIHBNYXNrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCB0cnVlKSkgewogICAgICAgICBkZWxldGUgcE1hc2tTb3VyY2U7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTg1Niw3ICs4NTYsNyBAQAogaW50IENQREZfRElCU291cmNlOjpTdGFydExvYWRNYXNrRElCKCkKIHsKICAgICBtX3BNYXNrID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGludCByZXQgPSBtX3BNYXNrLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIChDUERGX1N0cmVhbSopbV9wTWFza1N0cmVhbSwgRkFMU0UsIE5VTEwsIE5VTEwsIFRSVUUpOworICAgIGludCByZXQgPSBtX3BNYXNrLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIChDUERGX1N0cmVhbSopbV9wTWFza1N0cmVhbSwgZmFsc2UsIE5VTEwsIE5VTEwsIHRydWUpOwogICAgIGlmIChyZXQgPT0gMikgewogICAgICAgICBpZiAobV9TdGF0dXMgPT0gMCkgewogICAgICAgICAgICAgbV9TdGF0dXMgPSAyOwpAQCAtMTIwOSwxNSArMTIwOSwxNSBAQAogICAgIH0KICAgICByZXR1cm4gcFNyY0xpbmU7CiB9Ci1GWF9CT09MIENQREZfRElCU291cmNlOjpTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0Citib29sIENQREZfRElCU291cmNlOjpTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0CiB7CiAgICAgaWYgKG1fcERlY29kZXIpIHsKICAgICAgICAgcmV0dXJuIG1fcERlY29kZXItPlNraXBUb1NjYW5saW5lKGxpbmUsIHBQYXVzZSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENQREZfRElCU291cmNlOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGJvb2wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKIHsKICAgICBpZiAobGluZSA8IDAgfHwgZGVzdF9zY2FuID09IE5VTEwgfHwgZGVzdF9icHAgPD0gMCB8fAogICAgICAgICBkZXN0X3dpZHRoIDw9IDAgfHwgY2xpcF9sZWZ0IDwgMCB8fCBjbGlwX3dpZHRoIDw9IDApIHsKQEAgLTE0ODAsMjYgKzE0ODAsMjYgQEAKIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6fkNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpCiB7CiB9Ci1GWF9CT09MIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6U3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCitib29sIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6U3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIGJvb2wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgYm9vbCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCiB7CiAgICAgbV9wSW1hZ2VMb2FkZXIgPSBwSW1hZ2VMb2FkZXI7CiAgICAgbV9wQ2FjaGUgPSBwQ2FjaGU7CiAgICAgbV9wSW1hZ2UgPSAoQ1BERl9JbWFnZU9iamVjdCopcEltYWdlOwogICAgIG1fbkRvd25zYW1wbGVXaWR0aCA9IG5Eb3duc2FtcGxlV2lkdGg7CiAgICAgbV9uRG93bnNhbXBsZUhlaWdodCA9IG5Eb3duc2FtcGxlSGVpZ2h0OwotICAgIEZYX0JPT0wgcmV0OworICAgIGJvb2wgcmV0OwogICAgIGlmIChwQ2FjaGUpIHsKICAgICAgICAgcmV0ID0gcENhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcChwSW1hZ2UtPm1fcEltYWdlLT5HZXRTdHJlYW0oKSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwotICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gVFJVRTsKKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IHRydWU7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hCaXRtYXAoKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hNYXNrKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5tX01hdHRlQ29sb3I7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBwSW1hZ2UtPm1fcEltYWdlLT5TdGFydExvYWRESUJTb3VyY2UocFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBwUmVuZGVyU3RhdHVzLT5tX3BQYWdlUmVzb3VyY2UsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gICAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoQml0bWFwKCk7CiAgICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoTWFzaygpOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9IG1fcEltYWdlLT5tX3BJbWFnZS0+bV9NYXR0ZUNvbG9yOwpAQCAtMTUwNywyMSArMTUwNywyMSBAQAogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgcmV0OworICAgIGJvb2wgcmV0OwogICAgIGlmIChtX3BDYWNoZSkgewogICAgICAgICByZXQgPSBtX3BDYWNoZS0+Q29udGludWUocFBhdXNlKTsKLSAgICAgICAgaWYgKHJldCA9PSBGQUxTRSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IFRSVUU7CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSB0cnVlOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hCaXRtYXAoKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPkRldGFjaE1hc2soKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+bV9NYXR0ZUNvbG9yOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5Db250aW51ZShwUGF1c2UpOwotICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gRkFMU0U7CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaEJpdG1hcCgpOwogICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaE1hc2soKTsKICAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPm1fTWF0dGVDb2xvcjsKQEAgLTE1MjksMzAgKzE1MjksMzAgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZUxvYWRlcjo6TG9hZChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKQorYm9vbCBDUERGX0ltYWdlTG9hZGVyOjpMb2FkKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMpCiB7CiAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocENhY2hlKSB7CiAgICAgICAgIHBDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKHBJbWFnZS0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLCBtX3BCaXRtYXAsIG1fcE1hc2ssIG1fTWF0dGVDb2xvciwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwotICAgICAgICBtX2JDYWNoZWQgPSBUUlVFOworICAgICAgICBtX2JDYWNoZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcEJpdG1hcCA9IHBJbWFnZS0+bV9wSW1hZ2UtPkxvYWRESUJTb3VyY2UoJm1fcE1hc2ssICZtX01hdHRlQ29sb3IsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gICAgICAgIG1fYkNhY2hlZCA9IEZBTFNFOworICAgICAgICBtX2JDYWNoZWQgPSBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZUxvYWRlcjo6U3RhcnRMb2FkSW1hZ2UoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCB2b2lkKiYgTG9hZEhhbmRsZSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBuRG93bnNhbXBsZUhlaWdodCkKK2Jvb2wgQ1BERl9JbWFnZUxvYWRlcjo6U3RhcnRMb2FkSW1hZ2UoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCB2b2lkKiYgTG9hZEhhbmRsZSwgYm9vbCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBib29sIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBuRG93bnNhbXBsZUhlaWdodCkKIHsKICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSBuRG93bnNhbXBsZVdpZHRoOwogICAgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSBuRG93bnNhbXBsZUhlaWdodDsKICAgICBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqIHBMb2FkZXJIYW5kbGUgPSBuZXcgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOwotICAgIEZYX0JPT0wgcmV0ID0gcExvYWRlckhhbmRsZS0+U3RhcnQodGhpcywgcEltYWdlLCBwQ2FjaGUsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKKyAgICBib29sIHJldCA9IHBMb2FkZXJIYW5kbGUtPlN0YXJ0KHRoaXMsIHBJbWFnZSwgcENhY2hlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIG1fbkRvd25zYW1wbGVXaWR0aCwgbV9uRG93bnNhbXBsZUhlaWdodCk7CiAgICAgTG9hZEhhbmRsZSA9IHBMb2FkZXJIYW5kbGU7CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wJQ1BERl9JbWFnZUxvYWRlcjo6Q29udGludWUodm9pZCogTG9hZEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCitib29sCUNQREZfSW1hZ2VMb2FkZXI6OkNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIHJldHVybiAoKENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSopTG9hZEhhbmRsZSktPkNvbnRpbnVlKHBQYXVzZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm4uY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcAppbmRleCAzZWUyMjIyLi5lMDg2NDkwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm4uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICAgICAgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlcigwKTsKICAgICAgICAgdF9tYXggPSBwQXJyYXktPkdldE51bWJlcigxKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiU3RhcnRFeHRlbmQgPSBGQUxTRSwgYkVuZEV4dGVuZCA9IEZBTFNFOworICAgIGJvb2wgYlN0YXJ0RXh0ZW5kID0gZmFsc2UsIGJFbmRFeHRlbmQgPSBmYWxzZTsKICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkV4dGVuZCIpKTsKICAgICBpZiAocEFycmF5KSB7CiAgICAgICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICB0X21pbiA9IHBBcnJheS0+R2V0TnVtYmVyKDApOwogICAgICAgICB0X21heCA9IHBBcnJheS0+R2V0TnVtYmVyKDEpOwogICAgIH0KLSAgICBGWF9CT09MIGJTdGFydEV4dGVuZCA9IEZBTFNFLCBiRW5kRXh0ZW5kID0gRkFMU0U7CisgICAgYm9vbCBiU3RhcnRFeHRlbmQgPSBmYWxzZSwgYkVuZEV4dGVuZCA9IGZhbHNlOwogICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRXh0ZW5kIikpOwogICAgIGlmIChwQXJyYXkpIHsKICAgICAgICAgYlN0YXJ0RXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDApOwpAQCAtMTU1LDExICsxNTUsMTEgQEAKICAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwogICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKICAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0JPT0wgYkRlY3JlYXNpbmcgPSBGQUxTRTsKKyAgICBib29sIGJEZWNyZWFzaW5nID0gZmFsc2U7CiAgICAgaWYgKHN0YXJ0X3IgPiBlbmRfcikgewogICAgICAgICBpbnQgbGVuZ3RoID0gKGludClGWFNZU19zcXJ0KChGWFNZU19NdWwoc3RhcnRfeCAtIGVuZF94LCBzdGFydF94IC0gZW5kX3gpICsgRlhTWVNfTXVsKHN0YXJ0X3kgLSBlbmRfeSwgc3RhcnRfeSAtIGVuZF95KSkpOwogICAgICAgICBpZiAobGVuZ3RoIDwgc3RhcnRfciAtIGVuZF9yKSB7Ci0gICAgICAgICAgICBiRGVjcmVhc2luZyA9IFRSVUU7CisgICAgICAgICAgICBiRGVjcmVhc2luZyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKQEAgLTI4MSwyMiArMjgxLDIyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIF9HZXRTY2FubGluZUludGVyc2VjdChpbnQgeSwgRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0ZMT0FUJiB4KQorYm9vbCBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoaW50IHksIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9GTE9BVCYgeCkKIHsKICAgICBpZiAoeTEgPT0geTIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh5MSA8IHkyKSB7CiAgICAgICAgIGlmICh5IDwgeTEgfHwgeSA+IHkyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoeSA8IHkyIHx8IHkgPiB5MSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIHggPSB4MSArIEZYU1lTX011bERpdih4MiAtIHgxLCB5IC0geTEsIHkyIC0geTEpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIHZvaWQgX0RyYXdHb3VyYXVkKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGFscGhhLCBDUERGX01lc2hWZXJ0ZXggdHJpYW5nbGVbM10pCiB7CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpICsrKSB7CiAgICAgICAgICAgICBDUERGX01lc2hWZXJ0ZXgmIHZlcnRleDEgPSB0cmlhbmdsZVtpXTsKICAgICAgICAgICAgIENQREZfTWVzaFZlcnRleCYgdmVydGV4MiA9IHRyaWFuZ2xlWyhpICsgMSkgJSAzXTsKLSAgICAgICAgICAgIEZYX0JPT0wgYkludGVyc2VjdCA9IF9HZXRTY2FubGluZUludGVyc2VjdCh5LCB2ZXJ0ZXgxLngsIHZlcnRleDEueSwKKyAgICAgICAgICAgIGJvb2wgYkludGVyc2VjdCA9IF9HZXRTY2FubGluZUludGVyc2VjdCh5LCB2ZXJ0ZXgxLngsIHZlcnRleDEueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleDIueCwgdmVydGV4Mi55LCBpbnRlcl94W25JbnRlcnNlY3RzXSk7CiAgICAgICAgICAgICBpZiAoIWJJbnRlcnNlY3QpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTYwMSw3ICs2MDEsNyBAQAogICAgIGludAkJCQkJYWxwaGE7CiAgICAgdm9pZCBEcmF3KGludCB4X3NjYWxlLCBpbnQgeV9zY2FsZSwgaW50IGxlZnQsIGludCBib3R0b20sIENvb25fQmV6aWVyIEMxLCBDb29uX0JlemllciBDMiwgQ29vbl9CZXppZXIgRDEsIENvb25fQmV6aWVyIEQyKQogICAgIHsKLSAgICAgICAgRlhfQk9PTCBiU21hbGwgPSBDMS5EaXN0YW5jZSgpIDwgMiAmJiBDMi5EaXN0YW5jZSgpIDwgMiAmJiBEMS5EaXN0YW5jZSgpIDwgMiAmJiBEMi5EaXN0YW5jZSgpIDwgMjsKKyAgICAgICAgYm9vbCBiU21hbGwgPSBDMS5EaXN0YW5jZSgpIDwgMiAmJiBDMi5EaXN0YW5jZSgpIDwgMiAmJiBEMS5EaXN0YW5jZSgpIDwgMiAmJiBEMi5EaXN0YW5jZSgpIDwgMjsKICAgICAgICAgQ29vbl9Db2xvciBkaXZfY29sb3JzWzRdOwogICAgICAgICBpbnQgZF9ib3R0b20sIGRfbGVmdCwgZF90b3AsIGRfcmlnaHQ7CiAgICAgICAgIGRpdl9jb2xvcnNbMF0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSwgeF9zY2FsZSwgeV9zY2FsZSk7CkBAIC02NjMsOSArNjYzLDkgQEAKICAgICB9CiB9OwogCi1GWF9CT09MIF9DaGVja0Nvb25UZW5zb3JQYXJhKGNvbnN0IENQREZfTWVzaFN0cmVhbSAmc3RyZWFtKQorYm9vbCBfQ2hlY2tDb29uVGVuc29yUGFyYShjb25zdCBDUERGX01lc2hTdHJlYW0gJnN0cmVhbSkKIHsKLSAgICBGWF9CT09MIGJDb29yQml0cyA9ICggc3RyZWFtLm1fbkNvb3JkQml0cz09IDEgICB8fAorICAgIGJvb2wgYkNvb3JCaXRzID0gKCBzdHJlYW0ubV9uQ29vcmRCaXRzPT0gMSAgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMiAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSA0ICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDggIHx8CkBAIC02NzQsMjEgKzY3NCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDI0IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMzIgICApOwogCi0gICAgRlhfQk9PTCBiQ29tcEJpdHMgPSAoIHN0cmVhbS5tX25Db21wQml0cyA9PSAxICB8fAorICAgIGJvb2wgYkNvbXBCaXRzID0gKCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMSAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDIgIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSA0ICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gOCAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDEyIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAxNiAgICk7CiAKLSAgICBGWF9CT09MIGJGbGFnQml0cyA9ICggc3RyZWFtLm1fbkZsYWdCaXRzID09IDIgIHx8CisgICAgYm9vbCBiRmxhZ0JpdHMgPSAoIHN0cmVhbS5tX25GbGFnQml0cyA9PSAyICB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uRmxhZ0JpdHMgPT0gNCAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkZsYWdCaXRzID09IDggICAgKTsKIAogICAgIHJldHVybiBiQ29vckJpdHMgJiYgYkNvbXBCaXRzICYmIGJGbGFnQml0czsKIH0KIAotc3RhdGljIHZvaWQgX0RyYXdDb29uUGF0Y2hNZXNoZXMoRlhfQk9PTCBiVGVuc29yLCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAorc3RhdGljIHZvaWQgX0RyYXdDb29uUGF0Y2hNZXNoZXMoYm9vbCBiVGVuc29yLCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsIGludCBmaWxsX21vZGUsIGludCBhbHBoYSkKIHsKQEAgLTc2OCw3ICs3NjgsNyBAQAogICAgIH0KIH0KIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCYgY2xpcF9yZWN0LCBpbnQgYWxwaGEsIEZYX0JPT0wgYkFscGhhTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwgaW50IGFscGhhLCBib29sIGJBbHBoYU1vZGUpCiB7CiAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcyA9IHBQYXR0ZXJuLT5tX3BGdW5jdGlvbnM7CiAgICAgaW50IG5GdW5jcyA9IHBQYXR0ZXJuLT5tX25GdW5jczsKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgIH0KICAgICBidWZmZXIuT3V0cHV0VG9EZXZpY2UoKTsKIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1NoYWRpbmdQYXR0ZXJuKENQREZfU2hhZGluZ1BhdHRlcm4qIHBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpCiB7CiAgICAgaWYgKCFwYXR0ZXJuLT5Mb2FkKCkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtODU4LDcgKzg1OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0OwotICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwUGFnZU9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgeworICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwUGFnZU9iaiwgcE9iajJEZXZpY2UsIGZhbHNlLCByZWN0KSkgewogICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODY5LDE5ICs4NjksMTkgQEAKICAgICBEcmF3U2hhZGluZyhwYXR0ZXJuLCAmbWF0cml4LCByZWN0LCBhbHBoYSwgbV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSk7CiAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NTaGFkaW5nKENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1NoYWRpbmcoQ1BERl9TaGFkaW5nT2JqZWN0KiBwU2hhZGluZ09iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgRlhfUkVDVCByZWN0ID0gcFNoYWRpbmdPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwogICAgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICByZWN0LkludGVyc2VjdChjbGlwX2JveCk7CiAgICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwU2hhZGluZ09iai0+bV9NYXRyaXg7CiAgICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIERyYXdTaGFkaW5nKHBTaGFkaW5nT2JqLT5tX3BTaGFkaW5nLCAmbWF0cml4LCByZWN0LCBwU2hhZGluZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoRkFMU0UpLAorICAgIERyYXdTaGFkaW5nKHBTaGFkaW5nT2JqLT5tX3BTaGFkaW5nLCAmbWF0cml4LCByZWN0LCBwU2hhZGluZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoZmFsc2UpLAogICAgICAgICAgICAgICAgIG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIENGWF9ESUJpdG1hcCogRHJhd1BhdHRlcm5CaXRtYXAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLApAQCAtOTE0LDcgKzkxNCw3IEBACiAgICAgY29udGV4dC5EcmF3T2JqZWN0TGlzdCgmYml0bWFwX2RldmljZSwgcFBhdHRlcm4tPm1fcEZvcm0sICZtdFBhdHRlcm4yQml0bWFwLCAmb3B0aW9ucyk7CiAgICAgcmV0dXJuIHBCaXRtYXA7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSkKIHsKICAgICBpZiAoIXBQYXR0ZXJuLT5Mb2FkKCkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtOTQ0LDExICs5NDQsMTEgQEAKICAgICBDRlhfQWZmaW5lTWF0cml4IG10UGF0dGVybjJEZXZpY2UgPSBwUGF0dGVybi0+bV9QYXR0ZXJuMkZvcm07CiAgICAgbXRQYXR0ZXJuMkRldmljZS5Db25jYXQoKnBPYmoyRGV2aWNlKTsKICAgICBHZXRTY2FsZWRNYXRyaXgobXRQYXR0ZXJuMkRldmljZSk7Ci0gICAgRlhfQk9PTCBiQWxpZ25lZCA9IEZBTFNFOworICAgIGJvb2wgYkFsaWduZWQgPSBmYWxzZTsKICAgICBpZiAocFBhdHRlcm4tPm1fQkJveC5sZWZ0ID09IDAgJiYgcFBhdHRlcm4tPm1fQkJveC5ib3R0b20gPT0gMCAmJgogICAgICAgICAgICAgcFBhdHRlcm4tPm1fQkJveC5yaWdodCA9PSBwUGF0dGVybi0+bV9YU3RlcCAmJiBwUGF0dGVybi0+bV9CQm94LnRvcCA9PSBwUGF0dGVybi0+bV9ZU3RlcCAmJgogICAgICAgICAgICAgKG10UGF0dGVybjJEZXZpY2UuSXNTY2FsZWQoKSB8fCBtdFBhdHRlcm4yRGV2aWNlLklzOTBSb3RhdGVkKCkpKSB7Ci0gICAgICAgIGJBbGlnbmVkID0gVFJVRTsKKyAgICAgICAgYkFsaWduZWQgPSB0cnVlOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IGNlbGxfYmJveCA9IHBQYXR0ZXJuLT5tX0JCb3g7CiAgICAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm1SZWN0KGNlbGxfYmJveCk7CkBAIC0xMDc1LDExICsxMDc1LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgQ29tcG9zaXRlRElCaXRtYXAoJnNjcmVlbiwgY2xpcF9ib3gubGVmdCwgY2xpcF9ib3gudG9wLCAwLCAyNTUsIEZYRElCX0JMRU5EX05PUk1BTCwgRkFMU0UpOworICAgIENvbXBvc2l0ZURJQml0bWFwKCZzY3JlZW4sIGNsaXBfYm94LmxlZnQsIGNsaXBfYm94LnRvcCwgMCwgMjU1LCBGWERJQl9CTEVORF9OT1JNQUwsIGZhbHNlKTsKICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogICAgIGRlbGV0ZSBwUGF0dGVybkJpdG1hcDsKIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgRlhfQk9PTCBiU3Ryb2tlKQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1BhdGhXaXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ1BERl9Db2xvciogcENvbG9yLCBib29sIGJTdHJva2UpCiB7CiAgICAgQ1BERl9QYXR0ZXJuKiBwYXR0ZXJuID0gcENvbG9yLT5HZXRQYXR0ZXJuKCk7CiAgICAgaWYgKHBhdHRlcm4gPT0gTlVMTCkgewpAQCAtMTA5MSwyMCArMTA5MSwyMCBAQAogICAgICAgICBEcmF3U2hhZGluZ1BhdHRlcm4oKENQREZfU2hhZGluZ1BhdHRlcm4qKXBhdHRlcm4sIHBQYXRoT2JqLCBwT2JqMkRldmljZSwgYlN0cm9rZSk7CiAgICAgfQogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1BhdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBpbnQmIGZpbGx0eXBlLCBGWF9CT09MJiBiU3Ryb2tlKQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1BhdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBpbnQmIGZpbGx0eXBlLCBib29sJiBiU3Ryb2tlKQogewogICAgIGlmKGZpbGx0eXBlKSB7CiAgICAgICAgIENQREZfQ29sb3ImIEZpbGxDb2xvciA9ICpwUGF0aE9iai0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpOwogICAgICAgICBpZihGaWxsQ29sb3IubV9wQ1MgJiYgRmlsbENvbG9yLm1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICBEcmF3UGF0aFdpdGhQYXR0ZXJuKHBQYXRoT2JqLCBwT2JqMkRldmljZSwgJkZpbGxDb2xvciwgRkFMU0UpOworICAgICAgICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZGaWxsQ29sb3IsIGZhbHNlKTsKICAgICAgICAgICAgIGZpbGx0eXBlID0gMDsKICAgICAgICAgfQogICAgIH0KICAgICBpZihiU3Ryb2tlKSB7CiAgICAgICAgIENQREZfQ29sb3ImIFN0cm9rZUNvbG9yID0gKnBQYXRoT2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKTsKICAgICAgICAgaWYoU3Ryb2tlQ29sb3IubV9wQ1MgJiYgU3Ryb2tlQ29sb3IubV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmU3Ryb2tlQ29sb3IsIFRSVUUpOwotICAgICAgICAgICAgYlN0cm9rZSA9IEZBTFNFOworICAgICAgICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZTdHJva2VDb2xvciwgdHJ1ZSk7CisgICAgICAgICAgICBiU3Ryb2tlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcAppbmRleCBhZDVkYzU4Li4yNjEzOGE5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgogI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSAicmVuZGVyX2ludC5oIgotZXh0ZXJuIEZYX0JPT0wgSXNBdmFpbGFibGVNYXRyaXgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKK2V4dGVybiBib29sIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CiBDUERGX1R5cGUzQ2FjaGU6On5DUERGX1R5cGUzQ2FjaGUoKQogewogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fU2l6ZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CkBAIC03NiwyOCArNzYsMjggQEAKICAgICB0b3BfbGluZSA9IF9BZGp1c3RCbHVlKHRvcCwgbV9Ub3BCbHVlQ291bnQsIG1fVG9wQmx1ZSk7CiAgICAgYm90dG9tX2xpbmUgPSBfQWRqdXN0Qmx1ZShib3R0b20sIG1fQm90dG9tQmx1ZUNvdW50LCBtX0JvdHRvbUJsdWUpOwogfQotc3RhdGljIEZYX0JPT0wgX0lzU2NhbkxpbmUxYnBwKHVpbnQ4X3QqIHBCdWYsIGludCB3aWR0aCkKK3N0YXRpYyBib29sIF9Jc1NjYW5MaW5lMWJwcCh1aW50OF90KiBwQnVmLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50IHNpemUgPSB3aWR0aCAvIDg7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKQogICAgICAgICBpZiAocEJ1ZltpXSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIGlmICh3aWR0aCAlIDgpCiAgICAgICAgIGlmIChwQnVmW3dpZHRoIC8gOF0gJiAoMHhmZiA8PCAoOCAtIHdpZHRoICUgOCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIF9Jc1NjYW5MaW5lOGJwcCh1aW50OF90KiBwQnVmLCBpbnQgd2lkdGgpCitzdGF0aWMgYm9vbCBfSXNTY2FuTGluZThicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspCiAgICAgICAgIGlmIChwQnVmW2ldID4gMHg0MCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1zdGF0aWMgaW50IF9EZXRlY3RGaXJzdExhc3RTY2FuKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgRlhfQk9PTCBiRmlyc3QpCitzdGF0aWMgaW50IF9EZXRlY3RGaXJzdExhc3RTY2FuKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgYm9vbCBiRmlyc3QpCiB7CiAgICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpLCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCksIHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKICAgICBpbnQgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCk7CkBAIC0xMzcsMTIgKzEzNywxMiBAQAogICAgIGludCBsZWZ0LCB0b3A7CiAgICAgaWYgKEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmIpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYSkgLyAxMDAgJiYgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYykgPCBGWFNZU19mYWJzKGltYWdlX21hdHJpeC5kKSAvIDEwMCkgewogICAgICAgICBpbnQgdG9wX2xpbmUsIGJvdHRvbV9saW5lOwotICAgICAgICB0b3BfbGluZSA9IF9EZXRlY3RGaXJzdExhc3RTY2FuKHBCaXRtYXAsIFRSVUUpOwotICAgICAgICBib3R0b21fbGluZSA9IF9EZXRlY3RGaXJzdExhc3RTY2FuKHBCaXRtYXAsIEZBTFNFKTsKKyAgICAgICAgdG9wX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCB0cnVlKTsKKyAgICAgICAgYm90dG9tX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBmYWxzZSk7CiAgICAgICAgIGlmICh0b3BfbGluZSA9PSAwICYmIGJvdHRvbV9saW5lID09IHBCaXRtYXAtPkdldEhlaWdodCgpIC0gMSkgewogICAgICAgICAgICAgRlhfRkxPQVQgdG9wX3kgPSBpbWFnZV9tYXRyaXguZCArIGltYWdlX21hdHJpeC5mOwogICAgICAgICAgICAgRlhfRkxPQVQgYm90dG9tX3kgPSBpbWFnZV9tYXRyaXguZjsKLSAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBwZWQgPSB0b3BfeSA+IGJvdHRvbV95OworICAgICAgICAgICAgYm9vbCBiRmxpcHBlZCA9IHRvcF95ID4gYm90dG9tX3k7CiAgICAgICAgICAgICBpZiAoYkZsaXBwZWQpIHsKICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0ZW1wID0gdG9wX3k7CiAgICAgICAgICAgICAgICAgdG9wX3kgPSBib3R0b21feTsKQEAgLTE4NSw3NiArMTg1LDc2IEBACiAgICAgdmFfZW5kKGFyZ0xpc3QpOwogICAgIG1fS2V5TGVuID0gY291bnQgKiBzaXplb2YoRlhfRFdPUkQpOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKQorYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKQogewogICAgIGlmKHRleHRvYmotPm1fbkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQgdGV4dF9yZW5kZXJfbW9kZSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlOwogICAgIGlmICh0ZXh0X3JlbmRlcl9tb2RlID09IDMpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDUERGX0ZvbnQqIHBGb250ID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpOwogICAgIGlmIChwRm9udC0+R2V0Rm9udFR5cGUoKSA9PSBQREZGT05UX1RZUEUzKSB7CiAgICAgICAgIHJldHVybiBQcm9jZXNzVHlwZTNUZXh0KHRleHRvYmosIHBPYmoyRGV2aWNlKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiRmlsbCA9IEZBTFNFLCBiU3Ryb2tlID0gRkFMU0UsIGJDbGlwID0gRkFMU0U7CisgICAgYm9vbCBiRmlsbCA9IGZhbHNlLCBiU3Ryb2tlID0gZmFsc2UsIGJDbGlwID0gZmFsc2U7CiAgICAgaWYgKHBDbGlwcGluZ1BhdGgpIHsKLSAgICAgICAgYkNsaXAgPSBUUlVFOworICAgICAgICBiQ2xpcCA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3dpdGNoICh0ZXh0X3JlbmRlcl9tb2RlKSB7CiAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgYkZpbGwgPSBUUlVFOworICAgICAgICAgICAgICAgIGJGaWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldEZhY2UoKSA9PSBOVUxMICYmICEocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJGaWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiU3Ryb2tlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYlN0cm9rZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkZpbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGaWxsID0gYlN0cm9rZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJGaWxsID0gYlN0cm9rZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkZpbGwgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIEZYX0FSR0Igc3Ryb2tlX2FyZ2IgPSAwLCBmaWxsX2FyZ2IgPSAwOwotICAgIEZYX0JPT0wgYlBhdHRlcm4gPSBGQUxTRTsKKyAgICBib29sIGJQYXR0ZXJuID0gZmFsc2U7CiAgICAgaWYgKGJTdHJva2UpIHsKICAgICAgICAgaWYgKHRleHRvYmotPm1fQ29sb3JTdGF0ZS5HZXRTdHJva2VDb2xvcigpLT5Jc1BhdHRlcm4oKSkgewotICAgICAgICAgICAgYlBhdHRlcm4gPSBUUlVFOworICAgICAgICAgICAgYlBhdHRlcm4gPSB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3Ryb2tlX2FyZ2IgPSBHZXRTdHJva2VBcmdiKHRleHRvYmopOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChiRmlsbCkgewogICAgICAgICBpZiAodGV4dG9iai0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpLT5Jc1BhdHRlcm4oKSkgewotICAgICAgICAgICAgYlBhdHRlcm4gPSBUUlVFOworICAgICAgICAgICAgYlBhdHRlcm4gPSB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IodGV4dG9iaik7CiAgICAgICAgIH0KICAgICB9CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeDsKICAgICB0ZXh0b2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7Ci0gICAgaWYoSXNBdmFpbGFibGVNYXRyaXgodGV4dF9tYXRyaXgpID09IEZBTFNFKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIGlmKElzQXZhaWxhYmxlTWF0cml4KHRleHRfbWF0cml4KSA9PSBmYWxzZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKICAgICBpZiAoYlBhdHRlcm4pIHsKICAgICAgICAgRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4odGV4dG9iaiwgcE9iajJEZXZpY2UsIHBGb250LCBmb250X3NpemUsICZ0ZXh0X21hdHJpeCwgYkZpbGwsIGJTdHJva2UpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChiQ2xpcCB8fCBiU3Ryb2tlKSB7CiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXZpY2VNYXRyaXggPSBwT2JqMkRldmljZTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgIGlmIChwRm9udC0+bV9wRG9jdW1lbnQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRGb250KHBGb250LT5HZXRGb250RGljdCgpLCBGQUxTRSk7CisgICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRGb250KHBGb250LT5HZXRGb250RGljdCgpLCBmYWxzZSk7CiAgICAgcmV0dXJuIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5HZXRDYWNoZWRUeXBlMyhwRm9udCk7CiB9CiBzdGF0aWMgdm9pZCBSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KQpAQCAtMzA0LDEwICszMDQsMTAgQEAKICAgICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+UmVsZWFzZUNhY2hlZFR5cGUzKHBGb250KTsKICAgICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VGb250KHBGb250LT5HZXRGb250RGljdCgpKTsKIH0KLUZYX0JPT0wgQ1BERl9UeXBlM0NoYXI6OkxvYWRCaXRtYXAoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCkKK2Jvb2wgQ1BERl9UeXBlM0NoYXI6OkxvYWRCaXRtYXAoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCkKIHsKICAgICBpZiAobV9wQml0bWFwICE9IE5VTEwgfHwgbV9wRm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fcEZvcm0tPkNvdW50T2JqZWN0cygpID09IDEgJiYgIW1fYkNvbG9yZWQpIHsKICAgICAgICAgQ1BERl9QYWdlT2JqZWN0ICpwUGFnZU9iaiA9IG1fcEZvcm0tPkdldE9iamVjdEF0KG1fcEZvcm0tPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKSk7CkBAIC0zMjEsMTAgKzMyMSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsZXRlIG1fcEZvcm07CiAgICAgICAgICAgICBtX3BGb3JtID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGNsYXNzIENQREZfUmVmVHlwZTNDYWNoZQogewpAQCAtMzQzLDEyICszNDMsMTIgQEAKICAgICBGWF9EV09SRCBtX2R3Q291bnQ7CiAgICAgQ1BERl9UeXBlM0ZvbnQqIG1fcFR5cGUzRm9udDsKIH07Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCitib29sIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCiB7CiAgICAgQ1BERl9UeXBlM0ZvbnQqIHBUeXBlM0ZvbnQgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250KCktPkdldFR5cGUzRm9udCgpOwogICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9UeXBlM0ZvbnRDYWNoZS5HZXRTaXplKCk7IGorKykKICAgICAgICAgaWYgKChDUERGX1R5cGUzRm9udCopbV9UeXBlM0ZvbnRDYWNoZS5HZXRBdChqKSA9PSBwVHlwZTNGb250KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgQ0ZYX01hdHJpeCBkQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKICAgICBGWF9GTE9BVCBzYSA9IEZYU1lTX2ZhYnMoZENUTS5hKTsKQEAgLTM1OCwxNCArMzU4LDE0IEBACiAgICAgQ0ZYX0FmZmluZU1hdHJpeCBjaGFyX21hdHJpeCA9IHBUeXBlM0ZvbnQtPkdldEZvbnRNYXRyaXgoKTsKICAgICBGWF9GTE9BVCBmb250X3NpemUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwogICAgIGNoYXJfbWF0cml4LlNjYWxlKGZvbnRfc2l6ZSwgZm9udF9zaXplKTsKLSAgICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmosIFRSVUUpOworICAgIEZYX0FSR0IgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IodGV4dG9iaiwgdHJ1ZSk7CiAgICAgaW50IGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2FyZ2IpOwogICAgIGludCBkZXZpY2VfY2xhc3MgPSBtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCk7CiAgICAgRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MgPSBOVUxMOwogICAgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19ESVNQTEFZKSB7CiAgICAgICAgIHBHbHlwaEFuZFBvcyA9IEZYX0FsbG9jKEZYVEVYVF9HTFlQSFBPUywgdGV4dG9iai0+bV9uQ2hhcnMpOwogICAgIH0gZWxzZSBpZiAoZmlsbF9hbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9SZWZUeXBlM0NhY2hlIHJlZlR5cGVDYWNoZShwVHlwZTNGb250KTsKICAgICBGWF9EV09SRCAqcENoYXJzID0gdGV4dG9iai0+bV9wQ2hhckNvZGVzOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAgICAgICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwogICAgICAgICAgICAgICAgIHBHbHlwaEFuZFBvcyA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTdGF0ZXMgPSBDbG9uZU9ialN0YXRlcyh0ZXh0b2JqLCBGQUxTRSk7CisgICAgICAgICAgICBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTdGF0ZXMgPSBDbG9uZU9ialN0YXRlcyh0ZXh0b2JqLCBmYWxzZSk7CiAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMgT3B0aW9ucyA9IG1fT3B0aW9uczsKICAgICAgICAgICAgIE9wdGlvbnMubV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkUgfCBSRU5ERVJfUkVDVF9BQTsKICAgICAgICAgICAgIE9wdGlvbnMubV9GbGFncyAmPSB+UkVOREVSX0ZPUkNFX0RPV05TQU1QTEU7CkBAIC00MTAsNyArNDEwLDcgQEAKICAgICAgICAgICAgIGlmIChmaWxsX2FscGhhID09IDI1NSkgewogICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKICAgICAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsICZPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgRkFMU0UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBmYWxzZSwgcFR5cGUzQ2hhciwgZmlsbF9hcmdiKTsKICAgICAgICAgICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BcHBlbmQobV9UeXBlM0ZvbnRDYWNoZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQWRkKHBUeXBlM0ZvbnQpOwogICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7CkBAIC00MjIsMTIgKzQyMiwxMiBAQAogICAgICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CiAgICAgICAgICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKICAgICAgICAgICAgICAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKChpbnQpKHJlY3QuV2lkdGgoKSAqIHNhKSwgKGludCkocmVjdC5IZWlnaHQoKSAqIHNkKSwgRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBiaXRtYXBfZGV2aWNlLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CiAgICAgICAgICAgICAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsICZPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgRkFMU0UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBmYWxzZSwgcFR5cGUzQ2hhciwgZmlsbF9hcmdiKTsKICAgICAgICAgICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BcHBlbmQobV9UeXBlM0ZvbnRDYWNoZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQWRkKHBUeXBlM0ZvbnQpOwogICAgICAgICAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CkBAIC00NTcsMTEgKzQ1NywxMSBAQAogICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggaW1hZ2VfbWF0cml4ID0gcFR5cGUzQ2hhci0+bV9JbWFnZU1hdHJpeDsKICAgICAgICAgICAgICAgICBpbWFnZV9tYXRyaXguQ29uY2F0KG1hdHJpeCk7CiAgICAgICAgICAgICAgICAgQ1BERl9JbWFnZVJlbmRlcmVyIHJlbmRlcmVyOwotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5TdGFydCh0aGlzLCBwVHlwZTNDaGFyLT5tX3BCaXRtYXAsIGZpbGxfYXJnYiwgMjU1LCAmaW1hZ2VfbWF0cml4LCAwLCBGQUxTRSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuU3RhcnQodGhpcywgcFR5cGUzQ2hhci0+bV9wQml0bWFwLCBmaWxsX2FyZ2IsIDI1NSwgJmltYWdlX21hdHJpeCwgMCwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLkNvbnRpbnVlKE5VTEwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIXJlbmRlcmVyLm1fUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDcxLDcgKzQ3MSw3IEBACiAgICAgICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7CiAgICAgICAgIGlmICghYml0bWFwLkNyZWF0ZSgoaW50KShyZWN0LldpZHRoKCkgKiBzYSksIChpbnQpKHJlY3QuSGVpZ2h0KCkgKiBzZCksIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7CiAgICAgICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCB0ZXh0b2JqLT5tX25DaGFyczsgaUNoYXIgKyspIHsKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogICAgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJmJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgZmlsbF9hcmdiKTsKICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNsYXNzIENQREZfQ2hhclBvc0xpc3QKIHsKQEAgLTUxNSwxMyArNTE1LDEzIEBACiAgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYVEVYVF9DSEFSUE9TLCBuQ2hhcnMpOwogICAgIG1fbkNoYXJzID0gMDsKICAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IHBDSURGb250ICYmIHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CisgICAgYm9vbCBiVmVydFdyaXRpbmcgPSBwQ0lERm9udCAmJiBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwogICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7CiAgICAgICAgIEZYX0RXT1JEIENoYXJDb2RlID0gbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKHVpbnRwdHJfdClwQ2hhckNvZGVzIDogcENoYXJDb2Rlc1tpQ2hhcl07CiAgICAgICAgIGlmIChDaGFyQ29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiVmVydCA9IEZBTFNFOworICAgICAgICBib29sIGJWZXJ0ID0gZmFsc2U7CiAgICAgICAgIEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gbV9wQ2hhclBvc1ttX25DaGFycysrXTsKICAgICAgICAgaWYgKHBDSURGb250KSB7CiAgICAgICAgICAgICBjaGFycG9zLm1fYkZvbnRTdHlsZSA9IHBDSURGb250LT5Jc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShDaGFyQ29kZSk7CkBAIC01MzcsNyArNTM3LDcgQEAKICAgICAgICAgfQogICAgICAgICBjaGFycG9zLm1fT3JpZ2luWCA9IGlDaGFyID8gcENoYXJQb3NbaUNoYXIgLSAxXSA6IDA7CiAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5ZID0gMDsKLSAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IEZBTFNFOworICAgICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gZmFsc2U7CiAgICAgICAgIGlmIChwQ0lERm9udCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtNTU4LDExICs1NTgsMTEgQEAKICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10gPSBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzNdKTsKICAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5YICs9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNF0pICogRm9udFNpemU7CiAgICAgICAgICAgICBjaGFycG9zLm1fT3JpZ2luWSArPSBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzVdKSAqIEZvbnRTaXplOwotICAgICAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IFRSVUU7CisgICAgICAgICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAorYm9vbCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLApAQCAtNjMyLDcgKzYzMiw3IEBACiAgICAgICAgIEZYX0ZyZWUocENoYXJQb3MpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCitib29sIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAogICAgICAgICBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmb250X3NpemUsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MkRldmljZSwKICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCkBAIC02NzEsMTMgKzY3MSwxMyBAQAogfQogdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1RleHRQYXRoV2l0aFBhdHRlcm4oY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dE1hdHJpeCwgRlhfQk9PTCBiRmlsbCwgRlhfQk9PTCBiU3Ryb2tlKQorICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dE1hdHJpeCwgYm9vbCBiRmlsbCwgYm9vbCBiU3Ryb2tlKQogewogICAgIGlmICghYlN0cm9rZSkgewogICAgICAgICBDUERGX1BhdGhPYmplY3QgcGF0aDsKICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwQ29weSA9IG5ldyBDUERGX1RleHRPYmplY3Q7CiAgICAgICAgIHBDb3B5LT5Db3B5KHRleHRvYmopOwotICAgICAgICBwYXRoLm1fYlN0cm9rZSA9IEZBTFNFOworICAgICAgICBwYXRoLm1fYlN0cm9rZSA9IGZhbHNlOwogICAgICAgICBwYXRoLm1fRmlsbFR5cGUgPSBGWEZJTExfV0lORElORzsKICAgICAgICAgcGF0aC5tX0NsaXBQYXRoLkFwcGVuZFRleHRzKCZwQ29weSwgMSk7CiAgICAgICAgIHBhdGgubV9Db2xvclN0YXRlID0gdGV4dG9iai0+bV9Db2xvclN0YXRlOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaAppbmRleCBlNWZiODMxLi5jOWM4OTQ0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaApAQCAtNDksOSArNDksOSBAQAogcHVibGljOgogICAgIENQREZfRG9jdW1lbnQqCW1fcFBERkRvYzsKICAgICB1aW50OF90CQkJbV9TYW1wbGVzWzI1NiAqIDNdOwotICAgIEZYX0JPT0wJCQltX2JJZGVudGl0eTsKKyAgICBib29sCQkJbV9iSWRlbnRpdHk7CiAKLSAgICBDRlhfRElCU291cmNlKglUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYyk7CisgICAgQ0ZYX0RJQlNvdXJjZSoJVHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgYm9vbCBiQXV0b0Ryb3BTcmMpOwogICAgIEZYX0NPTE9SUkVGCQlUcmFuc2xhdGVDb2xvcihGWF9DT0xPUlJFRiBzcmMpOwogfTsKIApAQCAtNjYsNyArNjYsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcEZvbnRDYWNoZTsKICAgICB9Ci0gICAgdm9pZAkJCQlDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOworICAgIHZvaWQJCQkJQ2xlYXIoYm9vbCBiUmVsZWFzZSA9IGZhbHNlKTsKICAgICB2b2lkCQkJCVJlbGVhc2VDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOwogICAgIHZvaWQJCQkJUmVsZWFzZVRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaik7CiBwcml2YXRlOgpAQCAtOTEsMjQgKzkxLDI0IEBACiBwdWJsaWM6CiAgICAgc3RhdGljIElQREZfT2JqZWN0UmVuZGVyZXIqIENyZWF0ZShpbnQgdHlwZSk7CiAgICAgdmlydHVhbCB+SVBERl9PYmplY3RSZW5kZXJlcigpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotICAgIEZYX0JPT0wJCW1fUmVzdWx0OworICAgIHZpcnR1YWwgYm9vbCBTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKKyAgICBib29sCQltX1Jlc3VsdDsKIH07CiBjbGFzcyBDUERGX1JlbmRlclN0YXR1cwogewogcHVibGljOgogICAgIENQREZfUmVuZGVyU3RhdHVzKCk7CiAgICAgfkNQREZfUmVuZGVyU3RhdHVzKCk7Ci0gICAgRlhfQk9PTAkJCUluaXRpYWxpemUoY2xhc3MgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwKKyAgICBib29sCQkJSW5pdGlhbGl6ZShjbGFzcyBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGV2aWNlTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosIGNvbnN0IENQREZfUmVuZGVyU3RhdHVzKiBwUGFyZW50U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcEluaXRpYWxTdGF0ZXMsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zcGFyZW5jeSwgRlhfQk9PTCBiRHJvcE9iamVjdHMsIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwJQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIgPSBOVUxMLCBGWF9BUkdCIGZpbGxfY29sb3IgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zcGFyZW5jeSwgYm9vbCBiRHJvcE9iamVjdHMsIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MgPSBmYWxzZSwJQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIgPSBOVUxMLCBGWF9BUkdCIGZpbGxfY29sb3IgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSk7CiAgICAgdm9pZAkJCVJlbmRlck9iamVjdExpc3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJUmVuZGVyU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJCUNvbnRpbnVlU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIElGWF9QYXVzZSogcFBhdXNlKTsKICAgICBDUERGX1JlbmRlck9wdGlvbnMJbV9PcHRpb25zOwogICAgIENQREZfRGljdGlvbmFyeSogICAgbV9wRm9ybVJlc291cmNlOwogICAgIENQREZfRGljdGlvbmFyeSogICAgbV9wUGFnZVJlc291cmNlOwpAQCAtMTIyLDQ1ICsxMjIsNDUgQEAKICAgICBmcmllbmQgY2xhc3MJQ1BERl9SZW5kZXJDb250ZXh0OwogICAgIHZvaWQJCQlQcm9jZXNzQ2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwogICAgIHZvaWQJCQlEcmF3Q2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzVHJhbnNwYXJlbmN5KGNvbnN0IENQREZfUGFnZU9iamVjdCogUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIGJvb2wJCQlQcm9jZXNzVHJhbnNwYXJlbmN5KGNvbnN0IENQREZfUGFnZU9iamVjdCogUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwogICAgIHZvaWQJCQlQcm9jZXNzT2JqZWN0Tm9DbGlwKGNvbnN0IENQREZfUGFnZU9iamVjdCogUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwogICAgIHZvaWQJCQlEcmF3T2JqV2l0aEJhY2tncm91bmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIERyYXdPYmpXaXRoQmxlbmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCVByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICB2b2lkCQkJUHJvY2Vzc1BhdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBpbnQmIGZpbGx0eXBlLCBGWF9CT09MJiBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1BhdGhXaXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ1BERl9Db2xvciogcENvbG9yLCBGWF9CT09MIGJTdHJva2UpOwotICAgIHZvaWQJCQlEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1NoYWRpbmdQYXR0ZXJuKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICBGWF9CT09MCQkJU2VsZWN0Q2xpcFBhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgRlhfQk9PTAkJCVByb2Nlc3NJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJT3V0cHV0Qml0bWFwQWxwaGEoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJT3V0cHV0SW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJT3V0cHV0RElCU291cmNlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBPdXRwdXRCaXRtYXAsIEZYX0FSR0IgZmlsbF9hcmdiLCBpbnQgYml0bWFwX2FscGhhLAorICAgIGJvb2wgICAgICAgICBEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICAgIGJvb2wJCQlQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgdm9pZAkJCVByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgYm9vbCYgYlN0cm9rZSk7CisgICAgdm9pZAkJCURyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgYm9vbCBiU3Ryb2tlKTsKKyAgICB2b2lkCQkJRHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSk7CisgICAgdm9pZAkJCURyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0cm9rZSk7CisgICAgYm9vbAkJCVNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBib29sIGJTdHJva2UpOworICAgIGJvb2wJCQlQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgYm9vbAkJCU91dHB1dEJpdG1hcEFscGhhKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7CisgICAgYm9vbAkJCU91dHB1dEltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7CisgICAgYm9vbAkJCU91dHB1dERJQlNvdXJjZShjb25zdCBDRlhfRElCU291cmNlKiBwT3V0cHV0Qml0bWFwLCBGWF9BUkdCIGZpbGxfYXJnYiwgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIENQREZfSW1hZ2VDYWNoZSogcEltYWdlQ2FjaGUsIEZYX0RXT1JEIGZsYWdzKTsKICAgICB2b2lkCQkJQ29tcG9zaXRlRElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9BUkdCIG1hc2tfYXJnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgaW50IGJsZW5kX21vZGUsIGludCBiSXNvbGF0ZWQpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgYm9vbAkJCVByb2Nlc3NTaGFkaW5nKENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICB2b2lkCQkJRHJhd1NoYWRpbmcoQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX1JFQ1QmIGNsaXBfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBGWF9CT09MIGJBbHBoYU1vZGUpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsIGJvb2wgYkFscGhhTW9kZSk7CisgICAgYm9vbAkJCVByb2Nlc3NUeXBlM1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgYm9vbAkJCVByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCk7CiAgICAgdm9pZAkJCURyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIEZYX0JPT0wgYkZpbGwsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgRlhfQk9PTAkJCVByb2Nlc3NGb3JtKENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIGJvb2wgYkZpbGwsIGJvb2wgYlN0cm9rZSk7CisgICAgYm9vbAkJCVByb2Nlc3NGb3JtKENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKICAgICBDRlhfRElCaXRtYXAqCUdldEJhY2tkcm9wKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgRlhfUkVDVCYgcmVjdCwgaW50JiBsZWZ0LCBpbnQmIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCk7CiAgICAgQ0ZYX0RJQml0bWFwKglMb2FkU01hc2soQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0LCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwogICAgIHZvaWQJCQlJbml0KENQREZfUmVuZGVyQ29udGV4dCogcFBhcmVudCk7CiAgICAgc3RhdGljIGNsYXNzIENQREZfVHlwZTNDYWNoZSoJR2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKLSAgICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLCBGWF9CT09MIGJTdHJva2UpOworICAgIHN0YXRpYyBDUERGX0dyYXBoaWNTdGF0ZXMqIENsb25lT2JqU3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFBhdGhPYmosIGJvb2wgYlN0cm9rZSk7CiAgICAgQ1BERl9UcmFuc2ZlckZ1bmMqCUdldFRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iamVjdCkgY29uc3Q7Ci0gICAgRlhfQVJHQgkJCUdldEZpbGxBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiVHlwZTMgPSBGQUxTRSkgY29uc3Q7CisgICAgRlhfQVJHQgkJCUdldEZpbGxBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgYm9vbCBiVHlwZTMgPSBmYWxzZSkgY29uc3Q7CiAgICAgRlhfQVJHQgkJCUdldFN0cm9rZUFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKSBjb25zdDsKICAgICBDUERGX1JlbmRlckNvbnRleHQqCQltX3BDb250ZXh0OwotICAgIEZYX0JPT0wJCQkJCW1fYlN0b3BwZWQ7CisgICAgYm9vbAkJCQkJbV9iU3RvcHBlZDsKICAgICB2b2lkCQkJRGl0aGVyT2JqZWN0QXJlYShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJR2V0T2JqZWN0Q2xpcHBlZFJlY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiTG9naWNhbCwgRlhfUkVDVCAmcmVjdCkgY29uc3Q7CisgICAgYm9vbAkJCUdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYkxvZ2ljYWwsIEZYX1JFQ1QgJnJlY3QpIGNvbnN0OwogICAgIHZvaWQJCQlHZXRTY2FsZWRNYXRyaXgoQ0ZYX01hdHJpeCAmbWF0cml4KSBjb25zdDsKIAogcHJvdGVjdGVkOgpAQCAtMTc1LDEzICsxNzUsMTMgQEAKICAgICBDUERGX0dyYXBoaWNTdGF0ZXMJCW1fSW5pdGlhbFN0YXRlczsKICAgICBpbnQJCQkJCQltX0hhbGZ0b25lTGltaXQ7CiAgICAgSVBERl9PYmplY3RSZW5kZXJlcioJbV9wT2JqZWN0UmVuZGVyZXI7Ci0gICAgRlhfQk9PTAkJCQkJbV9iUHJpbnQ7CisgICAgYm9vbAkJCQkJbV9iUHJpbnQ7CiAgICAgaW50CQkJCQkJbV9UcmFuc3BhcmVuY3k7CiAgICAgaW50CQkJCQkJbV9EaXRoZXJCaXRzOwotICAgIEZYX0JPT0wJCQkJCW1fYkRyb3BPYmplY3RzOwotICAgIEZYX0JPT0wJCQkJCW1fYlN0ZENTOworICAgIGJvb2wJCQkJCW1fYkRyb3BPYmplY3RzOworICAgIGJvb2wJCQkJCW1fYlN0ZENTOwogICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgIG1fR3JvdXBGYW1pbHk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgbV9iTG9hZE1hc2s7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbV9iTG9hZE1hc2s7CiAgICAgQ1BERl9UeXBlM0NoYXIgKiAgICAgICAgbV9wVHlwZTNDaGFyOwogICAgIEZYX0FSR0IJCQkJCW1fVDNGaWxsQ29sb3I7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbV9jdXJCbGVuZDsKQEAgLTE5NCwyMCArMTk0LDIwIEBACiAgICAgICAgIG1fcEJpdG1hcCA9IE5VTEw7CiAgICAgICAgIG1fcE1hc2sgPSBOVUxMOwogICAgICAgICBtX01hdHRlQ29sb3IgPSAwOwotICAgICAgICBtX2JDYWNoZWQgPSBGQUxTRTsKKyAgICAgICAgbV9iQ2FjaGVkID0gZmFsc2U7CiAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aCA9IDA7CiAgICAgICAgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSAwOwogICAgIH0KIAotICAgIEZYX0JPT0wJCQkJCUxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCk7CisgICAgYm9vbAkJCQkJTG9hZChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQkJCVN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgdm9pZComIExvYWRIYW5kbGUsIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgRlhfQk9PTAkJCQkJQ29udGludWUodm9pZCogTG9hZEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCQkJCVN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgdm9pZComIExvYWRIYW5kbGUsIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgICAgYm9vbAkJCQkJQ29udGludWUodm9pZCogTG9hZEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogICAgIH5DUERGX0ltYWdlTG9hZGVyKCk7CiAgICAgQ0ZYX0RJQlNvdXJjZSoJCQltX3BCaXRtYXA7CiAgICAgQ0ZYX0RJQlNvdXJjZSoJCQltX3BNYXNrOwogICAgIEZYX0RXT1JECQkJCW1fTWF0dGVDb2xvcjsKLSAgICBGWF9CT09MCQkJCQltX2JDYWNoZWQ7CisgICAgYm9vbAkJCQkJbV9iQ2FjaGVkOwogcHJvdGVjdGVkOgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgbV9uRG93bnNhbXBsZVdpZHRoOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgbV9uRG93bnNhbXBsZUhlaWdodDsKQEAgLTIxOCw4ICsyMTgsOCBAQAogICAgIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpOwogICAgIH5DUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKTsKIAotICAgIEZYX0JPT0wJCQlTdGFydChDUERGX0ltYWdlTG9hZGVyKiBwSW1hZ2VMb2FkZXIsIGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQgPSAwKTsKLSAgICBGWF9CT09MCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCQlTdGFydChDUERGX0ltYWdlTG9hZGVyKiBwSW1hZ2VMb2FkZXIsIGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBib29sIGJMb2FkTWFzayA9IGZhbHNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgICBib29sCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogcHJvdGVjdGVkOgogICAgIENQREZfSW1hZ2VMb2FkZXIqCW1fcEltYWdlTG9hZGVyOwogICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBtX3BDYWNoZTsKQEAgLTIzMywxMCArMjMzLDEwIEBACiBwdWJsaWM6CiAgICAgQ1BERl9JbWFnZVJlbmRlcmVyKCk7CiAgICAgfkNQREZfSW1hZ2VSZW5kZXJlcigpOwotICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgRlhfQk9PTAkJU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsIEZYX0FSR0IgYml0bWFwX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICBGWF9CT09MCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAkJU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIGJvb2wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICBib29sCQlTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgYm9vbCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIGJvb2wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKIHByb3RlY3RlZDoKICAgICBDUERGX1JlbmRlclN0YXR1cyoJbV9wUmVuZGVyU3RhdHVzOwogICAgIENQREZfSW1hZ2VPYmplY3QqCW1fcEltYWdlT2JqZWN0OwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSoJCW1fcERJQlNvdXJjZTsKICAgICBDRlhfRElCaXRtYXAqCQltX3BDbG9uZTsKICAgICBpbnQJCQkJCW1fQml0bWFwQWxwaGE7Ci0gICAgRlhfQk9PTAkJCQltX2JQYXR0ZXJuQ29sb3I7CisgICAgYm9vbAkJCQltX2JQYXR0ZXJuQ29sb3I7CiAgICAgQ1BERl9QYXR0ZXJuKgkJbV9wUGF0dGVybjsKICAgICBGWF9BUkdCCQkJCW1fRmlsbEFyZ2I7CiAgICAgRlhfRFdPUkQJCQltX0ZsYWdzOwpAQCAtMjU1LDIxICsyNTUsMjEgQEAKICAgICBDRlhfSW1hZ2VUcmFuc2Zvcm1lcioJbV9wVHJhbnNmb3JtZXI7CiAgICAgdm9pZCoJCQltX0RldmljZUhhbmRsZTsKICAgICB2b2lkKiAgICAgICAgICAgbV9Mb2FkSGFuZGxlOwotICAgIEZYX0JPT0wJCQkJbV9iU3RkQ1M7CisgICAgYm9vbAkJCQltX2JTdGRDUzsKICAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOwotICAgIEZYX0JPT0wJCQkJU3RhcnRCaXRtYXBBbHBoYSgpOwotICAgIEZYX0JPT0wJCQkJU3RhcnRESUJTb3VyY2UoKTsKLSAgICBGWF9CT09MCQkJCVN0YXJ0UmVuZGVyRElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlTdGFydExvYWRESUJTb3VyY2UoKTsKLSAgICBGWF9CT09MCQkJCURyYXdNYXNrZWRJbWFnZSgpOwotICAgIEZYX0JPT0wJCQkJRHJhd1BhdHRlcm5JbWFnZShjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisgICAgYm9vbAkJCQlTdGFydEJpdG1hcEFscGhhKCk7CisgICAgYm9vbAkJCQlTdGFydERJQlNvdXJjZSgpOworICAgIGJvb2wJCQkJU3RhcnRSZW5kZXJESUJTb3VyY2UoKTsKKyAgICBib29sCQkJCVN0YXJ0TG9hZERJQlNvdXJjZSgpOworICAgIGJvb2wJCQkJRHJhd01hc2tlZEltYWdlKCk7CisgICAgYm9vbAkJCQlEcmF3UGF0dGVybkltYWdlKGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKIH07CiBjbGFzcyBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcgogewogcHVibGljOgogICAgIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCk7CiAgICAgfkNQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCk7Ci0gICAgRlhfQk9PTAkJCQlJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAorICAgIGJvb2wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMgKnBPcHRpb25zID0gTlVMTCwgaW50IG1heF9kcGkgPSAwKTsKICAgICBDRlhfUmVuZGVyRGV2aWNlKglHZXREZXZpY2UoKQogICAgIHsKQEAgLTI5NCwxMyArMjk0LDEzIEBACiBwdWJsaWM6CiAgICAgQ1BERl9RdWlja1N0cmV0Y2hlcigpOwogICAgIH5DUERGX1F1aWNrU3RyZXRjaGVyKCk7Ci0gICAgRlhfQk9PTAkJU3RhcnQoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBjb25zdCBGWF9SRUNUKiBwQ2xpcEJveCk7Ci0gICAgRlhfQk9PTAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIGJvb2wJCVN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpOworICAgIGJvb2wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKICAgICBDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKICAgICBpbnQJCQltX1Jlc3VsdExlZnQsIG1fUmVzdWx0VG9wLCBtX0NsaXBMZWZ0LCBtX0NsaXBUb3A7CiAgICAgaW50CQkJbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQ7CiAgICAgaW50CQkJbV9CcHAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0OwotICAgIEZYX0JPT0wJCW1fYkZsaXBYLCBtX2JGbGlwWTsKKyAgICBib29sCQltX2JGbGlwWCwgbV9iRmxpcFk7CiAgICAgQ1BERl9Db2xvclNwYWNlKgltX3BDUzsKICAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKgltX3BEZWNvZGVyOwogICAgIENQREZfU3RyZWFtQWNjIG1fU3RyZWFtQWNjOwpAQCAtMzExLDcgKzMxMSw3IEBACiBwdWJsaWM6CiAgICAgQ1BERl9EZXZpY2VCdWZmZXIoKTsKICAgICB+Q1BERl9EZXZpY2VCdWZmZXIoKTsKLSAgICBGWF9CT09MCQkJCUluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCisgICAgYm9vbAkJCQlJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGludCBtYXhfZHBpID0gMCk7CiAgICAgdm9pZAkJCQlPdXRwdXRUb0RldmljZSgpOwogICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpIGNvbnN0CkBAIC0zMzcsOCArMzM3LDggQEAKICAgICB+Q1BERl9JbWFnZUNhY2hlKCk7CiAgICAgdm9pZAkJCQlDbGVhckltYWdlRGF0YSgpOwogICAgIHZvaWQJCQkJUmVzZXQoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKLSAgICBGWF9CT09MCQkJCUdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgYm9vbAkJCQlHZXRDYWNoZWRCaXRtYXAoQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBib29sIGJMb2FkTWFzayA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKICAgICBGWF9EV09SRAkJCUVzdGltYXRlU2l6ZSgpIGNvbnN0CiAgICAgewpAQCAtMzU5LDggKzM1OSw4IEBACiAgICAgaW50CQkJCQltX2R3VGltZUNvdW50OwogcHVibGljOgogICAgIGludAkJCQkJU3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKLSAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKICAgICBpbnQJCQkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKICAgICBpbnQgCQkJCUNvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKCk7CiAgICAgQ0ZYX0RJQlNvdXJjZSoJCURldGFjaEJpdG1hcCgpOwpAQCAtMzg4LDIzICszODgsMjMgQEAKIHB1YmxpYzoKICAgICBDUERGX0RJQlNvdXJjZSgpOwogICAgIHZpcnR1YWwgfkNQREZfRElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgIGJvb2wJCQkJTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9ESUJTb3VyY2UqKiBwcE1hc2ssIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgYm9vbCBiTG9hZE1hc2sgPSBmYWxzZSk7CisgICAgdmlydHVhbCBib29sCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0OwogICAgIHZpcnR1YWwJdWludDhfdCoJR2V0QnVmZmVyKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KglHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkCQlEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBib29sIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZAkJU2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3Q7CiAgICAgQ0ZYX0RJQml0bWFwKgkJR2V0Qml0bWFwKCkgY29uc3Q7CiAgICAgdm9pZAkJCQlSZWxlYXNlQml0bWFwKENGWF9ESUJpdG1hcCopIGNvbnN0OwogICAgIHZvaWQJCQkJQ2xlYXJJbWFnZURhdGEoKTsKIHB1YmxpYzoKLSAgICBpbnQJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiSGFzTWFzaywKKyAgICBpbnQJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiSGFzTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MgPSBmYWxzZSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBib29sIGJMb2FkTWFzayA9IGZhbHNlKTsKICAgICBpbnQJCQkJCUNvbnRpbnVlTG9hZERJQlNvdXJjZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgaW50CQkJCQlTdHJhdExvYWRNYXNrKCk7CiAgICAgaW50CQkJCQlTdGFydExvYWRNYXNrRElCKCk7CkBAIC00MTUsMTMgKzQxNSwxMyBAQAogICAgIEZYX0RXT1JECQkJbV9NYXR0ZUNvbG9yOwogICAgIHZvaWQqCQkJbV9wSmJpZzJDb250ZXh0OwogICAgIENQREZfU3RyZWFtQWNjKgkJbV9wR2xvYmFsU3RyZWFtOwotICAgIEZYX0JPT0wJCQkJbV9iU3RkQ1M7CisgICAgYm9vbAkJCQltX2JTdGRDUzsKICAgICBpbnQJCQkJCW1fU3RhdHVzOwogICAgIENQREZfT2JqZWN0KgkJbV9wTWFza1N0cmVhbTsKLSAgICBGWF9CT09MCQkJCW1fYkhhc01hc2s7CisgICAgYm9vbAkJCQltX2JIYXNNYXNrOwogcHJvdGVjdGVkOgotICAgIEZYX0JPT0wJCQkJTG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKTsKLSAgICBESUJfQ09NUF9EQVRBKiAgICAgIEdldERlY29kZUFuZE1hc2tBcnJheShGWF9CT09MJiBiRGVmYXVsdERlY29kZSwgRlhfQk9PTCYgYkNvbG9yS2V5KTsKKyAgICBib29sCQkJCUxvYWRDb2xvckluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyk7CisgICAgRElCX0NPTVBfREFUQSogICAgICBHZXREZWNvZGVBbmRNYXNrQXJyYXkoYm9vbCYgYkRlZmF1bHREZWNvZGUsIGJvb2wmIGJDb2xvcktleSk7CiAgICAgQ1BERl9ESUJTb3VyY2UqCQlMb2FkTWFzayhGWF9EV09SRCYgTWF0dGVDb2xvcik7CiAgICAgQ1BERl9ESUJTb3VyY2UqCQlMb2FkTWFza0RJQihDUERGX1N0cmVhbSogcE1hc2spOwogICAgIHZvaWQJCQkJTG9hZEpweEJpdG1hcCgpOwpAQCAtNDM5LDExICs0MzksMTEgQEAKICAgICBGWF9EV09SRAkJCW1fYnBjX29yaWc7CiAgICAgRlhfRFdPUkQJCQltX25Db21wb25lbnRzOwogICAgIEZYX0RXT1JECQkJbV9Hcm91cEZhbWlseTsKLSAgICBGWF9CT09MCQkJCW1fYkxvYWRNYXNrOwotICAgIEZYX0JPT0wJCQkJbV9iRGVmYXVsdERlY29kZTsKLSAgICBGWF9CT09MCQkJCW1fYkltYWdlTWFzazsKLSAgICBGWF9CT09MCQkJCW1fYkRvQnBjQ2hlY2s7Ci0gICAgRlhfQk9PTAkJCQltX2JDb2xvcktleTsKKyAgICBib29sCQkJCW1fYkxvYWRNYXNrOworICAgIGJvb2wJCQkJbV9iRGVmYXVsdERlY29kZTsKKyAgICBib29sCQkJCW1fYkltYWdlTWFzazsKKyAgICBib29sCQkJCW1fYkRvQnBjQ2hlY2s7CisgICAgYm9vbAkJCQltX2JDb2xvcktleTsKICAgICBESUJfQ09NUF9EQVRBKgkJbV9wQ29tcERhdGE7CiAgICAgdWludDhfdCoJCQltX3BMaW5lQnVmOwogICAgIHVpbnQ4X3QqCQkJbV9wTWFza2VkTGluZTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FjdGlvbi5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwCmluZGV4IDg1MWIyZDYuLmU3YTMzOWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FjdGlvbi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcApAQCAtMjg5LDEwICsyODksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0MiLCAiV1MiLCAiRFMiLCAiV1AiLCAiRFAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotRlhfQk9PTCBDUERGX0FBY3Rpb246OkFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdAorYm9vbCBDUERGX0FBY3Rpb246OkFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdAogewogICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX3BEaWN0LT5LZXlFeGlzdChnX3NBQVR5cGVzWyhpbnQpZVR5cGVdKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcAppbmRleCAwYTc0NjE5Li41NDMwMDc5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICAgIENQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7Ci0gICAgRlhfQk9PTCBiUmVnZW5lcmF0ZUFQID0gcEFjcm9Gb3JtICYmIHBBY3JvRm9ybS0+R2V0Qm9vbGVhbigiTmVlZEFwcGVhcmFuY2VzIik7CisgICAgYm9vbCBiUmVnZW5lcmF0ZUFQID0gcEFjcm9Gb3JtICYmIHBBY3JvRm9ybS0+R2V0Qm9vbGVhbigiTmVlZEFwcGVhcmFuY2VzIik7CiAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBbm5vdHMtPkdldENvdW50KCk7ICsraSkgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOwogICAgICAgICBpZiAocERpY3QgPT0gTlVMTCB8fCBwRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CkBAIC01NSwxMiArNTUsMTIgQEAKICAgICB9CiB9CiB2b2lkIENQREZfQW5ub3RMaXN0OjpEaXNwbGF5UGFzcyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWRnZXRQYXNzLCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBjbGlwX3JlY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBib29sIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpZGdldFBhc3MsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCkKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fQW5ub3RMaXN0LkdldFNpemUoKTsgKytpKSB7CiAgICAgICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IChDUERGX0Fubm90KiltX0Fubm90TGlzdFtpXTsKLSAgICAgICAgRlhfQk9PTCBiV2lkZ2V0ID0gcEFubm90LT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCI7CisgICAgICAgIGJvb2wgYldpZGdldCA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiOwogICAgICAgICBpZiAoKGJXaWRnZXRQYXNzICYmICFiV2lkZ2V0KSB8fCAoIWJXaWRnZXRQYXNzICYmIGJXaWRnZXQpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMTAzLDI0ICsxMDMsMjQgQEAKIH0KIHZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaG93V2lkZ2V0LCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaG93V2lkZ2V0LCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQogewogICAgIEZYX1JFQ1QgY2xpcF9yZWN0OwogICAgIGlmIChwRGV2aWNlKSB7CiAgICAgICAgIGNsaXBfcmVjdCA9IHBEZXZpY2UtPkdldENsaXBCb3goKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fCAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOworICAgIGJvb2wgYlByaW50aW5nID0gcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX1BSSU5URVIgfHwgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKICAgICBEaXNwbGF5QW5ub3RzKHBQYWdlLCBwRGV2aWNlLCBOVUxMLCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgYlNob3dXaWRnZXQgPyAzIDogMSwgcE9wdGlvbnMsICZjbGlwX3JlY3QpOwogfQogdm9pZCBDUERGX0Fubm90TGlzdDo6RGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBGWF9EV09SRCBkd0Fubm90RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogcENsaXBSZWN0KQogewogICAgIGlmIChkd0Fubm90RmxhZ3MgJiAweDAxKSB7Ci0gICAgICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIEZBTFNFLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKKyAgICAgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgZmFsc2UsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwogICAgIH0KICAgICBpZiAoZHdBbm5vdEZsYWdzICYgMHgwMikgewotICAgICAgICBEaXNwbGF5UGFzcyhwUGFnZSwgcERldmljZSwgcENvbnRleHQsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBUUlVFLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKKyAgICAgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgdHJ1ZSwgcE9wdGlvbnMsIHBDbGlwUmVjdCk7CiAgICAgfQogfQogaW50IENQREZfQW5ub3RMaXN0OjpHZXRJbmRleChDUERGX0Fubm90KiBwQW5ub3QpCkBAIC0yNDYsMjggKzI0NiwyOCBAQAogICAgIG1hdHJpeC5Db25jYXQoKnBVc2VyMkRldmljZSk7CiAgICAgcmV0dXJuIHBGb3JtOwogfQotRlhfQk9PTCBDUERGX0Fubm90OjpEcmF3QXBwZWFyYW5jZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCitib29sIENQREZfQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKIHsKICAgICBDRlhfTWF0cml4IG1hdHJpeDsKICAgICBDUERGX0Zvcm0qIHBGb3JtID0gRlBERkRPQ19Bbm5vdF9HZXRNYXRyaXgocFBhZ2UsIHRoaXMsIG1vZGUsIHBVc2VyMkRldmljZSwgbWF0cml4KTsKICAgICBpZiAoIXBGb3JtKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX1JlbmRlckNvbnRleHQgY29udGV4dDsKICAgICBjb250ZXh0LkNyZWF0ZSgoQ1BERl9QYWdlKilwUGFnZSk7CiAgICAgY29udGV4dC5EcmF3T2JqZWN0TGlzdChwRGV2aWNlLCBwRm9ybSwgJm1hdHJpeCwgcE9wdGlvbnMpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0Fubm90OjpEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgQXBwZWFyYW5jZU1vZGUgbW9kZSkKK2Jvb2wgQ1BERl9Bbm5vdDo6RHJhd0luQ29udGV4dChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBjb25zdCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIEFwcGVhcmFuY2VNb2RlIG1vZGUpCiB7CiAgICAgQ0ZYX01hdHJpeCBtYXRyaXg7CiAgICAgQ1BERl9Gb3JtKiBwRm9ybSA9IEZQREZET0NfQW5ub3RfR2V0TWF0cml4KHBQYWdlLCB0aGlzLCBtb2RlLCBwVXNlcjJEZXZpY2UsIG1hdHJpeCk7CiAgICAgaWYgKCFwRm9ybSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgKChDUERGX1JlbmRlckNvbnRleHQqKXBDb250ZXh0KS0+QXBwZW5kT2JqZWN0TGlzdChwRm9ybSwgJm1hdHJpeCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfQW5ub3Q6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQogewpAQCAtMjc4LDcgKzI3OCw3IEBACiAgICAgaWYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX0hJRERFTikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0JPT0wgYlByaW50aW5nID0gcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX1BSSU5URVIgfHwgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKKyAgICBib29sIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8IChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7CiAgICAgaWYgKGJQcmludGluZyAmJiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfUFJJTlQpID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcAppbmRleCBmOTRhNGQ2Li40ZjNmMTc4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYXAuY3BwCkBAIC04LDEwICs4LDEwIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKICNpbmNsdWRlICJwZGZfdnQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oIgotRlhfQk9PTCBGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQorYm9vbCBGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQogewogICAgIGlmICghcEFubm90RGljdCB8fCBwQW5ub3REaWN0LT5HZXRDb25zdFN0cmluZygiU3VidHlwZSIpICE9IEZYX0JTVFJDKCJXaWRnZXQiKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmllbGRfdHlwZSA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGVCIpLT5HZXRTdHJpbmcoKTsKICAgICBGWF9EV09SRCBmbGFncyA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKS0+R2V0SW50ZWdlcigpIDogMDsKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogY2xhc3MgQ1BWVF9Gb250TWFwIDogcHVibGljIElQVlRfRm9udE1hcAogewpAQCAtMTU0LDEyICsxNTQsMTIgQEAKICAgICAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ1BWVF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQorYm9vbCBDUFZUX1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCiB7CiAgICAgaWYgKCh3b3JkID49IDB4NjEgJiYgd29yZCA8PSAweDdBKSB8fCAod29yZCA+PSAweDQxICYmIHdvcmQgPD0gMHg1QSkgfHwgd29yZCA9PSAweDJEIHx8IHdvcmQgPT0gMHgyNykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBpbnQzMl90IENQVlRfUHJvdmlkZXI6OkdldERlZmF1bHRGb250SW5kZXgoKQogewpAQCAtMjQ0LDE0ICsyNDQsMTQgQEAKICAgICB9CiAgICAgcmV0dXJuIHJ0OwogfQotc3RhdGljIEZYX0JPT0wgR2VuZXJhdGVXaWRnZXRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsIGNvbnN0IGludDMyX3QgJiBuV2lkZ2V0VHlwZSkKK3N0YXRpYyBib29sIEdlbmVyYXRlV2lkZ2V0QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBjb25zdCBpbnQzMl90ICYgbldpZGdldFR5cGUpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBOVUxMOwogICAgIGlmIChDUERGX0RpY3Rpb25hcnkgKiBwUm9vdERpY3QgPSBwRG9jLT5HZXRSb290KCkpIHsKICAgICAgICAgcEZvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJBY3JvRm9ybSIpOwogICAgIH0KICAgICBpZiAoIXBGb3JtRGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgREE7CiAgICAgaWYgKENQREZfT2JqZWN0KiBwREFPYmogPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiREEiKSkgewpAQCAtMjYxLDIzICsyNjEsMjMgQEAKICAgICAgICAgREEgPSBwRm9ybURpY3QtPkdldFN0cmluZygiREEiKTsKICAgICB9CiAgICAgaWYgKERBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KERBKTsKICAgICBzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpOwogICAgIENGWF9CeXRlU3RyaW5nIHNGb250TmFtZSA9IHN5bnRheC5HZXRXb3JkKCk7CiAgICAgc0ZvbnROYW1lID0gUERGX05hbWVEZWNvZGUoc0ZvbnROYW1lKTsKICAgICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKICAgICBDUFZUX0NvbG9yIGNyVGV4dCA9IFBhcnNlQ29sb3IoREEpOwotICAgIEZYX0JPT0wgYlVzZUZvcm1SZXMgPSBGQUxTRTsKKyAgICBib29sIGJVc2VGb3JtUmVzID0gZmFsc2U7CiAgICAgQ1BERl9EaWN0aW9uYXJ5ICogcEZvbnREaWN0ID0gTlVMTDsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsKICAgICBpZiAocERSRGljdCA9PSBOVUxMKSB7CiAgICAgICAgIHBEUkRpY3QgPSBwRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkRSIikpOwotICAgICAgICBiVXNlRm9ybVJlcyA9IFRSVUU7CisgICAgICAgIGJVc2VGb3JtUmVzID0gdHJ1ZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5ICogcERSRm9udERpY3QgPSBOVUxMOwogICAgIGlmIChwRFJEaWN0ICYmIChwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKSkpIHsKQEAgLTI5MSwxMiArMjkxLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFwRFJGb250RGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFwRm9udERpY3QpIHsKICAgICAgICAgcEZvbnREaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgaWYgKHBGb250RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgIkZvbnQiKTsKICAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgIlR5cGUxIik7CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICB9CiAgICAgQ1BERl9Gb250KiBwRGVmRm9udCA9IHBEb2MtPkxvYWRGb250KHBGb250RGljdCk7CiAgICAgaWYgKCFwRGVmRm9udCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0KCJSZWN0Iik7CiAgICAgaW50MzJfdCBuUm90YXRlID0gMDsKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICAgIENGWF9CeXRlU3RyaW5nIHNCRyA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyQkcsIFRSVUUpOworICAgIENGWF9CeXRlU3RyaW5nIHNCRyA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyQkcsIHRydWUpOwogICAgIGlmIChzQkcuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0JHIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgogICAgICAgICAgICAgICAgICAgIDw8IHJjQkJveC5XaWR0aCgpIDw8ICIgIiA8PCByY0JCb3guSGVpZ2h0KCkgPDwgIiByZSBmXG4iIDw8ICJRXG4iOwpAQCAtMzk1LDcgKzM5NSw3IEBACiAgICAgaWYgKHBBUERpY3QgPT0gTlVMTCkgewogICAgICAgICBwQVBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgaWYgKHBBUERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBBbm5vdERpY3QtPlNldEF0KCJBUCIsIHBBUERpY3QpOwogICAgIH0KQEAgLTQwMyw3ICs0MDMsNyBAQAogICAgIGlmIChwTm9ybWFsU3RyZWFtID09IE5VTEwpIHsKICAgICAgICAgcE5vcm1hbFN0cmVhbSA9IENQREZfU3RyZWFtOjpDcmVhdGUoTlVMTCwgMCwgTlVMTCk7CiAgICAgICAgIGlmIChwTm9ybWFsU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IG9iam51bSA9IHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOb3JtYWxTdHJlYW0pOwogICAgICAgICBwQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpLT5TZXRBdFJlZmVyZW5jZSgiTiIsIHBEb2MsIG9iam51bSk7CkBAIC00MTgsNyArNDE4LDcgQEAKICAgICAgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7CiAgICAgICAgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAocFN0cmVhbVJlc0ZvbnRMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7CiAgICAgICAgICAgICB9CkBAIC00NDMsMjEgKzQ0MywyMSBAQAogICAgICAgICAgICAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0JvZHkpOwogICAgICAgICAgICAgICAgIHZ0LlNldEFsaWdubWVudChuQWxpZ24pOwogICAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgdnQuU2V0QXV0b0ZvbnRTaXplKHRydWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHZ0LlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYk11bHRpTGluZSA9IChkd0ZsYWdzID4+IDEyKSAmIDE7CisgICAgICAgICAgICAgICAgYm9vbCBiTXVsdGlMaW5lID0gKGR3RmxhZ3MgPj4gMTIpICYgMTsKICAgICAgICAgICAgICAgICBpZiAoYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRNdWx0aUxpbmUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9SZXR1cm4oVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHZ0LlNldE11bHRpTGluZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdnQuU2V0QXV0b1JldHVybih0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRlhfV09SRCBzdWJXb3JkID0gMDsKICAgICAgICAgICAgICAgICBpZiAoKGR3RmxhZ3MgPj4gMTMpICYgMSkgewogICAgICAgICAgICAgICAgICAgICBzdWJXb3JkID0gJyonOwogICAgICAgICAgICAgICAgICAgICB2dC5TZXRQYXNzd29yZENoYXIoc3ViV29yZCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJBcnJheSA9IChkd0ZsYWdzID4+IDI0KSAmIDE7CisgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckFycmF5ID0gKGR3RmxhZ3MgPj4gMjQpICYgMTsKICAgICAgICAgICAgICAgICBpZiAoYkNoYXJBcnJheSkgewogICAgICAgICAgICAgICAgICAgICB2dC5TZXRDaGFyQXJyYXkoZHdNYXhMZW4pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NzksNyArNDc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCb2R5LmxlZnQgPDwgIiAiIDw8IHJjQm9keS5ib3R0b20gPDwgIiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjQm9keS5XaWR0aCgpIDw8ICIgIiA8PCByY0JvZHkuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIFRSVUUpIDw8IHNCb2R5IDw8ICJFVFxuIiA8PCAiUVxuRU1DXG4iOworICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIHRydWUpIDw8IHNCb2R5IDw8ICJFVFxuIiA8PCAiUVxuRU1DXG4iOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICAgICAgcmNFZGl0Lk5vcm1hbGl6ZSgpOwogICAgICAgICAgICAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0VkaXQpOwogICAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgdnQuU2V0QXV0b0ZvbnRTaXplKHRydWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHZ0LlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTA2LDE0ICs1MDYsMTQgQEAKICAgICAgICAgICAgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gdnQuR2V0Q29udGVudFJlY3QoKTsKICAgICAgICAgICAgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0ID0gQ1BERl9Qb2ludCgwLjBmLCAocmNDb250ZW50LkhlaWdodCgpIC0gcmNFZGl0LkhlaWdodCgpKSAvIDIuMGYpOwotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwgVFJVRSwgMCk7CisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCB0cnVlLCAwKTsKICAgICAgICAgICAgICAgICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIgPDwgInFcbiI7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNFZGl0LmxlZnQgPDwgIiAiIDw8IHJjRWRpdC5ib3R0b20gPDwgIiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmNFZGl0LldpZHRoKCkgPDwgIiAiIDw8IHJjRWRpdC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIFRSVUUpIDw8IHNFZGl0IDw8ICJFVFxuIiA8PCAiUVxuRU1DXG4iOworICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIHRydWUpIDw8IHNFZGl0IDw8ICJFVFxuIiA8PCAiUVxuRU1DXG4iOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQnV0dG9uID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9SR0IsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQnV0dG9uID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9SR0IsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpLCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoc0J1dHRvbi5HZXRMZW5ndGgoKSA+IDAgJiYgIXJjQnV0dG9uLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCdXR0b247CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCdXR0b24ubGVmdCA8PCAiICIgPDwgcmNCdXR0b24uYm90dG9tIDw8ICIgIgpAQCAtNTU1LDExICs1NTUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dJdGVtID0gKChDUERGX0FycmF5KilwT3B0KS0+R2V0RWxlbWVudFZhbHVlKDEpLT5HZXRVbmljb2RlVGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgcyA9IDAsIHNzeiA9IHBTZWxzLT5HZXRDb3VudCgpOyBzIDwgc3N6OyBzKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IHBTZWxzLT5HZXRJbnRlZ2VyKHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC01NzgsMTEgKzU3OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gdnQuR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY0l0ZW0gPSBDUERGX1JlY3QocmNCb2R5LmxlZnQsIGZ5IC0gZkl0ZW1IZWlnaHQsIHJjQm9keS5yaWdodCwgZnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAicVxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChDUFZUX0NvbG9yKENUX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsIDExMy4wZiAvIDI1NS4wZiksIFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCb2R5IDw8ICJxXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAwLCA1MS4wZiAvIDI1NS4wZiwgMTEzLjBmIC8gMjU1LjBmKSwgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpIDw8ICIgIiA8PCByY0l0ZW0uSGVpZ2h0KCkgPDwgIiByZSBmXG4iIDw8ICJRXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9HUkFZLCAxKSwgVFJVRSkgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBDUERGX1BvaW50KDAuMGYsIGZ5KSwgVFJVRSwgMCkgPDwgIkVUXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9HUkFZLCAxKSwgdHJ1ZSkgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBDUERGX1BvaW50KDAuMGYsIGZ5KSwgdHJ1ZSwgMCkgPDwgIkVUXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIFRSVUUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIFRSVUUsIDApIDw8ICJFVFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgdHJ1ZSkgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBDUERGX1BvaW50KDAuMGYsIGZ5KSwgdHJ1ZSwgMCkgPDwgIkVUXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeSAtPSBmSXRlbUhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU5OCw3ICs1OTgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChwTm9ybWFsU3RyZWFtKSB7Ci0gICAgICAgIHBOb3JtYWxTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNBcHBTdHJlYW0uR2V0QnVmZmVyKCksIHNBcHBTdHJlYW0uR2V0U2l6ZSgpLCBGQUxTRSwgRkFMU0UpOworICAgICAgICBwTm9ybWFsU3RyZWFtLT5TZXREYXRhKCh1aW50OF90KilzQXBwU3RyZWFtLkdldEJ1ZmZlcigpLCBzQXBwU3RyZWFtLkdldFNpemUoKSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7CiAgICAgICAgIGlmIChwU3RyZWFtRGljdCkgewogICAgICAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0TWF0cml4KCJNYXRyaXgiLCBtYXRyaXgpOwpAQCAtNjA5LDcgKzYwOSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCFwU3RyZWFtUmVzRm9udExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW1SZXNGb250TGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbVJlc0xpc3QtPlNldEF0KCJGb250IiwgcFN0cmVhbVJlc0ZvbnRMaXN0KTsKICAgICAgICAgICAgICAgICB9CkBAIC02MjIsMjEgKzYyMiwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQorYm9vbCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQogewogICAgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDApOwogfQotRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCitib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb21ib0JveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKIHsKICAgICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAxKTsKIH0KLUZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUxpc3RCb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCitib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQogewogICAgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDIpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBGWF9CT09MIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUpCitDRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKElQVlRfRm9udE1hcCAqIHBGb250TWFwLCBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yLCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGJvb2wgYkNvbnRpbnVvdXMsIEZYX1dPUkQgU3ViV29yZCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwVmlzaWJsZSkKIHsKICAgICBDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW0sIHNMaW5lU3RyZWFtLCBzV29yZHM7CiAgICAgQ1BERl9Qb2ludCBwdE9sZCgwLjBmLCAwLjBmKSwgcHROZXcoMC4wZiwgMC4wZik7CkBAIC03MjYsNyArNzI2LDcgQEAKICAgICAgICAgc3dpdGNoIChuU3R5bGUpIHsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBjYXNlIFBCU19TT0xJRDoKLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIFRSVUUpOworICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gPDwgIiAiIDw8IGZSaWdodCAtIGZMZWZ0IDw8ICIgIiA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOwpAQCAtNzM2LDcgKzczNiw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQQlNfREFTSDoKLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3IiA8PCAiIFsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIjsKQEAgLTc0OSw3ICs3NDksNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQQlNfQkVWRUxFRDoKICAgICAgICAgICAgIGNhc2UgUEJTX0lOU0VUOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjckxlZnRUb3AsIFRSVUUpOworICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjckxlZnRUb3AsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggPDwgIiBtXG4iOwpAQCAtNzU5LDcgKzc1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjclJpZ2h0Qm90dG9tLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwJZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBtXG4iOwpAQCAtNzY5LDcgKzc2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGwgZlxuIjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwogICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PAlmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKQEAgLTc3OCw3ICs3NzgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEJTX1VOREVSTElORUQ6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgd1xuIjsKQEAgLTc5MCw3ICs3OTAsNyBAQAogICAgIH0KICAgICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IEZYX0JPT0wgJiBiRmlsbE9yU3Ryb2tlKQorQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSkKIHsKICAgICBDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwogICAgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwCmluZGV4IDNiYTEwOWIuLjY0N2I3Y2IgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19iYXNpYy5jcHAKQEAgLTMxMywxMCArMzEzLDEwIEBACiAgICAgcmV0dXJuIGZpbGVwYXRoOwogI2VuZGlmCiB9Ci1GWF9CT09MIENQREZfRmlsZVNwZWM6OkdldEZpbGVOYW1lKENGWF9XaWRlU3RyaW5nICZjc0ZpbGVOYW1lKSBjb25zdAorYm9vbCBDUERGX0ZpbGVTcGVjOjpHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmY3NGaWxlTmFtZSkgY29uc3QKIHsKICAgICBpZiAobV9wT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wT2JqOwpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGIikpKTsKICAgICAgICAgfQogICAgICAgICBpZiAocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRlMiKSkgPT0gRlhfQlNUUkMoIlVSTCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc0ZpbGVOYW1lLklzRW1wdHkoKSkgewogICAgICAgICAgICAgaWYgKHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRE9TIikpKSB7CkBAIC0zMzUsMTQgKzMzNSwxNCBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlVuaXgiKSkpIHsKICAgICAgICAgICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVbml4IikpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGNzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKG1fcE9iai0+R2V0U3RyaW5nKCkpOwogICAgIH0KICAgICBjc0ZpbGVOYW1lID0gRklMRVNQRUNfRGVjb2RlRmlsZU5hbWUoY3NGaWxlTmFtZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDUERGX0ZpbGVTcGVjOjpDUERGX0ZpbGVTcGVjKCkKIHsKQEAgLTM1MSwxMyArMzUxLDEzIEBACiAgICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopLT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIkZpbGVzcGVjIikpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6SXNVUkwoKSBjb25zdAorYm9vbCBDUERGX0ZpbGVTcGVjOjpJc1VSTCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIik7CiB9CkBAIC00MTYsNyArNDE2LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1zdGF0aWMgdm9pZCBGUERGRE9DX0ZJTEVTUEVDX1NldEZpbGVOYW1lKENQREZfT2JqZWN0ICpwT2JqLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIEZYX0JPT0wgYlVSTCkKK3N0YXRpYyB2b2lkIEZQREZET0NfRklMRVNQRUNfU2V0RmlsZU5hbWUoQ1BERl9PYmplY3QgKnBPYmosIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwgYm9vbCBiVVJMKQogewogICAgIEFTU0VSVChwT2JqICE9IE5VTEwpOwogICAgIENGWF9XaWRlU3RyaW5nIHdzU3RyOwpAQCAtNDM0LDcgKzQzNCw3IEBACiAgICAgICAgIHBEaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiVUYiKSwgUERGX0VuY29kZVRleHQod3NTdHIpKTsKICAgICB9CiB9Ci12b2lkIENQREZfRmlsZVNwZWM6OlNldEZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwgRlhfQk9PTCBiVVJMKQordm9pZCBDUERGX0ZpbGVTcGVjOjpTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIGJvb2wgYlVSTCkKIHsKICAgICBBU1NFUlQobV9wT2JqICE9IE5VTEwpOwogICAgIGlmIChtX3BPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSAmJiBiVVJMKSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm0uY3BwCmluZGV4IDczNTIzMWMuLjYwNTdmNTYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm0uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm0uY3BwCkBAIC0yNDEsMTIgKzI0MSwxMiBAQAogICAgIH0KICAgICByZXR1cm4gcE5vZGU7CiB9Ci1DUERGX0ludGVyRm9ybTo6Q1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CT09MIGJHZW5lcmF0ZUFQKSA6IENGWF9Qcml2YXRlRGF0YSgpCitDUERGX0ludGVyRm9ybTo6Q1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBib29sIGJHZW5lcmF0ZUFQKSA6IENGWF9Qcml2YXRlRGF0YSgpCiB7CiAgICAgbV9wRG9jdW1lbnQgPSBwRG9jdW1lbnQ7CiAgICAgbV9iR2VuZXJhdGVBUCA9IGJHZW5lcmF0ZUFQOwogICAgIG1fcEZvcm1Ob3RpZnkgPSBOVUxMOwotICAgIG1fYlVwZGF0ZWQgPSBGQUxTRTsKKyAgICBtX2JVcGRhdGVkID0gZmFsc2U7CiAgICAgbV9wRmllbGRUcmVlID0gbmV3IENGaWVsZFRyZWU7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CiAgICAgbV9wRm9ybURpY3QgPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKQEAgLTI4MCwxMiArMjgwLDEyIEBACiAgICAgICAgIGRlbGV0ZSBtX3BGaWVsZFRyZWU7CiAgICAgfQogfQotRlhfQk9PTAlDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVAgPSBUUlVFOwotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKQorYm9vbAlDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVAgPSB0cnVlOworYm9vbCBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKQogewogICAgIHJldHVybiBtX2JVcGRhdGVBUDsKIH0KLXZvaWQgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZYX0JPT0wgYlVwZGF0ZUFQKQordm9pZCBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoYm9vbCBiVXBkYXRlQVApCiB7CiAgICAgbV9iVXBkYXRlQVAgPSBiVXBkYXRlQVA7CiB9CkBAIC0zMjgsNyArMzI4LDcgQEAKICAgICB9CiAgICAgaW50IG51bSA9IDA7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOdW07Ci0gICAgd2hpbGUgKFRSVUUpIHsKKyAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoIXBEaWN0LT5LZXlFeGlzdChjc1RtcCArIGJzTnVtKSkgewogICAgICAgICAgICAgcmV0dXJuIGNzVG1wICsgYnNOdW07CiAgICAgICAgIH0KQEAgLTM0Myw3ICszNDMsNyBAQAogfQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KIHR5cGVkZWYgc3RydWN0IF9QREZfRk9OVERBVEEgewotICAgIEZYX0JPT0wJCWJGaW5kOworICAgIGJvb2wJCWJGaW5kOwogICAgIExPR0ZPTlRBCWxmOwogfSBQREZfRk9OVERBVEEsIEZBUiogTFBERl9GT05UREFUQTsKIHN0YXRpYyBpbnQgQ0FMTEJBQ0sgRW51bUZvbnRGYW1FeFByb2MoCUVOVU1MT0dGT05URVhBICpscGVsZmUsCkBAIC0zNTcsMTAgKzM1NywxMCBAQAogICAgIH0KICAgICBMUERGX0ZPTlREQVRBIHBEYXRhID0gKExQREZfRk9OVERBVEEpbFBhcmFtOwogICAgIG1lbWNweSgmcERhdGEtPmxmLCAmbHBlbGZlLT5lbGZMb2dGb250LCBzaXplb2YoTE9HRk9OVEEpKTsKLSAgICBwRGF0YS0+YkZpbmQgPSBUUlVFOworICAgIHBEYXRhLT5iRmluZCA9IHRydWU7CiAgICAgcmV0dXJuIDA7CiB9Ci1zdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVNwZWNpZmljRm9udChMT0dGT05UQSYgbGYpCitzdGF0aWMgYm9vbCBSZXRyaWV2ZVNwZWNpZmljRm9udChMT0dGT05UQSYgbGYpCiB7CiAgICAgUERGX0ZPTlREQVRBIGZkOwogICAgIG1lbXNldCgmZmQsIDAsIHNpemVvZihQREZfRk9OVERBVEEpKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgIH0KICAgICByZXR1cm4gZmQuYkZpbmQ7CiB9Ci1zdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVNwZWNpZmljRm9udCh1aW50OF90IGNoYXJTZXQsIHVpbnQ4X3QgcGl0Y2hBbmRGYW1pbHksIExQQ1NUUiBwY3NGb250TmFtZSwgTE9HRk9OVEEmIGxmKQorc3RhdGljIGJvb2wgUmV0cmlldmVTcGVjaWZpY0ZvbnQodWludDhfdCBjaGFyU2V0LCB1aW50OF90IHBpdGNoQW5kRmFtaWx5LCBMUENTVFIgcGNzRm9udE5hbWUsIExPR0ZPTlRBJiBsZikKIHsKICAgICBtZW1zZXQoJmxmLCAwLCBzaXplb2YoTE9HRk9OVEEpKTsKICAgICBsZi5sZkNoYXJTZXQgPSBjaGFyU2V0OwpAQCAtMzgyLDcgKzM4Miw3IEBACiAgICAgfQogICAgIHJldHVybiBSZXRyaWV2ZVNwZWNpZmljRm9udChsZik7CiB9Ci1zdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVN0b2NrRm9udChpbnQgaUZvbnRPYmplY3QsIHVpbnQ4X3QgY2hhclNldCwgTE9HRk9OVEEmIGxmKQorc3RhdGljIGJvb2wgUmV0cmlldmVTdG9ja0ZvbnQoaW50IGlGb250T2JqZWN0LCB1aW50OF90IGNoYXJTZXQsIExPR0ZPTlRBJiBsZikKIHsKICAgICBIRk9OVCBoRm9udCA9IChIRk9OVCk6OkdldFN0b2NrT2JqZWN0KGlGb250T2JqZWN0KTsKICAgICBpZiAoaEZvbnQgIT0gTlVMTCkgewpAQCAtMzkyLDcgKzM5Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAjZW5kaWYKIENQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZFN5c3RlbURlZmF1bHRGb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKQEAgLTQwMywxMyArNDAzLDEzIEBACiAgICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogICAgIExPR0ZPTlRBIGxmOwotICAgIEZYX0JPT0wgYlJldDsKKyAgICBib29sIGJSZXQ7CiAgICAgYlJldCA9IFJldHJpZXZlU3RvY2tGb250KERFRkFVTFRfR1VJX0ZPTlQsIDI1NSwgbGYpOwogICAgIGlmICghYlJldCkgewogICAgICAgICBiUmV0ID0gUmV0cmlldmVTdG9ja0ZvbnQoU1lTVEVNX0ZPTlQsIDI1NSwgbGYpOwogICAgIH0KICAgICBpZiAoYlJldCkgewotICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7CisgICAgICAgIHBGb250ID0gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIGZhbHNlLCB0cnVlKTsKICAgICB9CiAjZW5kaWYKICAgICByZXR1cm4gcEZvbnQ7CkBAIC00MzAsNyArNDMwLDcgQEAKICAgICAgICAgOjpHZXRPYmplY3RBKGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOwogICAgICAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7CiAgICAgICAgIGlmIChzdHJsZW4obGYubGZGYWNlTmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC00NTIsNyArNDUyLDcgQEAKICAgICAgICAgOjpHZXRPYmplY3QoaEZvbnQsIHNpemVvZihMT0dGT05UQSksICZsZik7CiAgICAgICAgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKICAgICAgICAgaWYgKHN0cmxlbihsZi5sZkZhY2VOYW1lKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYKQEAgLTQ3NywxMiArNDc3LDEyIEBACiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZTsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAgICAgTE9HRk9OVEEgbGY7Ci0gICAgRlhfQk9PTCBiUmV0OworICAgIGJvb2wgYlJldDsKICAgICBpZiAoY2hhclNldCA9PSBBTlNJX0NIQVJTRVQpIHsKICAgICAgICAgY3NGb250TmFtZSA9ICJIZWx2ZXRpY2EiOwogICAgICAgICByZXR1cm4gY3NGb250TmFtZTsKICAgICB9Ci0gICAgYlJldCA9IEZBTFNFOworICAgIGJSZXQgPSBmYWxzZTsKICAgICBpZiAoY2hhclNldCA9PSBTSElGVEpJU19DSEFSU0VUKSB7CiAgICAgICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsICJNUyBNaW5jaG8iLCBsZik7CiAgICAgfSBlbHNlIGlmIChjaGFyU2V0ID09IEdCMjMxMl9DSEFSU0VUKSB7CkBAIC01OTEsNyArNTkxLDcgQEAKICAgICAgICAgaWYgKGNzRm9udE5hbWUgPT0gIkhlbHZldGljYSIpIHsKICAgICAgICAgICAgIHBGb250ID0gQWRkU3RhbmRhcmRGb250KHBEb2N1bWVudCwgY3NGb250TmFtZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYKQEAgLTYwNywxNSArNjA3LDE1IEBACiAgICAgcEZvbnQgPSBBZGROYXRpdmVGb250KGNoYXJTZXQsIHBEb2N1bWVudCk7CiAgICAgcmV0dXJuIHBGb250OwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUsIGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRXhjbHVkZWRGaWVsZCwgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCkKK2Jvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpCiB7CiAgICAgaWYgKGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGlQb3MgPSAwOwogICAgIGludCBpTGVuZ3RoID0gY3NOZXdGaWVsZE5hbWUuR2V0TGVuZ3RoKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NTdWI7Ci0gICAgd2hpbGUgKFRSVUUpIHsKKyAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgKGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnLicgfHwgY3NOZXdGaWVsZE5hbWVbaVBvc10gPT0gTCcgJykpIHsKICAgICAgICAgICAgIGlQb3MgKys7CiAgICAgICAgIH0KQEAgLTY1MSwxNSArNjUxLDE1IEBACiAgICAgICAgICAgICBpbnQgaVJldCA9IENvbXBhcmVGaWVsZE5hbWUoY3NTdWIsIGNzRnVsbE5hbWUpOwogICAgICAgICAgICAgaWYgKGlSZXQgPT0gMSkgewogICAgICAgICAgICAgICAgIGlmIChwRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IGlUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoaVJldCA9PSAyICYmIGNzU3ViID09IGNzTmV3RmllbGROYW1lKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNzRnVsbE5hbWVbaVBvc10gPT0gTCcuJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMyAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgewogICAgICAgICAgICAgICAgIGlmIChjc05ld0ZpZWxkTmFtZVtjc0Z1bGxOYW1lLkdldExlbmd0aCgpXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjY4LDI2ICs2NjgsMjYgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoY3NTdWIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBjc05ld0ZpZWxkTmFtZSA9IGNzU3ViOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpCitib29sIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSkKIHsKICAgICByZXR1cm4gVmFsaWRhdGVGaWVsZE5hbWUoY3NOZXdGaWVsZE5hbWUsIGlUeXBlLCBOVUxMLCBOVUxMKTsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSkKK2Jvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSkKIHsKICAgICBpZiAocEZpZWxkID09IE5VTEwgfHwgY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gVmFsaWRhdGVGaWVsZE5hbWUoY3NOZXdGaWVsZE5hbWUsICgoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZCktPkdldEZpZWxkVHlwZSgpLCBwRmllbGQsIE5VTEwpOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSkKK2Jvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCiB7CiAgICAgaWYgKHBDb250cm9sID09IE5VTEwgfHwgY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gKChDUERGX0Zvcm1Db250cm9sKilwQ29udHJvbCktPkdldEZpZWxkKCk7CiAgICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCBwRmllbGQtPkdldEZpZWxkVHlwZSgpLCBwRmllbGQsIHBDb250cm9sKTsKQEAgLTc2NCwxOSArNzY0LDE5IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCkKK2Jvb2wgQ1BERl9JbnRlckZvcm06OklzVmFsaWRGb3JtRmllbGQoY29uc3Qgdm9pZCogcEZpZWxkKQogewogICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewogICAgICAgICBDUERGX0Zvcm1GaWVsZCAqcEZvcm1GaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwogICAgICAgICBpZiAocEZpZWxkID09IHBGb3JtRmllbGQpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6R2V0RmllbGRCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSBjb25zdAogewpAQCAtODA4LDEwICs4MDgsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUNvbnRyb2woY29uc3Qgdm9pZCogcENvbnRyb2wpCitib29sIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUNvbnRyb2woY29uc3Qgdm9pZCogcENvbnRyb2wpCiB7CiAgICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fQ29udHJvbE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CiAgICAgd2hpbGUgKHBvcykgewpAQCAtODE5LDEwICs4MTksMTAgQEAKICAgICAgICAgdm9pZCogcEZvcm1Db250cm9sID0gTlVMTDsKICAgICAgICAgbV9Db250cm9sTWFwLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpcFdpZGdldERpY3QsIHBGb3JtQ29udHJvbCk7CiAgICAgICAgIGlmIChwQ29udHJvbCA9PSBwRm9ybUNvbnRyb2wpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGludCBDUERGX0ludGVyRm9ybTo6Q291bnRQYWdlQ29udHJvbHMoQ1BERl9QYWdlKiBwUGFnZSkgY29uc3QKIHsKQEAgLTkxOSw3ICs5MTksNyBAQAogICAgICAgICAgICAgY3NTdWIgKz0gY3NGaWVsZE5hbWVbaVBvcyArK107CiAgICAgICAgIH0KICAgICAgICAgaW50IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgICAgICBib29sIGJGaW5kID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICBwRGljdCA9IHBBcnJheS0+R2V0RGljdChpKTsKICAgICAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7CkBAIC05MjcsNyArOTI3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVCA9IHBEaWN0LT5HZXRVbmljb2RlVGV4dCgiVCIpOwogICAgICAgICAgICAgaWYgKGNzVCA9PSBjc1N1YikgewotICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTk3MCw3ICs5NzAsNyBAQAogICAgICAgICAgICAgY3NTdWIgKz0gY3NGaWVsZE5hbWVbaVBvcyArK107CiAgICAgICAgIH0KICAgICAgICAgaW50IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgICAgICBib29sIGJGaW5kID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICBwRGljdCA9IHBBcnJheS0+R2V0RGljdChpKTsKICAgICAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7CkBAIC05NzgsNyArOTc4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVCA9IHBEaWN0LT5HZXRVbmljb2RlVGV4dCgiVCIpOwogICAgICAgICAgICAgaWYgKGNzVCA9PSBjc1N1YikgewotICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTk5NiwxNCArOTk2LDE0IEBACiAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KCJLaWRzIik7CiAgICAgcmV0dXJuIHBBcnJheSA/IHBBcnJheS0+R2V0RGljdChpbmRleCkgOiBwRGljdDsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUCgpCitib29sIENQREZfSW50ZXJGb3JtOjpOZWVkQ29uc3RydWN0QVAoKQogewogICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9wRm9ybURpY3QtPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOwogfQotdm9pZCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKEZYX0JPT0wgYk5lZWRBUCkKK3ZvaWQgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUChib29sIGJOZWVkQVApCiB7CiAgICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKICAgICAgICAgSW5pdEludGVyRm9ybURpY3QobV9wRm9ybURpY3QsIG1fcERvY3VtZW50KTsKQEAgLTEwNzgsMzcgKzEwNzgsMzcgQEAKIHsKICAgICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKK2Jvb2wgQ1BERl9JbnRlckZvcm06OkZpbmRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewogICAgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgcEZvbnQsIGNzTmFtZVRhZyk7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCitib29sIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7CiAgICAgcmV0dXJuIEZpbmRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NGb250TmFtZSwgcEZvbnQsIGNzTmFtZVRhZyk7CiB9CiB2b2lkIENQREZfSW50ZXJGb3JtOjpBZGRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewogICAgIEFkZEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBwRm9udCwgY3NOYW1lVGFnKTsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKKyAgICBtX2JVcGRhdGVkID0gdHJ1ZTsKIH0KIENQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvcm1Gb250KHVpbnQ4X3QgY2hhclNldCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKKyAgICBtX2JVcGRhdGVkID0gdHJ1ZTsKICAgICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7CiB9CiBDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQogewotICAgIG1fYlVwZGF0ZWQgPSBUUlVFOworICAgIG1fYlVwZGF0ZWQgPSB0cnVlOwogICAgIHJldHVybiBBZGROYXRpdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKIH0KIHZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQpCiB7Ci0gICAgbV9iVXBkYXRlZCA9IFRSVUU7CisgICAgbV9iVXBkYXRlZCA9IHRydWU7CiAgICAgUmVtb3ZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgcEZvbnQpOwogfQogdm9pZCBDUERGX0ludGVyRm9ybTo6UmVtb3ZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKQogewotICAgIG1fYlVwZGF0ZWQgPSBUUlVFOworICAgIG1fYlVwZGF0ZWQgPSB0cnVlOwogICAgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIGNzTmFtZVRhZyk7CiB9CiBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIENQREZfSW50ZXJGb3JtOjpHZXREZWZhdWx0QXBwZWFyYW5jZSgpCkBAIC0xMTMxLDEyICsxMTMxLDEyIEBACiAgICAgfQogICAgIHJldHVybiBtX3BGb3JtRGljdC0+R2V0SW50ZWdlcigiUSIsIDApOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtUmVzZXQodGhpcyk7CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwpAQCAtMTE0NSwxMSArMTE0NSwxMSBAQAogICAgICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogICAgICAgICBpbnQgaUNvdW50ID0gZmllbGRzLkdldFNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKICAgICAgICAgICAgIGlmIChwRmllbGQgPT0gKENQREZfRm9ybUZpZWxkKilmaWVsZHNbaV0pIHsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTYwLDE0ICsxMTYwLDE0IEBACiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyRm9ybVJlc2V0KHRoaXMpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlJlc2V0Rm9ybShGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oYm9vbCBiTm90aWZ5KQogewogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZUZvcm1SZXNldCh0aGlzKTsKICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CkBAIC0xMTgxLDcgKzExODEsNyBAQAogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1SZXNldCh0aGlzKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfSW50ZXJGb3JtOjpSZWxvYWRGb3JtKCkKIHsKQEAgLTEyNDIsNyArMTI0Miw3IEBACiAgICAgICAgIEFkZFRlcm1pbmFsRmllbGQocEZpZWxkRGljdCk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SGFzWEZBRm9ybSgpIGNvbnN0Citib29sIENQREZfSW50ZXJGb3JtOjpIYXNYRkFGb3JtKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9wRm9ybURpY3QgJiYgbV9wRm9ybURpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJYRkEiKSkgIT0gTlVMTDsKIH0KQEAgLTEzMDMsNyArMTMwMyw3IEBACiAgICAgICAgIHBGaWVsZCA9IG5ldyBDUERGX0Zvcm1GaWVsZCh0aGlzLCBwUGFyZW50KTsKICAgICAgICAgQ1BERl9PYmplY3QqIHBUT2JqID0gcERpY3QtPkdldEVsZW1lbnQoIlQiKTsKICAgICAgICAgaWYgKHBUT2JqICYmIHBUT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDbG9uZSA9IHBUT2JqLT5DbG9uZShUUlVFKTsKKyAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwVE9iai0+Q2xvbmUodHJ1ZSk7CiAgICAgICAgICAgICBpZiAocENsb25lKSB7CiAgICAgICAgICAgICAgICAgcERpY3QtPlNldEF0KCJUIiwgcENsb25lKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMzQyLDcgKzEzNDIsNyBAQAogICAgICgoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZCktPm1fQ29udHJvbExpc3QuQWRkKHBDb250cm9sKTsKICAgICByZXR1cm4gcENvbnRyb2w7CiB9Ci1DUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUpIGNvbnN0CitDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMsIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUpIGNvbnN0CiB7CiAgICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewpAQCAtMTM1OCw3ICsxMzU4LDcgQEAKICAgICAgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gVFJVRTsKKyAgICAgICAgYm9vbCBiRmluZCA9IHRydWU7CiAgICAgICAgIGlmIChmaWVsZHMgIT0gTlVMTCkgewogICAgICAgICAgICAgYkZpbmQgPSBmaWVsZHMtPkZpbmQocEZpZWxkLCAwKSA+PSAwOwogICAgICAgICB9CkBAIC0xMzcxLDcgKzEzNzEsNyBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLUNGREZfRG9jdW1lbnQqIENQREZfSW50ZXJGb3JtOjpFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKK0NGREZfRG9jdW1lbnQqIENQREZfSW50ZXJGb3JtOjpFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBib29sIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKIHsKICAgICBDRlhfUHRyQXJyYXkgZmllbGRzOwogICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwpAQCAtMTM3OSwxMCArMTM3OSwxMCBAQAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7CiAgICAgICAgIGZpZWxkcy5BZGQocEZpZWxkKTsKICAgICB9Ci0gICAgcmV0dXJuIEV4cG9ydFRvRkRGKHBkZl9wYXRoLCBmaWVsZHMsIFRSVUUsIGJTaW1wbGVGaWxlU3BlYyk7CisgICAgcmV0dXJuIEV4cG9ydFRvRkRGKHBkZl9wYXRoLCBmaWVsZHMsIHRydWUsIGJTaW1wbGVGaWxlU3BlYyk7CiB9CiBDRlhfV2lkZVN0cmluZyBGSUxFU1BFQ19FbmNvZGVGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVwYXRoKTsKLUNGREZfRG9jdW1lbnQqIENQREZfSW50ZXJGb3JtOjpFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBDRlhfUHRyQXJyYXkmIGZpZWxkcywgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgRlhfQk9PTCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0CitDRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIGJvb2wgYlNpbXBsZUZpbGVTcGVjKSBjb25zdAogewogICAgIENGREZfRG9jdW1lbnQqIHBEb2MgPSBDRkRGX0RvY3VtZW50OjpDcmVhdGVOZXdEb2MoKTsKICAgICBpZiAocERvYyA9PSBOVUxMKSB7CkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogICAgICAgICBpZiAoZHdGbGFncyAmIDB4MDQpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYkZpbmQgPSBmaWVsZHMuRmluZChwRmllbGQsIDApID49IDA7CisgICAgICAgIGJvb2wgYkZpbmQgPSBmaWVsZHMuRmluZChwRmllbGQsIDApID49IDA7CiAgICAgICAgIGlmICgoYkluY2x1ZGVPckV4Y2x1ZGUgJiYgYkZpbmQpIHx8ICghYkluY2x1ZGVPckV4Y2x1ZGUgJiYgIWJGaW5kKSkgewogICAgICAgICAgICAgaWYgKChkd0ZsYWdzICYgMHgwMikgIT0gMCAmJiBwRmllbGQtPm1fcERpY3QtPkdldFN0cmluZygiViIpLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTQzMiw3ICsxNDMyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0KCJUIiwgcFN0cmluZyk7CiAgICAgICAgICAgICBpZiAocEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbikgewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gcEZpZWxkLT5HZXRDaGVja1ZhbHVlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBGaWVsZC0+R2V0Q2hlY2tWYWx1ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NFeHBvcnQpOwogICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT3B0ID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5tX3BEaWN0LCAiT3B0Iik7CiAgICAgICAgICAgICAgICAgaWYgKHBPcHQgPT0gTlVMTCkgewpAQCAtMTQ0Myw3ICsxNDQzLDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5tX3BEaWN0LCAiViIpOwogICAgICAgICAgICAgICAgIGlmIChwViAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0KCJWIiwgcFYtPkNsb25lKFRSVUUpKTsKKyAgICAgICAgICAgICAgICAgICAgcEZpZWxkRGljdC0+U2V0QXQoIlYiLCBwVi0+Q2xvbmUodHJ1ZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBGaWVsZHMtPkFkZChwRmllbGREaWN0KTsKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAgICAgICAgIGNzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNzQlZhbHVlKTsKICAgICB9CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcGFyZW50X25hbWUsIEZYX0JPT0wgYk5vdGlmeSwgaW50IG5MZXZlbCkKK3ZvaWQgQ1BERl9JbnRlckZvcm06OkZERl9JbXBvcnRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwgYm9vbCBiTm90aWZ5LCBpbnQgbkxldmVsKQogewogICAgIENGWF9XaWRlU3RyaW5nIG5hbWU7CiAgICAgaWYgKCFwYXJlbnRfbmFtZS5Jc0VtcHR5KCkpIHsKQEAgLTE1MzEsNyArMTUzMSw3IEBACiAgICAgcEZpZWxkLT5TZXRWYWx1ZShjc1dWYWx1ZSk7CiAgICAgQ1BERl9Gb3JtRmllbGQ6OlR5cGUgZVR5cGUgPSBwRmllbGQtPkdldFR5cGUoKTsKICAgICBpZiAoKGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpMaXN0Qm94IHx8IGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpDb21ib0JveCkgJiYgcEZpZWxkRGljdC0+S2V5RXhpc3QoIk9wdCIpKSB7Ci0gICAgICAgIHBGaWVsZC0+bV9wRGljdC0+U2V0QXQoIk9wdCIsIHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiT3B0IiktPkNsb25lKFRSVUUpKTsKKyAgICAgICAgcEZpZWxkLT5tX3BEaWN0LT5TZXRBdCgiT3B0IiwgcEZpZWxkRGljdC0+R2V0RWxlbWVudFZhbHVlKCJPcHQiKS0+Q2xvbmUodHJ1ZSkpOwogICAgIH0KICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fCBpVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKQEAgLTE1NDYsMjQgKzE1NDYsMjQgQEAKICAgICAgICAgcEZpZWxkLT5VcGRhdGVBUChOVUxMKTsKICAgICB9CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpJbXBvcnRGcm9tRkRGKGNvbnN0IENGREZfRG9jdW1lbnQqIHBGREYsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9JbnRlckZvcm06OkltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERiwgYm9vbCBiTm90aWZ5KQogewogICAgIGlmIChwRkRGID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcE1haW5EaWN0ID0gcEZERi0+R2V0Um9vdCgpLT5HZXREaWN0KCJGREYiKTsKICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBwTWFpbkRpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKICAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX2JzRW5jb2RpbmcgPSBwTWFpbkRpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRW5jb2RpbmciKSk7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybUltcG9ydERhdGEodGhpcyk7CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRmllbGRzLT5HZXRDb3VudCgpOyBpICsrKSB7CkBAIC0xNTc2LDEzICsxNTc2LDEzIEBACiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyRm9ybUltcG9ydERhdGEodGhpcyk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0ludGVyRm9ybTo6U2V0Rm9ybU5vdGlmeShjb25zdCBDUERGX0Zvcm1Ob3RpZnkqIHBOb3RpZnkpCiB7CiAgICAgbV9wRm9ybU5vdGlmeSA9IChDUERGX0Zvcm1Ob3RpZnkqKXBOb3RpZnk7CiB9Ci1pbnQgQ1BERl9JbnRlckZvcm06OkdldFBhZ2VXaXRoV2lkZ2V0KGludCBpQ3VyUGFnZSwgRlhfQk9PTCBiTmV4dCkKK2ludCBDUERGX0ludGVyRm9ybTo6R2V0UGFnZVdpdGhXaWRnZXQoaW50IGlDdXJQYWdlLCBib29sIGJOZXh0KQogewogICAgIGlmIChpQ3VyUGFnZSA8IDApIHsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTYyMiw2ICsxNjIyLDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gaU5ld1BhZ2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IHdoaWxlIChUUlVFKTsKKyAgICB9IHdoaWxlICh0cnVlKTsKICAgICByZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAKaW5kZXggODdlZWU5Mi4uNjJlYjU5MSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1jb250cm9sLmNwcApAQCAtMTEzLDI1ICsxMTMsMjUgQEAKICAgICBDRlhfV2lkZVN0cmluZyBjc1dPbiA9IFBERl9EZWNvZGVUZXh0KGNzT24pOwogICAgIHJldHVybiBjc1dPbjsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SXNDaGVja2VkKCkKK2Jvb2wgQ1BERl9Gb3JtQ29udHJvbDo6SXNDaGVja2VkKCkKIHsKICAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKICAgICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKICAgICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIpOwogICAgIHJldHVybiBjc0FTID09IGNzT247CiB9Ci1GWF9CT09MIENQREZfRm9ybUNvbnRyb2w6OklzRGVmYXVsdENoZWNrZWQoKQorYm9vbCBDUERGX0Zvcm1Db250cm9sOjpJc0RlZmF1bHRDaGVja2VkKCkKIHsKICAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKICAgICBDUERGX09iamVjdCogcERWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJEViIpOwogICAgIGlmIChwRFYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NEViA9IHBEVi0+R2V0U3RyaW5nKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CiAgICAgcmV0dXJuIChjc0RWID09IGNzT24pOwogfQotdm9pZCBDUERGX0Zvcm1Db250cm9sOjpDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCkKK3ZvaWQgQ1BERl9Gb3JtQ29udHJvbDo6Q2hlY2tDb250cm9sKGJvb2wgYkNoZWNrZWQpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtX3BXaWRnZXREaWN0LT5TZXRBdE5hbWUoIkFTIiwgY3NBUyk7Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CiB9CiBDUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CiB2b2lkIENQREZfRm9ybUNvbnRyb2w6OkRyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENQREZfUGFnZSogcFBhZ2UsCkBAIC0xODYsNyArMTg2LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIEludmVydDsKIH0KLUNQREZfQXBTZXR0aW5ncyBDUERGX0Zvcm1Db250cm9sOjpHZXRNSyhGWF9CT09MIGJDcmVhdGUpCitDUERGX0FwU2V0dGluZ3MgQ1BERl9Gb3JtQ29udHJvbDo6R2V0TUsoYm9vbCBiQ3JlYXRlKQogewogICAgIGlmICghbV9wV2lkZ2V0RGljdCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIwMSw0OSArMjAxLDQ5IEBACiAgICAgfQogICAgIHJldHVybiBtazsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQorYm9vbCBDUERGX0Zvcm1Db250cm9sOjpIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKICAgICByZXR1cm4gbWsuSGFzTUtFbnRyeShjc0VudHJ5KTsKIH0KIGludCBDUERGX0Zvcm1Db250cm9sOjpHZXRSb3RhdGlvbigpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKICAgICByZXR1cm4gbWsuR2V0Um90YXRpb24oKTsKIH0KIEZYX0FSR0IgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldENvbG9yKGlDb2xvclR5cGUsIGNzRW50cnkpOwogfQogRlhfRkxPQVQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKICAgICByZXR1cm4gbWsuR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgY3NFbnRyeSk7CiB9CiB2b2lkIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKIHsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CisgICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoZmFsc2UpOwogICAgIG1rLkdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsIGNzRW50cnkpOwogfQogQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q2FwdGlvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldENhcHRpb24oY3NFbnRyeSk7CiB9CiBDUERGX1N0cmVhbSogQ1BERl9Gb3JtQ29udHJvbDo6R2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQogewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhmYWxzZSk7CiAgICAgcmV0dXJuIG1rLkdldEljb24oY3NFbnRyeSk7CiB9CiBDUERGX0ljb25GaXQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0SWNvbkZpdCgpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKICAgICByZXR1cm4gbWsuR2V0SWNvbkZpdCgpOwogfQogaW50IENQREZfRm9ybUNvbnRyb2w6OkdldFRleHRQb3NpdGlvbigpCiB7Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKGZhbHNlKTsKICAgICByZXR1cm4gbWsuR2V0VGV4dFBvc2l0aW9uKCk7CiB9CiBDUERGX0FjdGlvbiBDUERGX0Zvcm1Db250cm9sOjpHZXRBY3Rpb24oKQpAQCAtMzQzLDEwICszNDMsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKIH0KLUZYX0JPT0wgQ1BERl9BcFNldHRpbmdzOjpIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkKK2Jvb2wgQ1BERl9BcFNldHRpbmdzOjpIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkKIHsKICAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9wRGljdC0+S2V5RXhpc3QoY3NFbnRyeSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcAppbmRleCAwODdlYmE4Li44ZDk4ODdlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1maWVsZC5jcHAKQEAgLTcsMTEgKzcsMTEgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKICNpbmNsdWRlICJkb2NfdXRpbHMuaCIKIAotRlhfQk9PTCBQREZfRm9ybUZpZWxkX0lzVW5pc29uKENQREZfRm9ybUZpZWxkICpwRmllbGQpCitib29sIFBERl9Gb3JtRmllbGRfSXNVbmlzb24oQ1BERl9Gb3JtRmllbGQgKnBGaWVsZCkKIHsKLSAgICBGWF9CT09MIGJVbmlzb24gPSBGQUxTRTsKKyAgICBib29sIGJVbmlzb24gPSBmYWxzZTsKICAgICBpZiAocEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94KSB7Ci0gICAgICAgIGJVbmlzb24gPSBUUlVFOworICAgICAgICBiVW5pc29uID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7CiAgICAgICAgIGJVbmlzb24gPSAoKGR3RmxhZ3MgJiAweDIwMDAwMDApICE9IDApOwpAQCAtMTAwLDcgKzEwMCw3IEBACiB7CiAgICAgcmV0dXJuIDo6R2V0RnVsbE5hbWUobV9wRGljdCk7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OlJlc2V0RmllbGQoYm9vbCBiTm90aWZ5KQogewogICAgIHN3aXRjaCAobV9UeXBlKSB7CiAgICAgICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94OgpAQCAtMTEzLDEzICsxMTMsMTMgQEAKICAgICAgICAgICAgICAgICBpZiAoaUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChQREZfRm9ybUZpZWxkX0lzVW5pc29uKHRoaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woaSwgR2V0Q29udHJvbChpKS0+SXNEZWZhdWx0Q2hlY2tlZCgpLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIEdldENvbnRyb2woaSktPklzRGVmYXVsdENoZWNrZWQoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0RlZmF1bHRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIGJDaGVja2VkLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0RlZmF1bHRDaGVja2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIGJDaGVja2VkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xMzgsMTAgKzEzOCwxMCBAQAogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CisgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE1NywxMCArMTU3LDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CisgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xODIsMTIgKzE4MiwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFJWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlJWIik7CiAgICAgICAgICAgICAgICAgaWYgKCFwUlYgJiYgKGNzRFZhbHVlID09IGNzVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc0RWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwRFYgPT0gTlVMTCkgewpAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDbG9uZSA9IHBEVi0+Q2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBDbG9uZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbV9wRGljdC0+U2V0QXQoIlYiLCBwQ2xvbmUpOwogICAgICAgICAgICAgICAgICAgICBpZihwUlYpIHsKQEAgLTIwNywxMSArMjA3LDExIEBACiAgICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50IENQREZfRm9ybUZpZWxkOjpHZXRDb250cm9sSW5kZXgoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpCiB7CkBAIC0yOTksNyArMjk5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7CiB9Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkKK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRWYWx1ZShib29sIGJEZWZhdWx0KQogewogICAgIGlmIChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKSB7CiAgICAgICAgIHJldHVybiBHZXRDaGVja1ZhbHVlKGJEZWZhdWx0KTsKQEAgLTMzMywxOSArMzMzLDE5IEBACiB9CiBDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoKQogewotICAgIHJldHVybiBHZXRWYWx1ZShGQUxTRSk7CisgICAgcmV0dXJuIEdldFZhbHVlKGZhbHNlKTsKIH0KIENGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0VmFsdWUoKQogewotICAgIHJldHVybiBHZXRWYWx1ZShUUlVFKTsKKyAgICByZXR1cm4gR2V0VmFsdWUodHJ1ZSk7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiRGVmYXVsdCwgYm9vbCBiTm90aWZ5KQogewogICAgIHN3aXRjaCAobV9UeXBlKSB7CiAgICAgICAgIGNhc2UgQ2hlY2tCb3g6CiAgICAgICAgIGNhc2UgUmFkaW9CdXR0b246IHsKICAgICAgICAgICAgICAgICBTZXRDaGVja1ZhbHVlKHZhbHVlLCBiRGVmYXVsdCwgYk5vdGlmeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgRmlsZToKICAgICAgICAgY2FzZSBSaWNoVGV4dDoKQEAgLTM1NSw3ICszNTUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gRmluZE9wdGlvblZhbHVlKGNzVmFsdWUpOwpAQCAtMzcxLDM5ICszNzEsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIExpc3RCb3g6IHsKICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gRmluZE9wdGlvblZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICBpZiAoaUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJEZWZhdWx0ICYmIGlJbmRleCA9PSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYkRlZmF1bHQpIHsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKQEAgLTQxMiwxMSArNDEyLDExIEBACiAgICAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgewogICAgICAgICBVcGRhdGVBUChOVUxMKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiTm90aWZ5KQogewotICAgIHJldHVybiBTZXRWYWx1ZSh2YWx1ZSwgRkFMU0UsIGJOb3RpZnkpOworICAgIHJldHVybiBTZXRWYWx1ZSh2YWx1ZSwgZmFsc2UsIGJOb3RpZnkpOwogfQogaW50IENQREZfRm9ybUZpZWxkOjpHZXRNYXhMZW4oKQogewpAQCAtNTA2LDcgKzUwNiw3IEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyU2VsZWN0aW9uKGJvb2wgYk5vdGlmeSkKIHsKICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgaW50IGlSZXQgPSAwOwpAQCAtNTIyLDcgKzUyMiw3IEBACiAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKQEAgLTUzOCw0MyArNTM4LDQzIEBACiAgICAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgewogICAgICAgICBVcGRhdGVBUChOVUxMKTsKICAgICB9Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpCitib29sIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CiAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudE9wdGlvbnMoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKElzT3B0aW9uU2VsZWN0ZWQoaW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaW5kZXgpOwogICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOwogICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewogICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOwogICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewogICAgICAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0U3RyaW5nKCkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0SW50ZWdlcigpID09IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcFZhbHVlOwogICAgIGludCBpUG9zID0gLTE7CkBAIC01ODYsMTUgKzU4NiwxNSBAQAogICAgIH0KICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKQogICAgICAgICBpZiAocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSktPkdldFVuaWNvZGVUZXh0KCkgPT0gb3B0X3ZhbHVlICYmIChpbnQpaSA9PSBpUG9zKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CiAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudE9wdGlvbnMoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaW5kZXgpOwogICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewpAQCAtNjA2LDE0ICs2MDYsMTQgQEAKICAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBvcHRfdmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghYlNlbGVjdGVkKSB7CiAgICAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOwogICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsKICAgICAgICAgICAgIGlmIChtX1R5cGUgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgICAgIFNlbGVjdE9wdGlvbihpbmRleCwgRkFMU0UpOworICAgICAgICAgICAgICAgIFNlbGVjdE9wdGlvbihpbmRleCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCkgPT0gb3B0X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOwpAQCAtNjIxLDcgKzYyMSw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKQEAgLTY0NSwyMSArNjQ1LDIxIEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAobV9UeXBlID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgIFNlbGVjdE9wdGlvbihpbmRleCwgVFJVRSk7CisgICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIHRydWUpOwogICAgICAgICAgICAgaWYgKCEobV9GbGFncyAmIEZPUk1MSVNUX01VTFRJU0VMRUNUKSkgewogICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0U3RyaW5nKCJWIiwgUERGX0VuY29kZVRleHQob3B0X3ZhbHVlKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgYm9vbCBiU2VsZWN0ZWQ7CiAgICAgICAgICAgICAgICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSBJc0l0ZW1TZWxlY3RlZChpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChiU2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGkpOwpAQCAtNjcyLDcgKzY3Miw3IEBACiAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOwogICAgICAgICAgICAgQ1BERl9BcnJheSogcEkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKICAgICAgICAgICAgIGlmIChwSSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBJLT5BZGRJbnRlZ2VyKGluZGV4KTsKICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJJIiwgcEkpOwpAQCAtNjg5LDE4ICs2ODksMTggQEAKICAgICBpZiAoQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQKSB7CiAgICAgICAgIFVwZGF0ZUFQKE5VTEwpOwogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzSXRlbURlZmF1bHRTZWxlY3RlZChpbnQgaW5kZXgpCitib29sIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KQogewogICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwogICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBpRFZJbmRleCA9IEdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKTsKICAgICBpZiAoaURWSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gKGlEVkluZGV4ID09IGluZGV4KTsKIH0KQEAgLTc5OCwxNSArNzk4LDE1IEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tDb250cm9sKGludCBpQ29udHJvbEluZGV4LCBib29sIGJDaGVja2VkLCBib29sIGJOb3RpZnkpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOwogICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpQ29udHJvbEluZGV4KTsKICAgICBpZiAocENvbnRyb2wgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFiQ2hlY2tlZCAmJiBwQ29udHJvbC0+SXNDaGVja2VkKCkgPT0gYkNoZWNrZWQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CkBAIC04MTUsNyArODE1LDcgQEAKICAgICBDRlhfV2lkZVN0cmluZyBjc1dFeHBvcnQgPSBwQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKTsKICAgICBDRlhfQnl0ZVN0cmluZyBjc0JFeHBvcnQgPSBQREZfRW5jb2RlVGV4dChjc1dFeHBvcnQpOwogICAgIGludCBpQ291bnQgPSBDb3VudENvbnRyb2xzKCk7Ci0gICAgRlhfQk9PTCBiVW5pc29uID0gUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKTsKKyAgICBib29sIGJVbmlzb24gPSBQREZfRm9ybUZpZWxkX0lzVW5pc29uKHRoaXMpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Q29udHJvbChpKTsKICAgICAgICAgaWYgKGJVbmlzb24pIHsKQEAgLTgyNCwxNiArODI0LDE2IEBACiAgICAgICAgICAgICAgICAgaWYgKHBDdHJsLT5HZXRPblN0YXRlTmFtZSgpID09IHBDb250cm9sLT5HZXRPblN0YXRlTmFtZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woYkNoZWNrZWQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKKyAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChpID09IGlDb250cm9sSW5kZXgpIHsKICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKKyAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTg1OSwxNCArODU5LDE0IEBACiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkKK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRDaGVja1ZhbHVlKGJvb2wgYkRlZmF1bHQpCiB7CiAgICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOwogICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gTCJPZmYiOwotICAgIEZYX0JPT0wgYkNoZWNrZWQ7CisgICAgYm9vbCBiQ2hlY2tlZDsKICAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpKTsKQEAgLTg4Miw3ICs4ODIsNyBAQAogICAgIH0KICAgICByZXR1cm4gY3NFeHBvcnQ7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRDaGVja1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgRlhfQk9PTCBiRGVmYXVsdCwgRlhfQk9PTCBiTm90aWZ5KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0Q2hlY2tWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYkRlZmF1bHQsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBBU1NFUlQoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbik7CiAgICAgQ0ZYX0J5dGVBcnJheSBzdGF0dXNBcnJheTsKQEAgLTg5NiwyMSArODk2LDIxIEBACiAgICAgICAgIGlmIChjc0V4cG9ydCA9PSB2YWx1ZSkgewogICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgRkFMU0UpOworICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogaW50IENQREZfRm9ybUZpZWxkOjpHZXRUb3BWaXNpYmxlSW5kZXgoKQogewpAQCAtOTQ4LDQzICs5NDgsNDMgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6SXNPcHRpb25TZWxlY3RlZChpbnQgaU9wdEluZGV4KQorYm9vbCBDUERGX0Zvcm1GaWVsZDo6SXNPcHRpb25TZWxlY3RlZChpbnQgaU9wdEluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwT2JqLT5HZXRBcnJheSgpOwogICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGlDb3VudCA9IChpbnQpcEFycmF5LT5HZXRDb3VudCgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CiAgICAgICAgIGlmIChwQXJyYXktPkdldEludGVnZXIoaSkgPT0gaU9wdEluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6OlNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5KQogewogICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcERpY3QtPkdldEFycmF5KCJJIik7CiAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7CiAgICAgICAgIGlmICghYlNlbGVjdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwogICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX3BEaWN0LT5TZXRBdCgiSSIsIHBBcnJheSk7CiAgICAgfQotICAgIEZYX0JPT0wgYlJldHVybiA9IEZBTFNFOworICAgIGJvb2wgYlJldHVybiA9IGZhbHNlOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKICAgICAgICAgaW50IGlGaW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKGkpOwogICAgICAgICBpZiAoaUZpbmQgPT0gaU9wdEluZGV4KSB7CiAgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IDA7CkBAIC05OTYsMTEgKzk5NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQXJyYXktPlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgYlJldHVybiA9IFRSVUU7CisgICAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGlGaW5kID4gaU9wdEluZGV4KSB7CiAgICAgICAgICAgICBpZiAoIWJTZWxlY3RlZCkgewpAQCAtMTAxNiwxNSArMTAxNiwxNSBAQAogICAgICAgICAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDUERGX051bWJlciogcE51bSA9IENQREZfTnVtYmVyOjpDcmVhdGUoaU9wdEluZGV4KTsKICAgICAgICAgICAgIGlmIChwTnVtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcEFycmF5LT5JbnNlcnRBdChpLCBwTnVtKTsKLSAgICAgICAgICAgIGJSZXR1cm4gPSBUUlVFOworICAgICAgICAgICAgYlJldHVybiA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNDQsMTAgKzEwNDQsMTAgQEAKICAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGVkT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGVkT3B0aW9ucyhib29sIGJOb3RpZnkpCiB7CiAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpUmV0ID0gMDsKQEAgLTEwNjMsNyArMTA2Myw3IEBACiAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKQEAgLTEwNzUsOCArMTA3NSw4IEBACiAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogICAgICAgICB9CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDUERGX0Zvcm1GaWVsZDo6TG9hZERBKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX21ldGFkYXRhLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX21ldGFkYXRhLmNwcAppbmRleCBhZWViMWQxLi4zM2UxZTIzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfbWV0YWRhdGEuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKICAgICBpbnQgc2l6ZSA9IGFjYy5HZXRTaXplKCk7CiAgICAgY29uc3QgdWludDhfdCogcEJ1ZiA9IGFjYy5HZXREYXRhKCk7CiAgICAgQ1hNTF9FbGVtZW50IComcFhtbEVsbW50ID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wWG1sRWxtbnQ7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19vY2cuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcAppbmRleCBkNTI1MjI3Li42ZTg4MzA5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19vY2cuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQotc3RhdGljIEZYX0JPT0wgRlBERkRPQ19PQ0dfSGFzSW50ZW50KGNvbnN0IENQREZfRGljdGlvbmFyeSAqcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbGVtZW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRGVmID0gRlhfQlNUUkMoIiIpKQorc3RhdGljIGJvb2wgRlBERkRPQ19PQ0dfSGFzSW50ZW50KGNvbnN0IENQREZfRGljdGlvbmFyeSAqcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbGVtZW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRGVmID0gRlhfQlNUUkMoIiIpKQogewogICAgIEZYU1lTX2Fzc2VydChwRGljdCAhPSBOVUxMKTsKICAgICBDUERGX09iamVjdCAqcEludGVudCA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkludGVudCIpKTsKQEAgLTM4LDEwICszOCwxMCBAQAogICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgZHdDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBic0ludGVudCA9ICgoQ1BERl9BcnJheSopcEludGVudCktPkdldFN0cmluZyhpKTsKICAgICAgICAgICAgIGlmIChic0ludGVudCA9PSBGWF9CU1RSQygiQWxsIikgfHwgYnNJbnRlbnQgPT0gY3NFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGJzSW50ZW50ID0gcEludGVudC0+R2V0U3RyaW5nKCk7CiAgICAgcmV0dXJuIGJzSW50ZW50ID09IEZYX0JTVFJDKCJBbGwiKSB8fCBic0ludGVudCA9PSBjc0VsZW1lbnQ7CkBAIC0xMDEsMjQgKzEwMSwyNCBAQAogewogICAgIG1fT0NHU3RhdGVzLmNsZWFyKCk7CiB9Ci1GWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QsIEZYX0JPT0wgJmJWYWxpZENvbmZpZykgY29uc3QKK2Jvb2wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0NvbmZpZywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCwgYm9vbCAmYlZhbGlkQ29uZmlnKSBjb25zdAogewogICAgIENQREZfRGljdGlvbmFyeSAqcENvbmZpZyA9IEZQREZET0NfT0NHX0dldENvbmZpZyhtX3BEb2N1bWVudCwgcE9DR0RpY3QsIGNzQ29uZmlnKTsKICAgICBpZiAoIXBDb25maWcpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICBiVmFsaWRDb25maWcgPSBUUlVFOwotICAgIEZYX0JPT0wgYlN0YXRlID0gcENvbmZpZy0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlU3RhdGUiKSwgRlhfQlNUUkMoIk9OIikpICE9IEZYX0JTVFJDKCJPRkYiKTsKKyAgICBiVmFsaWRDb25maWcgPSB0cnVlOworICAgIGJvb2wgYlN0YXRlID0gcENvbmZpZy0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlU3RhdGUiKSwgRlhfQlNUUkMoIk9OIikpICE9IEZYX0JTVFJDKCJPRkYiKTsKICAgICBDUERGX0FycmF5ICpwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheShGWF9CU1RSQygiT04iKSk7CiAgICAgaWYgKHBBcnJheSkgewogICAgICAgICBpZiAoRlBERkRPQ19PQ0dfRmluZEdyb3VwKHBBcnJheSwgcE9DR0RpY3QpID49IDApIHsKLSAgICAgICAgICAgIGJTdGF0ZSA9IFRSVUU7CisgICAgICAgICAgICBiU3RhdGUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHBBcnJheSA9IHBDb25maWctPkdldEFycmF5KEZYX0JTVFJDKCJPRkYiKSk7CiAgICAgaWYgKHBBcnJheSkgewogICAgICAgICBpZiAoRlBERkRPQ19PQ0dfRmluZEdyb3VwKHBBcnJheSwgcE9DR0RpY3QpID49IDApIHsKLSAgICAgICAgICAgIGJTdGF0ZSA9IEZBTFNFOworICAgICAgICAgICAgYlN0YXRlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgcEFycmF5ID0gcENvbmZpZy0+R2V0QXJyYXkoRlhfQlNUUkMoIkFTIikpOwpAQCAtMTQ5LDEwICsxNDksMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIGJTdGF0ZTsKIH0KLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdAorYm9vbCBDUERGX09DQ29udGV4dDo6TG9hZE9DR1N0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpIGNvbnN0CiB7CiAgICAgaWYgKCFGUERGRE9DX09DR19IYXNJbnRlbnQocE9DR0RpY3QsIEZYX0JTVFJDKCJWaWV3IiksIEZYX0JTVFJDKCJWaWV3IikpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NTdGF0ZSA9IEZQREZET0NfT0NHX0dldFVzYWdlVHlwZVN0cmluZyhtX2VVc2FnZVR5cGUpOwogICAgIENQREZfRGljdGlvbmFyeSAqcFVzYWdlID0gcE9DR0RpY3QtPkdldERpY3QoRlhfQlNUUkMoIlVzYWdlIikpOwpAQCAtMTcxLDMxICsxNzEsMzEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBGWF9CT09MIGJEZWZWYWxpZCA9IEZBTFNFOworICAgIGJvb2wgYkRlZlZhbGlkID0gZmFsc2U7CiAgICAgcmV0dXJuIExvYWRPQ0dTdGF0ZUZyb21Db25maWcoY3NTdGF0ZSwgcE9DR0RpY3QsIGJEZWZWYWxpZCk7CiB9CiAKLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkKK2Jvb2wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkKIHsKICAgICBpZiAoIXBPQ0dEaWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGNvbnN0IGF1dG8gaXQgPSBtX09DR1N0YXRlcy5maW5kKHBPQ0dEaWN0KTsKICAgICBpZiAoaXQgIT0gbV9PQ0dTdGF0ZXMuZW5kKCkpCiAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogCi0gICAgRlhfQk9PTCBiU3RhdGUgPSBMb2FkT0NHU3RhdGUocE9DR0RpY3QpOworICAgIGJvb2wgYlN0YXRlID0gTG9hZE9DR1N0YXRlKHBPQ0dEaWN0KTsKICAgICBtX09DR1N0YXRlc1twT0NHRGljdF0gPSBiU3RhdGU7CiAgICAgcmV0dXJuIGJTdGF0ZTsKIH0KIAotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6R2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIEZYX0JPT0wgYkZyb21Db25maWcsIGludCBuTGV2ZWwpCitib29sIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWRShDUERGX0FycmF5ICpwRXhwcmVzc2lvbiwgYm9vbCBiRnJvbUNvbmZpZywgaW50IG5MZXZlbCkKIHsKICAgICBpZiAobkxldmVsID4gMzIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwRXhwcmVzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQzMl90IGlDb3VudCA9IHBFeHByZXNzaW9uLT5HZXRDb3VudCgpOwogICAgIENQREZfT2JqZWN0ICpwT0NHT2JqOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgaWYgKGNzT3BlcmF0b3IgPT0gRlhfQlNUUkMoIk5vdCIpKSB7CiAgICAgICAgIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RWxlbWVudFZhbHVlKDEpOwogICAgICAgICBpZiAocE9DR09iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICAgICAgcmV0dXJuICEoYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopKTsKQEAgLTIxMSwxNiArMjExLDE2IEBACiAgICAgICAgIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CiAgICAgICAgICAgICByZXR1cm4gIUdldE9DR1ZFKChDUERGX0FycmF5KilwT0NHT2JqLCBiRnJvbUNvbmZpZywgbkxldmVsICsgMSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjc09wZXJhdG9yID09IEZYX0JTVFJDKCJPciIpIHx8IGNzT3BlcmF0b3IgPT0gRlhfQlNUUkMoIkFuZCIpKSB7Ci0gICAgICAgIEZYX0JPT0wgYlZhbHVlID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlZhbHVlID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb3VudDsgaSArKykgewogICAgICAgICAgICAgcE9DR09iaiA9IHBFeHByZXNzaW9uLT5HZXRFbGVtZW50VmFsdWUoMSk7CiAgICAgICAgICAgICBpZiAocE9DR09iaiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJJdGVtID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJJdGVtID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CiAgICAgICAgICAgICAgICAgYkl0ZW0gPSBiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKSA6IEdldE9DR1Zpc2libGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKQEAgLTIzOCw5ICsyMzgsOSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiVmFsdWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NNRFN0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DTUREaWN0LCBGWF9CT09MIGJGcm9tQ29uZmlnKQorYm9vbCBDUERGX09DQ29udGV4dDo6TG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgYm9vbCBiRnJvbUNvbmZpZykKIHsKICAgICBGWFNZU19hc3NlcnQocE9DTUREaWN0ICE9IE5VTEwpOwogICAgIENQREZfQXJyYXkgKnBWRSA9IHBPQ01ERGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlZFIikpOwpAQCAtMjUwLDUwICsyNTAsNTAgQEAKICAgICBDRlhfQnl0ZVN0cmluZyBjc1AgPSBwT0NNRERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiUCIpLCBGWF9CU1RSQygiQW55T24iKSk7CiAgICAgQ1BERl9PYmplY3QgKnBPQ0dPYmogPSBwT0NNRERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiT0NHcyIpKTsKICAgICBpZiAocE9DR09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewogICAgICAgICByZXR1cm4gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopOwogICAgIH0KICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIEZYX0JPT0wgYlN0YXRlID0gRkFMU0U7CisgICAgYm9vbCBiU3RhdGUgPSBmYWxzZTsKICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbGxPbiIpIHx8IGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikpIHsKLSAgICAgICAgYlN0YXRlID0gVFJVRTsKKyAgICAgICAgYlN0YXRlID0gdHJ1ZTsKICAgICB9CiAgICAgaW50MzJfdCBpQ291bnQgPSAoKENQREZfQXJyYXkqKXBPQ0dPYmopLT5HZXRDb3VudCgpOwogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBGWF9CT09MIGJJdGVtID0gVFJVRTsKKyAgICAgICAgYm9vbCBiSXRlbSA9IHRydWU7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEl0ZW1EaWN0ID0gKChDUERGX0FycmF5KilwT0NHT2JqKS0+R2V0RGljdChpKTsKICAgICAgICAgaWYgKHBJdGVtRGljdCkgewogICAgICAgICAgICAgYkl0ZW0gPSBiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZShwSXRlbURpY3QpIDogR2V0T0NHVmlzaWJsZShwSXRlbURpY3QpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFueU9uIikgJiYgYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQW55T2ZmIikgJiYgIWJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFsbE9uIikgJiYgIWJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikgJiYgYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gYlN0YXRlOwogfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6Q2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpCitib29sIENQREZfT0NDb250ZXh0OjpDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCkKIHsKICAgICBpZiAoIXBPQ0dEaWN0KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gcE9DR0RpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVHlwZSIpLCBGWF9CU1RSQygiT0NHIikpOwogICAgIGlmIChjc1R5cGUgPT0gRlhfQlNUUkMoIk9DRyIpKSB7CiAgICAgICAgIHJldHVybiBHZXRPQ0dWaXNpYmxlKHBPQ0dEaWN0KTsKICAgICB9Ci0gICAgcmV0dXJuIExvYWRPQ01EU3RhdGUocE9DR0RpY3QsIEZBTFNFKTsKKyAgICByZXR1cm4gTG9hZE9DTURTdGF0ZShwT0NHRGljdCwgZmFsc2UpOwogfQogdm9pZCBDUERGX09DQ29udGV4dDo6UmVzZXRPQ0NvbnRleHQoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAKaW5kZXggZTlmMGM1NS4uM2U0NGIxYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY190YWdnZWQuY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIgogI2luY2x1ZGUgInRhZ2dlZF9pbnQuaCIKIGNvbnN0IGludCBuTWF4UmVjdXJzaW9uID0gMzI7Ci1zdGF0aWMgRlhfQk9PTCBJc1RhZ2dlZChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKQorc3RhdGljIGJvb2wgSXNUYWdnZWQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBDYXRhbG9nID0gcERvYy0+R2V0Um9vdCgpOwogICAgIENQREZfRGljdGlvbmFyeSogcE1hcmtJbmZvID0gcENhdGFsb2ctPkdldERpY3QoRlhfQlNUUkMoIk1hcmtJbmZvIikpOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwUGFyZW50RWxlbWVudCA9IEFkZFBhZ2VOb2RlKHBQYXJlbnQsIG1hcCwgbkxldmVsICsgMSk7Ci0gICAgICAgIEZYX0JPT0wgYlNhdmUgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiU2F2ZSA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBQYXJlbnRFbGVtZW50LT5tX0tpZHMuR2V0U2l6ZSgpOyBpICsrKSB7CiAgICAgICAgICAgICBpZiAocFBhcmVudEVsZW1lbnQtPm1fS2lkc1tpXS5tX1R5cGUgIT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcFBhcmVudEVsZW1lbnQtPm1fS2lkc1tpXS5tX0VsZW1lbnQubV9wRWxlbWVudCA9IHBFbGVtZW50LT5SZXRhaW4oKTsKLSAgICAgICAgICAgIGJTYXZlID0gVFJVRTsKKyAgICAgICAgICAgIGJTYXZlID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWJTYXZlKSB7CiAgICAgICAgICAgICBwRWxlbWVudC0+UmVsZWFzZSgpOwpAQCAtMTU2LDExICsxNTYsMTEgQEAKICAgICB9CiAgICAgcmV0dXJuIHBFbGVtZW50OwogfQotRlhfQk9PTCBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpCitib29sIENQREZfU3RydWN0VHJlZUltcGw6OkFkZFRvcExldmVsTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwRWxlbWVudCkKIHsKICAgICBDUERGX09iamVjdCAqcE9iaiA9IG1fcFRyZWVSb290LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIksiKSk7CiAgICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CiAgICAgICAgIGlmIChwT2JqLT5HZXRPYmpOdW0oKSA9PSBwRGljdC0+R2V0T2JqTnVtKCkpIHsKQEAgLTE2OSwxMyArMTY5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX0tpZHNbMF0gPSBwRWxlbWVudC0+UmV0YWluKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKICAgICAgICAgQ1BERl9BcnJheSogcFRvcEtpZHMgPSAoQ1BERl9BcnJheSopcE9iajsKICAgICAgICAgRlhfRFdPUkQgaTsKLSAgICAgICAgRlhfQk9PTCBiU2F2ZSA9IEZBTFNFOworICAgICAgICBib29sIGJTYXZlID0gZmFsc2U7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwVG9wS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewogICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBLaWRSZWYgPSBwVG9wS2lkcy0+R2V0RWxlbWVudChpKTsKICAgICAgICAgICAgIGlmIChwS2lkUmVmID09IE5VTEwgfHwgcEtpZFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKQEAgLTE4OCwxMyArMTg4LDEzIEBACiAgICAgICAgICAgICAgICAgbV9LaWRzW2ldLT5SZWxlYXNlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX0tpZHNbaV0gPSBwRWxlbWVudC0+UmV0YWluKCk7Ci0gICAgICAgICAgICBiU2F2ZSA9IFRSVUU7CisgICAgICAgICAgICBiU2F2ZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiU2F2ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbChDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKICAgICA6IG1fUmVmQ291bnQoMCkKQEAgLTM0MCwyMCArMzQwLDIwIEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgRlhfRkxPQVQgZkxldmVsKQorQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBib29sIGJJbmhlcml0YWJsZSwgRlhfRkxPQVQgZkxldmVsKQogewogICAgIGlmIChmTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoYkluaGVyaXRhYmxlKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIEZBTFNFKTsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgZmFsc2UpOwogICAgICAgICBpZiAocEF0dHIpIHsKICAgICAgICAgICAgIHJldHVybiBwQXR0cjsKICAgICAgICAgfQogICAgICAgICBpZiAobV9wUGFyZW50ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3BQYXJlbnQtPkdldEF0dHIob3duZXIsIG5hbWUsIFRSVUUsIGZMZXZlbCArIDEpOworICAgICAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCB0cnVlLCBmTGV2ZWwgKyAxKTsKICAgICB9CiAgICAgQ1BERl9PYmplY3QqIHBBID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJBIikpOwogICAgIGlmIChwQSkgewpAQCAtMzkxLDcgKzM5MSw3IEBACiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQotQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQorQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBib29sIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSk7CiAgICAgaWYgKHBBdHRyID09IE5VTEwgfHwgc3ViaW5kZXggPT0gLTEgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKQEAgLTQwMyw3ICs0MDMsNyBAQAogICAgIH0KICAgICByZXR1cm4gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoc3ViaW5kZXgpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKK0NGWF9CeXRlU3RyaW5nIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7CiAgICAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkgewpAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgfQogICAgIHJldHVybiBwQXR0ci0+R2V0U3RyaW5nKCk7CiB9Ci1GWF9BUkdCCUNQREZfU3RydWN0RWxlbWVudEltcGw6OkdldENvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQVJHQiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQorRlhfQVJHQglDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKIHsKICAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKICAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewpAQCAtNDIwLDcgKzQyMCw3IEBACiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBBdHRyOwogICAgIHJldHVybiAweGZmMDAwMDAwIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDApICogMjU1KSA8PCAxNikgfCAoKGludCkocEFycmF5LT5HZXROdW1iZXIoMSkgKiAyNTUpIDw8IDgpIHwgKGludCkocEFycmF5LT5HZXROdW1iZXIoMikgKiAyNTUpOwogfQotRlhfRkxPQVQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKK0ZYX0ZMT0FUIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCiB7CiAgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7CiAgICAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfTlVNQkVSKSB7CkBAIC00MjgsNyArNDI4LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBBdHRyLT5HZXROdW1iZXIoKTsKIH0KLWludAlDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCitpbnQJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBib29sIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQogewogICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwogICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwCmluZGV4IDk2ZDJjY2YuLjI2YzkzZjEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5jcHAKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgIH0KICAgICByZXR1cm4gZnVsbF9uYW1lOwogfQotRlhfQk9PTCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNGb250KCkKK2Jvb2wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzRm9udCgpCiB7CiAgICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOwogICAgIHJldHVybiBzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpOwpAQCAtNjUsMjMgKzY1LDIzIEBACiAgICAgfQogICAgIGNzRm9udE5hbWVUYWcgPSBQREZfTmFtZURlY29kZShjc0ZvbnROYW1lVGFnKTsKIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzQ29sb3IoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCitib29sIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0NvbG9yKGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uKQogewogICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKICAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgc3ludGF4LlNldFBvcygwKTsKICAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBzeW50YXguU2V0UG9zKDApOwogICAgIHJldHVybiBzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJLIiA6ICJrIiwgNCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKK0NGWF9CeXRlU3RyaW5nIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yU3RyaW5nKGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uKQogewogICAgIENGWF9CeXRlU3RyaW5nIGNzQ29sb3I7CiAgICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKQEAgLTExOSw3ICsxMTksNyBAQAogICAgIH0KICAgICByZXR1cm4gY3NDb2xvcjsKIH0KLXZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCit2b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIGJvb2wgYlN0cm9raW5nT3BlcmF0aW9uKQogewogICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CiAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjICsrKSB7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgZmNbM10gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKICAgICB9CiB9Ci12b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uKQordm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihGWF9BUkdCJiBjb2xvciwgaW50JiBpQ29sb3JUeXBlLCBib29sIGJTdHJva2luZ09wZXJhdGlvbikKIHsKICAgICBjb2xvciA9IDA7CiAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKQEAgLTE4NywxMCArMTg3LDEwIEBACiAgICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpKHIgKiAyNTUgKyAwLjVmKSwgKGludCkoZyAqIDI1NSArIDAuNWYpLCAoaW50KShiICogMjU1ICsgMC41ZikpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzVGV4dE1hdHJpeCgpCitib29sIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc1RleHRNYXRyaXgoKQogewogICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKICAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KTsKQEAgLTQ2OCwxOCArNDY4LDE4IEBACiAgICAgfQogICAgIHJldHVybiBHZXROYXRpdmVJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOwogfQotRlhfQk9PTCBGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKK2Jvb2wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7CiAgICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwogICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKICAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKICAgICB3aGlsZSAocG9zKSB7CkBAIC00OTksMjMgKzQ5OSwyMyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChwRm9udC0+R2V0Rm9udERpY3QoKSA9PSBwRWxlbWVudCkgewogICAgICAgICAgICAgY3NOYW1lVGFnID0gY3NLZXk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQorYm9vbCBGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKIHsKICAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwogICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKICAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjc0ZvbnROYW1lLkdldExlbmd0aCgpID4gMCkgewogICAgICAgICBjc0ZvbnROYW1lLlJlbW92ZSgnICcpOwpAQCAtNTQ1LDEwICs1NDUsMTAgQEAKICAgICAgICAgY3NCYXNlRm9udC5SZW1vdmUoJyAnKTsKICAgICAgICAgaWYgKGNzQmFzZUZvbnQgPT0gY3NGb250TmFtZSkgewogICAgICAgICAgICAgY3NOYW1lVGFnID0gY3NLZXk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIEFkZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCiB7CkBAIC02NzAsMTAgKzY3MCwxMCBAQAogICAgIH0KICAgICByZXR1cm4gQWx3YXlzOwogfQotRlhfQk9PTCBDUERGX0ljb25GaXQ6OklzUHJvcG9ydGlvbmFsU2NhbGUoKQorYm9vbCBDUERGX0ljb25GaXQ6OklzUHJvcG9ydGlvbmFsU2NhbGUoKQogewogICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJTIiwgIlAiKSAhPSAiQSI7CiB9CkBAIC02OTQsMTAgKzY5NCwxMCBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDUERGX0ljb25GaXQ6OkdldEZpdHRpbmdCb3VuZHMoKQorYm9vbCBDUERGX0ljb25GaXQ6OkdldEZpdHRpbmdCb3VuZHMoKQogewogICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJGQiIpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmgKaW5kZXggNmJiMWQzMC4uNmRjZjViMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5oCkBAIC0xNSw4ICsxNSw4IEBACiBDUERGX0ZvbnQqCQlHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogQ1BERl9Gb250KgkJR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCB1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogQ1BERl9Gb250KgkJR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLUZYX0JPT0wJCQlGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1GWF9CT09MCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOworYm9vbAkJCUZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK2Jvb2wJCQlGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDUERGX0ZvbnQqJiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiB2b2lkCQkJQWRkSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiBDUERGX0ZvbnQqCQlBZGROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCB1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogQ1BERl9Gb250KgkJQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CkBAIC0yNSw4ICsyNSw4IEBACiBDUERGX0ZvbnQqCQlHZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKIHZvaWQJCQlTZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCk7CiB2b2lkCQkJU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSk7Ci1GWF9CT09MCQkJTmVlZFBERkVuY29kZUZvckZpZWxkRnVsbE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKLUZYX0JPT0wJCQlOZWVkUERGRW5jb2RlRm9yRmllbGRUcmVlKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOworYm9vbAkJCU5lZWRQREZFbmNvZGVGb3JGaWVsZEZ1bGxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7Citib29sCQkJTmVlZFBERkVuY29kZUZvckZpZWxkVHJlZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwgPSAwKTsKIHZvaWQJCQlFbmNvZGVGaWVsZE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzTmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIGNzVCk7CiB2b2lkCQkJVXBkYXRlRW5jb2RlRmllbGROYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwogCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAKaW5kZXggZWI4MjRlYi4uMWMwMTRkYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3ZpZXdlclByZWZlcmVuY2VzLmNwcApAQCAtMTEsMjEgKzExLDIxIEBACiBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjp+Q1BERl9WaWV3ZXJQcmVmZXJlbmNlcygpCiB7CiB9Ci1GWF9CT09MIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OklzRGlyZWN0aW9uUjJMKCkgY29uc3QKK2Jvb2wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6SXNEaXJlY3Rpb25SMkwoKSBjb25zdAogewogICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKICAgICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKICAgICBpZiAoIXBEaWN0KQl7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gRlhfQlNUUkMoIlIyTCIpID09IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkRpcmVjdGlvbiIpKTsKIH0KLUZYX0JPT0wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6UHJpbnRTY2FsaW5nKCkgY29uc3QKK2Jvb2wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6UHJpbnRTY2FsaW5nKCkgY29uc3QKIHsKICAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7CiAgICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7CiAgICAgaWYgKCFwRGljdCkJewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBGWF9CU1RSQygiTm9uZSIpICE9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlByaW50U2NhbGluZyIpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcAppbmRleCAyMzBiYTc2Li44Y2M2YjdjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnQuY3BwCkBAIC0xODMsOCArMTgzLDggQEAKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIEZYX0JPT0wgYlVwID0gVFJVRTsKLSAgICBGWF9CT09MIGJEb3duID0gVFJVRTsKKyAgICBib29sIGJVcCA9IHRydWU7CisgICAgYm9vbCBiRG93biA9IHRydWU7CiAgICAgaW50MzJfdCBuTGVmdCA9IDA7CiAgICAgaW50MzJfdCBuUmlnaHQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxOwogICAgIGludDMyX3Qgbk1pZCA9IG1fTGluZUFycmF5LkdldFNpemUoKSAvIDI7CkBAIC0xOTUsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgZlRvcCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50IC0gbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fU2VjSW5mbyk7CiAgICAgICAgICAgICBmQm90dG9tID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVZIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OwogICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZlRvcCkpIHsKLSAgICAgICAgICAgICAgICBiVXAgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiVXAgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmQm90dG9tKSkgewotICAgICAgICAgICAgICAgIGJEb3duID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkRvd24gPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmVG9wKSkgewogICAgICAgICAgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOwpAQCAtMzk0LDcgKzM5NCw3IEBACiB7CiAgICAgQVNTRVJUKG1fcFNlY3Rpb24gIT0gTlVMTCk7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIFNwbGl0TGluZXMoRkFMU0UsIGZGb250U2l6ZSk7CisgICAgU3BsaXRMaW5lcyhmYWxzZSwgZkZvbnRTaXplKTsKICAgICByZXR1cm4gQ1BWVF9TaXplKG1fcmNSZXQuV2lkdGgoKSwgbV9yY1JldC5IZWlnaHQoKSk7CiB9CiBDUFZUX0Zsb2F0UmVjdCBDVHlwZXNldDo6VHlwZXNldCgpCkBAIC00MDIsNyArNDAyLDcgQEAKICAgICBBU1NFUlQobV9wU2VjdGlvbiAhPSBOVUxMKTsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuRW1wdHkoKTsKLSAgICBTcGxpdExpbmVzKFRSVUUsIDAuMGYpOworICAgIFNwbGl0TGluZXModHJ1ZSwgMC4wZik7CiAgICAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuQ2xlYXIoKTsKICAgICBPdXRwdXRMaW5lcygpOwogICAgIHJldHVybiBtX3JjUmV0OwpAQCAtNDI1LDExICs0MjUsMTEgQEAKICAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKICAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMEMsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwKIH07Ci1zdGF0aWMgRlhfQk9PTCBJc0xhdGluKEZYX1dPUkQgd29yZCkKK3N0YXRpYyBib29sIElzTGF0aW4oRlhfV09SRCB3b3JkKQogewogICAgIGlmICh3b3JkIDw9IDB4MDA3RikgewogICAgICAgICBpZiAoc3BlY2lhbF9jaGFyc1t3b3JkXSAmIDB4MDAwMSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKHdvcmQgPj0gMHgwMEMwICYmIHdvcmQgPD0gMHgwMEZGKSB8fApAQCAtNDM5LDE1ICs0MzksMTUgQEAKICAgICAgICAgICAgICh3b3JkID49IDB4QTcyMCAmJiB3b3JkIDw9IDB4QTdGRikgfHwKICAgICAgICAgICAgICh3b3JkID49IDB4RkYyMSAmJiB3b3JkIDw9IDB4RkYzQSkgfHwKICAgICAgICAgICAgICh3b3JkID49IDB4RkY0MSAmJiB3b3JkIDw9IDB4RkY1QSkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgSXNEaWdpdChGWF9EV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNEaWdpdChGWF9EV09SRCB3b3JkKQogewotICAgIHJldHVybiAod29yZCA+PSAweDAwMzAgJiYgd29yZCA8PSAweDAwMzkpID8gVFJVRSA6IEZBTFNFOworICAgIHJldHVybiAod29yZCA+PSAweDAwMzAgJiYgd29yZCA8PSAweDAwMzkpID8gdHJ1ZSA6IGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgSXNDSksoRlhfRFdPUkQgd29yZCkKK3N0YXRpYyBib29sIElzQ0pLKEZYX0RXT1JEIHdvcmQpCiB7CiAgICAgaWYgKCh3b3JkID49IDB4MTEwMCAmJiB3b3JkIDw9IDB4MTFGRikgfHwKICAgICAgICAgICAgICh3b3JkID49IDB4MkU4MCAmJiB3b3JkIDw9IDB4MkZGRikgfHwKQEAgLTQ1NywzMyArNDU3LDMzIEBACiAgICAgICAgICAgICAod29yZCA+PSAweEZFMzAgJiYgd29yZCA8PSAweEZFNEYpIHx8CiAgICAgICAgICAgICAod29yZCA+PSAweDIwMDAwICYmIHdvcmQgPD0gMHgyQTZERikgfHwKICAgICAgICAgICAgICh3b3JkID49IDB4MkY4MDAgJiYgd29yZCA8PSAweDJGQTFGKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgewogICAgICAgICBpZiAod29yZCA9PSAweDMwMDUgfHwgd29yZCA9PSAweDMwMDYgfHwgd29yZCA9PSAweDMwMjEgfHwgd29yZCA9PSAweDMwMjIgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAyMyB8fCB3b3JkID09IDB4MzAyNCB8fCB3b3JkID09IDB4MzAyNSB8fCB3b3JkID09IDB4MzAyNiB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDI3IHx8IHdvcmQgPT0gMHgzMDI4IHx8IHdvcmQgPT0gMHgzMDI5IHx8IHdvcmQgPT0gMHgzMDMxIHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMzIgfHwgd29yZCA9PSAweDMwMzMgfHwgd29yZCA9PSAweDMwMzQgfHwgd29yZCA9PSAweDMwMzUpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh3b3JkID49IDB4RkY2NiAmJiB3b3JkIDw9IDB4RkY5RCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBJc1B1bmN0dWF0aW9uKEZYX0RXT1JEIHdvcmQpCitzdGF0aWMgYm9vbCBJc1B1bmN0dWF0aW9uKEZYX0RXT1JEIHdvcmQpCiB7CiAgICAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CiAgICAgICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiAzKSAmIDEpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHdvcmQgPj0gMHgwMDgwICYmIHdvcmQgPD0gMHgwMEZGKSB7CiAgICAgICAgIGlmICh3b3JkID09IDB4MDA4MiB8fCB3b3JkID09IDB4MDA4NCB8fCB3b3JkID09IDB4MDA4NSB8fCB3b3JkID09IDB4MDA5MSB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgwMDkyIHx8IHdvcmQgPT0gMHgwMDkzIHx8IHdvcmQgPD0gMHgwMDk0IHx8IHdvcmQgPT0gMHgwMDk2IHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDAwQjQgfHwgd29yZCA9PSAweDAwQjgpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSB7CiAgICAgICAgIGlmICh3b3JkID09IDB4MjAxMCB8fCB3b3JkID09IDB4MjAxMSB8fCB3b3JkID09IDB4MjAxMiB8fCB3b3JkID09IDB4MjAxMyB8fApAQCAtNDkyLDcgKzQ5Miw3IEBACiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDIwMzIgfHwgd29yZCA9PSAweDIwMzMgfHwgd29yZCA9PSAweDIwMzQgfHwgd29yZCA9PSAweDIwMzUgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MjAzNiB8fCB3b3JkID09IDB4MjAzNyB8fCB3b3JkID09IDB4MjAzQyB8fCB3b3JkID09IDB4MjAzRCB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDNFIHx8IHdvcmQgPT0gMHgyMDQ0KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgewogICAgICAgICBpZiAod29yZCA9PSAweDMwMDEgfHwgd29yZCA9PSAweDMwMDIgfHwgd29yZCA9PSAweDMwMDMgfHwgd29yZCA9PSAweDMwMDUgfHwKQEAgLTUwMSwxMSArNTAxLDExIEBACiAgICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMTEgfHwgd29yZCA9PSAweDMwMTQgfHwgd29yZCA9PSAweDMwMTUgfHwgd29yZCA9PSAweDMwMTYgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAxNyB8fCB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxOSB8fCB3b3JkID09IDB4MzAxQSB8fAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDFCIHx8IHdvcmQgPT0gMHgzMDFEIHx8IHdvcmQgPT0gMHgzMDFFIHx8IHdvcmQgPT0gMHgzMDFGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU2RikgewogICAgICAgICBpZiAoKHdvcmQgPj0gMHhGRTUwICYmIHdvcmQgPD0gMHhGRTVFKSB8fCB3b3JkID09IDB4RkU2MykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAod29yZCA+PSAweEZGMDAgJiYgd29yZCA8PSAweEZGRUYpIHsKICAgICAgICAgaWYgKHdvcmQgPT0gMHhGRjAxIHx8IHdvcmQgPT0gMHhGRjAyIHx8IHdvcmQgPT0gMHhGRjA3IHx8IHdvcmQgPT0gMHhGRjA4IHx8CkBAIC01MTQsODMgKzUxNCw4MyBAQAogICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjNEIHx8IHdvcmQgPT0gMHhGRjQwIHx8IHdvcmQgPT0gMHhGRjVCIHx8IHdvcmQgPT0gMHhGRjVDIHx8CiAgICAgICAgICAgICAgICAgd29yZCA9PSAweEZGNUQgfHwgd29yZCA9PSAweEZGNjEgfHwgd29yZCA9PSAweEZGNjIgfHwgd29yZCA9PSAweEZGNjMgfHwKICAgICAgICAgICAgICAgICB3b3JkID09IDB4RkY2NCB8fCB3b3JkID09IDB4RkY2NSB8fCB3b3JkID09IDB4RkY5RSB8fCB3b3JkID09IDB4RkY5RikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgSXNDb25uZWN0aXZlU3ltYm9sKEZYX0RXT1JEIHdvcmQpCitzdGF0aWMgYm9vbCBJc0Nvbm5lY3RpdmVTeW1ib2woRlhfRFdPUkQgd29yZCkKIHsKICAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKICAgICAgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDUpICYgMSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQogewogICAgIGlmICh3b3JkIDw9IDB4MDA3RikgewogICAgICAgICBpZiAoKHNwZWNpYWxfY2hhcnNbd29yZF0gPj4gMikgJiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID09IDB4MzAwQSB8fCB3b3JkID09IDB4MzAwQyB8fCB3b3JkID09IDB4MzAwRSB8fCB3b3JkID09IDB4MzAxMCB8fAogICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMTQgfHwgd29yZCA9PSAweDMwMTYgfHwgd29yZCA9PSAweDMwMTggfHwgd29yZCA9PSAweDMwMUEgfHwKICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjA4IHx8IHdvcmQgPT0gMHhGRjNCIHx8IHdvcmQgPT0gMHhGRjVCIHx8IHdvcmQgPT0gMHhGRjYyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzQ3VycmVuY3lTeW1ib2woRlhfV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNDdXJyZW5jeVN5bWJvbChGWF9XT1JEIHdvcmQpCiB7CiAgICAgaWYgKHdvcmQgPT0gMHgwMDI0IHx8IHdvcmQgPT0gMHgwMDgwIHx8IHdvcmQgPT0gMHgwMEEyIHx8IHdvcmQgPT0gMHgwMEEzIHx8CiAgICAgICAgICAgICB3b3JkID09IDB4MDBBNCB8fCB3b3JkID09IDB4MDBBNSB8fCAod29yZCA+PSAweDIwQTAgJiYgd29yZCA8PSAweDIwQ0YpIHx8CiAgICAgICAgICAgICB3b3JkID09IDB4RkU2OSB8fCB3b3JkID09IDB4RkYwNCB8fCB3b3JkID09IDB4RkZFMCB8fCB3b3JkID09IDB4RkZFMSB8fAogICAgICAgICAgICAgd29yZCA9PSAweEZGRTUgfHwgd29yZCA9PSAweEZGRTYpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgSXNQcmVmaXhTeW1ib2woRlhfV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNQcmVmaXhTeW1ib2woRlhfV09SRCB3b3JkKQogewogICAgIGlmIChJc0N1cnJlbmN5U3ltYm9sKHdvcmQpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHdvcmQgPT0gMHgyMTE2KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyBGWF9CT09MIElzU3BhY2UoRlhfV09SRCB3b3JkKQorc3RhdGljIGJvb2wgSXNTcGFjZShGWF9XT1JEIHdvcmQpCiB7Ci0gICAgcmV0dXJuICh3b3JkID09IDB4MDAyMCB8fCB3b3JkID09IDB4MzAwMCkgPyBUUlVFIDogRkFMU0U7CisgICAgcmV0dXJuICh3b3JkID09IDB4MDAyMCB8fCB3b3JkID09IDB4MzAwMCkgPyB0cnVlIDogZmFsc2U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBOZWVkRGl2aXNpb24oRlhfV09SRCBwcmV2V29yZCwgRlhfV09SRCBjdXJXb3JkKQorc3RhdGljIGJvb2wgTmVlZERpdmlzaW9uKEZYX1dPUkQgcHJldldvcmQsIEZYX1dPUkQgY3VyV29yZCkKIHsKICAgICBpZiAoKElzTGF0aW4ocHJldldvcmQpIHx8IElzRGlnaXQocHJldldvcmQpKSAmJiAoSXNMYXRpbihjdXJXb3JkKSB8fCBJc0RpZ2l0KGN1cldvcmQpKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKElzU3BhY2UoY3VyV29yZCkgfHwgSXNQdW5jdHVhdGlvbihjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKElzQ29ubmVjdGl2ZVN5bWJvbChwcmV2V29yZCkgfHwgSXNDb25uZWN0aXZlU3ltYm9sKGN1cldvcmQpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoSXNTcGFjZShwcmV2V29yZCkgfHwgSXNQdW5jdHVhdGlvbihwcmV2V29yZCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoSXNQcmVmaXhTeW1ib2wocHJldldvcmQpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoSXNQcmVmaXhTeW1ib2woY3VyV29yZCkgfHwgSXNDSksoY3VyV29yZCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoSXNDSksocHJldldvcmQpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLXZvaWQgQ1R5cGVzZXQ6OlNwbGl0TGluZXMoRlhfQk9PTCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKQordm9pZCBDVHlwZXNldDo6U3BsaXRMaW5lcyhib29sIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpCiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwpAQCAtNjAxLDE0ICs2MDEsMTQgQEAKICAgICBGWF9GTE9BVCBmTGluZUFzY2VudCA9IDAuMGYsIGZCYWNrdXBMaW5lQXNjZW50ID0gMC4wZjsKICAgICBGWF9GTE9BVCBmTGluZURlc2NlbnQgPSAwLjBmLCBmQmFja3VwTGluZURlc2NlbnQgPSAwLjBmOwogICAgIGludDMyX3QgbldvcmRTdGFydFBvcyA9IDA7Ci0gICAgRlhfQk9PTCBiRnVsbFdvcmQgPSBGQUxTRTsKKyAgICBib29sIGJGdWxsV29yZCA9IGZhbHNlOwogICAgIGludDMyX3QgbkxpbmVGdWxsV29yZEluZGV4ID0gMDsKICAgICBpbnQzMl90IG5DaGFySW5kZXggPSAwOwogICAgIENQVlRfTGluZUluZm8gbGluZTsKICAgICBGWF9GTE9BVCBmV29yZFdpZHRoID0gMDsKICAgICBGWF9GTE9BVCBmVHlwZXNldFdpZHRoID0gRlBERl9NQVgobV9wVlQtPkdldFBsYXRlV2lkdGgoKSAtIG1fcFZULT5HZXRMaW5lSW5kZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyksIDAuMGYpOwogICAgIGludDMyX3QgblRvdGFsV29yZHMgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7Ci0gICAgRlhfQk9PTCBiT3BlbmVkID0gRkFMU0U7CisgICAgYm9vbCBiT3BlbmVkID0gZmFsc2U7CiAgICAgaWYgKG5Ub3RhbFdvcmRzID4gMCkgewogICAgICAgICBpbnQzMl90IGkgPSAwOwogICAgICAgICB3aGlsZSAoaSA8IG5Ub3RhbFdvcmRzKSB7CkBAIC02MTksOCArNjE5LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwV29yZCkgewogICAgICAgICAgICAgICAgIGlmIChiVHlwZXNldCkgewotICAgICAgICAgICAgICAgICAgICBmTGluZUFzY2VudCA9IEZQREZfTUFYKGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIFRSVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gRlBERl9NSU4oZkxpbmVEZXNjZW50LCBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkLCBUUlVFKSk7CisgICAgICAgICAgICAgICAgICAgIGZMaW5lQXNjZW50ID0gRlBERl9NQVgoZkxpbmVBc2NlbnQsIG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICBmTGluZURlc2NlbnQgPSBGUERGX01JTihmTGluZURlc2NlbnQsIG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQsIHRydWUpKTsKICAgICAgICAgICAgICAgICAgICAgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBmTGluZUFzY2VudCA9IEZQREZfTUFYKGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIGZGb250U2l6ZSkpOwpAQCAtNjM2LDIwICs2MzYsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFiT3BlbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBPbGRXb3JkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZWVkRGl2aXNpb24ocE9sZFdvcmQtPldvcmQsIHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghSXNTcGFjZShwV29yZC0+V29yZCkgJiYgIUlzT3BlblN0eWxlUHVuY3R1YXRpb24ocFdvcmQtPldvcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiT3BlbmVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBiT3BlbmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGJGdWxsV29yZCkgewotICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuQ2hhckluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbkxpbmVGdWxsV29yZEluZGV4ICsrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02OTEsNyArNjkxLDcgQEAKICAgICAgICAgICAgICAgICBmTGluZURlc2NlbnQgPSAwLjBmOwogICAgICAgICAgICAgICAgIG5DaGFySW5kZXggPSAwOwogICAgICAgICAgICAgICAgIG5MaW5lRnVsbFdvcmRJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggKz0gZldvcmRXaWR0aDsKICAgICAgICAgICAgICAgICBpKys7CkBAIC04MDksMTcgKzgwOSwxNyBAQAogQ1BERl9WYXJpYWJsZVRleHQ6OkNQREZfVmFyaWFibGVUZXh0KCkgOgogICAgIG1fbkxpbWl0Q2hhcigwKSwKICAgICBtX25DaGFyQXJyYXkoMCksCi0gICAgbV9iTXVsdGlMaW5lKEZBTFNFKSwKLSAgICBtX2JMaW1pdFdpZHRoKEZBTFNFKSwKLSAgICBtX2JBdXRvRm9udFNpemUoRkFMU0UpLAorICAgIG1fYk11bHRpTGluZShmYWxzZSksCisgICAgbV9iTGltaXRXaWR0aChmYWxzZSksCisgICAgbV9iQXV0b0ZvbnRTaXplKGZhbHNlKSwKICAgICBtX25BbGlnbm1lbnQoMCksCiAgICAgbV9mTGluZUxlYWRpbmcoMC4wZiksCiAgICAgbV9mQ2hhclNwYWNlKDAuMGYpLAogICAgIG1fbkhvcnpTY2FsZSgxMDApLAogICAgIG1fd1N1YldvcmQoMCksCiAgICAgbV9mRm9udFNpemUoMC4wZiksCi0gICAgbV9iSW5pdGlhbChGQUxTRSksCi0gICAgbV9iUmljaFRleHQoRkFMU0UpLAorICAgIG1fYkluaXRpYWwoZmFsc2UpLAorICAgIG1fYlJpY2hUZXh0KGZhbHNlKSwKICAgICBtX3BWVFByb3ZpZGVyKE5VTEwpLAogICAgIG1fcFZUSXRlcmF0b3IoTlVMTCkKIHsKQEAgLTg0OCwxMiArODQ4LDEyIEBACiAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoMCkpIHsKICAgICAgICAgICAgIHBTZWN0aW9uLT5SZXNldExpbmVQbGFjZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1fYkluaXRpYWwgPSBUUlVFOworICAgICAgICBtX2JJbml0aWFsID0gdHJ1ZTsKICAgICB9CiB9CiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpSZXNldEFsbCgpCiB7Ci0gICAgbV9iSW5pdGlhbCA9IEZBTFNFOworICAgIG1fYkluaXRpYWwgPSBmYWxzZTsKICAgICBSZXNldFNlY3Rpb25BcnJheSgpOwogfQogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6Okluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsCkBAIC05NTYsNyArOTU2LDcgQEAKIH0KIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpEZWxldGVXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCiB7Ci0gICAgRlhfQk9PTCBiTGFzdFNlY1BvcyA9IEZBTFNFOworICAgIGJvb2wgYkxhc3RTZWNQb3MgPSBmYWxzZTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkpIHsKICAgICAgICAgYkxhc3RTZWNQb3MgPSAoUGxhY2VSYW5nZS5FbmRQb3MgPT0gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpKTsKICAgICB9CkBAIC05NzEsMTEgKzk3MSwxMSBAQAogfQogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkRlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKIHsKLSAgICByZXR1cm4gQ2xlYXJSaWdodFdvcmQoQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKSk7CisgICAgcmV0dXJuIENsZWFyUmlnaHRXb3JkKEFqdXN0TGluZUhlYWRlcihwbGFjZSwgdHJ1ZSkpOwogfQogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKIHsKLSAgICByZXR1cm4gQ2xlYXJMZWZ0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpKTsKKyAgICByZXR1cm4gQ2xlYXJMZWZ0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpKTsKIH0KIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKQpAQCAtMTA0NCw3ICsxMDQ0LDcgQEAKICAgICBpZiAocGxhY2UublNlY0luZGV4ID49IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSkgewogICAgICAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOwogICAgIH0KLSAgICBwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7CisgICAgcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpOwogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewogICAgICAgICBwU2VjdGlvbi0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKICAgICB9CkBAIC0xMDczLDE5ICsxMDczLDE5IEBACiB7CiAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwogICAgIGludDMyX3Qgbk9sZEluZGV4ID0gMCAsIG5JbmRleCA9IDA7Ci0gICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgewogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KGkpKSB7CiAgICAgICAgICAgICBuSW5kZXggKz0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKICAgICAgICAgICAgIGlmIChuSW5kZXggPT0gaW5kZXgpIHsKICAgICAgICAgICAgICAgICBwbGFjZSA9IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuSW5kZXggPiBpbmRleCkgewogICAgICAgICAgICAgICAgIHBsYWNlLm5TZWNJbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgcGxhY2UubldvcmRJbmRleCA9IGluZGV4IC0gbk9sZEluZGV4IC0gMTsKICAgICAgICAgICAgICAgICBwU2VjdGlvbi0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGkgIT0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewpAQCAtMTE1NSwxNSArMTE1NSwxNSBAQAogICAgIGludDMyX3QgbkxlZnQgPSAwOwogICAgIGludDMyX3QgblJpZ2h0ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMTsKICAgICBpbnQzMl90IG5NaWQgPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLyAyOwotICAgIEZYX0JPT0wgYlVwID0gVFJVRTsKLSAgICBGWF9CT09MIGJEb3duID0gVFJVRTsKKyAgICBib29sIGJVcCA9IHRydWU7CisgICAgYm9vbCBiRG93biA9IHRydWU7CiAgICAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgewogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG5NaWQpKSB7CiAgICAgICAgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihwdC55LCBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKSB7Ci0gICAgICAgICAgICAgICAgYlVwID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYlVwID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5ib3R0b20sIHB0LnkpKSB7Ci0gICAgICAgICAgICAgICAgYkRvd24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiRG93biA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpIHsKICAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKQEAgLTEzMDMsNDkgKzEzMDMsNDkgQEAKICAgICB9CiAgICAgcmV0dXJuIHBsYWNlOwogfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKQorYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKQogewogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewogICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHBsYWNlLm5Xb3JkSW5kZXgpKSB7CiAgICAgICAgICAgICB3b3JkaW5mbyA9ICpwV29yZDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKK2Jvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKIHsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KSkgewogICAgICAgICAgICAgKnBXb3JkID0gd29yZGluZm87Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pCitib29sIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pCiB7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CiAgICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7CiAgICAgICAgICAgICBsaW5laW5mbyA9IHBMaW5lLT5tX0xpbmVJbmZvOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pCitib29sIENQREZfVmFyaWFibGVUZXh0OjpHZXRTZWN0aW9uSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1NlY3Rpb25JbmZvICYgc2VjaW5mbykKIHsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgc2VjaW5mbyA9IHBTZWN0aW9uLT5tX1NlY0luZm87Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENQREZfUmVjdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q29udGVudFJlY3QoKSBjb25zdAogewogICAgIHJldHVybiBJblRvT3V0KENQREZfRWRpdENvbnRhaW5lcjo6R2V0Q29udGVudFJlY3QoKSk7CiB9Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRTaXplKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplKQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSkKIHsKICAgICByZXR1cm4gbV9iUmljaFRleHQgJiYgV29yZEluZm8ucFdvcmRQcm9wcyA/IChXb3JkSW5mby5wV29yZFByb3BzLT5uU2NyaXB0VHlwZSA9PSBQVlRXT1JEX1NDUklQVF9OT1JNQUwgfHwgYkZhY3RGb250U2l6ZSA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPmZGb250U2l6ZSA6IFdvcmRJbmZvLnBXb3JkUHJvcHMtPmZGb250U2l6ZSAqIFBWVF9IQUxGKSA6IEdldEZvbnRTaXplKCk7CiB9CkBAIC0xMzkxLDExICsxMzkxLDExIEBACiB7CiAgICAgcmV0dXJuIEdldEZvbnREZXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBmRm9udFNpemUpOwogfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSkKIHsKICAgICByZXR1cm4gR2V0Rm9udEFzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7CiB9Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBib29sIGJGYWN0Rm9udFNpemUpCiB7CiAgICAgcmV0dXJuIEdldEZvbnREZXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBHZXRXb3JkRm9udFNpemUoV29yZEluZm8sIGJGYWN0Rm9udFNpemUpKTsKIH0KQEAgLTE0MjEsNyArMTQyMSw3IEBACiB9CiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhclNlY3Rpb25SaWdodFdvcmRzKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKKyAgICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpOwogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewogICAgICAgICBmb3IgKGludDMyX3QgdyA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgLSAxOyB3ID4gd29yZHBsYWNlLm5Xb3JkSW5kZXg7IHctLSkgewogICAgICAgICAgICAgZGVsZXRlIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KTsKQEAgLTE0MjksMjYgKzE0MjksMjYgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3QKK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiUHJldk9yTmV4dCkgY29uc3QKIHsKICAgICBpZiAocGxhY2UubldvcmRJbmRleCA8IDAgJiYgcGxhY2UubkxpbmVJbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIGJQcmV2T3JOZXh0ID8gR2V0UHJldldvcmRQbGFjZShwbGFjZSkgOiBHZXROZXh0V29yZFBsYWNlKHBsYWNlKTsKICAgICB9CiAgICAgcmV0dXJuIHBsYWNlOwogfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJFbXB0eVNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKK2Jvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCiB7CiAgICAgaWYgKHBsYWNlLm5TZWNJbmRleCA9PSAwICYmIG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgPT0gMCkgewogICAgICAgICAgICAgZGVsZXRlIHBTZWN0aW9uOwogICAgICAgICAgICAgbV9TZWN0aW9uQXJyYXkuUmVtb3ZlQXQocGxhY2UublNlY0luZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyRW1wdHlTZWN0aW9ucyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCiB7CkBAIC0xNDYwLDcgKzE0NjAsNyBAQAogfQogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6TGlua0xhdHRlclNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKIHsKLSAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpOwogICAgIGlmIChDU2VjdGlvbiAqIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKSB7CiAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQob2xkcGxhY2UublNlY0luZGV4KSkgewogICAgICAgICAgICAgZm9yIChpbnQzMl90IHcgPSAwLCBzeiA9IHBOZXh0U2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOyB3IDwgc3o7IHcrKykgewpAQCAtMTQ3Nyw4ICsxNDc3LDggQEAKIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQogewogICAgIENQVlRfV29yZFJhbmdlIE5ld1JhbmdlOwotICAgIE5ld1JhbmdlLkJlZ2luUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuQmVnaW5Qb3MsIFRSVUUpOwotICAgIE5ld1JhbmdlLkVuZFBvcyA9IEFqdXN0TGluZUhlYWRlcihQbGFjZVJhbmdlLkVuZFBvcywgVFJVRSk7CisgICAgTmV3UmFuZ2UuQmVnaW5Qb3MgPSBBanVzdExpbmVIZWFkZXIoUGxhY2VSYW5nZS5CZWdpblBvcywgdHJ1ZSk7CisgICAgTmV3UmFuZ2UuRW5kUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuRW5kUG9zLCB0cnVlKTsKICAgICBmb3IgKGludDMyX3QgcyA9IE5ld1JhbmdlLkVuZFBvcy5uU2VjSW5kZXg7IHMgPj0gTmV3UmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4OyBzLS0pIHsKICAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgewogICAgICAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZHMoTmV3UmFuZ2UpOwpAQCAtMTUwNyw3ICsxNTA3LDcgQEAKIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpDbGVhclJpZ2h0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQogewogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBDUFZUX1dvcmRQbGFjZSByaWdodHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKEdldE5leHRXb3JkUGxhY2UocGxhY2UpLCBGQUxTRSk7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHJpZ2h0cGxhY2UgPSBBanVzdExpbmVIZWFkZXIoR2V0TmV4dFdvcmRQbGFjZShwbGFjZSksIGZhbHNlKTsKICAgICAgICAgaWYgKHJpZ2h0cGxhY2UgIT0gcGxhY2UpIHsKICAgICAgICAgICAgIGlmKHJpZ2h0cGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkgewogICAgICAgICAgICAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKHBsYWNlKTsKQEAgLTE1NjgsOSArMTU2OCw5IEBACiAgICAgfQogICAgIHJldHVybiAoRlhfRkxPQVQpZ0ZvbnRTaXplU3RlcHNbbk1pZF07CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0OjpJc0JpZ2dlcihGWF9GTE9BVCBmRm9udFNpemUpCitib29sCUNQREZfVmFyaWFibGVUZXh0OjpJc0JpZ2dlcihGWF9GTE9BVCBmRm9udFNpemUpCiB7Ci0gICAgRlhfQk9PTCBiQmlnZ2VyID0gIEZBTFNFOworICAgIGJvb2wgYkJpZ2dlciA9ICBmYWxzZTsKICAgICBDUFZUX1NpemUgc3pUb3RhbDsKICAgICBmb3IgKGludDMyX3QgcyA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBzIDwgc3o7IHMrKykgewogICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHMpKSB7CkBAIC0xNTgwLDcgKzE1ODAsNyBAQAogICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoc3pUb3RhbC54LCBHZXRQbGF0ZVdpZHRoKCkpCiAgICAgICAgICAgICAgICAgICAgIHx8IElzRmxvYXRCaWdnZXIoc3pUb3RhbC55LCBHZXRQbGF0ZUhlaWdodCgpKQogICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgYkJpZ2dlciA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkJpZ2dlciA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2NTIsOSArMTY1Miw5IEBACiB7CiAgICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXREZWZhdWx0Rm9udEluZGV4KCkgOiAtMTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHQ6OklzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHQ6OklzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkKIHsKLSAgICByZXR1cm4gbV9wVlRQcm92aWRlciA/IG1fcFZUUHJvdmlkZXItPklzTGF0aW5Xb3JkKHdvcmQpIDogRkFMU0U7CisgICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5Jc0xhdGluV29yZCh3b3JkKSA6IGZhbHNlOwogfQogSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0SXRlcmF0b3IoKQogewpAQCAtMTY4Nyw3MCArMTY4Nyw3MCBAQAogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBtX0N1clBvcyA9IHBsYWNlOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dFdvcmQoKQorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dFdvcmQoKQogewogICAgIGlmIChtX0N1clBvcyA9PSBtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fQ3VyUG9zID0gbV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV9DdXJQb3MpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6UHJldldvcmQoKQorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6UHJldldvcmQoKQogewogICAgIGlmIChtX0N1clBvcyA9PSBtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9DdXJQb3MgPSBtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX0N1clBvcyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0TGluZSgpCitib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0TGluZSgpCiB7CiAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewogICAgICAgICBpZiAobV9DdXJQb3MubkxpbmVJbmRleCA8IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSB7CiAgICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCArIDEsIC0xKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA8IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CiAgICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZMaW5lKCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZMaW5lKCkKIHsKICAgICBpZiAobV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKICAgICAgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPiAwKSB7CiAgICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCAtIDEsIC0xKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA+IDApIHsKICAgICAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBMYXN0U2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXggLSAxKSkgewogICAgICAgICAgICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgcExhc3RTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxLCAtMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRTZWN0aW9uKCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRTZWN0aW9uKCkKIHsKICAgICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZTZWN0aW9uKCkKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZTZWN0aW9uKCkKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA+IDApIHsKICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggLSAxLCAwLCAtMSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgd29yZC5Xb3JkUGxhY2UgPSBtX0N1clBvczsKQEAgLTE3NzAsMTMgKzE3NzAsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd29yZC5uRm9udEluZGV4ID0gbV9wVlQtPkdldFdvcmRGb250SW5kZXgoKnBXb3JkKTsKICAgICAgICAgICAgICAgICB3b3JkLmZGb250U2l6ZSA9IG1fcFZULT5HZXRXb3JkRm9udFNpemUoKnBXb3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0V29yZChjb25zdCBDUFZUX1dvcmQgJiB3b3JkKQorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0V29yZChjb25zdCBDUFZUX1dvcmQgJiB3b3JkKQogewogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CkBAIC0xNzg0LDEyICsxNzg0LDEyIEBACiAgICAgICAgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKICAgICAgICAgICAgICAgICAqcFdvcmQtPnBXb3JkUHJvcHMgPSB3b3JkLldvcmRQcm9wczsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKK2Jvb2wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKIHsKICAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CiAgICAgbGluZS5saW5lcGxhY2UgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXgsIC0xKTsKQEAgLTE4MDIsMTIgKzE4MDIsMTIgQEAKICAgICAgICAgICAgIGxpbmUuZkxpbmVBc2NlbnQgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudDsKICAgICAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OwogICAgICAgICAgICAgbGluZS5saW5lRW5kID0gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6R2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdAorYm9vbAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6R2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdAogewogICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBzZWN0aW9uLnNlY3BsYWNlID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCAwLCAtMSk7CkBAIC0xODE5LDExICsxODE5LDExIEBACiAgICAgICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHMpIHsKICAgICAgICAgICAgIHNlY3Rpb24uV29yZFByb3BzID0gKnBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wczsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pCitib29sCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pCiB7CiAgICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwogICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAgICAgICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHMpIHsKICAgICAgICAgICAgICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHMgPSBzZWN0aW9uLldvcmRQcm9wczsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oIGIvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaAppbmRleCBhNzU0OTBmLi5mYjc5MTBiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvcGRmX3Z0LmgKQEAgLTE5MSw3ICsxOTEsNyBAQAogdGVtcGxhdGU8Y2xhc3MgVFlQRT4gY2xhc3MgQ1BWVF9BcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+CiB7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBJc0VtcHR5KCkKKyAgICBib29sIElzRW1wdHkoKQogICAgIHsKICAgICAgICAgcmV0dXJuIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkgPD0gMDsKICAgICB9CkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlUeXBlc2V0KCk7CiAgICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJQ2hhckFycmF5KCk7CiBwcml2YXRlOgotICAgIHZvaWQJCQkJCQkJCQlTcGxpdExpbmVzKEZYX0JPT0wgYlR5cGVzZXQsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgICAgdm9pZAkJCQkJCQkJCVNwbGl0TGluZXMoYm9vbCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKTsKICAgICB2b2lkCQkJCQkJCQkJT3V0cHV0TGluZXMoKTsKIAogICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCW1fcmNSZXQ7CkBAIC00MjMsMTEgKzQyMywxMSBAQAogICAgIHsKICAgICAgICAgbV9uSG9yelNjYWxlID0gbkhvcnpTY2FsZTsKICAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKQorICAgIHZvaWQJCQkJCQkJCQlTZXRNdWx0aUxpbmUoYm9vbCBiTXVsdGlMaW5lID0gdHJ1ZSkKICAgICB7CiAgICAgICAgIG1fYk11bHRpTGluZSA9IGJNdWx0aUxpbmU7CiAgICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFKQorICAgIHZvaWQJCQkJCQkJCQlTZXRBdXRvUmV0dXJuKGJvb2wgYkF1dG8gPSB0cnVlKQogICAgIHsKICAgICAgICAgbV9iTGltaXRXaWR0aCA9IGJBdXRvOwogICAgIH0KQEAgLTQzOSwxMSArNDM5LDExIEBACiAgICAgewogICAgICAgICBtX25DaGFyQXJyYXkgPSBuQ2hhckFycmF5OwogICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFKQorICAgIHZvaWQJCQkJCQkJCQlTZXRBdXRvRm9udFNpemUoYm9vbCBiQXV0byA9IHRydWUpCiAgICAgewogICAgICAgICBtX2JBdXRvRm9udFNpemUgPSBiQXV0bzsKICAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0KQorICAgIHZvaWQJCQkJCQkJCQlTZXRSaWNoVGV4dChib29sIGJSaWNoVGV4dCkKICAgICB7CiAgICAgICAgIG1fYlJpY2hUZXh0ID0gYlJpY2hUZXh0OwogICAgIH0KQEAgLTQ1MiwxMSArNDUyLDExIEBACiAgICAgICAgIG1fZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOwogICAgIH0KICAgICB2b2lkCQkJCQkJCQkJSW5pdGlhbGl6ZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlJc1ZhbGlkKCkgY29uc3QKKyAgICBib29sCQkJCQkJCQkJSXNWYWxpZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9iSW5pdGlhbDsKICAgICB9Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdAorICAgIGJvb2wJCQkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JSaWNoVGV4dDsKICAgICB9CkBAIC00OTYsNyArNDk2LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX25MaW1pdENoYXI7CiAgICAgfQotICAgIEZYX0JPT0wJCQkJCQkJCQlJc011bHRpTGluZSgpIGNvbnN0CisgICAgYm9vbAkJCQkJCQkJCUlzTXVsdGlMaW5lKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JNdWx0aUxpbmU7CiAgICAgfQpAQCAtNTM3LDI1ICs1MzcsMjUgQEAKICAgICBpbnQzMl90CQkJCQkJCQlHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOwogICAgIGludDMyX3QJCQkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7CiAgICAgaW50MzJfdAkJCQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOworICAgIGJvb2wJCQkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOwogcHJpdmF0ZToKIAogICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pOwogICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUFkZExpbmUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKTsKICAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldExpbmVJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfTGluZUluZm8gJiBsaW5laW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZEZvbnRTaXplKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOworICAgIGJvb2wJCQkJCQkJCQlHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOworICAgIGJvb2wJCQkJCQkJCQlTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOworICAgIGJvb2wJCQkJCQkJCQlHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pOworICAgIGJvb2wJCQkJCQkJCQlHZXRTZWN0aW9uSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1NlY3Rpb25JbmZvICYgc2VjaW5mbyk7CisgICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSA9IGZhbHNlKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZFdpZHRoKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCBXb3JkLCBGWF9XT1JEIFN1YldvcmQsCiAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hhclNwYWNlLCBpbnQzMl90IG5Ib3J6U2NhbGUsCiAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0ZMT0FUIGZXb3JkVGFpbCwgaW50MzJfdCBuV29yZFN0eWxlKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZFdpZHRoKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbyk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOwogICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUgPSBGQUxTRSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOworICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgYm9vbCBiRmFjdEZvbnRTaXplID0gZmFsc2UpOworICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIGJvb2wgYkZhY3RGb250U2l6ZSA9IGZhbHNlKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0TGluZUFzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbyk7CiAgICAgRlhfRkxPQVQJCQkJCQkJCUdldExpbmVEZXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBTZWNJbmZvKTsKICAgICBGWF9GTE9BVAkJCQkJCQkJR2V0Rm9udEFzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CkBAIC01NjgsOCArNTY4LDggQEAKICAgICBpbnQzMl90CQkJCQkJCQlHZXRBbGlnbm1lbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CiAKICAgICB2b2lkCQkJCQkJCQkJQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOworICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUFqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBib29sIGJQcmV2T3JOZXh0KSBjb25zdDsKKyAgICBib29sCQkJCQkJCQkJQ2xlYXJFbXB0eVNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7CiAgICAgdm9pZAkJCQkJCQkJCUNsZWFyRW1wdHlTZWN0aW9ucyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwogICAgIHZvaWQJCQkJCQkJCQlMaW5rTGF0dGVyU2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKICAgICB2b2lkCQkJCQkJCQkJQ2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwpAQCAtNTc4LDcgKzU3OCw3IEBACiBwcml2YXRlOgogICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCVJlYXJyYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwogICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRBdXRvRm9udFNpemUoKTsKLSAgICBGWF9CT09MCQkJCQkJCQkJSXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgICBib29sCQkJCQkJCQkJSXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKTsKICAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlSZWFycmFuZ2VTZWN0aW9ucyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwogcHJpdmF0ZToKICAgICB2b2lkCQkJCQkJCQkJUmVzZXRTZWN0aW9uQXJyYXkoKTsKQEAgLTU4Niw5ICs1ODYsOSBAQAogICAgIENQVlRfQXJyYXlUZW1wbGF0ZTxDU2VjdGlvbio+CQkJbV9TZWN0aW9uQXJyYXk7CiAgICAgaW50MzJfdAkJCQkJCQkJbV9uTGltaXRDaGFyOwogICAgIGludDMyX3QJCQkJCQkJCW1fbkNoYXJBcnJheTsKLSAgICBGWF9CT09MCQkJCQkJCQkJbV9iTXVsdGlMaW5lOwotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JMaW1pdFdpZHRoOwotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JBdXRvRm9udFNpemU7CisgICAgYm9vbAkJCQkJCQkJCW1fYk11bHRpTGluZTsKKyAgICBib29sCQkJCQkJCQkJbV9iTGltaXRXaWR0aDsKKyAgICBib29sCQkJCQkJCQkJbV9iQXV0b0ZvbnRTaXplOwogICAgIGludDMyX3QJCQkJCQkJCW1fbkFsaWdubWVudDsKICAgICBGWF9GTE9BVAkJCQkJCQkJbV9mTGluZUxlYWRpbmc7CiAgICAgRlhfRkxPQVQJCQkJCQkJCW1fZkNoYXJTcGFjZTsKQEAgLTU5Nyw4ICs1OTcsOCBAQAogICAgIEZYX0ZMT0FUCQkJCQkJCQltX2ZGb250U2l6ZTsKIAogcHJpdmF0ZToKLSAgICBGWF9CT09MCQkJCQkJCQkJbV9iSW5pdGlhbDsKLSAgICBGWF9CT09MCQkJCQkJCQkJbV9iUmljaFRleHQ7CisgICAgYm9vbAkJCQkJCQkJCW1fYkluaXRpYWw7CisgICAgYm9vbAkJCQkJCQkJCW1fYlJpY2hUZXh0OwogICAgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyICoJCQltX3BWVFByb3ZpZGVyOwogICAgIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICoJCQltX3BWVEl0ZXJhdG9yOwogfTsKQEAgLTYwNywxNyArNjA3LDE3IEBACiBwdWJsaWM6CiAgICAgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoQ1BERl9WYXJpYWJsZVRleHQgKiBwVlQpOwogICAgIHZpcnR1YWwgfkNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCU5leHRXb3JkKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVByZXZXb3JkKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCU5leHRMaW5lKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVByZXZMaW5lKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uICYgc2VjdGlvbik7CisgICAgYm9vbAkJCQkJCQkJCU5leHRXb3JkKCk7CisgICAgYm9vbAkJCQkJCQkJCVByZXZXb3JkKCk7CisgICAgYm9vbAkJCQkJCQkJCU5leHRMaW5lKCk7CisgICAgYm9vbAkJCQkJCQkJCVByZXZMaW5lKCk7CisgICAgYm9vbAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7CisgICAgYm9vbAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CisgICAgYm9vbAkJCQkJCQkJCVNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCk7CisgICAgYm9vbAkJCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3Q7CisgICAgYm9vbAkJCQkJCQkJCUdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3Q7CisgICAgYm9vbAkJCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3Q7CisgICAgYm9vbAkJCQkJCQkJCVNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uICYgc2VjdGlvbik7CiAgICAgdm9pZAkJCQkJCQkJCVNldEF0KGludDMyX3QgbldvcmRJbmRleCk7CiAgICAgdm9pZAkJCQkJCQkJCVNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwogICAgIGNvbnN0IENQVlRfV29yZFBsYWNlICYJCQkJCUdldEF0KCkgY29uc3QKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oIGIvY29yZS9zcmMvZnBkZmRvYy90YWdnZWRfaW50LmgKaW5kZXggOWM2NDNhNi4uMTI3OTYxNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy90YWdnZWRfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmRvYy90YWdnZWRfaW50LmgKQEAgLTI2LDcgKzI2LDcgQEAKICAgICB2b2lkCQlMb2FkRG9jVHJlZSgpOwogICAgIHZvaWQJCUxvYWRQYWdlVHJlZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCk7CiAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogQWRkUGFnZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCwgQ0ZYX01hcFB0clRvUHRyJiBtYXAsIGludCBuTGV2ZWwgPSAwKTsKLSAgICBGWF9CT09MCQlBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpOworICAgIGJvb2wJCUFkZFRvcExldmVsTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwRWxlbWVudCk7CiBwcm90ZWN0ZWQ6CiAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KgltX3BUcmVlUm9vdDsKICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqCW1fcFJvbGVNYXA7CkBAIC02NywxNiArNjcsMTYgQEAKICAgICAgICAgcmV0dXJuICZtX09iamVjdEFycmF5OwogICAgIH0KIAotICAgIENQREZfT2JqZWN0KgkJCUdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBGWF9GTE9BVCBmTGV2ZWwgPSAwLjBGKTsKKyAgICBDUERGX09iamVjdCoJCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgRlhfRkxPQVQgZkxldmVsID0gMC4wRik7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKLSAgICBGWF9BUkdCCQkJCQlHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpOwotICAgIEZYX0ZMT0FUCQkJCUdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKLSAgICBpbnQJCQkJCQlHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKKyAgICBDRlhfQnl0ZVN0cmluZwkJCUdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKTsKKyAgICBGWF9BUkdCCQkJCQlHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwgaW50IHN1YmluZGV4ID0gLTEpOworICAgIEZYX0ZMT0FUCQkJCUdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKTsKKyAgICBpbnQJCQkJCQlHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsIGludCBzdWJpbmRleCA9IC0xKTsKICAgICBDRlhfUHRyQXJyYXkJCQltX09iamVjdEFycmF5OwogICAgIHZvaWQJCQkJCUxvYWRLaWRzKENQREZfRGljdGlvbmFyeSogcERpY3QpOwogICAgIHZvaWQJCQkJCUxvYWRLaWQoRlhfRFdPUkQgUGFnZU9iak51bSwgQ1BERl9PYmplY3QqIHBPYmosIENQREZfU3RydWN0S2lkKiBwS2lkKTsKLSAgICBDUERGX09iamVjdCoJCQlHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCk7CisgICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGJvb2wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpOwogICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqCVJldGFpbigpOwogICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwCmluZGV4IDcyMDNhNjkuLjdkNzI4YTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcApAQCAtMjg5LDcgKzI4OSw3IEBACiB9CiB2b2lkIE5vcm1hbGl6ZUNvbXBvc2l0ZUNoYXIoRlhfV0NIQVIgd0NoYXIsIENGWF9XaWRlU3RyaW5nJiBzRGVzdCkKIHsKLSAgICB3Q2hhciA9IEZYX0dldE1pcnJvckNoYXIod0NoYXIsIFRSVUUsIEZBTFNFKTsKKyAgICB3Q2hhciA9IEZYX0dldE1pcnJvckNoYXIod0NoYXIsIHRydWUsIGZhbHNlKTsKICAgICBGWF9XQ0hBUiogcERzdCA9IE5VTEw7CiAgICAgRlhfU1RSU0laRSBuQ291bnQgPSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwogICAgIGlmIChuQ291bnQgPCAxICkgewpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgQ0ZYX1dpZGVTdHJpbmcgc0J1ZmZlcjsKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SUZYX0JpZGlDaGFyPiBwQmlkaUNoYXIoSUZYX0JpZGlDaGFyOjpDcmVhdGUoKSk7CiAgICAgQ0ZYX1dvcmRBcnJheSBvcmRlcjsKLSAgICBGWF9CT09MIGJSMkwgPSBGQUxTRTsKKyAgICBib29sIGJSMkwgPSBmYWxzZTsKICAgICBpbnQzMl90IHN0YXJ0ID0gMCwgY291bnQgPSAwLCBpID0gMDsKICAgICBpbnQgblIyTCA9IDAsIG5MMlIgPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkrKykgewpAQCAtMzQzLDcgKzM0Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7Ci0gICAgICAgIGJSMkwgPSBUUlVFOworICAgICAgICBiUjJMID0gdHJ1ZTsKICAgICB9CiAgICAgaWYoYlIyTCkgewogICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CkBAIC0zNTcsNyArMzU3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGkgPSBqOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bWJvbCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJvb2wgYlN5bWJvbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHdoaWxlKGkgPiAwICYmIG9yZGVyLkdldEF0KGkpICE9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgYlN5bWJvbCA9ICFvcmRlci5HZXRBdChpKTsKICAgICAgICAgICAgICAgICAgICAgaSAtPSAzOwpAQCAtMzg5LDcgKzM4OSw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIEZYX0JPT0wgYkwyUiA9IEZBTFNFOworICAgICAgICBib29sIGJMMlIgPSBmYWxzZTsKICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IGNvdW50OyBqICs9IDMpIHsKICAgICAgICAgICAgIGludCByZXQgPSBvcmRlci5HZXRBdChqICsgMik7CiAgICAgICAgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChqKTsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZihpID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgaiA9IC0zOwotICAgICAgICAgICAgICAgICAgICBiTDJSID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkwyUiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQgZW5kID0gc3RyLkdldExlbmd0aCgpIC0gMTsKQEAgLTQyNywxNSArNDI3LDE1IEBACiAgICAgc3RyLkVtcHR5KCk7CiAgICAgc3RyICs9IHNCdWZmZXI7CiB9Ci1zdGF0aWMgRlhfQk9PTCBJc051bWJlcihDRlhfV2lkZVN0cmluZyYgc3RyKQorc3RhdGljIGJvb2wgSXNOdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSArKykgewogICAgICAgICBGWF9XQ0hBUiBjaCA9IHN0cltpXTsKICAgICAgICAgaWYgKChjaCA8ICcwJyB8fCBjaCA+ICc5JykgJiYgY2ggIT0gJy0nICYmIGNoICE9ICcrJyAmJiBjaCAhPSAnLicgJiYgY2ggIT0gJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENUZXh0UGFnZTo6RmluZENvbHVtbnMoKQogewpAQCAtNTM0LDE4ICs1MzQsMTggQEAKICAgICBwVGV4dC0+bV9wQ29sdW1uID0gTlVMTDsKICAgICBtX1RleHRMaXN0Lkluc2VydEF0KGksIHBUZXh0KTsKIH0KLUZYX0JPT0wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsIEZYX0ZMT0FUIGhpZ2gxLCBGWF9GTE9BVCBsb3cyLCBGWF9GTE9BVCBoaWdoMiwKK2Jvb2wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsIEZYX0ZMT0FUIGhpZ2gxLCBGWF9GTE9BVCBsb3cyLCBGWF9GTE9BVCBoaWdoMiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmxvdywgRlhfRkxPQVQmIGludGVyaGlnaCk7Ci1GWF9CT09MIENUZXh0QmFzZUxpbmU6OkNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikKK2Jvb2wgQ1RleHRCYXNlTGluZTo6Q2FuTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKQogewogICAgIEZYX0ZMT0FUIGludGVyX3RvcCwgaW50ZXJfYm90dG9tOwogICAgIGlmICghR2V0SW50ZXJzZWN0aW9uKG1fQm90dG9tLCBtX1RvcCwgcE90aGVyLT5tX0JvdHRvbSwgcE90aGVyLT5tX1RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcl9ib3R0b20sIGludGVyX3RvcCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0ZMT0FUIGludGVyX2ggPSBpbnRlcl90b3AgLSBpbnRlcl9ib3R0b207CiAgICAgaWYgKGludGVyX2ggPCAobV9Ub3AgLSBtX0JvdHRvbSkgLyAyICYmIGludGVyX2ggPCAocE90aGVyLT5tX1RvcCAtIHBPdGhlci0+bV9Cb3R0b20pIC8gMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRkxPQVQgZHkgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhtX0Jhc2VMaW5lIC0gcE90aGVyLT5tX0Jhc2VMaW5lKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7CkBAIC01NjMsMTEgKzU2MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGR5ID49IChwVGV4dC0+bV9Cb3R0b20gLSBwVGV4dC0+bV9Ub3ApIC8gMiB8fAogICAgICAgICAgICAgICAgICAgICBkeSA+PSAocE90aGVyVGV4dC0+bV9Cb3R0b20gLSBwT3RoZXJUZXh0LT5tX1RvcCkgLyAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ1RleHRCYXNlTGluZTo6TWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKQogewpAQCAtNTc3LDcgKzU3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgcFRleHQtPm1fU3BhY2VXaWR0aCwgcFRleHQtPm1fRm9udFNpemVWLCBwVGV4dC0+bV9UZXh0KTsKICAgICB9CiB9Ci1GWF9CT09MIENUZXh0QmFzZUxpbmU6OkdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCkKK2Jvb2wgQ1RleHRCYXNlTGluZTo6R2V0V2lkdGgoRlhfRkxPQVQmIGxlZnR4LCBGWF9GTE9BVCYgcmlnaHR4KQogewogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewpAQCAtNTg3LDcgKzU4Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGkgPT0gbV9UZXh0TGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKICAgICBsZWZ0eCA9IHBUZXh0LT5tX0xlZnQ7CkBAIC01OTksNyArNTk5LDcgQEAKICAgICB9CiAgICAgcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7CiAgICAgcmlnaHR4ID0gcFRleHQtPm1fUmlnaHQ7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlQm94ZXMoKQogewpAQCAtNzI0LDggKzcyNCw4IEBACiAgICAgQ1BERl9QYWdlIHBhZ2U7CiAgICAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKICAgICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOwotICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7CisgICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IHRydWU7CisgICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBmYWxzZTsKICAgICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBwYWdlX2Jib3ggPSBwYWdlLkdldFBhZ2VCQm94KCk7CiAgICAgaWYgKGZsYWdzICYgUERGMlRYVF9BVVRPX1JPVEFURSkgewpAQCAtNzM0LDcgKzczNCw3IEBACiAgICAgQ1RleHRQYWdlIHRleHRzOwogICAgIHRleHRzLm1fYkF1dG9XaWR0aCA9IGZsYWdzICYgUERGMlRYVF9BVVRPX1dJRFRIOwogICAgIHRleHRzLm1fYktlZXBDb2x1bW4gPSBmbGFncyAmIFBERjJUWFRfS0VFUF9DT0xVTU47Ci0gICAgdGV4dHMubV9iQnJlYWtTcGFjZSA9IFRSVUU7CisgICAgdGV4dHMubV9iQnJlYWtTcGFjZSA9IHRydWU7CiAgICAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CiAgICAgd2hpbGUgKHBvcykgewogICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmplY3QgPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKQEAgLTc2Myw3ICs3NjMsNyBAQAogICAgICAgICBsaW5lcy5BZGQoc3RyKTsKICAgICB9CiB9Ci1leHRlcm4gdm9pZCBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsIEZYX0JPT0wgYlVzZUxGLAorZXh0ZXJuIHZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBib29sIGJVc2VMRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcE9iakFycmF5KTsKIHZvaWQgUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwgRlhfRFdPUkQgZmxhZ3MpCiB7CkBAIC03NzEsOCArNzcxLDggQEAKICAgICBDUERGX1BhZ2UgcGFnZTsKICAgICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOwogICAgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7Ci0gICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKKyAgICBvcHRpb25zLm1fYlRleHRPbmx5ID0gdHJ1ZTsKKyAgICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IGZhbHNlOwogICAgIHBhZ2UuUGFyc2VDb250ZW50KCZvcHRpb25zKTsKLSAgICBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShidWZmZXIsICZwYWdlLCBUUlVFLCBOVUxMKTsKKyAgICBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShidWZmZXIsICZwYWdlLCB0cnVlLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludC5jcHAKaW5kZXggYzFhYWFkOC4uZjc3N2EzZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludC5jcHAKQEAgLTE5LDEwICsxOSwxMCBAQAogCiBuYW1lc3BhY2UgewogCi1GWF9CT09MIF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKEZYX1dDSEFSIGN1ckNoYXIpCitib29sIF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKEZYX1dDSEFSIGN1ckNoYXIpCiB7CiAgICAgaWYoY3VyQ2hhciA8IDI1NSApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICggKGN1ckNoYXIgPj0gMHgwNjAwICYmIGN1ckNoYXIgPD0gMHgwNkZGKQogICAgICAgICAgICAgfHwgKGN1ckNoYXIgPj0gMHhGRTcwICYmIGN1ckNoYXIgPD0gMHhGRUZGKQpAQCAtMzMsOSArMzMsOSBAQAogICAgICAgICAgICAgfHwgKGN1ckNoYXIgPj0gMHgyREUwICYmIGN1ckNoYXIgPD0gMHgyREZGKQogICAgICAgICAgICAgfHwgY3VyQ2hhciA9PSA4NDY3CiAgICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDIwMDAgJiYgY3VyQ2hhciA8PSAweDIwNkYpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogRlhfRkxPQVQgX05vcm1hbGl6ZVRocmVzaG9sZChGWF9GTE9BVCB0aHJlc2hvbGQpCkBAIC01OCw3ICs1OCw3IEBACiAgICAgRlhfRkxPQVQgYmFzZVNwYWNlID0gMC4wOwogICAgIGNvbnN0IGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwogICAgIGlmIChwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fQ2hhclNwYWNlICYmIG5JdGVtcyA+PSAzKSB7Ci0gICAgICAgIEZYX0JPT0wgYkFsbENoYXIgPSBUUlVFOworICAgICAgICBib29sIGJBbGxDaGFyID0gdHJ1ZTsKICAgICAgICAgRlhfRkxPQVQgc3BhY2luZyA9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZSgKICAgICAgICAgICAgIHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2UpOwogICAgICAgICBiYXNlU3BhY2UgPSBzcGFjaW5nOwpAQCAtNjksNyArNjksNyBAQAogICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CiAgICAgICAgICAgICAgICAgRlhfRkxPQVQga2VybmluZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpblggLyAxMDAwOwogICAgICAgICAgICAgICAgIGJhc2VTcGFjZSA9IHN0ZDo6bWluKGJhc2VTcGFjZSwga2VybmluZyArIHNwYWNpbmcpOwotICAgICAgICAgICAgICAgIGJBbGxDaGFyID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkFsbENoYXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYmFzZVNwYWNlIDwgMC4wIHx8IChuSXRlbXMgPT0gMyAmJiAhYkFsbENoYXIpKSB7CkBAIC04Miw3ICs4Miw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogQ1BERlRleHRfUGFyc2VPcHRpb25zOjpDUERGVGV4dF9QYXJzZU9wdGlvbnMoKQotICAgIDogbV9iR2V0Q2hhckNvZGVPbmx5KEZBTFNFKSwgbV9iTm9ybWFsaXplT2JqcyhUUlVFKSwgbV9iT3V0cHV0SHlwaGVuKEZBTFNFKQorICAgIDogbV9iR2V0Q2hhckNvZGVPbmx5KGZhbHNlKSwgbV9iTm9ybWFsaXplT2Jqcyh0cnVlKSwgbV9iT3V0cHV0SHlwaGVuKGZhbHNlKQogewogfQogSVBERl9UZXh0UGFnZSogSVBERl9UZXh0UGFnZTo6Q3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICA6IG1fY2hhckxpc3QoNTEyKSwKICAgICAgIG1fVGVtcENoYXJMaXN0KDUwKSwKICAgICAgIG1fcFByZVRleHRPYmooTlVMTCksCi0gICAgICBtX0lzUGFyc2VyZWQoRkFMU0UpLAorICAgICAgbV9Jc1BhcnNlcmVkKGZhbHNlKSwKICAgICAgIG1fVGV4dGxpbmVEaXIoLTEpLAogICAgICAgbV9DdXJsaW5lUmVjdCgwLCAwLCAwLCAwKQogewpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgLCBtX2NoYXJMaXN0KDUxMikKICAgICAsIG1fVGVtcENoYXJMaXN0KDUwKQogICAgICwgbV9wUHJlVGV4dE9iaihOVUxMKQotICAgICwgbV9Jc1BhcnNlcmVkKEZBTFNFKQorICAgICwgbV9Jc1BhcnNlcmVkKGZhbHNlKQogICAgICwgbV9UZXh0bGluZURpcigtMSkKICAgICAsIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkKIHsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIDogbV9jaGFyTGlzdCg1MTIpLAogICAgICAgbV9UZW1wQ2hhckxpc3QoNTApLAogICAgICAgbV9wUHJlVGV4dE9iaihOVUxMKSwKLSAgICAgIG1fSXNQYXJzZXJlZChGQUxTRSksCisgICAgICBtX0lzUGFyc2VyZWQoZmFsc2UpLAogICAgICAgbV9UZXh0bGluZURpcigtMSksCiAgICAgICBtX0N1cmxpbmVSZWN0KDAsIDAsIDAsIDApCiB7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBDRlhfRmxvYXRSZWN0IHBhZ2VSZWN0ID0gcFBhZ2UtPkNhbGNCb3VuZGluZ0JveCgpOwogICAgIG1fRGlzcGxheU1hdHJpeCA9IENGWF9BZmZpbmVNYXRyaXgoMSwgMCwgMCwgLTEsIHBhZ2VSZWN0LnJpZ2h0LCBwYWdlUmVjdC50b3ApOwogfQotdm9pZCBDUERGX1RleHRQYWdlOjpOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSkKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6Tm9ybWFsaXplT2JqZWN0cyhib29sIGJOb3JtYWxpemUpCiB7CiAgICAgbV9QYXJzZU9wdGlvbnMubV9iTm9ybWFsaXplT2JqcyA9IGJOb3JtYWxpemU7CiB9CkBAIC0xNzcsMTggKzE3NywxOCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6UGFyc2VUZXh0UGFnZSgpCitib29sIENQREZfVGV4dFBhZ2U6OlBhcnNlVGV4dFBhZ2UoKQogewogICAgIGlmICghbV9wUGFnZSkgewotICAgICAgICBtX0lzUGFyc2VyZWQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBtX0lzUGFyc2VyZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX0lzUGFyc2VyZWQgPSBGQUxTRTsKKyAgICBtX0lzUGFyc2VyZWQgPSBmYWxzZTsKICAgICBtX1RleHRCdWYuQ2xlYXIoKTsKICAgICBtX2NoYXJMaXN0LlJlbW92ZUFsbCgpOwogICAgIG1fcFByZVRleHRPYmogPSBOVUxMOwogICAgIFByb2Nlc3NPYmplY3QoKTsKLSAgICBtX0lzUGFyc2VyZWQgPSBUUlVFOworICAgIG1fSXNQYXJzZXJlZCA9IHRydWU7CiAgICAgaWYoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewogICAgICAgICBtX0NoYXJJbmRleC5SZW1vdmVBbGwoKTsKICAgICAgICAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwpAQCAtMTk3LDE1ICsxOTcsMTUgQEAKICAgICAgICAgfQogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJOb3JtYWwgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYk5vcm1hbCA9IGZhbHNlOwogICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChpKTsKICAgICAgICAgICAgIGlmKGNoYXJpbmZvLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCkgewotICAgICAgICAgICAgICAgIGJOb3JtYWwgPSBUUlVFOworICAgICAgICAgICAgICAgIGJOb3JtYWwgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZihjaGFyaW5mby5tX1VuaWNvZGUgPT0gMCB8fCBJc0NvbnRyb2xDaGFyKGNoYXJpbmZvKSkKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYk5vcm1hbCA9IGZhbHNlOwogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYk5vcm1hbCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihiTm9ybWFsKSB7CiAgICAgICAgICAgICAgICAgaWYoaW5kZXhTaXplICUgMikgewpAQCAtMjMyLDcgKzIzMiw3IEBACiAgICAgICAgICAgICBtX0NoYXJJbmRleC5SZW1vdmVBdChpbmRleFNpemUgLSAxKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGludAlDUERGX1RleHRQYWdlOjpDb3VudENoYXJzKCkgY29uc3QKIHsKQEAgLTI4Myw3ICsyODMsNyBAQAogICAgIENQREZfVGV4dE9iamVjdCoJcEN1ck9iaiA9IE5VTEw7CiAgICAgQ0ZYX0Zsb2F0UmVjdAkJcmVjdDsKICAgICBpbnQJCQkJCWN1clBvcyA9IHN0YXJ0OwotICAgIEZYX0JPT0wJCQkJZmxhZ05ld1JlY3QgPSBUUlVFOworICAgIGJvb2wJCQkJZmxhZ05ld1JlY3QgPSB0cnVlOwogICAgIGlmIChuQ291bnQgKyBzdGFydCA+IG1fY2hhckxpc3QuR2V0U2l6ZSgpIHx8IG5Db3VudCA9PSAtMSkgewogICAgICAgICBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKSAtIHN0YXJ0OwogICAgIH0KQEAgLTMwMSw3ICszMDEsNyBAQAogICAgICAgICBpZiAocEN1ck9iaiAhPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iaikgewogICAgICAgICAgICAgcmVjdEFycmF5LkFkZChyZWN0KTsKICAgICAgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKLSAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZmxhZ05ld1JlY3QpIHsKICAgICAgICAgICAgIEZYX0ZMT0FUIG9yZ1ggPSBpbmZvX2N1cmNoYXIubV9PcmlnaW5YLCBvcmdZID0gaW5mb19jdXJjaGFyLm1fT3JpZ2luWTsKQEAgLTMyNiw3ICszMjYsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZWN0LnRvcCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBGQUxTRTsKKyAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gZmFsc2U7CiAgICAgICAgICAgICByZWN0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveDsKICAgICAgICAgICAgIHJlY3QuTm9ybWFsaXplKCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zOTksOCArMzk5LDggQEAKICAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CiAgICAgaW50IHBvcyA9IDA7CiAgICAgRlhfRkxPQVQgcG9zeSA9IDA7Ci0gICAgRlhfQk9PTCBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7Ci0gICAgRlhfQk9PTAlJU0FkZExpbmVGZWVkID0gRkFMU0U7CisgICAgYm9vbCBJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7CisgICAgYm9vbAlJU0FkZExpbmVGZWVkID0gZmFsc2U7CiAgICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewogICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcysrKTsKICAgICAgICAgaWYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpKSB7CkBAIC00MTAsMjAgKzQxMCwyMCBAQAogICAgICAgICAgICAgICAgICAgICBzdHJUZXh0ICs9IEwiXHJcbiI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IFRSVUU7Ci0gICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gRkFMU0U7CisgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gdHJ1ZTsKKyAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChjaGFyaW5mby5tX1VuaWNvZGUpIHsKICAgICAgICAgICAgICAgICBzdHJUZXh0ICs9IGNoYXJpbmZvLm1fVW5pY29kZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjaGFyaW5mby5tX1VuaWNvZGUgPT0gMzIpIHsKICAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyICYmIGNoYXJpbmZvLm1fVW5pY29kZSkgewogICAgICAgICAgICAgICAgIHN0clRleHQgKz0gY2hhcmluZm8ubV9Vbmljb2RlOwotICAgICAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IGZhbHNlOworICAgICAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBUUlVFOworICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IGZhbHNlOworICAgICAgICAgICAgSVNBZGRMaW5lRmVlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0clRleHQ7CkBAIC00MzcsNyArNDM3LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0CQljdXJSZWN0OwotICAgIEZYX0JPT0wJCQkJZmxhZ05ld1JlY3QgPSBUUlVFOworICAgIGJvb2wJCQkJZmxhZ05ld1JlY3QgPSB0cnVlOwogICAgIENQREZfVGV4dE9iamVjdCoJcEN1ck9iaiA9IE5VTEw7CiAgICAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIGludCBwb3MgPSAwOwpAQCAtNDUzLDExICs0NTMsMTEgQEAKICAgICAgICAgICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7CiAgICAgICAgICAgICAgICAgcmVzUmVjdEFycmF5LkFkZChjdXJSZWN0KTsKICAgICAgICAgICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7Ci0gICAgICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmbGFnTmV3UmVjdCkgewogICAgICAgICAgICAgICAgIGN1clJlY3QgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94OwotICAgICAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBjdXJSZWN0Lk5vcm1hbGl6ZSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbmZvX2N1cmNoYXIubV9DaGFyQm94Lk5vcm1hbGl6ZSgpOwpAQCAtNjI2LDEzICs2MjYsMTMgQEAKICAgICByaWdodCA9IG1fU2VsUmVjdHMuR2V0QXQocmVjdEluZGV4KS5yaWdodDsKICAgICBib3R0b20gPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkuYm90dG9tOwogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKQorYm9vbCBDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKQogewogICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoZW5kID09IHN0YXJ0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9GTE9BVCBkeCwgZHk7CiAgICAgRlBERl9DSEFSX0lORk8gaW5mbzEsIGluZm8yOwpAQCAtNjQxLDcgKzY0MSw3IEBACiAgICAgd2hpbGUoaW5mbzIubV9DaGFyQm94LldpZHRoKCkgPT0gMCB8fCBpbmZvMi5tX0NoYXJCb3guSGVpZ2h0KCkgPT0gMCkgewogICAgICAgICBlbmQtLTsKICAgICAgICAgaWYoZW5kIDw9IHN0YXJ0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgR2V0Q2hhckluZm8oZW5kLCBpbmZvMik7CiAgICAgfQpAQCAtNjY0LDE2ICs2NjQsMTYgQEAKICAgICB9IGVsc2UgaWYoUm90YXRlID4gMCkgewogICAgICAgICBSb3RhdGUgPSAzNjAgLSBSb3RhdGU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0ICwgaW50JiBSb3RhdGUpCitib29sCUNQREZfVGV4dFBhZ2U6OkdldEJhc2VsaW5lUm90YXRlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QgLCBpbnQmIFJvdGF0ZSkKIHsKICAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGludCBzdGFydCwgZW5kLCBjb3VudCwgbiA9IENvdW50Qm91bmRlZFNlZ21lbnRzKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBUUlVFKTsKKyAgICBpbnQgc3RhcnQsIGVuZCwgY291bnQsIG4gPSBDb3VudEJvdW5kZWRTZWdtZW50cyhyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgdHJ1ZSk7CiAgICAgaWYobiA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmKG4gPiAxKSB7CiAgICAgICAgIEdldEJvdW5kZWRTZWdtZW50KG4gLSAxLCBzdGFydCwgY291bnQpOwpAQCAtNjg1LDE4ICs2ODUsMTggQEAKICAgICB9CiAgICAgcmV0dXJuIEdldEJhc2VsaW5lUm90YXRlKHN0YXJ0LCBlbmQsIFJvdGF0ZSk7CiB9Ci1GWF9CT09MCUNQREZfVGV4dFBhZ2U6OkdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKQorYm9vbAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkKIHsKICAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghbV9Jc1BhcnNlcmVkIHx8IHJlY3RJbmRleCA8IDAgfHwgcmVjdEluZGV4ID4gbV9TZWxSZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IG1fU2VsUmVjdHMuR2V0QXQocmVjdEluZGV4KTsKICAgICByZXR1cm4gR2V0QmFzZWxpbmVSb3RhdGUocmVjdCAsIFJvdGF0ZSk7CiB9Ci1pbnQJQ1BERl9UZXh0UGFnZTo6Q291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyApCitpbnQJQ1BERl9UZXh0UGFnZTo6Q291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBib29sIGJDb250YWlucyApCiB7CiAgICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTcxMiw4ICs3MTIsOCBAQAogICAgIEZQREZfU0VHTUVOVAlzZWdtZW50OwogICAgIHNlZ21lbnQubV9TdGFydCA9IDA7CiAgICAgc2VnbWVudC5tX25Db3VudCA9IDA7Ci0gICAgRlhfQk9PTAkJc2VnbWVudFN0YXR1cyA9IDA7Ci0gICAgRlhfQk9PTAkJSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICAgIGJvb2wJCXNlZ21lbnRTdGF0dXMgPSAwOworICAgIGJvb2wJCUlzQ29udGFpblByZUNoYXIgPSBmYWxzZTsKICAgICB3aGlsZSAocG9zIDwgbkNvdW50KSB7CiAgICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQocG9zKTsKICAgICAgICAgaWYoYkNvbnRhaW5zICYmIHJlY3QuQ29udGFpbnMoY2hhcmluZm8ubV9DaGFyQm94KSkgewpAQCAtNzI0LDcgKzcyNCw3IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewogICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOworICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoIWJDb250YWlucyAmJiAoSXNSZWN0SW50ZXJzZWN0KHJlY3QsIGNoYXJpbmZvLm1fQ2hhckJveCkgfHwgcmVjdC5Db250YWlucyhjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSkpKSB7CiAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAwIHx8IHNlZ21lbnRTdGF0dXMgPT0gMikgewogICAgICAgICAgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IHBvczsKQEAgLTczMyw5ICs3MzMsOSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gVFJVRTsKKyAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAzMikgewotICAgICAgICAgICAgaWYgKElzQ29udGFpblByZUNoYXIgPT0gVFJVRSkgeworICAgICAgICAgICAgaWYgKElzQ29udGFpblByZUNoYXIgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IHBvczsKICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7CkBAIC03NDMsNyArNzQzLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDI7CkBAIC03NTksNyArNzU5LDcgQEAKICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwogICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBvcysrOwogICAgIH0KQEAgLTEwNTMsNyArMTA1Myw3IEBACiAgICAgUEFHRUNIQVJfSU5GTyBJbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChpKTsKICAgICBpZighSXNDb250cm9sQ2hhcihJbmZvKSkgewogICAgICAgICBJbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIEZYX1dDSEFSIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcihzdHIuR2V0QXQoaSksIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHN0ci5HZXRBdChpKSwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICBGWF9XQ0hBUiogcERzdCA9IE5VTEw7CiAgICAgICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKICAgICAgICAgaWYgKG5Db3VudCA+PSAxKSB7CkBAIC0xMDg5LDEwICsxMDg5LDEwIEBACiAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPElGWF9CaWRpQ2hhcj4gcEJpZGlDaGFyKElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCkpOwogICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOwogICAgIENGWF9Xb3JkQXJyYXkgb3JkZXI7Ci0gICAgRlhfQk9PTCBiUjJMID0gRkFMU0U7CisgICAgYm9vbCBiUjJMID0gZmFsc2U7CiAgICAgaW50MzJfdCBzdGFydCA9IDAsIGNvdW50ID0gMDsKICAgICBpbnQgblIyTCA9IDAsIG5MMlIgPSAwOwotICAgIEZYX0JPT0wgYlByZXZTcGFjZSA9IEZBTFNFOworICAgIGJvb2wgYlByZXZTcGFjZSA9IGZhbHNlOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKICAgICAgICAgaWYoc3RyLkdldEF0KGkpID09IDMyKSB7CiAgICAgICAgICAgICBpZihiUHJldlNwYWNlKSB7CkBAIC0xMTAzLDkgKzExMDMsOSBAQAogICAgICAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJQcmV2U3BhY2UgPSBUUlVFOworICAgICAgICAgICAgYlByZXZTcGFjZSA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiUHJldlNwYWNlID0gRkFMU0U7CisgICAgICAgICAgICBiUHJldlNwYWNlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYocEJpZGlDaGFyLT5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSkpIHsKICAgICAgICAgICAgIGludDMyX3QgcmV0ID0gcEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwpAQCAtMTEzNSw3ICsxMTM1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZihuUjJMID4gMCAmJiBuUjJMID49IG5MMlIpIHsKLSAgICAgICAgYlIyTCA9IFRSVUU7CisgICAgICAgIGJSMkwgPSB0cnVlOwogICAgIH0KICAgICBpZiAobV9wYXJzZXJmbGFnID09IEZQREZURVhUX1JMVEIgfHwgYlIyTCkgewogICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CkBAIC0xMTQ5LDcgKzExNDksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IGogPSBpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bWJvbCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJvb2wgYlN5bWJvbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHdoaWxlKGogPiAwICYmIG9yZGVyLkdldEF0KGopICE9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgYlN5bWJvbCA9ICFvcmRlci5HZXRBdChqKTsKICAgICAgICAgICAgICAgICAgICAgaiAtPSAzOwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBjb3VudCA9IG9yZGVyLkdldFNpemUoKTsKLSAgICAgICAgRlhfQk9PTCBiTDJSID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkwyUiA9IGZhbHNlOwogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMykgewogICAgICAgICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGkgKyAyKTsKICAgICAgICAgICAgIGludCBzdGFydCA9IG9yZGVyLkdldEF0KGkpOwpAQCAtMTE5Nyw3ICsxMTk3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYoaiA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIGkgPSAtMzsKLSAgICAgICAgICAgICAgICAgICAgYkwyUiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJMMlIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50IGVuZCA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDE7CkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgYWN0VGV4dDsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7CiAgICAgaW50IG4gPSAwOwogICAgIGZvciAobiA9IDA7IG4gPCBuQ29udGVudE1hcms7IG4rKykgewpAQCAtMTMxNiw3ICsxMzE2LDcgQEAKICAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilpdGVtLkdldFBhcmFtKCk7CiAgICAgICAgIENQREZfU3RyaW5nKiB0ZW1wID0gKENQREZfU3RyaW5nKikocERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWN0dWFsVGV4dCIpKSA6IE5VTEwpOwogICAgICAgICBpZiAodGVtcCkgewotICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJFeGlzdCA9IHRydWU7CiAgICAgICAgICAgICBhY3RUZXh0ID0gdGVtcC0+R2V0VW5pY29kZVRleHQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzMzgsMjQgKzEzMzgsMjQgQEAKICAgICBpZiAobkl0ZW1zIDwgMSkgewogICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKICAgICB9Ci0gICAgYkV4aXN0ID0gRkFMU0U7CisgICAgYkV4aXN0ID0gZmFsc2U7CiAgICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBhY3RUZXh0LkdldEF0KGkpOwogICAgICAgICBpZiAoLTEgPT0gcEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod0NoYXIpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICBiRXhpc3QgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFiRXhpc3QpIHsKICAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CiAgICAgfQotICAgIGJFeGlzdCA9IEZBTFNFOworICAgIGJFeGlzdCA9IGZhbHNlOwogICAgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CiAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gYWN0VGV4dC5HZXRBdChpKTsKICAgICAgICAgaWYgKCh3Q2hhciA+IDB4ODAgJiYgd0NoYXIgPCAweEZGRkQpIHx8ICh3Q2hhciA8PSAweDgwICYmIGlzcHJpbnQod0NoYXIpKSkgewotICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJFeGlzdCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTE1MzksOCArMTUzOSw4IEBACiAgICAgaW50IG5JdGVtcyA9IHBUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CiAgICAgRlhfRkxPQVQgYmFzZVNwYWNlID0gX0NhbGN1bGF0ZUJhc2VTcGFjZShwVGV4dE9iaiwgbWF0cml4KTsKIAotICAgIGNvbnN0IEZYX0JPT0wgYlIyTCA9IElzUmlnaHRUb0xlZnQocFRleHRPYmosIHBGb250LCBuSXRlbXMpOwotICAgIGNvbnN0IEZYX0JPT0wgYklzQmlkaUFuZE1pcnJvckludmVyc2UgPQorICAgIGNvbnN0IGJvb2wgYlIyTCA9IElzUmlnaHRUb0xlZnQocFRleHRPYmosIHBGb250LCBuSXRlbXMpOworICAgIGNvbnN0IGJvb2wgYklzQmlkaUFuZE1pcnJvckludmVyc2UgPQogICAgICAgICBiUjJMICYmIChtYXRyaXguYSAqIG1hdHJpeC5kIC0gbWF0cml4LmIgKiBtYXRyaXguYykgPCAwOwogICAgIGludDMyX3QgaUJ1ZlN0YXJ0QXBwZW5kID0gbV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKICAgICBpbnQzMl90IGlDaGFyTGlzdFN0YXJ0QXBwZW5kID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwpAQCAtMTYwOSw3ICsxNjA5LDcgQEAKICAgICAgICAgfQogICAgICAgICBzcGFjaW5nID0gMDsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOwotICAgICAgICBGWF9CT09MIGJOb1VuaWNvZGUgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiTm9Vbmljb2RlID0gZmFsc2U7CiAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gd3N0ckl0ZW0uR2V0QXQoMCk7CiAgICAgICAgIGlmICgod3N0ckl0ZW0uSXNFbXB0eSgpIHx8IHdDaGFyID09IDApICYmIGl0ZW0ubV9DaGFyQ29kZSkgewogICAgICAgICAgICAgaWYod3N0ckl0ZW0uSXNFbXB0eSgpKSB7CkBAIC0xNjE3LDcgKzE2MTcsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB3c3RySXRlbS5TZXRBdCgwLCAoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJOb1VuaWNvZGUgPSBUUlVFOworICAgICAgICAgICAgYk5vVW5pY29kZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IC0xOwogICAgICAgICBjaGFyaW5mby5tX0NoYXJDb2RlID0gaXRlbS5tX0NoYXJDb2RlOwpAQCAtMTY1MSw3ICsxNjUxLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IG5Ub3RhbCA9IHdzdHJJdGVtLkdldExlbmd0aCgpOwotICAgICAgICAgICAgRlhfQk9PTCBiRGVsID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJEZWwgPSBmYWxzZTsKICAgICAgICAgICAgIGNvbnN0IGludCBjb3VudCA9IHN0ZDo6bWluKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSwgNyk7CiAgICAgICAgICAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSBjaGFyaW5mby5tX01hdHJpeC5UcmFuc2Zvcm1YRGlzdGFuY2UoKEZYX0ZMT0FUKVRFWFRfQ0hBUlJBVElPX0dBUERFTFRBICogcFRleHRPYmotPkdldEZvbnRTaXplKCkpOwogICAgICAgICAgICAgZm9yIChpbnQgbiA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKQEAgLTE2NjIsNyArMTY2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyaW5mbzEtPm1fcFRleHRPYmotPkdldEZvbnQoKSA9PSBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250KCkgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKGNoYXJpbmZvMS0+bV9PcmlnaW5YIC0gY2hhcmluZm8ubV9PcmlnaW5YKSA8IHRocmVzaG9sZCAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMoY2hhcmluZm8xLT5tX09yaWdpblkgLSBjaGFyaW5mby5tX09yaWdpblkpIDwgdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJEZWwgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRGVsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTcwNyw3ICsxNzA3LDcgQEAKICAgICAgICAgc3RkOjpzd2FwKHBUZW1wQnVmZmVyW2ldLCBwVGVtcEJ1ZmZlcltqXSk7CiAgICAgfQogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1JpZ2h0VG9MZWZ0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmosCitib29sIENQREZfVGV4dFBhZ2U6OklzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSXRlbXMpIGNvbnN0CiB7CkBAIC0xNzc5LDcgKzE3NzksNyBAQAogICAgIH0KICAgICByZXR1cm4gbV9UZXh0bGluZURpcjsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcikKK2Jvb2wgQ1BERl9UZXh0UGFnZTo6SXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcikKIHsKICAgICBDRlhfV2lkZVN0cmluZyBzdHJDdXJUZXh0ID0gbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7CiAgICAgaWYoc3RyQ3VyVGV4dC5HZXRMZW5ndGgoKSA9PSAwKSB7CkBAIC0xNzk2LDcgKzE3OTYsNyBAQAogICAgICAgICAgICAgRlhfV0NIQVIgcHJlQ2hhciA9IHN0ckN1clRleHQuR2V0QXQoKG5JbmRleCkpOwogICAgICAgICAgICAgaWYgKCgocHJlQ2hhciA+PSBMJ0EnICYmIHByZUNoYXIgPD0gTCdaJykgfHwgKHByZUNoYXIgPj0gTCdhJyAmJiBwcmVDaGFyIDw9IEwneicpKQogICAgICAgICAgICAgICAgICAgICAmJiAoKGN1ckNoYXIgPj0gTCdBJyAmJiBjdXJDaGFyIDw9IEwnWicpIHx8IChjdXJDaGFyID49IEwnYScgJiYgY3VyQ2hhciA8PSBMJ3onKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpbnQgc2l6ZSA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKQEAgLTE4MDYsMjEgKzE4MDYsMjEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpemUgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKICAgICAgICAgICAgIGlmKHNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07CiAgICAgICAgIH0KICAgICAgICAgaWYgKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gcHJlQ2hhci5tX0ZsYWcpCiAgICAgICAgICAgICBpZiAoMHhBRCA9PSBwcmVDaGFyLm1fVW5pY29kZSB8fCAweDJEID09IHByZUNoYXIubV9Vbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBpbnQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc0luc2VydE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpCiB7CiAgICAgRmluZFByZXZpb3VzVGV4dE9iamVjdCgpOwotICAgIEZYX0JPT0wgYk5ld2xpbmUgPSBGQUxTRTsKKyAgICBib29sIGJOZXdsaW5lID0gZmFsc2U7CiAgICAgaW50IFdyaXRpbmdNb2RlID0gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKHBPYmopOwogICAgIGlmKFdyaXRpbmdNb2RlID09IC0xKSB7CiAgICAgICAgIFdyaXRpbmdNb2RlID0gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKG1fcFByZVRleHRPYmopOwpAQCAtMTg4NCw4ICsxODg0LDggQEAKICAgICByZWN0MS5JbnRlcnNlY3QocmVjdDIpOwogICAgIGlmIChXcml0aW5nTW9kZSA9PSAwKSB7CiAgICAgICAgIGlmICgocmVjdDEuSXNFbXB0eSgpICYmIHJlY3QyLkhlaWdodCgpID4gNSAmJiByZWN0My5IZWlnaHQoKSA+IDUpCi0gICAgICAgICAgICAgICAgfHwgKCh5ID4gdGhyZXNob2xkICogMiB8fCB5IDwgdGhyZXNob2xkICogLTMpICYmIChGWFNZU19mYWJzKHkpIDwgMSA/IEZYU1lTX2ZhYnMoeCkgPCBGWFNZU19mYWJzKHkpIDogVFJVRSkpKSB7Ci0gICAgICAgICAgICBiTmV3bGluZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfHwgKCh5ID4gdGhyZXNob2xkICogMiB8fCB5IDwgdGhyZXNob2xkICogLTMpICYmIChGWFNZU19mYWJzKHkpIDwgMSA/IEZYU1lTX2ZhYnMoeCkgPCBGWFNZU19mYWJzKHkpIDogdHJ1ZSkpKSB7CisgICAgICAgICAgICBiTmV3bGluZSA9IHRydWU7CiAgICAgICAgICAgICBpZihuSXRlbSA+IDEgKSB7CiAgICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSB0ZW1wSXRlbTsKICAgICAgICAgICAgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmdGVtcEl0ZW0pOwpAQCAtMTg5NywxMSArMTg5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgbS5iIDwgMC4xICYmIG0uYyA8IDAuMSApIHsKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZSgwLCBtX3BQcmVUZXh0T2JqLT5tX0JvdHRvbSwgMTAwMCwgbV9wUHJlVGV4dE9iai0+bV9Ub3ApOwogICAgICAgICAgICAgICAgICAgICBpZihyZS5Db250YWlucyhwT2JqLT5HZXRQb3NYKCksIHBPYmotPkdldFBvc1koKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdsaW5lID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBiTmV3bGluZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZSgwLCBwT2JqLT5tX0JvdHRvbSwgMTAwMCwgcE9iai0+bV9Ub3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYocmUuQ29udGFpbnMobV9wUHJlVGV4dE9iai0+R2V0UG9zWCgpLCBtX3BQcmVUZXh0T2JqLT5HZXRQb3NZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmV3bGluZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTk1MiwxMCArMTk1MiwxMCBAQAogICAgICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OklzU2FtZVRleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajEsIENQREZfVGV4dE9iamVjdCogcFRleHRPYmoyKQorYm9vbCBDUERGX1RleHRQYWdlOjpJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMikKIHsKICAgICBpZiAoIXBUZXh0T2JqMSB8fCAhcFRleHRPYmoyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IHJjUHJlT2JqKHBUZXh0T2JqMi0+bV9MZWZ0LCBwVGV4dE9iajItPm1fQm90dG9tLCBwVGV4dE9iajItPm1fUmlnaHQsIHBUZXh0T2JqMi0+bV9Ub3ApOwogICAgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmoocFRleHRPYmoxLT5tX0xlZnQsIHBUZXh0T2JqMS0+bV9Cb3R0b20sIHBUZXh0T2JqMS0+bV9SaWdodCwgcFRleHRPYmoxLT5tX1RvcCk7CkBAIC0xOTY2LDQ2ICsxOTY2LDQ2IEBACiAgICAgICAgICAgICBQQUdFQ0hBUl9JTkZPIHBlckNoYXJUZW1wID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtuQ291bnQgLSAyXTsKICAgICAgICAgICAgIEZYX0ZMT0FUIGRiU3BhY2UgPSBwZXJDaGFyVGVtcC5tX0NoYXJCb3guV2lkdGgoKTsKICAgICAgICAgICAgIGlmIChkYlhkaWYgPiBkYlNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIXJjUHJlT2JqLklzRW1wdHkoKSB8fCAhcmNDdXJPYmouSXNFbXB0eSgpKSB7CiAgICAgICAgIHJjUHJlT2JqLkludGVyc2VjdChyY0N1ck9iaik7CiAgICAgICAgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoRlhTWVNfZmFicyhyY1ByZU9iai5XaWR0aCgpIC0gcmNDdXJPYmouV2lkdGgoKSkgPiByY0N1ck9iai5XaWR0aCgpIC8gMikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwVGV4dE9iajItPkdldEZvbnRTaXplKCkgIT0gcFRleHRPYmoxLT5HZXRGb250U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaW50IG5QcmVDb3VudCA9IHBUZXh0T2JqMi0+Q291bnRJdGVtcygpOwogICAgIGludCBuQ3VyQ291bnQgPSBwVGV4dE9iajEtPkNvdW50SXRlbXMoKTsKICAgICBpZiAoblByZUNvdW50ICE9IG5DdXJDb3VudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtUGVyLCBpdGVtQ3VyOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblByZUNvdW50OyBpKyspIHsKICAgICAgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7CiAgICAgICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwogICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmKEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NYKCkgLSBwVGV4dE9iajItPkdldFBvc1goKSkgPiBHZXRDaGFyV2lkdGgoaXRlbVBlci5tX0NoYXJDb2RlLCBwVGV4dE9iajItPkdldEZvbnQoKSkqcFRleHRPYmoyLT5HZXRGb250U2l6ZSgpIC8gMTAwMCAqIDAuOSB8fAogICAgICAgICAgICAgRlhTWVNfZmFicyhwVGV4dE9iajEtPkdldFBvc1koKSAtIHBUZXh0T2JqMi0+R2V0UG9zWSgpKSA+CiAgICAgICAgICAgICBGWF9NQVgoRlhfTUFYKHJjUHJlT2JqLkhlaWdodCgpICwgcmNQcmVPYmouV2lkdGgoKSksIHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSkgLyA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcykKK2Jvb2wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcykKIHsKICAgICBpZiAoIXBUZXh0T2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgaSA9IDA7CiAgICAgaWYgKCFPYmpQb3MpIHsKQEAgLTIwMjEsMTMgKzIwMjEsMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmKElzU2FtZVRleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iaiwgcFRleHRPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGkrKzsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKQorYm9vbCBDUERGX1RleHRQYWdlOjpHZW5lcmF0ZUNoYXJJbmZvKEZYX1dDSEFSIHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pCiB7CiAgICAgaW50IHNpemUgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CiAgICAgUEFHRUNIQVJfSU5GTyBwcmVDaGFyOwpAQCAtMjAzNiw3ICsyMDM2LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBzaXplID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CiAgICAgICAgIGlmKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHByZUNoYXIgPSAoUEFHRUNIQVJfSU5GTyltX2NoYXJMaXN0W3NpemUgLSAxXTsKICAgICB9CkBAIC0yMDYxLDM3ICsyMDYxLDM3IEBACiAgICAgaW5mby5tX09yaWdpblggPSBwcmVDaGFyLm1fT3JpZ2luWCArIHByZVdpZHRoICogKGZzKSAvIDEwMDA7CiAgICAgaW5mby5tX09yaWdpblkgPSBwcmVDaGFyLm1fT3JpZ2luWTsKICAgICBpbmZvLm1fQ2hhckJveCA9IENGWF9GbG9hdFJlY3QoaW5mby5tX09yaWdpblgsIGluZm8ubV9PcmlnaW5ZLCBpbmZvLm1fT3JpZ2luWCwgaW5mby5tX09yaWdpblkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKQorYm9vbCBDUERGX1RleHRQYWdlOjpJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKQogewogICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHJlY3QxOwogICAgIHJlY3QuSW50ZXJzZWN0KHJlY3QyKTsKICAgICByZXR1cm4gIXJlY3QuSXNFbXB0eSgpOwogfQotRlhfQk9PTAlDUERGX1RleHRQYWdlOjpJc0xldHRlcihGWF9XQ0hBUiB1bmljb2RlKQorYm9vbAlDUERGX1RleHRQYWdlOjpJc0xldHRlcihGWF9XQ0hBUiB1bmljb2RlKQogewogICAgIGlmICh1bmljb2RlIDwgTCdBJykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHVuaWNvZGUgPiBMJ1onICYmIHVuaWNvZGUgPCBMJ2EnKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAodW5pY29kZSA+IEwneicpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ1BERl9UZXh0UGFnZUZpbmQ6OkNQREZfVGV4dFBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkKICAgICA6IG1fcFRleHRQYWdlKHBUZXh0UGFnZSksCiAgICAgICBtX2ZsYWdzKDApLAogICAgICAgbV9maW5kTmV4dFN0YXJ0KC0xKSwKICAgICAgIG1fZmluZFByZVN0YXJ0KC0xKSwKLSAgICAgIG1fYk1hdGNoQ2FzZShGQUxTRSksCi0gICAgICBtX2JNYXRjaFdob2xlV29yZChGQUxTRSksCisgICAgICBtX2JNYXRjaENhc2UoZmFsc2UpLAorICAgICAgbV9iTWF0Y2hXaG9sZVdvcmQoZmFsc2UpLAogICAgICAgbV9yZXNTdGFydCgwKSwKICAgICAgIG1fcmVzRW5kKC0xKSwKLSAgICAgIG1fSXNGaW5kKEZBTFNFKQorICAgICAgbV9Jc0ZpbmQoZmFsc2UpCiB7CiAgICAgbV9zdHJUZXh0ID0gbV9wVGV4dFBhZ2UtPkdldFBhZ2VUZXh0KCk7CiAgICAgaW50IG5Db3VudCA9IHBUZXh0UGFnZS0+Q291bnRDaGFycygpOwpAQCAtMjE0MCwxMCArMjE0MCwxMCBAQAogICAgIH0KICAgICByZXR1cm4gLTE7CiB9Ci1GWF9CT09MCUNQREZfVGV4dFBhZ2VGaW5kOjpGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcykKK2Jvb2wJQ1BERl9UZXh0UGFnZUZpbmQ6OkZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zKQogewogICAgIGlmICghbV9wVGV4dFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpIHx8IG1fYk1hdGNoQ2FzZSAhPSAoZmxhZ3MgJiBGUERGVEVYVF9NQVRDSENBU0UpKSB7CiAgICAgICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOwpAQCAtMjE1Myw4ICsyMTUzLDggQEAKICAgICBtX2ZsYWdzID0gZmxhZ3M7CiAgICAgbV9iTWF0Y2hDYXNlID0gZmxhZ3MgJiBGUERGVEVYVF9NQVRDSENBU0U7CiAgICAgaWYgKG1fc3RyVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9TVFJTSVpFIGxlbiA9IGZpbmR3aGF0U3RyLkdldExlbmd0aCgpOwogICAgIGlmICghbV9iTWF0Y2hDYXNlKSB7CkBAIC0yMTgyLDM2ICsyMTgyLDM2IEBACiAgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChmaW5kd2hhdFN0cik7CiAgICAgfQogICAgIGlmKG1fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKSA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX0lzRmluZCA9IFRSVUU7CisgICAgbV9Jc0ZpbmQgPSB0cnVlOwogICAgIG1fcmVzU3RhcnQgPSAwOwogICAgIG1fcmVzRW5kID0gLTE7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kTmV4dCgpCitib29sIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kTmV4dCgpCiB7CiAgICAgaWYgKCFtX3BUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9yZXNBcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZihtX2ZpbmROZXh0U3RhcnQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmKG1fc3RyVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKKyAgICAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwogICAgIH0KICAgICBpbnQgc3RyTGVuID0gbV9zdHJUZXh0LkdldExlbmd0aCgpOwogICAgIGlmIChtX2ZpbmROZXh0U3RhcnQgPiBzdHJMZW4gLSAxKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CisgICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICB9CiAgICAgaW50IG5Db3VudCA9IG1fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKTsKICAgICBpbnQgblJlc3VsdFBvcyA9IDA7CiAgICAgaW50CW5TdGFydFBvcyA9IDA7CiAgICAgblN0YXJ0UG9zID0gbV9maW5kTmV4dFN0YXJ0OwotICAgIEZYX0JPT0wgYlNwYWNlU3RhcnQgPSBGQUxTRTsKKyAgICBib29sIGJTcGFjZVN0YXJ0ID0gZmFsc2U7CiAgICAgZm9yKGludCBpV29yZCA9IDA7IGlXb3JkIDwgbkNvdW50OyBpV29yZCsrKSB7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzV29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkXTsKICAgICAgICAgaWYoY3NXb3JkLklzRW1wdHkoKSkgewpAQCAtMjIyMywzMyArMjIyMywzMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpV29yZCA9IC0xOwogICAgICAgICAgICAgfSBlbHNlIGlmKGlXb3JkID09IDApIHsKLSAgICAgICAgICAgICAgICBiU3BhY2VTdGFydCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlNwYWNlU3RhcnQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaW50IGVuZEluZGV4OwogICAgICAgICBuUmVzdWx0UG9zID0gbV9zdHJUZXh0LkZpbmQoY3NXb3JkLmNfc3RyKCksIG5TdGFydFBvcyk7CiAgICAgICAgIGlmIChuUmVzdWx0UG9zID09IC0xKSB7Ci0gICAgICAgICAgICBtX0lzRmluZCA9IEZBTFNFOworICAgICAgICAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICAgICAgfQogICAgICAgICBlbmRJbmRleCA9IG5SZXN1bHRQb3MgKyBjc1dvcmQuR2V0TGVuZ3RoKCkgLSAxOwogICAgICAgICBpZihpV29yZCA9PSAwKSB7CiAgICAgICAgICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvczsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJNYXRjaCA9IFRSVUU7CisgICAgICAgIGJvb2wgYk1hdGNoID0gdHJ1ZTsKICAgICAgICAgaWYoaVdvcmQgIT0gMCAmJiAhYlNwYWNlU3RhcnQpIHsKICAgICAgICAgICAgIGludCBQcmVSZXNFbmRQb3MgPSBuU3RhcnRQb3M7CiAgICAgICAgICAgICBpbnQgY3VyQ2hhciA9IGNzV29yZC5HZXRBdCgwKTsKICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGxhc3RXb3JkID0gbV9jc0ZpbmRXaGF0QXJyYXlbaVdvcmQgLSAxXTsKICAgICAgICAgICAgIGludCBsYXN0Q2hhciA9IGxhc3RXb3JkLkdldEF0KGxhc3RXb3JkLkdldExlbmd0aCgpIC0gMSk7CiAgICAgICAgICAgICBpZihuU3RhcnRQb3MgPT0gblJlc3VsdFBvcyAmJiAhKF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGxhc3RDaGFyKSB8fCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihjdXJDaGFyKSkpIHsKLSAgICAgICAgICAgICAgICBiTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiTWF0Y2ggPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvcihpbnQgZCA9IFByZVJlc0VuZFBvczsgZCA8IG5SZXN1bHRQb3M7IGQrKykgewogICAgICAgICAgICAgICAgIEZYX1dDSEFSIHN0ckluc2VydCA9IG1fc3RyVGV4dC5HZXRBdChkKTsKICAgICAgICAgICAgICAgICBpZihzdHJJbnNlcnQgIT0gVEVYVF9MSU5FRkVFRF9DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX0JMQU5LX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfUkVUVVJOX0NIQVIgJiYgc3RySW5zZXJ0ICE9IDE2MCkgewotICAgICAgICAgICAgICAgICAgICBiTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIyNTcsNyArMjI1Nyw3IEBACiAgICAgICAgICAgICBpZihuUmVzdWx0UG9zID4gMCkgewogICAgICAgICAgICAgICAgIEZYX1dDSEFSIHN0ckluc2VydCA9IG1fc3RyVGV4dC5HZXRBdChuUmVzdWx0UG9zIC0gMSk7CiAgICAgICAgICAgICAgICAgaWYoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX1JFVFVSTl9DSEFSICYmIHN0ckluc2VydCAhPSAxNjApIHsKLSAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvczsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvcyAtIDE7CkBAIC0yMjc4LDcgKzIyNzgsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1fcmVzRW5kID0gblJlc3VsdFBvcyArIG1fY3NGaW5kV2hhdEFycmF5W21fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKSAtIDFdLkdldExlbmd0aCgpIC0gMTsKLSAgICBtX0lzRmluZCA9IFRSVUU7CisgICAgbV9Jc0ZpbmQgPSB0cnVlOwogICAgIGludCByZXNTdGFydCA9IEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKICAgICBpbnQgcmVzRW5kID0gR2V0Q2hhckluZGV4KG1fcmVzRW5kKTsKICAgICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KHJlc1N0YXJ0LCByZXNFbmQgLSByZXNTdGFydCArIDEsIG1fcmVzQXJyYXkpOwpAQCAtMjI5MSwyMCArMjI5MSwyMCBAQAogICAgIH0KICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kUHJldigpCitib29sIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kUHJldigpCiB7CiAgICAgaWYgKCFtX3BUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9yZXNBcnJheS5SZW1vdmVBbGwoKTsKICAgICBpZihtX3N0clRleHQuSXNFbXB0eSgpIHx8IG1fZmluZFByZVN0YXJ0IDwgMCkgewotICAgICAgICBtX0lzRmluZCA9IEZBTFNFOworICAgICAgICBtX0lzRmluZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgICAgfQogICAgIENQREZfVGV4dFBhZ2VGaW5kIGZpbmRFbmdpbmUobV9wVGV4dFBhZ2UpOwotICAgIEZYX0JPT0wgcmV0ID0gZmluZEVuZ2luZS5GaW5kRmlyc3QobV9maW5kV2hhdCwgbV9mbGFncyk7CisgICAgYm9vbCByZXQgPSBmaW5kRW5naW5lLkZpbmRGaXJzdChtX2ZpbmRXaGF0LCBtX2ZsYWdzKTsKICAgICBpZighcmV0KSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7CisgICAgICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBtX0lzRmluZDsKICAgICB9CiAgICAgaW50CW9yZGVyID0gLTEsIE1hdGNoZWRDb3VudCA9IDA7CkBAIC0yMzIxLDEyICsyMzIxLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYob3JkZXIgPT0gLTEpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKKyAgICAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwogICAgIH0KICAgICBtX3Jlc1N0YXJ0ID0gbV9wVGV4dFBhZ2UtPlRleHRJbmRleEZyb21DaGFySW5kZXgob3JkZXIpOwogICAgIG1fcmVzRW5kID0gbV9wVGV4dFBhZ2UtPlRleHRJbmRleEZyb21DaGFySW5kZXgob3JkZXIgKyBNYXRjaGVkQ291bnQgLSAxKTsKLSAgICBtX0lzRmluZCA9IFRSVUU7CisgICAgbV9Jc0ZpbmQgPSB0cnVlOwogICAgIG1fcFRleHRQYWdlLT5HZXRSZWN0QXJyYXkob3JkZXIsIE1hdGNoZWRDb3VudCwgbV9yZXNBcnJheSk7CiAgICAgaWYobV9mbGFncyAmIEZQREZURVhUX0NPTlNFQ1VUSVZFKSB7CiAgICAgICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzU3RhcnQgKyAxOwpAQCAtMjM4NSwxNiArMjM4NSwxNiBAQAogICAgICAgICBpbmRleCsrOwogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OklzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKK2Jvb2wgQ1BERl9UZXh0UGFnZUZpbmQ6OklzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKIHsKICAgICBpbnQgY2hhcl9sZWZ0ID0gMDsKICAgICBpbnQgY2hhcl9yaWdodCA9IDA7CiAgICAgaW50IGNoYXJfY291bnQgPSBlbmRQb3MgLSBzdGFydFBvcyArIDE7CiAgICAgaWYoY2hhcl9jb3VudCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjaGFyX2NvdW50ID09IDEgJiYgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPiAyNTUpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZihzdGFydFBvcyAtIDEgPj0gMCApIHsKICAgICAgICAgY2hhcl9sZWZ0ID0gY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcyAtIDEpOwpAQCAtMjQwNCwzMyArMjQwNCwzMyBAQAogICAgIH0KICAgICBpZiAoKGNoYXJfbGVmdCA+ICdBJyAmJiBjaGFyX2xlZnQgPCAnYScpIHx8IChjaGFyX2xlZnQgPiAnYScgJiYgY2hhcl9sZWZ0IDwgJ3onKSB8fCAoY2hhcl9sZWZ0ID4gMHhmYjAwICYmIGNoYXJfbGVmdCA8IDB4ZmIwNikgfHwgKGNoYXJfbGVmdCA+PSAnMCcgJiYgY2hhcl9sZWZ0IDw9ICc5JykgfHwKICAgICAgICAgICAgIChjaGFyX3JpZ2h0ID4gJ0EnICYmIGNoYXJfcmlnaHQgPCAnYScpIHx8IChjaGFyX3JpZ2h0ID4gJ2EnICYmIGNoYXJfcmlnaHQgPCAneicpIHx8IChjaGFyX3JpZ2h0ID4gMHhmYjAwICYmIGNoYXJfcmlnaHQgPCAweGZiMDYpIHx8IChjaGFyX3JpZ2h0ID49ICcwJyAmJiBjaGFyX3JpZ2h0IDw9ICc5JykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmKCEoKCdBJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAnWicpICAmJiAoJ2EnID4gY2hhcl9sZWZ0IHx8IGNoYXJfbGVmdCA+ICd6JykKICAgICAgICAgICAgICYmICgnQScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAnWicpICAmJiAoJ2EnID4gY2hhcl9yaWdodCB8fCBjaGFyX3JpZ2h0ID4gJ3onKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjaGFyX2NvdW50ID4gMCkgewogICAgICAgICBpZiAoY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zKSA8PSBMJzknICYmIGNoYXJfbGVmdCA+PSBMJzAnICYmIGNoYXJfbGVmdCA8PSBMJzknKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNzUGFnZVRleHQuR2V0QXQoZW5kUG9zKSA+PSBMJzAnICYmIGNzUGFnZVRleHQuR2V0QXQoZW5kUG9zKSA8PSBMJzknICYmIGNoYXJfcmlnaHQgPj0gTCcwJyAmJiBjaGFyX3JpZ2h0IDw9IEwnOScpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OkV4dHJhY3RTdWJTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHJTdHJpbmcsIGNvbnN0IEZYX1dDSEFSKiBscHN6RnVsbFN0cmluZywKK2Jvb2wgQ1BERl9UZXh0UGFnZUZpbmQ6OkV4dHJhY3RTdWJTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHJTdHJpbmcsIGNvbnN0IEZYX1dDSEFSKiBscHN6RnVsbFN0cmluZywKICAgICAgICAgaW50IGlTdWJTdHJpbmcsIEZYX1dDSEFSIGNoU2VwKQogewogICAgIGlmIChscHN6RnVsbFN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB3aGlsZSAoaVN1YlN0cmluZy0tKSB7CiAgICAgICAgIGxwc3pGdWxsU3RyaW5nID0gRlhTWVNfd2NzY2hyKGxwc3pGdWxsU3RyaW5nLCBjaFNlcCk7CiAgICAgICAgIGlmIChscHN6RnVsbFN0cmluZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByU3RyaW5nLkVtcHR5KCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbHBzekZ1bGxTdHJpbmcrKzsKICAgICAgICAgd2hpbGUoKmxwc3pGdWxsU3RyaW5nID09IGNoU2VwKSB7CkBAIC0yNDQzLDcgKzI0NDMsNyBAQAogICAgIEFTU0VSVChuTGVuID49IDApOwogICAgIEZYU1lTX21lbWNweShyU3RyaW5nLkdldEJ1ZmZlcihuTGVuKSwgbHBzekZ1bGxTdHJpbmcsIG5MZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKICAgICByU3RyaW5nLlJlbGVhc2VCdWZmZXIoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9XaWRlU3RyaW5nIENQREZfVGV4dFBhZ2VGaW5kOjpNYWtlUmV2ZXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQogewpAQCAtMjQ3MSwyNyArMjQ3MSwyNyBAQAogfQogQ1BERl9MaW5rRXh0cmFjdDo6Q1BERl9MaW5rRXh0cmFjdCgpCiAgICAgOiBtX3BUZXh0UGFnZShOVUxMKSwKLSAgICAgIG1fSXNQYXJzZXJkKEZBTFNFKQorICAgICAgbV9Jc1BhcnNlcmQoZmFsc2UpCiB7CiB9CiBDUERGX0xpbmtFeHRyYWN0Ojp+Q1BERl9MaW5rRXh0cmFjdCgpCiB7CiAgICAgRGVsZXRlTGlua0xpc3QoKTsKIH0KLUZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6RXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkKK2Jvb2wgQ1BERl9MaW5rRXh0cmFjdDo6RXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkKIHsKICAgICBpZiAoIXBUZXh0UGFnZSB8fCAhcFRleHRQYWdlLT5Jc1BhcnNlcmVkKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcFRleHRQYWdlID0gKGNvbnN0IENQREZfVGV4dFBhZ2UqKXBUZXh0UGFnZTsKICAgICBtX3N0clBhZ2VUZXh0ID0gbV9wVGV4dFBhZ2UtPkdldFBhZ2VUZXh0KDAsIC0xKTsKICAgICBEZWxldGVMaW5rTGlzdCgpOwogICAgIGlmIChtX3N0clBhZ2VUZXh0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcGFyc2VyTGluaygpOwotICAgIG1fSXNQYXJzZXJkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX0lzUGFyc2VyZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENQREZfTGlua0V4dHJhY3Q6OkRlbGV0ZUxpbmtMaXN0KCkKIHsKQEAgLTI1NDYsNDIgKzI1NDYsNDIgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKQorYm9vbCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja1dlYkxpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0ckJlQ2hlY2spCiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gc3RyQmVDaGVjazsKICAgICBzdHIuTWFrZUxvd2VyKCk7CiAgICAgaWYgKHN0ci5GaW5kKEwiaHR0cDovL3d3dy4iKSAhPSAtMSkgewogICAgICAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHA6Ly93d3cuIikpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMImh0dHA6Ly8iKSAhPSAtMSkgewogICAgICAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHA6Ly8iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikgIT0gLTEpIHsKICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovL3d3dy4iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHN0ci5GaW5kKEwiaHR0cHM6Ly8iKSAhPSAtMSkgewogICAgICAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHBzOi8vIikpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChzdHIuRmluZChMInd3dy4iKSAhPSAtMSkgewogICAgICAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMInd3dy4iKSk7CiAgICAgICAgIHN0ckJlQ2hlY2sgPSBMImh0dHA6Ly8iICsgc3RyQmVDaGVjazsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpCitib29sIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrTWFpbExpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKIHsKICAgICBzdHIuTWFrZUxvd2VyKCk7CiAgICAgaW50IGFQb3MgPSBzdHIuRmluZChMJ0AnKTsKICAgICBpZiAoYVBvcyA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChzdHIuR2V0QXQoYVBvcyAtIDEpID09IEwnLicgfHwgc3RyLkdldEF0KGFQb3MgLSAxKSA9PSBMJ18nKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSBhUG9zIC0gMTsgaSA+PSAwOyBpLS0pIHsKQEAgLTI1OTAsNyArMjU5MCw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChpID09IGFQb3MgLSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ciA9IHN0ci5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBpIC0gMSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1OTgsNyArMjU5OCw3IEBACiAgICAgfQogICAgIGFQb3MgPSBzdHIuRmluZChMJ0AnKTsKICAgICBpZiAoYVBvcyA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9XaWRlU3RyaW5nIHN0cnRlbXAgPSBMIiI7CiAgICAgZm9yIChpID0gMDsgaSA8IGFQb3M7IGkrKykgewpAQCAtMjYxNCwxMyArMjYxNCwxMyBAQAogICAgIH0KICAgICBhUG9zID0gc3RyLkZpbmQoTCdAJyk7CiAgICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzdHIuVHJpbVJpZ2h0KEwnLicpOwogICAgIHN0cnRlbXAgPSBzdHI7CiAgICAgaW50IGVQb3MgPSBzdHIuRmluZChMJy4nKTsKICAgICBpZiAoZVBvcyA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgd2hpbGUgKGVQb3MgIT0gLTEpIHsKICAgICAgICAgc3RydGVtcCA9IHN0cnRlbXAuUmlnaHQoc3RydGVtcC5HZXRMZW5ndGgoKSAtIGVQb3MgLSAxKTsKQEAgLTI2NDMsMjIgKzI2NDMsMjIgQEAKICAgICAgICAgaWYgKHdjaCA9PSBMJy0nIHx8IHdjaCA9PSBMJy4nIHx8ICh3Y2ggPj0gTCdhJyAmJiB3Y2ggPD0gTCd6JykgfHwgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0ci5GaW5kKEwibWFpbHRvOiIpID09IC0xKSB7CiAgICAgICAgIHN0ciA9IEwibWFpbHRvOiIgKyBzdHI7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVXJsKQorYm9vbCBDUERGX0xpbmtFeHRyYWN0OjpBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVXJsKQogewogICAgIENQREZfTGlua0V4dCogbGlua0luZm8gPSBuZXcgQ1BERl9MaW5rRXh0OwogICAgIGxpbmtJbmZvLT5tX3N0clVybCA9IHN0clVybDsKICAgICBsaW5rSW5mby0+bV9TdGFydCA9IHN0YXJ0OwogICAgIGxpbmtJbmZvLT5tX0NvdW50ID0gY291bnQ7CiAgICAgbV9MaW5rTGlzdC5BZGQobGlua0luZm8pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0ZYX1dpZGVTdHJpbmcgQ1BERl9MaW5rRXh0cmFjdDo6R2V0VVJMKGludCBpbmRleCkgY29uc3QKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAKaW5kZXggMjFhMjU2NC4uZDg4ZTllMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAKQEAgLTksNTYgKzksNTYgQEAKIGNsYXNzIENQREZfVGV4dFN0cmVhbQogewogcHVibGljOgotICAgIENQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgRlhfQk9PTCBiVXNlTEYsIENGWF9QdHJBcnJheSogcE9iakFycmF5KTsKKyAgICBDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIGJvb2wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CiAgICAgfkNQREZfVGV4dFN0cmVhbSgpIHt9Ci0gICAgRlhfQk9PTCBQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgRlhfQk9PTCBiRmlyc3RMaW5lKTsKKyAgICBib29sIFByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBib29sIGJGaXJzdExpbmUpOwogICAgIENGWF9XaWRlVGV4dEJ1ZiYJbV9CdWZmZXI7Ci0gICAgRlhfQk9PTAkJCQltX2JVc2VMRjsKKyAgICBib29sCQkJCW1fYlVzZUxGOwogICAgIENGWF9QdHJBcnJheSoJCW1fcE9iakFycmF5OwogICAgIGNvbnN0IENQREZfVGV4dE9iamVjdCoJbV9wTGFzdE9iajsKIH07Ci1DUERGX1RleHRTdHJlYW06OkNQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgRlhfQk9PTCBiVXNlTEYsIENGWF9QdHJBcnJheSogcE9iakFycmF5KSA6IG1fQnVmZmVyKGJ1ZmZlcikKK0NQREZfVGV4dFN0cmVhbTo6Q1BERl9UZXh0U3RyZWFtKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBib29sIGJVc2VMRiwgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpIDogbV9CdWZmZXIoYnVmZmVyKQogewogICAgIG1fcExhc3RPYmogPSBOVUxMOwogICAgIG1fYlVzZUxGID0gYlVzZUxGOwogICAgIG1fcE9iakFycmF5ID0gcE9iakFycmF5OwogfQotRlhfQk9PTCBGUERGVGV4dF9Jc1NhbWVUZXh0T2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMikKK2Jvb2wgRlBERlRleHRfSXNTYW1lVGV4dE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCiB7CiAgICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwVGV4dE9iajItPm1fTGVmdCwgcFRleHRPYmoyLT5tX0JvdHRvbSwgcFRleHRPYmoyLT5tX1JpZ2h0LCBwVGV4dE9iajItPm1fVG9wKTsKICAgICBDRlhfRmxvYXRSZWN0IHJjQ3VyT2JqKHBUZXh0T2JqMS0+bV9MZWZ0LCBwVGV4dE9iajEtPm1fQm90dG9tLCBwVGV4dE9iajEtPm1fUmlnaHQsIHBUZXh0T2JqMS0+bV9Ub3ApOwogICAgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkgJiYgcmNDdXJPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgewogICAgICAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOwogICAgICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4gcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKICAgICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7CiAgICAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblByZUNvdW50OyBpKyspIHsKICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtUGVyLCBpdGVtQ3VyOwogICAgICAgICBwVGV4dE9iajItPkdldEl0ZW1JbmZvKGksICZpdGVtUGVyKTsKICAgICAgICAgcFRleHRPYmoxLT5HZXRJdGVtSW5mbyhpLCAmaXRlbUN1cik7CiAgICAgICAgIGlmIChpdGVtQ3VyLm1fQ2hhckNvZGUgIT0gaXRlbVBlci5tX0NoYXJDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBpbnQgR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJDb2RlLCBDUERGX0ZvbnQqIHBGb250KQogewpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUERGX1RleHRTdHJlYW06OlByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBGWF9CT09MIGJGaXJzdExpbmUpCitib29sIENQREZfVGV4dFN0cmVhbTo6UHJvY2Vzc09iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIGJvb2wgYkZpcnN0TGluZSkKIHsKICAgICBDUERGX0ZvbnQqIHBGb250ID0gcE9iai0+R2V0Rm9udCgpOwogICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0TGluZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtX2JVc2VMRikgewogICAgICAgICAgICAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKEwnXHInKTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAtMSkgewogICAgICAgICAgICAgbV9wTGFzdE9iaiA9IHBPYmo7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDMpIHsKICAgICAgICAgICAgIGl0ZW1faW5kZXggPSAxOwogICAgICAgICB9CkBAIC0yNzcsOSArMjc3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotdm9pZCBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsIEZYX0JPT0wgYlVzZUxGLAordm9pZCBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsIGJvb2wgYlVzZUxGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkKIHsKICAgICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIGJVc2VMRiwgcE9iakFycmF5KTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogICAgICAgICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgdGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIEZBTFNFKTsKKyAgICAgICAgdGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIGZhbHNlKTsKICAgICB9CiB9CiBDRlhfV2lkZVN0cmluZyBQREZfR2V0Rmlyc3RUZXh0TGluZV9Vbmljb2RlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UpCkBAIC0zMDIsMTcgKzMwMiwxNyBAQAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jLCBwUGFnZSk7CiAgICAgQ1BERl9QYXJzZU9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLm1fYlRleHRPbmx5ID0gVFJVRTsKLSAgICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IEZBTFNFOworICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSB0cnVlOworICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gZmFsc2U7CiAgICAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOwotICAgIENQREZfVGV4dFN0cmVhbSB0ZXh0c3RyZWFtKGJ1ZmZlciwgRkFMU0UsIE5VTEwpOworICAgIENQREZfVGV4dFN0cmVhbSB0ZXh0c3RyZWFtKGJ1ZmZlciwgZmFsc2UsIE5VTEwpOwogICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0ID0gcGFnZS5HZXROZXh0T2JqZWN0KHBvcyk7CiAgICAgICAgIGlmIChwT2JqZWN0LT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAodGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIFRSVUUpKSB7CisgICAgICAgIGlmICh0ZXh0c3RyZWFtLlByb2Nlc3NPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iamVjdCwgdHJ1ZSkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmgKaW5kZXggY2U1MjM3MS4uYmNhY2M1NyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC90ZXh0X2ludC5oCkBAIC00OCw5ICs0OCw5IEBACiAgICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKICAgICBDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKICAgICBDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENQREZUZXh0X1BhcnNlT3B0aW9ucyBQYXJzZXJPcHRpb25zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVBhcnNlVGV4dFBhZ2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzUGFyc2VyZWQoKSBjb25zdAorICAgIHZpcnR1YWwgYm9vbAkJCQkJUGFyc2VUZXh0UGFnZSgpOworICAgIHZpcnR1YWwgdm9pZAkJCQkJTm9ybWFsaXplT2JqZWN0cyhib29sIGJOb3JtYWxpemUpOworICAgIHZpcnR1YWwJYm9vbAkJCQkJSXNQYXJzZXJlZCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9Jc1BhcnNlcmVkOwogICAgIH0KQEAgLTcxLDEwICs3MSwxMCBAQAogICAgIHZpcnR1YWwgaW50CQkJCQkJQ291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpOwogICAgIHZpcnR1YWwJdm9pZAkJCQkJR2V0UmVjdChpbnQgcmVjdEluZGV4LCBGWF9GTE9BVCYgbGVmdCwgRlhfRkxPQVQmIHRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSk7CisgICAgdmlydHVhbCBib29sCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSk7CisgICAgdmlydHVhbCBib29sCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSk7CiAgICAgdmlydHVhbAlpbnQJCQkJCQlDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsCi0gICAgICAgICAgICBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKTsKKyAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCBib3R0b20sIGJvb2wgYkNvbnRhaW5zID0gZmFsc2UpOwogICAgIHZpcnR1YWwJdm9pZAkJCQkJR2V0Qm91bmRlZFNlZ21lbnQoaW50IGluZGV4LCBpbnQmIHN0YXJ0LCBpbnQmIGNvdW50KSBjb25zdDsKICAgICB2aXJ0dWFsIGludAkJCQkJCUdldFdvcmRCcmVhayhpbnQgaW5kZXgsIGludCBkaXJlY3Rpb24pIGNvbnN0OwogcHVibGljOgpAQCAtODIsMjAgKzgyLDIwIEBACiAgICAgewogICAgICAgICByZXR1cm4gJm1fY2hhckxpc3Q7CiAgICAgfQotICAgIHN0YXRpYwlGWF9CT09MCQkJCQlJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKTsKLSAgICBzdGF0aWMJRlhfQk9PTAkJCQkJSXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSk7CisgICAgc3RhdGljCWJvb2wJCQkJCUlzUmVjdEludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MSwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDIpOworICAgIHN0YXRpYwlib29sCQkJCQlJc0xldHRlcihGWF9XQ0hBUiB1bmljb2RlKTsKIHByaXZhdGU6Ci0gICAgRlhfQk9PTAkJCQkJCQlJc0h5cGhlbihGWF9XQ0hBUiBjdXJDaGFyKTsKKyAgICBib29sCQkJCQkJCUlzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpOwogICAgIGJvb2wJCQkJCQkJSXNDb250cm9sQ2hhcihjb25zdCBQQUdFQ0hBUl9JTkZPJiBjaGFySW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKTsKKyAgICBib29sCQkJCQkJCUdldEJhc2VsaW5lUm90YXRlKGludCBzdGFydCwgaW50IGVuZCwgaW50JiBSb3RhdGUpOwogICAgIHZvaWQJCQkJCQkJUHJvY2Vzc09iamVjdCgpOwogICAgIHZvaWQJCQkJCQkJUHJvY2Vzc0Zvcm1PYmplY3QoQ1BERl9Gb3JtT2JqZWN0KglwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCk7CiAgICAgdm9pZAkJCQkJCQlQcm9jZXNzVGV4dE9iamVjdChQREZURVhUX09iaiBwT2JqKTsKICAgICB2b2lkCQkJCQkJCVByb2Nlc3NUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCoJcFRleHRPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgsIEZYX1BPU0lUSU9OIE9ialBvcyk7CiAgICAgaW50CQkJCQkJCQlQcm9jZXNzSW5zZXJ0T2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCk7Ci0gICAgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZUNoYXJJbmZvKEZYX1dDSEFSIHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJSXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcyk7Ci0gICAgRlhfQk9PTAkJCQkJCQlJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMik7CisgICAgYm9vbAkJCQkJCQlHZW5lcmF0ZUNoYXJJbmZvKEZYX1dDSEFSIHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pOworICAgIGJvb2wJCQkJCQkJSXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcyk7CisgICAgYm9vbAkJCQkJCQlJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMik7CiAgICAgaW50CQkJCQkJCQlHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhckNvZGUsIENQREZfRm9udCogcEZvbnQpIGNvbnN0OwogICAgIHZvaWQJCQkJCQkJQ2xvc2VUZW1wTGluZSgpOwogICAgIHZvaWQJCQkJCQkJT25QaWVjZShJRlhfQmlkaUNoYXIqIHBCaWRpLCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIGludDMyX3QJRmluZFRleHRsaW5lRmxvd0RpcmVjdGlvbigpOwogICAgIHZvaWQgU3dhcFRlbXBUZXh0QnVmKGludDMyX3QgaUNoYXJMaXN0U3RhcnRBcHBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmU3RhcnRBcHBlbmQpOwotICAgIEZYX0JPT0wgSXNSaWdodFRvTGVmdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAorICAgIGJvb2wgSXNSaWdodFRvTGVmdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkl0ZW1zKSBjb25zdDsKIHByb3RlY3RlZDoKQEAgLTEyMywxMyArMTIzLDEzIEBACiAgICAgaW50CQkJCQkJCQltX3BhcnNlcmZsYWc7CiAgICAgQ1BERl9UZXh0T2JqZWN0KgkJCQltX3BQcmVUZXh0T2JqOwogICAgIENGWF9BZmZpbmVNYXRyaXgJCQkJbV9wZXJNYXRyaXg7Ci0gICAgRlhfQk9PTAkJCQkJCQltX0lzUGFyc2VyZWQ7CisgICAgYm9vbAkJCQkJCQltX0lzUGFyc2VyZWQ7CiAgICAgQ0ZYX0FmZmluZU1hdHJpeAkJCQltX0Rpc3BsYXlNYXRyaXg7CiAKICAgICBTRUdNRU5UX0FycmF5CQkJCQltX1NlZ21lbnQ7CiAgICAgQ0ZYX1JlY3RBcnJheQkJCQkJbV9TZWxSZWN0czsKICAgICBMSU5FT0JKCQkJCQkJCW1fTGluZU9iajsKLSAgICBGWF9CT09MCQkJCQkJCW1fVGV4dGxpbmVEaXI7CisgICAgYm9vbAkJCQkJCQltX1RleHRsaW5lRGlyOwogICAgIENGWF9GbG9hdFJlY3QJCQkJCW1fQ3VybGluZVJlY3Q7CiB9OwogY2xhc3MgQ1BERl9UZXh0UGFnZUZpbmQ6IHB1YmxpYyBJUERGX1RleHRQYWdlRmluZApAQCAtMTM4LDE3ICsxMzgsMTcgQEAKICAgICBDUERGX1RleHRQYWdlRmluZChjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOwogICAgIHZpcnR1YWwJCQkJCQkJfkNQREZfVGV4dFBhZ2VGaW5kKCkge307CiBwdWJsaWM6Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCQlGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcyA9IDApOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJRmluZE5leHQoKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUZpbmRQcmV2KCk7CisgICAgdmlydHVhbAlib29sCQkJCQlGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcyA9IDApOworICAgIHZpcnR1YWwJYm9vbAkJCQkJRmluZE5leHQoKTsKKyAgICB2aXJ0dWFsCWJvb2wJCQkJCUZpbmRQcmV2KCk7CiAKICAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQJCQkJCQlHZXRDdXJPcmRlcigpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50CQkJCQkJR2V0TWF0Y2hlZENvdW50KCljb25zdDsKIHByb3RlY3RlZDoKICAgICB2b2lkCQkJCQkJCUV4dHJhY3RGaW5kV2hhdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQpOwotICAgIEZYX0JPT0wJCQkJCQkJSXNNYXRjaFdob2xlV29yZChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKTsKLSAgICBGWF9CT09MCQkJCQkJCUV4dHJhY3RTdWJTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHJTdHJpbmcsIGNvbnN0IEZYX1dDSEFSKiBscHN6RnVsbFN0cmluZywKKyAgICBib29sCQkJCQkJCUlzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcyk7CisgICAgYm9vbAkJCQkJCQlFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCiAgICAgICAgICAgICBpbnQgaVN1YlN0cmluZywgRlhfV0NIQVIgY2hTZXApOwogICAgIENGWF9XaWRlU3RyaW5nCQkJCQlNYWtlUmV2ZXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKICAgICBpbnQJCQkJCQkJCVJldmVyc2VGaW5kKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NXb3JkLCBpbnQgblN0YXJ0UG9zLCBpbnQmIFdvcmRMZW5ndGgpOwpAQCAtMTYyLDEyICsxNjIsMTIgQEAKICAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQkJCW1fY3NGaW5kV2hhdEFycmF5OwogICAgIGludAkJCQkJCQkJbV9maW5kTmV4dFN0YXJ0OwogICAgIGludAkJCQkJCQkJbV9maW5kUHJlU3RhcnQ7Ci0gICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaENhc2U7Ci0gICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaFdob2xlV29yZDsKKyAgICBib29sCQkJCQkJCW1fYk1hdGNoQ2FzZTsKKyAgICBib29sCQkJCQkJCW1fYk1hdGNoV2hvbGVXb3JkOwogICAgIGludAkJCQkJCQkJbV9yZXNTdGFydDsKICAgICBpbnQJCQkJCQkJCW1fcmVzRW5kOwogICAgIENGWF9SZWN0QXJyYXkJCQkJCW1fcmVzQXJyYXk7Ci0gICAgRlhfQk9PTAkJCQkJCQltX0lzRmluZDsKKyAgICBib29sCQkJCQkJCW1fSXNGaW5kOwogfTsKIGNsYXNzIENQREZfTGlua0V4dAogewpAQCAtMTg0LDggKzE4NCw4IEBACiBwdWJsaWM6CiAgICAgQ1BERl9MaW5rRXh0cmFjdCgpOwogICAgIHZpcnR1YWwJCQkJCQkJfkNQREZfTGlua0V4dHJhY3QoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJSXNFeHRyYWN0KCkgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQkJCUV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOworICAgIHZpcnR1YWwJYm9vbAkJCQkJSXNFeHRyYWN0KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX0lzUGFyc2VyZDsKICAgICB9CkBAIC0xOTcsMTQgKzE5NywxNCBAQAogcHJvdGVjdGVkOgogICAgIHZvaWQJCQkJCQkJcGFyc2VyTGluaygpOwogICAgIHZvaWQJCQkJCQkJRGVsZXRlTGlua0xpc3QoKTsKLSAgICBGWF9CT09MCQkJCQkJCUNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjayk7Ci0gICAgRlhfQk9PTAkJCQkJCQlDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICAgIEZYX0JPT0wJCQkJCQkJQXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCk7CisgICAgYm9vbAkJCQkJCQlDaGVja1dlYkxpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0ckJlQ2hlY2spOworICAgIGJvb2wJCQkJCQkJQ2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgICBib29sCQkJCQkJCUFwcGVuZFRvTGlua0xpc3QoaW50IHN0YXJ0LCBpbnQgY291bnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJVcmwpOwogcHJpdmF0ZToKICAgICBMSU5LX0luZm9BcnJheQkJCQkJbV9MaW5rTGlzdDsKICAgICBjb25zdCBDUERGX1RleHRQYWdlKgkJCW1fcFRleHRQYWdlOwogICAgIENGWF9XaWRlU3RyaW5nCQkJCQltX3N0clBhZ2VUZXh0OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc1BhcnNlcmQ7CisgICAgYm9vbAkJCQkJCQltX0lzUGFyc2VyZDsKIH07CiBGWF9TVFJTSVpFIEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbihGWF9XQ0hBUiB3Y2gsIEZYX1dDSEFSKiBwRHN0KTsKIHZvaWQgTm9ybWFsaXplU3RyaW5nKENGWF9XaWRlU3RyaW5nJiBzdHIpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oIGIvY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oCmluZGV4IDI3NWFhYmQuLmVmZTlmZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC90eHRwcm9jLmgKQEAgLTMzLDggKzMzLDggQEAKICAgICB+Q1RleHRCYXNlTGluZSgpOwogICAgIHZvaWQJSW5zZXJ0VGV4dEJveChGWF9GTE9BVCBsZWZ0eCwgRlhfRkxPQVQgcmlnaHR4LCBGWF9GTE9BVCB0b3B5LCBGWF9GTE9BVCBib3R0b215LAogICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcGFjZXcsIEZYX0ZMT0FUIGZvbnRzaXplX3YsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICAgIEZYX0JPT0wJR2V0V2lkdGgoRlhfRkxPQVQmIGxlZnR4LCBGWF9GTE9BVCYgcmlnaHR4KTsKLSAgICBGWF9CT09MCUNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcik7CisgICAgYm9vbAlHZXRXaWR0aChGWF9GTE9BVCYgbGVmdHgsIEZYX0ZMT0FUJiByaWdodHgpOworICAgIGJvb2wJQ2FuTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKTsKICAgICB2b2lkCU1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcik7CiAgICAgdm9pZAlNZXJnZUJveGVzKCk7CiAgICAgdm9pZAlDb3VudENoYXJzKGludCYgY291bnQsIEZYX0ZMT0FUJiB3aWR0aCwgaW50JiBtaW5jaGFycyk7CkBAIC01Nyw5ICs1Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodHgsIEZYX0ZMT0FUIHRvcHksIEZYX0ZMT0FUIGJvdHRvbXksIEZYX0ZMT0FUIHNwYWNldywgRlhfRkxPQVQgZm9udHNpemVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHIsIENQREZfRm9udCogcEZvbnQpOwogICAgIHZvaWQJV3JpdGVPdXRwdXQoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgbGluZXMsIGludCBpTWluV2lkdGgpOwotICAgIEZYX0JPT0wJbV9iQXV0b1dpZHRoOwotICAgIEZYX0JPT0wJbV9iS2VlcENvbHVtbjsKLSAgICBGWF9CT09MCW1fYkJyZWFrU3BhY2U7CisgICAgYm9vbAltX2JBdXRvV2lkdGg7CisgICAgYm9vbAltX2JLZWVwQ29sdW1uOworICAgIGJvb2wJbV9iQnJlYWtTcGFjZTsKIAogcHJpdmF0ZToKICAgICBDRlhfUHRyQXJyYXkJbV9CYXNlTGluZXM7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAppbmRleCA3NjY4Zjg0Li5kYzY0NzQ4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKQEAgLTE3LDkgKzE3LDkgQEAKIGNsYXNzIENDb2RlY19CYXNpY01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfQmFzaWNNb2R1bGUKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIEZYX0JPT0wJUnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCisgICAgdmlydHVhbCBib29sCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCUE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorICAgIHZpcnR1YWwgYm9vbAlBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOwogICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlUnVuTGVuZ3RoRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYyk7CkBAIC00Niw3ICs0Niw3IEBACiAKICAgICB1aW50OF90KgkJCUdldFNjYW5saW5lKGludCBsaW5lKTsKIAotICAgIEZYX0JPT0wJCQkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sCQkJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKICAgICBpbnQJCQkJCUdldFdpZHRoKCkKICAgICB7CkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgIHJldHVybiBtX2JwYzsKICAgICB9CiAKLSAgICBGWF9CT09MCQkJCUlzQ29sb3JUcmFuc2Zvcm1lZCgpCisgICAgYm9vbAkJCQlJc0NvbG9yVHJhbnNmb3JtZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYkNvbG9yVHJhbnNmb3JtZWQ7CiAgICAgfQpAQCAtOTgsMTEgKzk4LDExIEBACiAKICAgICBpbnQJCQkJCW1fUGl0Y2g7CiAKLSAgICBGWF9CT09MCQkJCW1fYkNvbG9yVHJhbnNmb3JtZWQ7CisgICAgYm9vbAkJCQltX2JDb2xvclRyYW5zZm9ybWVkOwogCiAgICAgdWludDhfdCoJCQlSZWFkTmV4dExpbmUoKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKSA9IDA7CisgICAgdmlydHVhbCBib29sCQl2X1Jld2luZCgpID0gMDsKIAogICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpID0gMDsKIApAQCAtMTE4LDIxICsxMTgsMjEgQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpOwotICAgIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgICAgICAgICAgIGludCBLLCBib29sIEVuZE9mTGluZSwgYm9vbCBFbmNvZGVkQnl0ZUFsaWduLCBib29sIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpOworICAgIGJvb2wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKIH07CiBjbGFzcyBDQ29kZWNfRmxhdGVNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ZsYXRlTW9kdWxlCiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQgRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSwKKyAgICB2aXJ0dWFsIEZYX0RXT1JEIEZsYXRlT3JMWldEZWNvZGUoYm9vbCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgYm9vbCBiRWFybHlDaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICB2aXJ0dWFsIGJvb2wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKIH07CiBjbGFzcyBDQ29kZWNfSnBlZ01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfSnBlZ01vZHVsZQogewpAQCAtMTQzLDE3ICsxNDMsMTcgQEAKICAgICAgICAgbV9wRXh0UHJvdmlkZXIgPSBwSlA7CiAgICAgfQogICAgIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pOwotICAgIEZYX0JPT0wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgYm9vbCBDb2xvclRyYW5zZm9ybSk7CisgICAgYm9vbAkJTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgYm9vbCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciwgRlhfRFdPUkQqIGljY19sZW5ndGgpOwotICAgIEZYX0JPT0wJCUVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHksIGNvbnN0IHVpbnQ4X3QqIGljY19idWYsIEZYX0RXT1JEIGljY19sZW5ndGgpOworICAgIGJvb2wJCUVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHksIGNvbnN0IHVpbnQ4X3QqIGljY19idWYsIEZYX0RXT1JEIGljY19sZW5ndGgpOwogICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkCQlGaW5pc2godm9pZCogcENvbnRleHQpOwogICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKICAgICB2aXJ0dWFsIGludAkJCVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIG5Db21wcyk7CiAgICAgdmlydHVhbCBpbnQJCQlTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKTsKKyAgICB2aXJ0dWFsIGJvb2wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOwogcHJvdGVjdGVkOgogICAgIElGWF9KcGVnUHJvdmlkZXIqIG1fcEV4dFByb3ZpZGVyOwpAQCAtMTk5LDEwICsxOTksMTAgQEAKIHsKIHB1YmxpYzoKICAgICBDQ29kZWNfSnB4TW9kdWxlKCk7Ci0gICAgdm9pZCoJCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSA9IEZBTFNFKTsKKyAgICB2b2lkKgkJQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgYm9vbCB1c2VDb2xvclNwYWNlID0gZmFsc2UpOwogICAgIHZvaWQJCUdldEltYWdlSW5mbyh2b2lkKiBjdHgsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7Ci0gICAgRlhfQk9PTAkJRGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKTsKKyAgICBib29sCQlEZWNvZGUodm9pZCogY3R4LCB1aW50OF90KiBkZXN0X2RhdGEsIGludCBwaXRjaCwgYm9vbCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpOwogICAgIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCk7CiB9OwogY2xhc3MgQ1BERl9KYmlnMkludGVyZmFjZSA6IHB1YmxpYyBDSkJpZzJfTW9kdWxlCkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICBGWF9EV09SRCBtX2dsb2JhbF9zaXplOwogICAgIHVpbnQ4X3QqIG1fZGVzdF9idWY7CiAgICAgRlhfRFdPUkQgbV9kZXN0X3BpdGNoOwotICAgIEZYX0JPT0wJbV9iRmlsZVJlYWRlcjsKKyAgICBib29sCW1fYkZpbGVSZWFkZXI7CiAgICAgSUZYX1BhdXNlKiBtX3BQYXVzZTsKICAgICBDSkJpZzJfQ29udGV4dCogbV9wQ29udGV4dDsKICAgICBDSkJpZzJfSW1hZ2UqIG1fZGVzdF9pbWFnZTsKQEAgLTI2Myw5ICsyNjMsOSBAQAogcHVibGljOgogICAgIENDb2RlY19KYmlnMk1vZHVsZSgpIHt9OwogICAgIH5DQ29kZWNfSmJpZzJNb2R1bGUoKTsKLSAgICBGWF9CT09MCQlEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgYm9vbAkJRGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKTsKLSAgICBGWF9CT09MCQlEZWNvZGUoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKKyAgICBib29sCQlEZWNvZGUoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1Zik7CiAgICAgdm9pZCoJCQkJQ3JlYXRlSmJpZzJDb250ZXh0KCk7CiAgICAgRlhDT0RFQ19TVEFUVVMJCVN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcAppbmRleCA5YmJjY2UxLi44ZWRmZGU1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcApAQCAtNDksMTMgKzQ5LDEzIEBACiAgICAgbV9OZXh0TGluZSArKzsKICAgICByZXR1cm4gbV9wTGFzdFNjYW5saW5lOwogfQotRlhfQk9PTCBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENDb2RlY19TY2FubGluZURlY29kZXI6OlNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9wRGF0YUNhY2hlICYmIGxpbmUgPCBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9OZXh0TGluZSA9PSBsaW5lIHx8IG1fTmV4dExpbmUgPT0gbGluZSArIDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX05leHRMaW5lIDwgMCB8fCBtX05leHRMaW5lID4gbGluZSkgewogICAgICAgICB2X1Jld2luZCgpOwpAQCAtNjYsMTAgKzY2LDEwIEBACiAgICAgICAgIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOwogICAgICAgICBtX05leHRMaW5lICsrOwogICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdWludDhfdCogQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6UmVhZE5leHRMaW5lKCkKIHsKQEAgLTEwNywxMCArMTA3LDEwIEBACiAgICAgbV9wRGF0YUNhY2hlLT5tX1dpZHRoID0gbV9PdXRwdXRXaWR0aDsKICAgICBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzID0gMDsKIH0KLUZYX0JPT0wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKK2Jvb2wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogZXh0ZXJuICJDIiBkb3VibGUgRlhzdHJ0b2QoY29uc3QgY2hhciogbnB0ciwgY2hhcioqIGVuZHB0cikKIHsKQEAgLTIxNiwyNiArMjE2LDI2IEBACiAgICAgfQogICAgIHJldHVybiBpc19uZWdhdGl2ZSA/IC1yZXQgOiByZXQ7CiB9Ci1GWF9CT09MIENDb2RlY19CYXNpY01vZHVsZTo6QTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCitib29sIENDb2RlY19CYXNpY01vZHVsZTo6QTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIGNsYXNzIENDb2RlY19STFNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCiB7CiBwdWJsaWM6CiAgICAgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCk7CiAgICAgdmlydHVhbCB+Q0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCk7Ci0gICAgRlhfQk9PTAkJCQlDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYyk7CisgICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYyk7CiAgICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfUmV3aW5kKCk7CiAgICAgdmlydHVhbCB1aW50OF90Kgl2X0dldE5leHRMaW5lKCk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fU3JjT2Zmc2V0OwogICAgIH0KIHByb3RlY3RlZDoKLSAgICBGWF9CT09MCQkJCUNoZWNrRGVzdFNpemUoKTsKKyAgICBib29sCQkJCUNoZWNrRGVzdFNpemUoKTsKICAgICB2b2lkCQkJCUdldE5leHRPcGVyYXRvcigpOwogICAgIHZvaWQJCQkJVXBkYXRlT3BlcmF0b3IodWludDhfdCB1c2VkX2J5dGVzKTsKIApAQCAtMjQ0LDcgKzI0NCw3IEBACiAgICAgRlhfRFdPUkQJCQltX1NyY1NpemU7CiAgICAgRlhfRFdPUkQJCQltX2R3TGluZUJ5dGVzOwogICAgIEZYX0RXT1JECQkJbV9TcmNPZmZzZXQ7Ci0gICAgRlhfQk9PTAkJCQltX2JFT0Q7CisgICAgYm9vbAkJCQltX2JFT0Q7CiAgICAgdWludDhfdAkJCQltX09wZXJhdG9yOwogfTsKIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCkKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgICwgbV9TcmNTaXplKDApCiAgICAgLCBtX2R3TGluZUJ5dGVzKDApCiAgICAgLCBtX1NyY09mZnNldCgwKQotICAgICwgbV9iRU9EKEZBTFNFKQorICAgICwgbV9iRU9EKGZhbHNlKQogICAgICwgbV9PcGVyYXRvcigwKQogewogfQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDaGVja0Rlc3RTaXplKCkKK2Jvb2wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDaGVja0Rlc3RTaXplKCkKIHsKICAgICBGWF9EV09SRCBpID0gMDsKICAgICBGWF9EV09SRCBvbGRfc2l6ZSA9IDA7CkBAIC0yNzMsMTQgKzI3MywxNCBAQAogICAgICAgICAgICAgb2xkX3NpemUgPSBkZXN0X3NpemU7CiAgICAgICAgICAgICBkZXN0X3NpemUgKz0gbV9wU3JjQnVmW2ldICsgMTsKICAgICAgICAgICAgIGlmIChkZXN0X3NpemUgPCBvbGRfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpICs9IG1fcFNyY0J1ZltpXSArIDI7CiAgICAgICAgIH0gZWxzZSBpZiAobV9wU3JjQnVmW2ldID4gMTI4KSB7CiAgICAgICAgICAgICBvbGRfc2l6ZSA9IGRlc3Rfc2l6ZTsKICAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSAyNTcgLSBtX3BTcmNCdWZbaV07CiAgICAgICAgICAgICBpZiAoZGVzdF9zaXplIDwgb2xkX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArPSAyOwogICAgICAgICB9IGVsc2UgewpAQCAtMjg4LDExICsyODgsMTEgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoKChGWF9EV09SRCltX09yaWdXaWR0aCAqIG1fbkNvbXBzICogbV9icGMgKiBtX09yaWdIZWlnaHQgKyA3KSAvIDggPiBkZXN0X3NpemUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBpbnQgYnBjKQorYm9vbCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBpbnQgYnBjKQogewogICAgIG1fcFNyY0J1ZiA9IHNyY19idWY7CiAgICAgbV9TcmNTaXplID0gc3JjX3NpemU7CkBAIC0zMDAsMjAgKzMwMCwyMCBAQAogICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwogICAgIG1fbkNvbXBzID0gbkNvbXBzOwogICAgIG1fYnBjID0gYnBjOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKKyAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7CiAgICAgbV9Eb3duU2NhbGUgPSAxOwogICAgIG1fUGl0Y2ggPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyAzMSkgLyAzMiAqIDQ7CiAgICAgbV9kd0xpbmVCeXRlcyA9ICh3aWR0aCAqIG5Db21wcyAqIGJwYyArIDcpIC8gODsKICAgICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwogICAgIHJldHVybiBDaGVja0Rlc3RTaXplKCk7CiB9Ci1GWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6dl9SZXdpbmQoKQorYm9vbCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkKIHsKICAgICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOwogICAgIG1fU3JjT2Zmc2V0ID0gMDsKLSAgICBtX2JFT0QgPSBGQUxTRTsKKyAgICBtX2JFT0QgPSBmYWxzZTsKICAgICBtX09wZXJhdG9yID0gMDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHVpbnQ4X3QqIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpCiB7CkBAIC0zMjYsMTcgKzMyNiwxNyBAQAogICAgIH0KICAgICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOwogICAgIEZYX0RXT1JEIGNvbF9wb3MgPSAwOwotICAgIEZYX0JPT0wJZW9sID0gRkFMU0U7CisgICAgYm9vbAllb2wgPSBmYWxzZTsKICAgICB3aGlsZSAobV9TcmNPZmZzZXQgPCBtX1NyY1NpemUgJiYgIWVvbCkgewogICAgICAgICBpZiAobV9PcGVyYXRvciA8IDEyOCkgewogICAgICAgICAgICAgRlhfRFdPUkQgY29weV9sZW4gPSBtX09wZXJhdG9yICsgMTsKICAgICAgICAgICAgIGlmIChjb2xfcG9zICsgY29weV9sZW4gPj0gbV9kd0xpbmVCeXRlcykgewogICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbV9kd0xpbmVCeXRlcyAtIGNvbF9wb3M7Ci0gICAgICAgICAgICAgICAgZW9sID0gVFJVRTsKKyAgICAgICAgICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNvcHlfbGVuID49IG1fU3JjU2l6ZSAtIG1fU3JjT2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgY29weV9sZW4gPSBtX1NyY1NpemUgLSBtX1NyY09mZnNldDsKLSAgICAgICAgICAgICAgICBtX2JFT0QgPSBUUlVFOworICAgICAgICAgICAgICAgIG1fYkVPRCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wU2NhbmxpbmUgKyBjb2xfcG9zLCBtX3BTcmNCdWYgKyBtX1NyY09mZnNldCwgY29weV9sZW4pOwogICAgICAgICAgICAgY29sX3BvcyArPSBjb3B5X2xlbjsKQEAgLTM0OSwxMyArMzQ5LDEzIEBACiAgICAgICAgICAgICBGWF9EV09SRCBkdXBsaWNhdGVfbGVuID0gMjU3IC0gbV9PcGVyYXRvcjsKICAgICAgICAgICAgIGlmIChjb2xfcG9zICsgZHVwbGljYXRlX2xlbiA+PSBtX2R3TGluZUJ5dGVzKSB7CiAgICAgICAgICAgICAgICAgZHVwbGljYXRlX2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwotICAgICAgICAgICAgICAgIGVvbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZW9sID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZYU1lTX21lbXNldChtX3BTY2FubGluZSArIGNvbF9wb3MsIGZpbGwsIGR1cGxpY2F0ZV9sZW4pOwogICAgICAgICAgICAgY29sX3BvcyArPSBkdXBsaWNhdGVfbGVuOwogICAgICAgICAgICAgVXBkYXRlT3BlcmF0b3IoKHVpbnQ4X3QpZHVwbGljYXRlX2xlbik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2JFT0QgPSBUUlVFOworICAgICAgICAgICAgbV9iRU9EID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwCmluZGV4IGQ0NTYwMDMuLjM0NDZkMGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKQEAgLTc5LDcgKzc5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHBvczsKIH0KLXZvaWQgX0ZheEc0RmluZEIxQjIoY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMsIGludCBhMCwgRlhfQk9PTCBhMGNvbG9yLCBpbnQmIGIxLCBpbnQmIGIyKQordm9pZCBfRmF4RzRGaW5kQjFCMihjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29sdW1ucywgaW50IGEwLCBib29sIGEwY29sb3IsIGludCYgYjEsIGludCYgYjIpCiB7CiAgICAgaWYgKGEwY29sb3IpIHsKICAgICAgICAgYTBjb2xvciA9IDE7CkBAIC00MDAsMjcgKzQwMCwyNyBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMpCitib29sIF9GYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29sdW1ucykKIHsKICAgICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50IGExLCBhMiwgYjEsIGIyOwogICAgICAgICBfRmF4RzRGaW5kQjFCMihyZWZfYnVmLCBjb2x1bW5zLCBhMCwgYTBjb2xvciwgYjEsIGIyKTsKLSAgICAgICAgRlhfQk9PTCBiaXQgPSBORVhUQklUOworICAgICAgICBib29sIGJpdCA9IE5FWFRCSVQ7CiAgICAgICAgIGludCB2X2RlbHRhID0gMDsKICAgICAgICAgaWYgKGJpdCkgewogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JPT0wgYml0MSA9IE5FWFRCSVQ7CisgICAgICAgICAgICBib29sIGJpdDEgPSBORVhUQklUOwogICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JPT0wgYml0MiA9IE5FWFRCSVQ7CisgICAgICAgICAgICBib29sIGJpdDIgPSBORVhUQklUOwogICAgICAgICAgICAgaWYgKGJpdDEgJiYgYml0MikgewogICAgICAgICAgICAgICAgIHZfZGVsdGEgPSAxOwogICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7CkBAIC00NTcsMTAgKzQ1NywxMCBAQAogICAgICAgICAgICAgICAgIGlmIChhMCA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJpdCA9IE5FWFRCSVQ7CiAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewpAQCAtNDY4LDI2ICs0NjgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGIyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYjIgPj0gY29sdW1ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhMCA9IGIyOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJpdDEgPSBORVhUQklUOworICAgICAgICAgICAgICAgICAgICBib29sIGJpdDEgPSBORVhUQklUOwogICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOworICAgICAgICAgICAgICAgICAgICBib29sIGJpdDIgPSBORVhUQklUOwogICAgICAgICAgICAgICAgICAgICBpZiAoYml0MSAmJiBiaXQyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gLTI7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IE5FWFRCSVQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0KSB7CkBAIC00OTcsNyArNDk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgPSBORVhUQklUOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewpAQCAtNTA1LDcgKzUwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHBvcyArPSA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTE2LDEzICs1MTYsMTMgQEAKICAgICAgICAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGExKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYTEgPj0gY29sdW1ucykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBhMCA9IGExOwogICAgICAgICBhMGNvbG9yID0gIWEwY29sb3I7CiAgICAgfQogfQotRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCitib29sIF9GYXhTa2lwRU9MKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcykKIHsKICAgICBpbnQgc3RhcnRiaXQgPSBiaXRwb3M7CiAgICAgd2hpbGUgKGJpdHBvcyA8IGJpdHNpemUpIHsKQEAgLTUzMSwxOCArNTMxLDE4IEBACiAgICAgICAgICAgICBpZiAoYml0cG9zIC0gc3RhcnRiaXQgPD0gMTEpIHsKICAgICAgICAgICAgICAgICBiaXRwb3MgPSBzdGFydGJpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgX0ZheEdldDFETGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgY29sdW1ucykKK2Jvb2wgX0ZheEdldDFETGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgY29sdW1ucykKIHsKLSAgICBpbnQgY29sb3IgPSBUUlVFOworICAgIGludCBjb2xvciA9IHRydWU7CiAgICAgaW50IHN0YXJ0cG9zID0gMDsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpbnQgcnVuX2xlbiA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7CkBAIC01NTEsMTAgKzU1MSwxMCBAQAogICAgICAgICAgICAgICAgIHdoaWxlIChiaXRwb3MgPCBiaXRzaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBiaXQgPSBORVhUQklUOwogICAgICAgICAgICAgICAgICAgICBpZiAoYml0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBydW5fbGVuICs9IHJ1bjsKICAgICAgICAgICAgIGlmIChydW4gPCA2NCkgewpAQCAtNTcwLDE3ICs1NzAsMTcgQEAKICAgICAgICAgfQogICAgICAgICBjb2xvciA9ICFjb2xvcjsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjbGFzcyBDQ29kZWNfRmF4RGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCiB7CiBwdWJsaWM6CiAgICAgQ0NvZGVjX0ZheERlY29kZXIoKTsKICAgICB2aXJ0dWFsIH5DQ29kZWNfRmF4RGVjb2RlcigpOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cyk7CisgICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywgYm9vbCBFbmRPZkxpbmUsIGJvb2wgRW5jb2RlZEJ5dGVBbGlnbiwgYm9vbCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKTsKICAgICB2aXJ0dWFsIHZvaWQJCXZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOworICAgIHZpcnR1YWwgYm9vbAkJdl9SZXdpbmQoKTsKICAgICB2aXJ0dWFsIHVpbnQ4X3QqCXZfR2V0TmV4dExpbmUoKTsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCgpOwogICAgIGludAkJCW1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKQEAgLTYwNCw4ICs2MDQsOCBAQAogICAgICAgICBGWF9GcmVlKG1fcFJlZkJ1Zik7CiAgICAgfQogfQotRlhfQk9PTCBDQ29kZWNfRmF4RGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykKK2Jvb2wgQ0NvZGVjX0ZheERlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLCBib29sIEVuZE9mTGluZSwgYm9vbCBFbmNvZGVkQnl0ZUFsaWduLCBib29sIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCiB7CiAgICAgbV9FbmNvZGluZyA9IEs7CiAgICAgbV9iRW5kT2ZMaW5lID0gRW5kT2ZMaW5lOwpAQCAtNjI4LDE0ICs2MjgsMTQgQEAKICAgICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKICAgICBtX25Db21wcyA9IDE7CiAgICAgbV9icGMgPSAxOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENDb2RlY19GYXhEZWNvZGVyOjp2X1Jld2luZCgpCitib29sIENDb2RlY19GYXhEZWNvZGVyOjp2X1Jld2luZCgpCiB7CiAgICAgRlhTWVNfbWVtc2V0KG1fcFJlZkJ1ZiwgMHhmZiwgbV9QaXRjaCk7CiAgICAgYml0cG9zID0gMDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHVpbnQ4X3QqIENDb2RlY19GYXhEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkKIHsKQEAgLTY1MSw3ICs2NTEsNyBAQAogICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZyA9PSAwKSB7CiAgICAgICAgIF9GYXhHZXQxRExpbmUobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX09yaWdXaWR0aCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhfQk9PTCBiTmV4dDFEID0gbV9wU3JjQnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7CisgICAgICAgIGJvb2wgYk5leHQxRCA9IG1fcFNyY0J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOwogICAgICAgICBiaXRwb3MgKys7CiAgICAgICAgIGlmIChiTmV4dDFEKSB7CiAgICAgICAgICAgICBfRmF4R2V0MURMaW5lKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9PcmlnV2lkdGgpOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAgICAgICAgIHdoaWxlIChtX2JCeXRlQWxpZ24gJiYgYml0cG9zMCA8IGJpdHBvczEpIHsKICAgICAgICAgICAgIGludCBiaXQgPSBtX3BTcmNCdWZbYml0cG9zMCAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MwICUgOCkpOwogICAgICAgICAgICAgaWYgKGJpdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9iQnl0ZUFsaWduID0gRkFMU0U7CisgICAgICAgICAgICAgICAgbV9iQnl0ZUFsaWduID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJpdHBvczAgKys7CiAgICAgICAgICAgICB9CkBAIC04NDYsNyArODQ2LDcgQEAKICAgICAgICAgZGVzdF9iaXRwb3MgKys7CiAgICAgfQogfQotc3RhdGljIHZvaWQgX0ZheEVuY29kZVJ1bih1aW50OF90KiBkZXN0X2J1ZiwgaW50JiBkZXN0X2JpdHBvcywgaW50IHJ1biwgRlhfQk9PTCBiV2hpdGUpCitzdGF0aWMgdm9pZCBfRmF4RW5jb2RlUnVuKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQmIGRlc3RfYml0cG9zLCBpbnQgcnVuLCBib29sIGJXaGl0ZSkKIHsKICAgICB3aGlsZSAocnVuID49IDI1NjApIHsKICAgICAgICAgX0FkZEJpdFN0cmVhbShkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsIDB4MWYsIDEyKTsKQEAgLTk3MiwxNCArOTcyLDE0IEBACiAgICAgZGVzdF9zaXplID0gbV9EZXN0QnVmLkdldFNpemUoKTsKICAgICBtX0Rlc3RCdWYuRGV0YWNoQnVmZmVyKCk7CiB9Ci1GWF9CT09MCUNDb2RlY19GYXhNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQorYm9vbAlDQ29kZWNfRmF4TW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKICAgICBDQ29kZWNfRmF4RW5jb2RlciBlbmNvZGVyKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsIHBpdGNoKTsKICAgICBlbmNvZGVyLkVuY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIElDb2RlY19TY2FubGluZURlY29kZXIqCUNDb2RlY19GYXhNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykKKyAgICAgICAgaW50IEssIGJvb2wgRW5kT2ZMaW5lLCBib29sIEVuY29kZWRCeXRlQWxpZ24sIGJvb2wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykKIHsKICAgICBDQ29kZWNfRmF4RGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0NvZGVjX0ZheERlY29kZXI7CiAgICAgcERlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgSywgRW5kT2ZMaW5lLCBFbmNvZGVkQnl0ZUFsaWduLCBCbGFja0lzMSwgQ29sdW1ucywgUm93cyk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCmluZGV4IGQxMjllMzYuLmE2MWJlNzUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCkBAIC04NCw3ICs4NCw3IEBACiBjbGFzcyBDTFpXRGVjb2RlcgogewogcHVibGljOgotICAgIGludCBEZWNvZGUodWludDhfdCogb3V0cHV0LCBGWF9EV09SRCYgb3V0bGVuLCBjb25zdCB1aW50OF90KiBpbnB1dCwgRlhfRFdPUkQmIHNpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlKTsKKyAgICBpbnQgRGVjb2RlKHVpbnQ4X3QqIG91dHB1dCwgRlhfRFdPUkQmIG91dGxlbiwgY29uc3QgdWludDhfdCogaW5wdXQsIEZYX0RXT1JEJiBzaXplLCBib29sIGJFYXJseUNoYW5nZSk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCBBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsKQEAgLTk0LDcgKzk0LDcgQEAKICAgICBGWF9EV09SRAltX091dFBvczsKICAgICB1aW50OF90KgltX3BPdXRwdXQ7CiAgICAgY29uc3QgdWludDhfdCoJbV9wSW5wdXQ7Ci0gICAgRlhfQk9PTAkJbV9FYXJseTsKKyAgICBib29sCQltX0Vhcmx5OwogICAgIEZYX0RXT1JECW1fQ29kZUFycmF5WzUwMjFdOwogICAgIEZYX0RXT1JECW1fbkNvZGVzOwogICAgIHVpbnQ4X3QJCW1fRGVjb2RlU3RhY2tbNDAwMF07CkBAIC0xMzQsNyArMTM0LDcgQEAKICAgICB9CiAgICAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gKHVpbnQ4X3QpY29kZTsKIH0KLWludCBDTFpXRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCYgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlKQoraW50IENMWldEZWNvZGVyOjpEZWNvZGUodWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEJiBzcmNfc2l6ZSwgYm9vbCBiRWFybHlDaGFuZ2UpCiB7CiAgICAgbV9Db2RlTGVuID0gOTsKICAgICBtX0luUG9zID0gMDsKQEAgLTIzOCwxNCArMjM4LDE0IEBACiAgICAgfQogICAgIHJldHVybiAodWludDhfdCljOwogfQotc3RhdGljIEZYX0JPT0wgUE5HX1ByZWRpY3RvckVuY29kZSh1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCitzdGF0aWMgYm9vbCBQTkdfUHJlZGljdG9yRW5jb2RlKHVpbnQ4X3QqJiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQogewogICAgIGNvbnN0IGludCBCeXRlc1BlclBpeGVsID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKyA3KSAvIDg7CiAgICAgY29uc3QgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OwogICAgIGlmIChyb3dfc2l6ZSA8PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKICAgICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIHJvd19zaXplOwogICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCByb3dfc2l6ZSArIDEsIHJvd19jb3VudCk7CkBAIC0zMjgsNyArMzI4LDcgQEAKICAgICBGWF9GcmVlKGRhdGFfYnVmKTsKICAgICBkYXRhX2J1ZiA9IGRlc3RfYnVmOwogICAgIGRhdGFfc2l6ZSA9IChyb3dfc2l6ZSArIDEpICogcm93X2NvdW50IC0gKGxhc3Rfcm93X3NpemUgPiAwID8gKHJvd19zaXplIC0gbGFzdF9yb3dfc2l6ZSkgOiAwKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyB2b2lkIFBOR19QcmVkaWN0TGluZSh1aW50OF90KiBwRGVzdERhdGEsIGNvbnN0IHVpbnQ4X3QqIHBTcmNEYXRhLCBjb25zdCB1aW50OF90KiBwTGFzdExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywgaW50IG5Db2xvcnMsIGludCBuUGl4ZWxzKQpAQCAtMzkzLDEzICszOTMsMTMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLXN0YXRpYyBGWF9CT09MIFBOR19QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAorc3RhdGljIGJvb2wgUE5HX1ByZWRpY3Rvcih1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKIHsKICAgICBjb25zdCBpbnQgQnl0ZXNQZXJQaXhlbCA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICsgNykgLyA4OwogICAgIGNvbnN0IGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKICAgICBpZiAocm93X3NpemUgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSkgLyAocm93X3NpemUgKyAxKTsKICAgICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIChyb3dfc2l6ZSArIDEpOwogICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCByb3dfc2l6ZSwgcm93X2NvdW50KTsKQEAgLTQ3OSw3ICs0NzksNyBAQAogICAgIEZYX0ZyZWUoZGF0YV9idWYpOwogICAgIGRhdGFfYnVmID0gZGVzdF9idWY7CiAgICAgZGF0YV9zaXplID0gcm93X3NpemUgKiByb3dfY291bnQgLSAobGFzdF9yb3dfc2l6ZSA+IDAgPyAocm93X3NpemUgKyAxIC0gbGFzdF9yb3dfc2l6ZSkgOiAwKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyB2b2lkIFRJRkZfUHJlZGljdG9yRW5jb2RlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHJvd19zaXplLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbG9ycywgaW50IENvbHVtbnMpCiB7CkBAIC01MTgsMTIgKzUxOCwxMiBAQAogICAgICAgICB9CiAgICAgfQogfQotc3RhdGljIEZYX0JPT0wgVElGRl9QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAorc3RhdGljIGJvb2wgVElGRl9QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQogewogICAgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKICAgICBpZiAocm93X3NpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7CiAgICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdysrKSB7CkBAIC01MzMsNyArNTMzLDcgQEAKICAgICAgICAgfQogICAgICAgICBUSUZGX1ByZWRpY3RvckVuY29kZUxpbmUoc2Nhbl9saW5lLCByb3dfc2l6ZSwgQml0c1BlckNvbXBvbmVudCwgQ29sb3JzLCBDb2x1bW5zKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgdm9pZCBUSUZGX1ByZWRpY3RMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcm93X3NpemUsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sb3JzLCBpbnQgQ29sdW1ucykKIHsKQEAgLTU2OCwxMiArNTY4LDEyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1zdGF0aWMgRlhfQk9PTCBUSUZGX1ByZWRpY3Rvcih1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCitzdGF0aWMgYm9vbCBUSUZGX1ByZWRpY3Rvcih1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCiB7CiAgICAgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OwogICAgIGlmIChyb3dfc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKICAgICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIHJvd19zaXplOwogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHJvd19jb3VudDsgcm93ICsrKSB7CkBAIC01ODMsNyArNTgzLDcgQEAKICAgICAgICAgfQogICAgICAgICBUSUZGX1ByZWRpY3RMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywgQ29sdW1ucyk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIKIHsKQEAgLTU5Nyw3ICs1OTcsNyBAQAogICAgICAgICBkZWxldGUgdGhpczsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKKyAgICB2aXJ0dWFsIGJvb2wJCXZfUmV3aW5kKCk7CiAgICAgdmlydHVhbCB1aW50OF90Kgl2X0dldE5leHRMaW5lKCk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKTsKICAgICB2b2lkKgkJCQltX3BGbGF0ZTsKQEAgLTY0Niw3ICs2NDYsNyBAQAogICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwogICAgIG1fbkNvbXBzID0gbkNvbXBzOwogICAgIG1fYnBjID0gYnBjOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKKyAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gZmFsc2U7CiAgICAgbV9QaXRjaCA9ICh3aWR0aCAqIG5Db21wcyAqIGJwYyArIDcpIC8gODsKICAgICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwogICAgIG1fUHJlZGljdG9yID0gMDsKQEAgLTY3MiwxOCArNjcyLDE4IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6dl9SZXdpbmQoKQorYm9vbCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkKIHsKICAgICBpZiAobV9wRmxhdGUpIHsKICAgICAgICAgRlBERkFQSV9GbGF0ZUVuZChtX3BGbGF0ZSk7CiAgICAgfQogICAgIG1fcEZsYXRlID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKICAgICBpZiAobV9wRmxhdGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlBERkFQSV9GbGF0ZUlucHV0KG1fcEZsYXRlLCBtX1NyY0J1ZiwgbV9TcmNTaXplKTsKICAgICBtX0xlZnRPdmVyID0gMDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHVpbnQ4X3QqIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpCiB7CkBAIC03MzIsNyArNzMyLDcgQEAKIHN0YXRpYyB2b2lkIEZsYXRlVW5jb21wcmVzcyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfRFdPUkQgb3JpZ19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgRlhfRFdPUkQmIG9mZnNldCkKIHsKLSAgICBjb25zdCBGWF9CT09MIHVzZU9sZEltcGwgPSBzcmNfc2l6ZSA8IDEwMjQwOworICAgIGNvbnN0IGJvb2wgdXNlT2xkSW1wbCA9IHNyY19zaXplIDwgMTAyNDA7CiAgICAgRlhfRFdPUkQgZ3Vlc3Nfc2l6ZSA9IG9yaWdfc2l6ZSA/IG9yaWdfc2l6ZSA6IHNyY19zaXplICogMjsKICAgICBGWF9EV09SRCBhbGxvY19zdGVwID0gb3JpZ19zaXplID8gMTAyNDAgOiAoc3JjX3NpemUgPCAxMDI0MCA/IDEwMjQwIDogc3JjX3NpemUpOwogICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBrTWF4SW5pdGlhbEFsbG9jU2l6ZSA9IDEwMDAwMDAwOwpAQCAtODM5LDcgKzgzOSw3IEBACiAgICAgcERlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBicGMsIHByZWRpY3RvciwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKICAgICByZXR1cm4gcERlY29kZXI7CiB9Ci1GWF9EV09SRCBDQ29kZWNfRmxhdGVNb2R1bGU6OkZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UsCitGWF9EV09SRCBDQ29kZWNfRmxhdGVNb2R1bGU6OkZsYXRlT3JMWldEZWNvZGUoYm9vbCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgYm9vbCBiRWFybHlDaGFuZ2UsCiAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKIHsKQEAgLTg3Niw3ICs4NzYsNyBAQAogICAgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgfQotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgICBib29sIHJldCA9IHRydWU7CiAgICAgaWYgKHByZWRpY3Rvcl90eXBlID09IDIpIHsKICAgICAgICAgcmV0ID0gUE5HX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7CkBAIC04ODYsNyArODg2LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHJldCA/IG9mZnNldCA6IC0xOwogfQotRlhfQk9PTCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKK2Jvb2wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQogewpAQCAtODk2LDcgKzg5Niw3IEBACiAgICAgdWludDhfdCogcFNyY0J1ZiA9IE5VTEw7CiAgICAgcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKICAgICBGWFNZU19tZW1jcHkocFNyY0J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgICBib29sIHJldCA9IHRydWU7CiAgICAgaWYgKHByZWRpY3RvciA9PSAyKSB7CiAgICAgICAgIHJldCA9IFRJRkZfUHJlZGljdG9yRW5jb2RlKHBTcmNCdWYsIHNyY19zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMpOwpAQCAtOTA5LDEyICs5MDksMTIgQEAKICAgICBGWF9GcmVlKHBTcmNCdWYpOwogICAgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENDb2RlY19GbGF0ZU1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCitib29sIENDb2RlY19GbGF0ZU1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCiB7CiAgICAgZGVzdF9zaXplID0gc3JjX3NpemUgKyBzcmNfc2l6ZSAvIDEwMDAgKyAxMjsKICAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jKCB1aW50OF90LCBkZXN0X3NpemUpOwogICAgIHVuc2lnbmVkIGxvbmcgdGVtcF9zaXplID0gZGVzdF9zaXplOwogICAgIEZQREZBUElfRmxhdGVDb21wcmVzcyhkZXN0X2J1ZiwgJnRlbXBfc2l6ZSwgc3JjX2J1Ziwgc3JjX3NpemUpOwogICAgIGRlc3Rfc2l6ZSA9IChGWF9EV09SRCl0ZW1wX3NpemU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAKaW5kZXggNzUwN2ZlNS4uMGNjZmUxZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcApAQCAtMTQsNyArMTQsNyBAQAogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfQ01ZSyA9IDQ7CiBjb25zdCBGWF9EV09SRCBOX0NPTVBPTkVOVF9ERUZBVUxUID0gMzsKIAotRlhfQk9PTCBNRDVDb21wdXRlSUQoIGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSApCitib29sIE1ENUNvbXB1dGVJRCggY29uc3Qgdm9pZCogYnVmLCBGWF9EV09SRCBkd1NpemUsIHVpbnQ4X3QgSURbMTZdICkKIHsKICAgICByZXR1cm4gY21zTUQ1Y29tcHV0ZUlERXh0KGJ1ZiwgZHdTaXplLCBJRCk7CiB9CkBAIC0yMiw1MCArMjIsNTAgQEAKICAgICBjbXNIVFJBTlNGT1JNIG1faFRyYW5zZm9ybTsKICAgICBpbnQJCQltX25TcmNDb21wb25lbnRzOwogICAgIGludAkJCW1fbkRzdENvbXBvbmVudHM7Ci0gICAgRlhfQk9PTAkJbV9iTGFiOworICAgIGJvb2wJCW1fYkxhYjsKIH07CiBleHRlcm4gIkMiIHsKICAgICBpbnQgb3VySGFuZGxlcihpbnQgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpFcnJvclRleHQpCiAgICAgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfTsKLUZYX0JPT0wgQ2hlY2tDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MsIGludCBuQ29tcG9uZW50cywgRlhfQk9PTCBiRHN0KQorYm9vbCBDaGVja0NvbXBvbmVudHMoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcywgaW50IG5Db21wb25lbnRzLCBib29sIGJEc3QpCiB7CiAgICAgaWYgKG5Db21wb25lbnRzIDw9IDAgfHwgbkNvbXBvbmVudHMgPiAxNSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3dpdGNoKGNzKSB7CiAgICAgICAgIGNhc2UgY21zU2lnTGFiRGF0YToKICAgICAgICAgICAgIGlmIChuQ29tcG9uZW50cyA8IDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgY21zU2lnR3JheURhdGE6CiAgICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghYkRzdCAmJiBuQ29tcG9uZW50cyA+IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgY21zU2lnUmdiRGF0YToKICAgICAgICAgICAgIGlmIChiRHN0ICYmIG5Db21wb25lbnRzICE9IDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgY21zU2lnQ215a0RhdGE6CiAgICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKG5Db21wb25lbnRzICE9IDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50MzJfdCBHZXRDU0NvbXBvbmVudHMoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcykKIHsKQEAgLTExMiwxMiArMTEyLDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpbnQgc3JjRm9ybWF0OwotICAgIEZYX0JPT0wgYkxhYiA9IEZBTFNFOworICAgIGJvb2wgYkxhYiA9IGZhbHNlOwogICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3JjQ1MgPSBjbXNHZXRDb2xvclNwYWNlKHNyY1Byb2ZpbGUpOwogICAgIG5TcmNDb21wb25lbnRzID0gR2V0Q1NDb21wb25lbnRzKHNyY0NTKTsKICAgICBpZiAoc3JjQ1MgPT0gY21zU2lnTGFiRGF0YSkgewogICAgICAgICBzcmNGb3JtYXQgPSBDT0xPUlNQQUNFX1NIKFBUX0xhYikgfCBDSEFOTkVMU19TSChuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgwKTsKLSAgICAgICAgYkxhYiA9IFRSVUU7CisgICAgICAgIGJMYWIgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNyY0Zvcm1hdCA9IENPTE9SU1BBQ0VfU0goUFRfQU5ZKSB8IENIQU5ORUxTX1NIKG5TcmNDb21wb25lbnRzKSB8IEJZVEVTX1NIKDEpOwogICAgICAgICBpZiAoc3JjQ1MgPT0gY21zU2lnUmdiRGF0YSAmJiBUX0RPU1dBUChkd1NyY0Zvcm1hdCkpIHsKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgZHN0Q1MgPSBjbXNHZXRDb2xvclNwYWNlKGRzdFByb2ZpbGUpOwotICAgIGlmICghQ2hlY2tDb21wb25lbnRzKGRzdENTLCBuRHN0Q29tcG9uZW50cywgVFJVRSkpIHsKKyAgICBpZiAoIUNoZWNrQ29tcG9uZW50cyhkc3RDUywgbkRzdENvbXBvbmVudHMsIHRydWUpKSB7CiAgICAgICAgIGNtc0Nsb3NlUHJvZmlsZShzcmNQcm9maWxlKTsKICAgICAgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOwogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwCmluZGV4IDUxMTg0MzAuLmMxM2EyZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcApAQCAtMjYsMjggKzI2LDI4IEBACiAgICAgfQogICAgIHBKYmlnMkNvbnRlbnQgPSBOVUxMOwogfQotRlhfQk9PTCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKK2Jvb2wgQ0NvZGVjX0piaWcyTW9kdWxlOjpEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdsb2JhbF9kYXRhLCBGWF9EV09SRCBnbG9iYWxfc2l6ZSwgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEIGRlc3RfcGl0Y2gpCiB7CiAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKICAgICBDSkJpZzJfQ29udGV4dCogcENvbnRleHQgPSBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWdsb2JhbF9kYXRhLCBnbG9iYWxfc2l6ZSwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplLCBKQklHMl9FTUJFRF9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSk7CiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCByZXQgPSBwQ29udGV4dC0+Z2V0Rmlyc3RQYWdlKGRlc3RfYnVmLCB3aWR0aCwgaGVpZ2h0LCBkZXN0X3BpdGNoLCBOVUxMKTsKICAgICBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQocENvbnRleHQpOwogICAgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGR3b3JkX3NpemUgPSBoZWlnaHQgKiBkZXN0X3BpdGNoIC8gNDsKICAgICBGWF9EV09SRCogZHdvcmRfYnVmID0gKEZYX0RXT1JEKilkZXN0X2J1ZjsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX3NpemU7IGkgKyspIHsKICAgICAgICAgZHdvcmRfYnVmW2ldID0gfmR3b3JkX2J1ZltpXTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCitib29sIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpCiB7CiAgICAgQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKQEAgLTcxLDE1ICs3MSwxNSBAQAogICAgIGhlaWdodCA9IChGWF9EV09SRClkZXN0X2ltYWdlLT5tX25IZWlnaHQ7CiAgICAgcGl0Y2ggPSAoRlhfRFdPUkQpZGVzdF9pbWFnZS0+bV9uU3RyaWRlOwogICAgIGRlc3RfYnVmID0gZGVzdF9pbWFnZS0+bV9wRGF0YTsKLSAgICBkZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOworICAgIGRlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gZmFsc2U7CiAgICAgZGVsZXRlIGRlc3RfaW1hZ2U7CiAgICAgRlhfRnJlZShzcmNfYnVmKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIGZhaWxlZDoKICAgICBpZihzcmNfYnVmKSB7CiAgICAgICAgIEZYX0ZyZWUoc3JjX2J1Zik7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBGWENPREVDX1NUQVRVUyBDQ29kZWNfSmJpZzJNb2R1bGU6OlN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAogICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoLCBJRlhfUGF1c2UqIHBQYXVzZSkKQEAgLTk3LDcgKzk3LDcgQEAKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9idWYgPSBkZXN0X2J1ZjsKICAgICBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9waXRjaCA9IGRlc3RfcGl0Y2g7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BQYXVzZSA9IHBQYXVzZTsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fYkZpbGVSZWFkZXIgPSBGQUxTRTsKKyAgICBtX3BKYmlnMkNvbnRleHQtPm1fYkZpbGVSZWFkZXIgPSBmYWxzZTsKICAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYsIDAsIGhlaWdodCAqIGRlc3RfcGl0Y2gpOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IENKQmlnMl9Db250ZXh0OjpDcmVhdGVDb250ZXh0KCZtX01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopZ2xvYmFsX2RhdGEsIGdsb2JhbF9zaXplLCAodWludDhfdCopc3JjX2J1Ziwgc3JjX3NpemUsIEpCSUcyX0VNQkVEX1NUUkVBTSwgJm1fU3ltYm9sRGljdENhY2hlLCBwUGF1c2UpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOwogICAgIH0KICAgICBDQ29kZWNfSmJpZzJDb250ZXh0KiBtX3BKYmlnMkNvbnRleHQgPSAoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGV4dDsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fYkZpbGVSZWFkZXIgPSBUUlVFOworICAgIG1fcEpiaWcyQ29udGV4dC0+bV9iRmlsZVJlYWRlciA9IHRydWU7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UgPSBOVUxMOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSA9IChGWF9EV09SRClmaWxlX3B0ci0+R2V0U2l6ZSgpOwogICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplKTsKQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbkhlaWdodDsKICAgICAgICAgcGl0Y2ggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fblN0cmlkZTsKICAgICAgICAgZGVzdF9idWYgPSBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9wRGF0YTsKLSAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gRkFMU0U7CisgICAgICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IGZhbHNlOwogICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKICAgICB9CiAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCk7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbkhlaWdodDsKICAgICBwaXRjaCA9IChGWF9EV09SRCltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9uU3RyaWRlOwogICAgIGRlc3RfYnVmID0gbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fcERhdGE7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gRkFMU0U7CisgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gZmFsc2U7CiAgICAgZGVsZXRlIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlOwogICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOwogICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKaW5kZXggNjgzOWQzMS4uMWFjMmYwMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCkBAIC03OCwxNSArNzgsMTUgQEAKICNkZWZpbmUJSlBFR19NQVJLRVJfQVVUSE9SVElNRQkoSlBFR19BUFAwICsgMykKICNkZWZpbmUJSlBFR19NQVJLRVJfTUFYU0laRQkweEZGRkYKICNkZWZpbmUJSlBFR19PVkVSSEVBRF9MRU4JMTQKLXN0YXRpYwlGWF9CT09MIF9KcGVnRW1iZWRJY2NQcm9maWxlKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjb25zdCB1aW50OF90KiBpY2NfYnVmX3B0ciwgRlhfRFdPUkQgaWNjX2xlbmd0aCkKK3N0YXRpYwlib29sIF9KcGVnRW1iZWRJY2NQcm9maWxlKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjb25zdCB1aW50OF90KiBpY2NfYnVmX3B0ciwgRlhfRFdPUkQgaWNjX2xlbmd0aCkKIHsKICAgICBpZihpY2NfYnVmX3B0ciA9PSBOVUxMIHx8IGljY19sZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgaWNjX3NlZ21lbnRfc2l6ZSA9IChKUEVHX01BUktFUl9NQVhTSVpFIC0gMiAtIEpQRUdfT1ZFUkhFQURfTEVOKTsKICAgICBGWF9EV09SRCBpY2Nfc2VnbWVudF9udW0gPSAoaWNjX2xlbmd0aCAvIGljY19zZWdtZW50X3NpemUpICsgMTsKICAgICBpZiAoaWNjX3NlZ21lbnRfbnVtID4gMjU1KQl7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9EV09SRCBpY2NfZGF0YV9sZW5ndGggPSBKUEVHX09WRVJIRUFEX0xFTiArIChpY2Nfc2VnbWVudF9udW0gPiAxID8gaWNjX3NlZ21lbnRfc2l6ZSA6IGljY19sZW5ndGgpOwogICAgIHVpbnQ4X3QqIGljY19kYXRhID0gRlhfQWxsb2ModWludDhfdCwgaWNjX2RhdGFfbGVuZ3RoKTsKQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgIEZYU1lTX21lbWNweShpY2NfZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLCBpY2NfYnVmX3B0ciArIGljY19zaXplLCBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOwogICAgIGpwZWdfd3JpdGVfbWFya2VyKGNpbmZvLCBKUEVHX01BUktFUl9JQ0MsIGljY19kYXRhLCBKUEVHX09WRVJIRUFEX0xFTiArIGljY19sZW5ndGggLSBpY2Nfc2l6ZSk7CiAgICAgRlhfRnJlZShpY2NfZGF0YSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBleHRlcm4gIkMiIHsKICAgICBzdGF0aWMgdm9pZCBfZGVzdF9kb19ub3RoaW5nKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7fQpAQCAtMTEwLDcgKzExMCw3IEBACiBleHRlcm4gIkMiIHsKICAgICBzdGF0aWMgYm9vbGVhbiBfZGVzdF9lbXB0eShqX2NvbXByZXNzX3B0ciBjaW5mbykKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH07CiAjZGVmaW5lCUpQRUdfQkxPQ0tfU0laRQkxMDQ4NTc2CkBAIC0xNzgsOSArMTc4LDkgQEAKICAgICB9CiAgICAganBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKICAgICBpZihxdWFsaXR5ICE9IDc1KSB7Ci0gICAgICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKKyAgICAgICAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIHF1YWxpdHksIHRydWUpOwogICAgIH0KLSAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisgICAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIHRydWUpOwogICAgIF9KcGVnRW1iZWRJY2NQcm9maWxlKCZjaW5mbywgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7CiAgICAgSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CiAgICAgSkRJTUVOU0lPTiByb3c7CkBAIC0yMjEsOCArMjIxLDggQEAKICAgICB9CiAgICAgZGVzdF9zaXplID0gZGVzdF9idWZfbGVuZ3RoIC0gKEZYX1NUUlNJWkUpZGVzdC5mcmVlX2luX2J1ZmZlcjsKIH0KLXN0YXRpYyBGWF9CT09MIF9KcGVnTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKK3N0YXRpYyBib29sIF9KcGVnTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIGJvb2wmIGNvbG9yX3RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKIHsKICAgICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAgICAgam1wX2J1ZiBtYXJrOwogICAgIGNpbmZvLmNsaWVudF9kYXRhID0gJm1hcms7CiAgICAgaWYgKHNldGptcChtYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOwogICAgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3Igc3JjOwpAQCAtMjUyLDE1ICsyNTIsMTUgQEAKICAgICBjaW5mby5zcmMgPSAmc3JjOwogICAgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKICAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmKGljY19idWZfcHRyICYmIGljY19sZW5ndGgpIHsKICAgICAgICAganBlZ19zYXZlX21hcmtlcnMoJmNpbmZvLCBKUEVHX01BUktFUl9JQ0MsIEpQRUdfTUFSS0VSX01BWFNJWkUpOwogICAgIH0KLSAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICAgIGludCByZXQgPSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgdHJ1ZSk7CiAgICAgaWYgKHJldCAhPSBKUEVHX0hFQURFUl9PSykgewogICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgd2lkdGggPSBjaW5mby5pbWFnZV93aWR0aDsKICAgICBoZWlnaHQgPSBjaW5mby5pbWFnZV9oZWlnaHQ7CkBAIC0yNzQsMjEgKzI3NCwyMSBAQAogICAgICAgICAqaWNjX2xlbmd0aCA9IDA7CiAgICAgfQogICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjbGFzcyBDQ29kZWNfSnBlZ0RlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgogewogcHVibGljOgogICAgIENDb2RlY19KcGVnRGVjb2RlcigpOwogICAgIH5DQ29kZWNfSnBlZ0RlY29kZXIoKTsKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0sIElGWF9KcGVnUHJvdmlkZXIqIHBKUCk7CisgICAgYm9vbAkJCQlDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbG9yVHJhbnNmb3JtLCBJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApOwogICAgIHZpcnR1YWwgdm9pZAkJRGVzdHJveSgpCiAgICAgewogICAgICAgICBkZWxldGUgdGhpczsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCk7CisgICAgdmlydHVhbCBib29sCQl2X1Jld2luZCgpOwogICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCk7CiAgICAgam1wX2J1ZgkJbV9KbXBCdWY7CkBAIC0yOTgsOCArMjk4LDggQEAKICAgICBjb25zdCB1aW50OF90KgltX1NyY0J1ZjsKICAgICBGWF9EV09SRAltX1NyY1NpemU7CiAgICAgdWludDhfdCoJbV9wU2NhbmxpbmVCdWY7Ci0gICAgRlhfQk9PTAkJSW5pdERlY29kZSgpOwotICAgIEZYX0JPT0wJCW1fYkluaXRlZCwgbV9iU3RhcnRlZCwgbV9iSnBlZ1RyYW5zZm9ybTsKKyAgICBib29sCQlJbml0RGVjb2RlKCk7CisgICAgYm9vbAkJbV9iSW5pdGVkLCBtX2JTdGFydGVkLCBtX2JKcGVnVHJhbnNmb3JtOwogcHJvdGVjdGVkOgogICAgIElGWF9KcGVnUHJvdmlkZXIqCW1fcEV4dFByb3ZpZGVyOwogICAgIHZvaWQqCQkJCW1fcEV4dENvbnRleHQ7CkBAIC0zMDksOCArMzA5LDggQEAKIHsKICAgICBtX3BTY2FubGluZUJ1ZiA9IE5VTEw7CiAgICAgbV9Eb3duU2NhbGUgPSAxOwotICAgIG1fYlN0YXJ0ZWQgPSBGQUxTRTsKLSAgICBtX2JJbml0ZWQgPSBGQUxTRTsKKyAgICBtX2JTdGFydGVkID0gZmFsc2U7CisgICAgbV9iSW5pdGVkID0gZmFsc2U7CiAgICAgbV9wRXh0UHJvdmlkZXIgPSBOVUxMOwogICAgIG1fcEV4dENvbnRleHQgPSBOVUxMOwogICAgIEZYU1lTX21lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOwpAQCAtMzMxLDMxICszMzEsMzEgQEAKICAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKICAgICB9CiB9Ci1GWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6SW5pdERlY29kZSgpCitib29sIENDb2RlY19KcGVnRGVjb2Rlcjo6SW5pdERlY29kZSgpCiB7CiAgICAgY2luZm8uZXJyID0gJmplcnI7CiAgICAgY2luZm8uY2xpZW50X2RhdGEgPSAmbV9KbXBCdWY7CiAgICAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICBtX2JJbml0ZWQgPSBUUlVFOworICAgIG1fYkluaXRlZCA9IHRydWU7CiAgICAgY2luZm8uc3JjID0gJnNyYzsKICAgICBzcmMuYnl0ZXNfaW5fYnVmZmVyID0gbV9TcmNTaXplOwogICAgIHNyYy5uZXh0X2lucHV0X2J5dGUgPSBtX1NyY0J1ZjsKICAgICBpZiAoc2V0am1wKG1fSm1wQnVmKSA9PSAtMSkgewogICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICBtX2JJbml0ZWQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBtX2JJbml0ZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBjaW5mby5pbWFnZV93aWR0aCA9IG1fT3JpZ1dpZHRoOwogICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IG1fT3JpZ0hlaWdodDsKLSAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICAgIGludCByZXQgPSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgdHJ1ZSk7CiAgICAgaWYgKHJldCAhPSBKUEVHX0hFQURFUl9PSykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGNpbmZvLnNhd19BZG9iZV9tYXJrZXIpIHsKLSAgICAgICAgbV9iSnBlZ1RyYW5zZm9ybSA9IFRSVUU7CisgICAgICAgIG1fYkpwZWdUcmFuc2Zvcm0gPSB0cnVlOwogICAgIH0KICAgICBpZiAoY2luZm8ubnVtX2NvbXBvbmVudHMgPT0gMyAmJiAhbV9iSnBlZ1RyYW5zZm9ybSkgewogICAgICAgICBjaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBjaW5mby5qcGVnX2NvbG9yX3NwYWNlOwpAQCAtMzY1LDEwICszNjUsMTAgQEAKICAgICBtX091dHB1dFdpZHRoID0gbV9PcmlnV2lkdGg7CiAgICAgbV9PdXRwdXRIZWlnaHQgPSBtX09yaWdIZWlnaHQ7CiAgICAgbV9uRGVmYXVsdFNjYWxlRGVub20gPSBjaW5mby5zY2FsZV9kZW5vbTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSwgSUZYX0pwZWdQcm92aWRlciogcEpQKQorYm9vbCBDQ29kZWNfSnBlZ0RlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLCBib29sIENvbG9yVHJhbnNmb3JtLCBJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApCiB7CiAgICAgaWYgKHBKUCkgewogICAgICAgICBtX3BFeHRQcm92aWRlciA9IHBKUDsKQEAgLTM5NiwyMSArMzk2LDIxIEBACiAgICAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoID0gd2lkdGg7CiAgICAgbV9PdXRwdXRIZWlnaHQgPSBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7CiAgICAgaWYgKCFJbml0RGVjb2RlKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjaW5mby5udW1fY29tcG9uZW50cyA8IG5Db21wcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChpbnQpY2luZm8uaW1hZ2Vfd2lkdGggPCB3aWR0aCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9QaXRjaCA9IChjaW5mby5pbWFnZV93aWR0aCAqIGNpbmZvLm51bV9jb21wb25lbnRzICsgMykgLyA0ICogNDsKICAgICBtX3BTY2FubGluZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwogICAgIG1fbkNvbXBzID0gY2luZm8ubnVtX2NvbXBvbmVudHM7CiAgICAgbV9icGMgPSA4OwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICBtX2JTdGFydGVkID0gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IGZhbHNlOworICAgIG1fYlN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGV4dGVybiAiQyIgewogICAgIGludDMyX3QgRlhfR2V0RG93bnNhbXBsZVJhdGlvKGludDMyX3Qgb3JpZ2luV2lkdGgsIGludDMyX3Qgb3JpZ2luSGVpZ2h0LCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgICAgICAgIG1fTmV4dExpbmUgPSAtMTsKICAgICB9CiB9Ci1GWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6dl9SZXdpbmQoKQorYm9vbCBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfUmV3aW5kKCkKIHsKICAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5SZXdpbmQobV9wRXh0Q29udGV4dCk7CkBAIC00NTMsMjUgKzQ1MywyNSBAQAogICAgIGlmIChtX2JTdGFydGVkKSB7CiAgICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CiAgICAgICAgIGlmICghSW5pdERlY29kZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGNpbmZvLnNjYWxlX2Rlbm9tID0gbV9uRGVmYXVsdFNjYWxlRGVub20gKiBtX0Rvd25TY2FsZTsKICAgICBtX091dHB1dFdpZHRoID0gKG1fT3JpZ1dpZHRoICsgbV9Eb3duU2NhbGUgLSAxKSAvIG1fRG93blNjYWxlOwogICAgIG1fT3V0cHV0SGVpZ2h0ID0gKG1fT3JpZ0hlaWdodCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKICAgICBpZiAoIWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pKSB7CiAgICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKGludCljaW5mby5vdXRwdXRfd2lkdGggPiBtX09yaWdXaWR0aCkgewotICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIEZYU1lTX2Fzc2VydChmYWxzZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbV9iU3RhcnRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB1aW50OF90KiBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfR2V0TmV4dExpbmUoKQogewpAQCAtNDkyLDcgKzQ5Miw3IEBACiAgICAgcmV0dXJuIChGWF9EV09SRCkobV9TcmNTaXplIC0gc3JjLmJ5dGVzX2luX2J1ZmZlcik7CiB9CiBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDQ29kZWNfSnBlZ01vZHVsZTo6Q3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBGWF9CT09MIENvbG9yVHJhbnNmb3JtKQorICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGJvb2wgQ29sb3JUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKHNyY19idWYgPT0gTlVMTCB8fCBzcmNfc2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTA0LDggKzUwNCw4IEBACiAgICAgfQogICAgIHJldHVybiBwRGVjb2RlcjsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAorYm9vbCBDQ29kZWNfSnBlZ01vZHVsZTo6TG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBib29sJiBjb2xvcl90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKQogewogICAgIGlmIChtX3BFeHRQcm92aWRlcikgewpAQCAtNTE1LDE3ICs1MTUsMTcgQEAKICAgICB9CiAgICAgcmV0dXJuIF9KcGVnTG9hZEluZm8oc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG51bV9jb21wb25lbnRzLCBiaXRzX3Blcl9jb21wb25lbnRzLCBjb2xvcl90cmFuc2Zvcm0sIGljY19idWZfcHRyLCBpY2NfbGVuZ3RoKTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHksIGNvbnN0IHVpbnQ4X3QqIGljY19idWYsIEZYX0RXT1JEIGljY19sZW5ndGgpCitib29sIENDb2RlY19KcGVnTW9kdWxlOjpFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKQogewogICAgIGlmIChtX3BFeHRQcm92aWRlcikgewogICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPkVuY29kZShwU291cmNlLCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBxdWFsaXR5LCBpY2NfYnVmLCBpY2NfbGVuZ3RoKTsKICAgICB9CiAgICAgaWYocFNvdXJjZS0+R2V0QlBQKCkgPCA4IHx8IHBTb3VyY2UtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7CiAgICAgICAgIEFTU0VSVChwU291cmNlLT5HZXRCUFAoKSA+PSA4ICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIF9KcGVnRW5jb2RlKHBTb3VyY2UsIGRlc3RfYnVmLCBkZXN0X3NpemUsIHF1YWxpdHksIGljY19idWYsIGljY19sZW5ndGgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RydWN0IEZYSlBFR19Db250ZXh0IHsKICAgICBqbXBfYnVmCQkJbV9KdW1wTWFyazsKQEAgLTY1MywxNCArNjUzLDE0IEBACiAgICAgcC0+bV9JbmZvLnNjYWxlX2Rlbm9tID0gZG93bl9zY2FsZTsKICAgICByZXR1cm4ganBlZ19zdGFydF9kZWNvbXByZXNzKCZwLT5tX0luZm8pOwogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZikKK2Jvb2wgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdW5zaWduZWQgY2hhciogZGVzdF9idWYpCiB7CiAgICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmVhZFNjYW5saW5lKHBDb250ZXh0LCBkZXN0X2J1Zik7CiAgICAgfQogICAgIEZYSlBFR19Db250ZXh0KiBwID0gKEZYSlBFR19Db250ZXh0KilwQ29udGV4dDsKICAgICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgbmxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcygmcC0+bV9JbmZvLCAmZGVzdF9idWYsIDEpOwogICAgIHJldHVybiBubGluZXMgPT0gMTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwCmluZGV4IDJkMzk1YjAuLjkyYWY2MjYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcApAQCAtNTg3LDE3ICs1ODcsMTcgQEAKIHB1YmxpYzoKICAgICBDSlBYX0RlY29kZXIoKTsKICAgICB+Q0pQWF9EZWNvZGVyKCk7Ci0gICAgRlhfQk9PTAlJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBpbnQgc3JjX3NpemUpOworICAgIGJvb2wJSW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKTsKICAgICB2b2lkCUdldEluZm8oRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgY29kZXN0cmVhbV9uQ29tcHMsIEZYX0RXT1JEJiBvdXRwdXRfbkNvbXBzKTsKLSAgICBGWF9CT09MCURlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cyk7CisgICAgYm9vbAlEZWNvZGUodWludDhfdCogZGVzdF9idWYsIGludCBwaXRjaCwgYm9vbCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpOwogICAgIGNvbnN0IHVpbnQ4X3QqIG1fU3JjRGF0YTsKICAgICBpbnQgbV9TcmNTaXplOwogICAgIG9wal9pbWFnZV90ICppbWFnZTsKICAgICBvcGpfY29kZWNfdCogbF9jb2RlYzsKICAgICBvcGpfc3RyZWFtX3QgKmxfc3RyZWFtOwotICAgIEZYX0JPT0wgbV91c2VDb2xvclNwYWNlOworICAgIGJvb2wgbV91c2VDb2xvclNwYWNlOwogfTsKLUNKUFhfRGVjb2Rlcjo6Q0pQWF9EZWNvZGVyKCk6IGltYWdlKE5VTEwpLCBsX2NvZGVjKE5VTEwpLCBsX3N0cmVhbShOVUxMKSwgbV91c2VDb2xvclNwYWNlKEZBTFNFKQorQ0pQWF9EZWNvZGVyOjpDSlBYX0RlY29kZXIoKTogaW1hZ2UoTlVMTCksIGxfY29kZWMoTlVMTCksIGxfc3RyZWFtKE5VTEwpLCBtX3VzZUNvbG9yU3BhY2UoZmFsc2UpCiB7CiB9CiBDSlBYX0RlY29kZXI6On5DSlBYX0RlY29kZXIoKQpAQCAtNjEyLDExICs2MTIsMTEgQEAKICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0pQWF9EZWNvZGVyOjpJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBpbnQgc3JjX3NpemUpCitib29sIENKUFhfRGVjb2Rlcjo6SW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKQogewogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN6SlAySGVhZGVyW10gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NmEsIDB4NTAsIDB4MjAsIDB4MjAsIDB4MGQsIDB4MGEsIDB4ODcsIDB4MGEgfTsKICAgICBpZiAoIXNyY19kYXRhIHx8IHNyY19zaXplIDwgc2l6ZW9mKHN6SlAySGVhZGVyKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW1hZ2UgPSBOVUxMOwogICAgIG1fU3JjRGF0YSA9IHNyY19kYXRhOwpAQCAtNjI0LDcgKzYyNCw3IEBACiAgICAgRGVjb2RlRGF0YSBzcmNEYXRhKGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHNyY19kYXRhKSwgc3JjX3NpemUpOwogICAgIGxfc3RyZWFtID0gZnhfb3BqX3N0cmVhbV9jcmVhdGVfbWVtb3J5X3N0cmVhbSgmc3JjRGF0YSwgT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSwgMSk7CiAgICAgaWYgKGxfc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG9wal9kcGFyYW1ldGVyc190IHBhcmFtZXRlcnM7CiAgICAgb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycygmcGFyYW1ldGVycyk7CkBAIC02MzcsMzMgKzYzNywzMyBAQAogICAgICAgICBsX2NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KMkspOwogICAgIH0KICAgICBpZighbF9jb2RlYykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgb3BqX3NldF9pbmZvX2hhbmRsZXIobF9jb2RlYywgZnhfaW5mb19jYWxsYmFjaywgMDApOwogICAgIG9wal9zZXRfd2FybmluZ19oYW5kbGVyKGxfY29kZWMsIGZ4X3dhcm5pbmdfY2FsbGJhY2ssIDAwKTsKICAgICBvcGpfc2V0X2Vycm9yX2hhbmRsZXIobF9jb2RlYywgZnhfZXJyb3JfY2FsbGJhY2ssIDAwKTsKICAgICBpZiAoICFvcGpfc2V0dXBfZGVjb2RlcihsX2NvZGVjLCAmcGFyYW1ldGVycykgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZighIG9wal9yZWFkX2hlYWRlcihsX3N0cmVhbSwgbF9jb2RlYywgJmltYWdlKSkgewogICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXBhcmFtZXRlcnMubmJfdGlsZV90b19kZWNvZGUpIHsKICAgICAgICAgaWYgKCFvcGpfc2V0X2RlY29kZV9hcmVhKGxfY29kZWMsIGltYWdlLCBwYXJhbWV0ZXJzLkRBX3gwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5EQV95MCwgcGFyYW1ldGVycy5EQV94MSwgcGFyYW1ldGVycy5EQV95MSkpIHsKICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKICAgICAgICAgICAgIGltYWdlID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIShvcGpfZGVjb2RlKGxfY29kZWMsIGxfc3RyZWFtLCBpbWFnZSkgJiYgb3BqX2VuZF9kZWNvbXByZXNzKGxfY29kZWMsIGxfc3RyZWFtKSkpIHsKICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKICAgICAgICAgICAgIGltYWdlID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghb3BqX2dldF9kZWNvZGVkX3RpbGUobF9jb2RlYywgbF9zdHJlYW0sIGltYWdlLCBwYXJhbWV0ZXJzLnRpbGVfaW5kZXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgb3BqX3N0cmVhbV9kZXN0cm95KGxfc3RyZWFtKTsKQEAgLTY4NCw5ICs2ODQsOSBAQAogICAgICAgICBpbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0gMDsKICAgICB9CiAgICAgaWYoIWltYWdlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0pQWF9EZWNvZGVyOjpHZXRJbmZvKEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcykKIHsKQEAgLTY5NCw3ICs2OTQsNyBAQAogICAgIGhlaWdodCA9IChGWF9EV09SRClpbWFnZS0+eTE7CiAgICAgb3V0cHV0X25Db21wcyA9IGNvZGVzdHJlYW1fbkNvbXBzID0gKEZYX0RXT1JEKWltYWdlLT5udW1jb21wczsKIH0KLUZYX0JPT0wgQ0pQWF9EZWNvZGVyOjpEZWNvZGUodWludDhfdCogZGVzdF9idWYsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpCitib29sIENKUFhfRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcGl0Y2gsIGJvb2wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKQogewogICAgIGludCBpLCB3aWQsIGhlaSwgcm93LCBjb2wsIGNoYW5uZWwsIHNyYzsKICAgICB1aW50OF90KiBwQ2hhbm5lbDsKQEAgLTcwMiwxNCArNzAyLDE0IEBACiAgICAgdWludDhfdCogcFBpeGVsOwogCiAgICAgaWYoaW1hZ2UtPmNvbXBzWzBdLncgIT0gaW1hZ2UtPngxIHx8IGltYWdlLT5jb21wc1swXS5oICE9IGltYWdlLT55MSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYocGl0Y2ggPCAoaW50KShpbWFnZS0+Y29tcHNbMF0udyAqIDggKiBpbWFnZS0+bnVtY29tcHMgKyAzMSkgPj4gNSA8PCAyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYsIDB4ZmYsIGltYWdlLT55MSAqIHBpdGNoKTsKICAgICB1aW50OF90KiogY2hhbm5lbF9idWZzID0gRlhfQWxsb2ModWludDhfdCosIGltYWdlLT5udW1jb21wcyk7Ci0gICAgRlhfQk9PTCByZXN1bHQgPSBGQUxTRTsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgIGludCogYWRqdXN0X2NvbXBzID0gRlhfQWxsb2MoaW50LCBpbWFnZS0+bnVtY29tcHMpOwogICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWltYWdlLT5udW1jb21wczsgaSArKykgewogICAgICAgICBjaGFubmVsX2J1ZnNbaV0gPSBkZXN0X2J1ZiArIG9mZnNldHNbaV07CkBAIC03NjUsNyArNzY1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXN1bHQgPSBUUlVFOworICAgIHJlc3VsdCA9IHRydWU7CiAKIGRvbmU6CiAgICAgRlhfRnJlZShjaGFubmVsX2J1ZnMpOwpAQCAtNzc4LDcgKzc3OCw3IEBACiBDQ29kZWNfSnB4TW9kdWxlOjpDQ29kZWNfSnB4TW9kdWxlKCkKIHsKIH0KLXZvaWQqIENDb2RlY19KcHhNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUgLCBGWF9CT09MIHVzZUNvbG9yU3BhY2UpCit2b2lkKiBDQ29kZWNfSnB4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplICwgYm9vbCB1c2VDb2xvclNwYWNlKQogewogICAgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0pQWF9EZWNvZGVyOwogICAgIHBEZWNvZGVyLT5tX3VzZUNvbG9yU3BhY2UgPSB1c2VDb2xvclNwYWNlOwpAQCAtNzk0LDcgKzc5NCw3IEBACiAgICAgQ0pQWF9EZWNvZGVyKiBwRGVjb2RlciA9IChDSlBYX0RlY29kZXIqKWN0eDsKICAgICBwRGVjb2Rlci0+R2V0SW5mbyh3aWR0aCwgaGVpZ2h0LCBjb2Rlc3RyZWFtX25Db21wcywgb3V0cHV0X25Db21wcyk7CiB9Ci1GWF9CT09MIENDb2RlY19KcHhNb2R1bGU6OkRlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykKK2Jvb2wgQ0NvZGVjX0pweE1vZHVsZTo6RGVjb2RlKHZvaWQqIGN0eCwgdWludDhfdCogZGVzdF9kYXRhLCBpbnQgcGl0Y2gsIGJvb2wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKQogewogICAgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSAoQ0pQWF9EZWNvZGVyKiljdHg7CiAgICAgcmV0dXJuIHBEZWNvZGVyLT5EZWNvZGUoZGVzdF9kYXRhLCBwaXRjaCwgYlRyYW5zbGF0ZUNvbG9yLCBvZmZzZXRzKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oCmluZGV4IGZmMGI5ZmMuLmZjZDExZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaApAQCAtMjMsNyArMjMsNyBAQAogCiAgICAgaW50MzJfdCByZWFkMUJpdChGWF9EV09SRCAqZHdSZXN1bHQpOwogCi0gICAgaW50MzJfdCByZWFkMUJpdChGWF9CT09MICAqYlJlc3VsdCk7CisgICAgaW50MzJfdCByZWFkMUJpdChib29sICAqYlJlc3VsdCk7CiAKICAgICBpbnQzMl90IHJlYWQxQnl0ZSh1aW50OF90ICpjUmVzdWx0KTsKIApAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgfQogfQogCi1pbmxpbmUgaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkMUJpdChGWF9CT09MICpiUmVzdWx0KQoraW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoYm9vbCAqYlJlc3VsdCkKIHsKICAgICBpZihtX2R3Qnl0ZUlkeCA8IG1fZHdMZW5ndGgpIHsKICAgICAgICAgKmJSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDE7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAppbmRleCA2OGM5NzM1Li4wYjcxYzQ3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICBKQklHMl9BTExPQyhtX3BTZWdtZW50TGlzdCwgQ0pCaWcyX0xpc3Q8Q0pCaWcyX1NlZ21lbnQ+KTsKICAgICBKQklHMl9BTExPQyhtX3BQYWdlSW5mb0xpc3QsIENKQmlnMl9MaXN0PEpCaWcyUGFnZUluZm8+KDEpKTsKICAgICBtX3BQYWdlID0gTlVMTDsKLSAgICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKKyAgICBtX2JCdWZTcGVjaWZpZWQgPSBmYWxzZTsKICAgICBtX3BQYXVzZSA9IHBQYXVzZTsKICAgICBtX25TZWdtZW50RGVjb2RlZCA9IDA7CiAgICAgbV9QYXVzZVN0ZXAgPSAxMDsKQEAgLTIzMSwxMSArMjMxLDExIEBACiAgICAgICAgICAgICByZXR1cm4gblJldDsKICAgICAgICAgfQogICAgIH0KLSAgICBtX2JGaXJzdFBhZ2UgPSBUUlVFOworICAgIG1fYkZpcnN0UGFnZSA9IHRydWU7CiAgICAgbV9QYXVzZVN0ZXAgPSAwOwogICAgIGRlbGV0ZSBtX3BQYWdlOwogICAgIEpCSUcyX0FMTE9DKG1fcFBhZ2UsIENKQmlnMl9JbWFnZSh3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHBCdWYpKTsKLSAgICBtX2JCdWZTcGVjaWZpZWQgPSBUUlVFOworICAgIG1fYkJ1ZlNwZWNpZmllZCA9IHRydWU7CiAgICAgaWYobV9wUGFnZSAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CiAgICAgICAgIG1fUGF1c2VTdGVwID0gMTsKICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKQEAgLTI5OCwxMSArMjk4LDExIEBACiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXROZXh0UGFnZSh1aW50OF90ICpwQnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBzdHJpZGUsIElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGludDMyX3QgblJldCA9IEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFOwotICAgIG1fYkZpcnN0UGFnZSA9IEZBTFNFOworICAgIG1fYkZpcnN0UGFnZSA9IGZhbHNlOwogICAgIG1fUGF1c2VTdGVwID0gMDsKICAgICBkZWxldGUgbV9wUGFnZTsKICAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2Uod2lkdGgsIGhlaWdodCwgc3RyaWRlLCBwQnVmKSk7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gVFJVRTsKKyAgICBtX2JCdWZTcGVjaWZpZWQgPSB0cnVlOwogICAgIGlmKG1fcFBhZ2UgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewogICAgICAgICBtX1BhdXNlU3RlcCA9IDE7CiAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CkBAIC0zMzAsNyArMzMwLDcgQEAKIGludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmdldEZpcnN0UGFnZShDSkJpZzJfSW1hZ2UgKippbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaW50MzJfdCBuUmV0OwotICAgIG1fYkZpcnN0UGFnZSA9IFRSVUU7CisgICAgbV9iRmlyc3RQYWdlID0gdHJ1ZTsKICAgICBtX1BhdXNlU3RlcCA9IDA7CiAgICAgaWYobV9wR2xvYmFsQ29udGV4dCkgewogICAgICAgICBuUmV0ID0gbV9wR2xvYmFsQ29udGV4dC0+ZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24ocFBhdXNlKTsKQEAgLTMzOCwxNCArMzM4LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gblJldDsKICAgICAgICAgfQogICAgIH0KLSAgICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKKyAgICBtX2JCdWZTcGVjaWZpZWQgPSBmYWxzZTsKICAgICByZXR1cm4gQ29udGludWUocFBhdXNlKTsKIH0KIGludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmdldE5leHRQYWdlKENKQmlnMl9JbWFnZSAqKmltYWdlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpbnQzMl90IG5SZXQ7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gRkFMU0U7Ci0gICAgbV9iRmlyc3RQYWdlID0gRkFMU0U7CisgICAgbV9iQnVmU3BlY2lmaWVkID0gZmFsc2U7CisgICAgbV9iRmlyc3RQYWdlID0gZmFsc2U7CiAgICAgbV9QYXVzZVN0ZXAgPSAwOwogICAgIHN3aXRjaChtX25TdHJlYW1UeXBlKSB7CiAgICAgICAgIGNhc2UgSkJJRzJfRklMRV9TVFJFQU06CkBAIC02MDEsMTQgKzYwMSwxNCBAQAogICAgIENKQmlnMl9IdWZmbWFuVGFibGUgKlRhYmxlX0IxID0gTlVMTCwgKlRhYmxlX0IyID0gTlVMTCwgKlRhYmxlX0IzID0gTlVMTCwgKlRhYmxlX0I0ID0gTlVMTCwgKlRhYmxlX0I1ID0gTlVMTDsKICAgICBpbnQzMl90IGksIG5JbmRleCwgblJldDsKICAgICBDSkJpZzJfU2VnbWVudCAqcFNlZyA9IE5VTEwsICpwTFJTZWcgPSBOVUxMOwotICAgIEZYX0JPT0wgYlVzZWQ7CisgICAgYm9vbCBiVXNlZDsKICAgICBDSkJpZzJfSW1hZ2UgKiogU0RJTlNZTVMgPSBOVUxMOwogICAgIENKQmlnMl9TRERQcm9jICpwU3ltYm9sRGljdERlY29kZXI7CiAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0ID0gTlVMTCwgKmdyQ29udGV4dCA9IE5VTEw7CiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKICAgICBKQklHMl9BTExPQyhwU3ltYm9sRGljdERlY29kZXIsIENKQmlnMl9TRERQcm9jKCkpOwogICAgIHVpbnQ4X3QgKmtleSA9IHBTZWdtZW50LT5tX3BEYXRhOwotICAgIEZYX0JPT0wgY2FjaGVfaGl0ID0gZmFsc2U7CisgICAgYm9vbCBjYWNoZV9oaXQgPSBmYWxzZTsKICAgICBpZihtX3BTdHJlYW0tPnJlYWRTaG9ydEludGVnZXIoJndGbGFncykgIT0gMCkgewogICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwogICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwpAQCAtODI1LDE2ICs4MjUsMTYgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZih3RmxhZ3MgJiAweDAyMDApIHsKLSAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2JDb250ZXh0UmV0YWluZWQgPSBUUlVFOworICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPm1fYkNvbnRleHRSZXRhaW5lZCA9IHRydWU7CiAgICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKICAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9nYkNvbnRleHQgPSBnYkNvbnRleHQ7CiAgICAgICAgIH0KICAgICAgICAgaWYocFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9PSAxKSB7CiAgICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPm1fZ3JDb250ZXh0ID0gZ3JDb250ZXh0OwogICAgICAgICB9Ci0gICAgICAgIGJVc2VkID0gVFJVRTsKKyAgICAgICAgYlVzZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJVc2VkID0gRkFMU0U7CisgICAgICAgIGJVc2VkID0gZmFsc2U7CiAgICAgfQogICAgIGRlbGV0ZSBwU3ltYm9sRGljdERlY29kZXI7CiAgICAgaWYoU0RJTlNZTVMpIHsKQEAgLTg0NSw3ICs4NDUsNyBAQAogICAgIGRlbGV0ZSBUYWJsZV9CMzsKICAgICBkZWxldGUgVGFibGVfQjQ7CiAgICAgZGVsZXRlIFRhYmxlX0I1OwotICAgIGlmKGJVc2VkID09IEZBTFNFKSB7CisgICAgaWYoYlVzZWQgPT0gZmFsc2UpIHsKICAgICAgICAgaWYoZ2JDb250ZXh0KSB7CiAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ2JDb250ZXh0KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuaAppbmRleCBlNmEwZDdiLi4wMmQ0MTkyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuaApAQCAtMTIzLDEzICsxMjMsMTMgQEAKIAogICAgIENKQmlnMl9JbWFnZSAqbV9wUGFnZTsKIAotICAgIEZYX0JPT0wgbV9iQnVmU3BlY2lmaWVkOworICAgIGJvb2wgbV9iQnVmU3BlY2lmaWVkOwogCiAgICAgaW50MzJfdCBtX25TZWdtZW50RGVjb2RlZDsKICAgICBJRlhfUGF1c2UqCW1fcFBhdXNlOwogICAgIGludDMyX3QJbV9QYXVzZVN0ZXA7CiAgICAgRlhDT0RFQ19TVEFUVVMgbV9Qcm9jZXNzaXZlU3RhdHVzOwotICAgIEZYX0JPT0wJbV9iRmlyc3RQYWdlOworICAgIGJvb2wJbV9iRmlyc3RQYWdlOwogICAgIENKQmlnMl9Bcml0aERlY29kZXIgKm1fcEFyaXRoRGVjb2RlcjsKICAgICBDSkJpZzJfR1JEUHJvYyAqbV9wR1JEOwogICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmNwcAppbmRleCBjYWJjZDRjLi4xZTMzOGE1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmNwcApAQCAtMTAxLDcgKzEwMSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTIxMyw3ICsyMTMsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtMzA1LDcgKzMwNSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTM1Miw3ICszNTIsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC00NjQsNyArNDY0LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTU1NSw3ICs1NTUsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC02MDAsNyArNjAwLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTY0Myw3ICs2NDMsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwpAQCAtNzEwLDcgKzcxMCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC04MDEsNyArODAxLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwpAQCAtODQ0LDcgKzg0NCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKQEAgLTg4Myw3ICs4ODMsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTE7CkBAIC05NDEsNyArOTQxLDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxOwpAQCAtMTAxNyw3ICsxMDE3LDcgQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CkBAIC0xMDU2LDcgKzEwNTYsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKQEAgLTExOTUsNyArMTE5NSw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQgPSAwOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7CiAgICAgTFRQID0gMDsKQEAgLTEzNDAsNyArMTM0MCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCiB7Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgICAgYm9vbCBMVFAsIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTMsIGxpbmU0LCBsaW5lNTsKQEAgLTE0MjQsNyArMTQyNCw3IEBACiB9CiBDSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTFfciwgbGluZTJfciwgbGluZTNfcjsKQEAgLTE0NTksOSArMTQ1OSw5IEBACiAgICAgICAgIH0KICAgICAgICAgbGluZTEgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDw8IDQgOiAwOwogICAgICAgICBpbnQzMl90IHJlZmVyZW5jZV9oID0gaCAtIEdSUkVGRVJFTkNFRFk7Ci0gICAgICAgIEZYX0JPT0wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7Ci0gICAgICAgIEZYX0JPT0wgbGluZTJfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0xICYmIHJlZmVyZW5jZV9oIDwgR1JIUik7Ci0gICAgICAgIEZYX0JPT0wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOworICAgICAgICBib29sIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOworICAgICAgICBib29sIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOworICAgICAgICBib29sIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKICAgICAgICAgbGluZTFfciA9IGxpbmUxX3Jfb2sgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSXSA6IDA7CiAgICAgICAgIGxpbmUyX3IgPSBsaW5lMl9yX29rID8gcExpbmVSW25PZmZzZXRdIDogMDsKICAgICAgICAgbGluZTNfciA9IGxpbmUzX3Jfb2sgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSXSA6IDA7CkBAIC0xNTU1LDcgKzE1NTUsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICAgIGJvb2wgTFRQLCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7CkBAIC0xNjMzLDcgKzE2MzMsNyBAQAogfQogQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKIHsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7CkBAIC0xNjY4LDkgKzE2NjgsOSBAQAogICAgICAgICB9CiAgICAgICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCAxIDogMDsKICAgICAgICAgaW50MzJfdCByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOwotICAgICAgICBGWF9CT09MIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOwotICAgICAgICBGWF9CT09MIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOwotICAgICAgICBGWF9CT09MIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKKyAgICAgICAgYm9vbCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKKyAgICAgICAgYm9vbCBsaW5lMl9yX29rID0gKHJlZmVyZW5jZV9oID4gLTEgJiYgcmVmZXJlbmNlX2ggPCBHUkhSKTsKKyAgICAgICAgYm9vbCBsaW5lM19yX29rID0gKHJlZmVyZW5jZV9oID4gLTIgJiYgcmVmZXJlbmNlX2ggPCBHUkhSIC0gMSk7CiAgICAgICAgIGxpbmUxX3IgPSBsaW5lMV9yX29rID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUl0gOiAwOwogICAgICAgICBsaW5lMl9yID0gbGluZTJfcl9vayA/IHBMaW5lUltuT2Zmc2V0XSA6IDA7CiAgICAgICAgIGxpbmUzX3IgPSBsaW5lM19yX29rID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUl0gOiAwOwpAQCAtMTc1OCw4ICsxNzU4LDggQEAKIH0KIENKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQogewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0JPT0wgVFBHUlBJWCwgVFBHUlZBTDsKKyAgICBib29sIExUUCwgU0xUUCwgYlZhbDsKKyAgICBib29sIFRQR1JQSVgsIFRQR1JWQUw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwogICAgIExUUCA9IDA7CkBAIC0xODgxLDEyICsxODgxLDEyIEBACiAgICAgQ0pCaWcyX0ltYWdlICpJQkk7CiAgICAgRlhfRFdPUkQgV0ksIEhJOwogICAgIGludDMyX3QgSURTOwotICAgIEZYX0JPT0wgUkk7CisgICAgYm9vbCBSSTsKICAgICBpbnQzMl90IFJEV0ksIFJESEksIFJEWEksIFJEWUk7CiAgICAgQ0pCaWcyX0ltYWdlICpJQk9JOwogICAgIEZYX0RXT1JEIFdPSSwgSE9JOwogICAgIENKQmlnMl9JbWFnZSAqU0JSRUc7Ci0gICAgRlhfQk9PTCBiRmlyc3Q7CisgICAgYm9vbCBiRmlyc3Q7CiAgICAgRlhfRFdPUkQgblRtcDsKICAgICBpbnQzMl90IG5WYWwsIG5CaXRzOwogICAgIENKQmlnMl9IdWZmbWFuRGVjb2RlciAqcEh1ZmZtYW5EZWNvZGVyOwpAQCAtMTkxMCw3ICsxOTEwLDcgQEAKICAgICAgICAgfQogICAgICAgICBEVCAqPSBTQlNUUklQUzsKICAgICAgICAgU1RSSVBUID0gU1RSSVBUICsgRFQ7Ci0gICAgICAgIGJGaXJzdCA9IFRSVUU7CisgICAgICAgIGJGaXJzdCA9IHRydWU7CiAgICAgICAgIGZvcig7OykgewogICAgICAgICAgICAgaWYoYkZpcnN0KSB7CiAgICAgICAgICAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRlMsICZERlMpICE9IDApIHsKQEAgLTE5MTksNyArMTkxOSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKICAgICAgICAgICAgICAgICBDVVJTID0gRklSU1RTOwotICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuVmFsID0gcEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFMsICZJRFMpOwogICAgICAgICAgICAgICAgIGlmKG5WYWwgPT0gSkJJRzJfT09CKSB7CkBAIC0yMTA2LDcgKzIxMDYsNyBAQAogICAgIENKQmlnMl9JbWFnZSAqSUJPSTsKICAgICBGWF9EV09SRCBXT0ksIEhPSTsKICAgICBDSkJpZzJfSW1hZ2UgKlNCUkVHOwotICAgIEZYX0JPT0wgYkZpcnN0OworICAgIGJvb2wgYkZpcnN0OwogICAgIGludDMyX3QgblJldCwgblZhbDsKICAgICBpbnQzMl90IGJSZXRhaW5lZDsKICAgICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyICpJQURULCAqSUFGUywgKklBRFMsICpJQUlULCAqSUFSSSwgKklBUkRXLCAqSUFSREgsICpJQVJEWCwgKklBUkRZOwpAQCAtMjEyMyw3ICsyMTIzLDcgQEAKICAgICAgICAgSUFSRFggPSBwSURTLT5JQVJEWDsKICAgICAgICAgSUFSRFkgPSBwSURTLT5JQVJEWTsKICAgICAgICAgSUFJRCA9IHBJRFMtPklBSUQ7Ci0gICAgICAgIGJSZXRhaW5lZCA9IFRSVUU7CisgICAgICAgIGJSZXRhaW5lZCA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgSkJJRzJfQUxMT0MoSUFEVCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKICAgICAgICAgSkJJRzJfQUxMT0MoSUFGUywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKQEAgLTIxMzUsNyArMjEzNSw3IEBACiAgICAgICAgIEpCSUcyX0FMTE9DKElBUkRYLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwogICAgICAgICBKQklHMl9BTExPQyhJQVJEWSwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKICAgICAgICAgSkJJRzJfQUxMT0MoSUFJRCAsIENKQmlnMl9Bcml0aElhaWREZWNvZGVyKFNCU1lNQ09ERUxFTikpOwotICAgICAgICBiUmV0YWluZWQgPSBGQUxTRTsKKyAgICAgICAgYlJldGFpbmVkID0gZmFsc2U7CiAgICAgfQogICAgIEpCSUcyX0FMTE9DKFNCUkVHLCBDSkJpZzJfSW1hZ2UoU0JXLCBTQkgpKTsKICAgICBTQlJFRy0+ZmlsbChTQkRFRlBJWEVMKTsKQEAgLTIxNTQsNyArMjE1NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgRFQgKj0gU0JTVFJJUFM7CiAgICAgICAgIFNUUklQVCA9IFNUUklQVCArIERUOwotICAgICAgICBiRmlyc3QgPSBUUlVFOworICAgICAgICBiRmlyc3QgPSB0cnVlOwogICAgICAgICBmb3IoOzspIHsKICAgICAgICAgICAgIGlmKGJGaXJzdCkgewogICAgICAgICAgICAgICAgIGlmKElBRlMtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmREZTKSA9PSAtMSkgewpAQCAtMjE2Myw3ICsyMTYzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRklSU1RTID0gRklSU1RTICsgREZTOwogICAgICAgICAgICAgICAgIENVUlMgPSBGSVJTVFM7Ci0gICAgICAgICAgICAgICAgYkZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG5SZXQgPSBJQURTLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJklEUyk7CiAgICAgICAgICAgICAgICAgaWYoblJldCA9PSBKQklHMl9PT0IpIHsKQEAgLTIyOTksNyArMjI5OSw3IEBACiAgICAgICAgICAgICBOSU5TVEFOQ0VTID0gTklOU1RBTkNFUyArIDE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYoYlJldGFpbmVkID09IEZBTFNFKSB7CisgICAgaWYoYlJldGFpbmVkID09IGZhbHNlKSB7CiAgICAgICAgIGRlbGV0ZSBJQURUOwogICAgICAgICBkZWxldGUgSUFGUzsKICAgICAgICAgZGVsZXRlIElBRFM7CkBAIC0yMzEzLDcgKzIzMTMsNyBAQAogICAgIH0KICAgICByZXR1cm4gU0JSRUc7CiBmYWlsZWQ6Ci0gICAgaWYoYlJldGFpbmVkID09IEZBTFNFKSB7CisgICAgaWYoYlJldGFpbmVkID09IGZhbHNlKSB7CiAgICAgICAgIGRlbGV0ZSBJQURUOwogICAgICAgICBkZWxldGUgSUFGUzsKICAgICAgICAgZGVsZXRlIElBRFM7CkBAIC0yMzM4LDkgKzIzMzgsOSBAQAogICAgIGludDMyX3QgRFc7CiAgICAgQ0pCaWcyX0ltYWdlICpCUzsKICAgICBGWF9EV09SRCBJLCBKLCBSRUZBR0dOSU5TVDsKLSAgICBGWF9CT09MICpFWEZMQUdTOworICAgIGJvb2wgKkVYRkxBR1M7CiAgICAgRlhfRFdPUkQgRVhJTkRFWDsKLSAgICBGWF9CT09MIENVUkVYRkxBRzsKKyAgICBib29sIENVUkVYRkxBRzsKICAgICBGWF9EV09SRCBFWFJVTkxFTkdUSDsKICAgICBpbnQzMl90IG5WYWw7CiAgICAgRlhfRFdPUkQgblRtcDsKQEAgLTI1ODUsNyArMjU4NSw3IEBACiAgICAgfQogICAgIEVYSU5ERVggPSAwOwogICAgIENVUkVYRkxBRyA9IDA7Ci0gICAgRVhGTEFHUyA9IChGWF9CT09MKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEZYX0JPT0wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKKyAgICBFWEZMQUdTID0gKGJvb2wqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoYm9vbCksIChTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykpOwogICAgIHdoaWxlKEVYSU5ERVggPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgewogICAgICAgICBpZihJQUVYLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgKGludCopJkVYUlVOTEVOR1RIKSA9PSAtMSkgewogICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEVYRkxBR1MpOwpAQCAtMjY3Niw5ICsyNjc2LDkgQEAKICAgICBpbnQzMl90IERXOwogICAgIENKQmlnMl9JbWFnZSAqQlMsICpCSEM7CiAgICAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7Ci0gICAgRlhfQk9PTCAqRVhGTEFHUzsKKyAgICBib29sICpFWEZMQUdTOwogICAgIEZYX0RXT1JEIEVYSU5ERVg7Ci0gICAgRlhfQk9PTCBDVVJFWEZMQUc7CisgICAgYm9vbCBDVVJFWEZMQUc7CiAgICAgRlhfRFdPUkQgRVhSVU5MRU5HVEg7CiAgICAgaW50MzJfdCBuVmFsLCBuQml0czsKICAgICBGWF9EV09SRCBuVG1wOwpAQCAtMjk3Niw3ICsyOTc2LDcgQEAKICAgICBDVVJFWEZMQUcgPSAwOwogICAgIEpCSUcyX0FMTE9DKHBUYWJsZSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7Ci0gICAgRVhGTEFHUyA9IChGWF9CT09MKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEZYX0JPT0wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKKyAgICBFWEZMQUdTID0gKGJvb2wqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoYm9vbCksIChTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykpOwogICAgIHdoaWxlKEVYSU5ERVggPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgewogICAgICAgICBpZihwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShwVGFibGUsIChpbnQqKSZFWFJVTkxFTkdUSCkgIT0gMCkgewogICAgICAgICAgICAgZGVsZXRlIHBUYWJsZTsKQEAgLTM0NzcsNyArMzQ3Nyw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YyKElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHID0gKm1fcEltYWdlOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CkBAIC0zNjUwLDcgKzM2NTAsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7CisgICAgYm9vbCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQgPSAwOwogICAgIENKQmlnMl9JbWFnZSAqR0JSRUcgPSAoKm1fcEltYWdlKTsKICAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewpAQCAtMzc5OSw3ICszNzk5LDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKICAgICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7CkBAIC0zODkxLDcgKzM4OTEsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwogICAgIGZvcig7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7CkBAIC0zOTQwLDcgKzM5NDAsNyBAQAogfQogRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7CisgICAgYm9vbCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwogICAgIHVpbnQ4X3QgKnBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKQEAgLTQwMzEsNyArNDAzMSw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CiAgICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKQEAgLTQwNzgsNyArNDA3OCw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQogewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgICBib29sIFNMVFAsIGJWYWw7CiAgICAgRlhfRFdPUkQgQ09OVEVYVDsKICAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CiAgICAgdWludDhfdCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwpAQCAtNDE2OSw3ICs0MTY5LDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7CisgICAgYm9vbCBTTFRQLCBiVmFsOwogICAgIEZYX0RXT1JEIENPTlRFWFQ7CiAgICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKICAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewpAQCAtNDIxNCw3ICs0MjE0LDcgQEAKIH0KIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxOwogICAgIHVpbnQ4X3QgKnBMaW5lMSwgY1ZhbDsKQEAgLTQyOTAsNyArNDI5MCw3IEBACiB9CiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOworICAgIGJvb2wgU0xUUCwgYlZhbDsKICAgICBGWF9EV09SRCBDT05URVhUOwogICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKICAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oCmluZGV4IDJiZDJjZWEuLmYzNDhlOTYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmgKQEAgLTc2LDcgKzc2LDcgQEAKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICptX3BBcml0aERlY29kZXI7CiAgICAgSkJpZzJBcml0aEN0eCAqbV9nYkNvbnRleHQ7CiAgICAgRlhfV09SRAkJbV9EZWNvZGVUeXBlOwotICAgIEZYX0JPT0wgTFRQOworICAgIGJvb2wgTFRQOwogICAgIEZYX1JFQ1QgbV9SZXBsYWNlUmVjdDsKIHByaXZhdGU6CiAKQEAgLTExMiwxMiArMTEyLDEyIEBACiAKICAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKIHB1YmxpYzoKLSAgICBGWF9CT09MIE1NUjsKKyAgICBib29sIE1NUjsKICAgICBGWF9EV09SRCBHQlc7CiAgICAgRlhfRFdPUkQgR0JIOwogICAgIHVpbnQ4X3QgR0JURU1QTEFURTsKLSAgICBGWF9CT09MIFRQR0RPTjsKLSAgICBGWF9CT09MIFVTRVNLSVA7CisgICAgYm9vbCBUUEdET047CisgICAgYm9vbCBVU0VTS0lQOwogICAgIENKQmlnMl9JbWFnZSAqIFNLSVA7CiAgICAgc2lnbmVkIGNoYXIgR0JBVFs4XTsKIH07CkBAIC0xMzksMTEgKzEzOSwxMSBAQAogcHVibGljOgogICAgIEZYX0RXT1JEIEdSVzsKICAgICBGWF9EV09SRCBHUkg7Ci0gICAgRlhfQk9PTCBHUlRFTVBMQVRFOworICAgIGJvb2wgR1JURU1QTEFURTsKICAgICBDSkJpZzJfSW1hZ2UgKkdSUkVGRVJFTkNFOwogICAgIGludDMyX3QgR1JSRUZFUkVOQ0VEWDsKICAgICBpbnQzMl90IEdSUkVGRVJFTkNFRFk7Ci0gICAgRlhfQk9PTCBUUEdST047CisgICAgYm9vbCBUUEdST047CiAgICAgc2lnbmVkIGNoYXIJR1JBVFs0XTsKIH07CiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xNjcsOCArMTY3LDggQEAKICAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJJbnREZWNvZGVyU3RhdGUgKnBJRFMgPSBOVUxMKTsKIHB1YmxpYzoKLSAgICBGWF9CT09MIFNCSFVGRjsKLSAgICBGWF9CT09MIFNCUkVGSU5FOworICAgIGJvb2wgU0JIVUZGOworICAgIGJvb2wgU0JSRUZJTkU7CiAgICAgRlhfRFdPUkQgU0JXOwogICAgIEZYX0RXT1JEIFNCSDsKICAgICBGWF9EV09SRCBTQk5VTUlOU1RBTkNFUzsKQEAgLTE3OSwxMCArMTc5LDEwIEBACiAgICAgdWludDhfdCBTQlNZTUNPREVMRU47CiAKICAgICBDSkJpZzJfSW1hZ2UgKipTQlNZTVM7Ci0gICAgRlhfQk9PTCBTQkRFRlBJWEVMOworICAgIGJvb2wgU0JERUZQSVhFTDsKIAogICAgIEpCaWcyQ29tcG9zZU9wIFNCQ09NQk9QOwotICAgIEZYX0JPT0wgVFJBTlNQT1NFRDsKKyAgICBib29sIFRSQU5TUE9TRUQ7CiAKICAgICBKQmlnMkNvcm5lciBSRUZDT1JORVI7CiAgICAgc2lnbmVkIGNoYXIgU0JEU09GRlNFVDsKQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKlNCSFVGRlJEWCwKICAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSRFksCiAgICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUlNJWkU7Ci0gICAgRlhfQk9PTCBTQlJURU1QTEFURTsKKyAgICBib29sIFNCUlRFTVBMQVRFOwogICAgIHNpZ25lZCBjaGFyIFNCUkFUWzRdOwogfTsKIGNsYXNzIENKQmlnMl9TRERQcm9jIDogcHVibGljIENKQmlnMl9PYmplY3QKQEAgLTIwNSw4ICsyMDUsOCBAQAogCiAgICAgQ0pCaWcyX1N5bWJvbERpY3QgKmRlY29kZV9IdWZmbWFuKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBTREhVRkY7Ci0gICAgRlhfQk9PTCBTRFJFRkFHRzsKKyAgICBib29sIFNESFVGRjsKKyAgICBib29sIFNEUkVGQUdHOwogICAgIEZYX0RXT1JEIFNETlVNSU5TWU1TOwogICAgIENKQmlnMl9JbWFnZSAqKiBTRElOU1lNUzsKICAgICBGWF9EV09SRCBTRE5VTU5FV1NZTVM7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICpTREhVRkZBR0dJTlNUOwogICAgIHVpbnQ4X3QgU0RURU1QTEFURTsKICAgICBzaWduZWQgY2hhciBTREFUWzhdOwotICAgIEZYX0JPT0wgU0RSVEVNUExBVEU7CisgICAgYm9vbCBTRFJURU1QTEFURTsKICAgICBzaWduZWQgY2hhciBTRFJBVFs0XTsKIH07CiBjbGFzcyBDSkJpZzJfSFRSRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdApAQCAtMjMwLDEzICsyMzAsMTMgQEAKIHB1YmxpYzoKICAgICBGWF9EV09SRCBIQlcsCiAgICAgICAgICAgICAgSEJIOwotICAgIEZYX0JPT0wgSE1NUjsKKyAgICBib29sIEhNTVI7CiAgICAgdWludDhfdCBIVEVNUExBVEU7CiAgICAgRlhfRFdPUkQgSE5VTVBBVFM7CiAgICAgQ0pCaWcyX0ltYWdlICoqSFBBVFM7Ci0gICAgRlhfQk9PTCBIREVGUElYRUw7CisgICAgYm9vbCBIREVGUElYRUw7CiAgICAgSkJpZzJDb21wb3NlT3AgSENPTUJPUDsKLSAgICBGWF9CT09MIEhFTkFCTEVTS0lQOworICAgIGJvb2wgSEVOQUJMRVNLSVA7CiAgICAgRlhfRFdPUkQgSEdXLAogICAgICAgICAgICAgIEhHSDsKICAgICBpbnQzMl90IEhHWCwKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiAgICAgQ0pCaWcyX1BhdHRlcm5EaWN0ICpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKIHB1YmxpYzoKLSAgICBGWF9CT09MIEhETU1SOworICAgIGJvb2wgSERNTVI7CiAgICAgdWludDhfdCBIRFBXLAogICAgICAgICAgICAgSERQSDsKICAgICBGWF9EV09SRCBHUkFZTUFYOwpAQCAtMjY4LDggKzI2OCw4IEBACiAKICAgICBGWF9EV09SRCAqZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBHU01NUjsKLSAgICBGWF9CT09MIEdTVVNFU0tJUDsKKyAgICBib29sIEdTTU1SOworICAgIGJvb2wgR1NVU0VTS0lQOwogICAgIHVpbnQ4X3QgR1NCUFA7CiAgICAgRlhfRFdPUkQgR1NXLAogICAgICAgICAgICAgIEdTSDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcAppbmRleCAwNjE2MTIzLi40OTMyZTU3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiBDSkJpZzJfSHVmZm1hblRhYmxlOjpDSkJpZzJfSHVmZm1hblRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsCi0gICAgICAgIEZYX0JPT0wgYkhUT09CKQorICAgICAgICBib29sIGJIVE9PQikKIHsKICAgICBpbml0KCk7CiAgICAgbV9iT0sgPSBwYXJzZUZyb21TdGFuZGFyZFRhYmxlKHBUYWJsZSwgbkxpbmVzLCBiSFRPT0IpOwpAQCAtMzgsMTQgKzM4LDE0IEBACiB9CiB2b2lkIENKQmlnMl9IdWZmbWFuVGFibGU6OmluaXQoKQogewotICAgIEhUT09CID0gRkFMU0U7CisgICAgSFRPT0IgPSBmYWxzZTsKICAgICBOVEVNUCA9IDA7CiAgICAgQ09ERVMgPSBOVUxMOwogICAgIFBSRUZMRU4gPSBOVUxMOwogICAgIFJBTkdFTEVOID0gTlVMTDsKICAgICBSQU5HRUxPVyA9IE5VTEw7CiB9Ci1pbnQgQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6cGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBGWF9CT09MIGJIVE9PQikKK2ludCBDSkJpZzJfSHVmZm1hblRhYmxlOjpwYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsIGJvb2wgYkhUT09CKQogewogICAgIGludCBDVVJMRU4sIExFTk1BWCwgQ1VSQ09ERSwgQ1VSVEVNUCwgaTsKICAgICBpbnQgKkxFTkNPVU5UOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgfQogICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShMRU5DT1VOVCk7CiAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEZJUlNUQ09ERSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiBmYWlsZWQ6Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oCmluZGV4IGQ2OGNlZDIuLmQ2YmMzZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaApAQCAtMTMsNyArMTMsNyBAQAogewogcHVibGljOgogCi0gICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBGWF9CT09MIGJIVE9PQik7CisgICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBib29sIGJIVE9PQik7CiAKICAgICBDSkJpZzJfSHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOwogCkBAIC0yMSwyMiArMjEsMjIgQEAKIAogICAgIHZvaWQgaW5pdCgpOwogCi0gICAgaW50IHBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpOworICAgIGludCBwYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsIGJvb2wgYkhUT09CKTsKIAogICAgIGludCBwYXJzZUZyb21Db2RlZEJ1ZmZlcihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKTsKIAotICAgIEZYX0JPT0wgaXNPSygpCisgICAgYm9vbCBpc09LKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2JPSzsKICAgICB9CiBwcml2YXRlOgotICAgIEZYX0JPT0wgSFRPT0I7CisgICAgYm9vbCBIVE9PQjsKICAgICBpbnQgTlRFTVA7CiAgICAgaW50ICpDT0RFUzsKICAgICBpbnQgKlBSRUZMRU47CiAgICAgaW50ICpSQU5HRUxFTjsKICAgICBpbnQgKlJBTkdFTE9XOwotICAgIEZYX0JPT0wgbV9iT0s7CisgICAgYm9vbCBtX2JPSzsKICAgICBmcmllbmQgY2xhc3MgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmgKaW5kZXggNDI4YjJjMy4uYzA4ZDI0NSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oCkBAIC0xMSw3ICsxMSw3IEBACiAgICAgaW50IFJBTkRFTEVOOwogICAgIGludCBSQU5HRUxPVzsKIH0gSkJpZzJUYWJsZUxpbmU7Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjEgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMVtdID0gewogICAgIHsgMSwJNCwJCTAgfSwKICAgICB7IDIsCTgsCSAgIDE2IH0sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgeyAwLCAgIDMyLAkgICAtMSB9LAogICAgIHsgMywgICAzMiwJNjU4MDggfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IyID0gVFJVRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IyID0gdHJ1ZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMltdID0gewogICAgIHsgMSwJMCwJCTAgfSwKICAgICB7IDIsCTAsCQkxIH0sCkBAIC0zMCw3ICszMCw3IEBACiAgICAgeyA2LCAgIDMyLCAgICAgNzUgfSwKICAgICB7IDYsCTAsICAgICAgMCB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjMgPSBUUlVFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjMgPSB0cnVlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IzW10gPSB7CiAgICAgeyA4LAk4LCAgIC0yNTYgfSwKICAgICB7IDEsCTAsCQkwIH0sCkBAIC00Miw3ICs0Miw3IEBACiAgICAgeyA3LCAgIDMyLCAgICAgNzUgfSwKICAgICB7IDYsCTAsCQkwIH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNCA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjQgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CNFtdID0gewogICAgIHsgMSwJMCwJCTEgfSwKICAgICB7IDIsCTAsCQkyIH0sCkBAIC01Miw3ICs1Miw3IEBACiAgICAgeyAwLCAgIDMyLCAgICAgLTEgfSwKICAgICB7IDUsICAgMzIsCSAgIDc2IH0sCiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjUgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I1ID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjVbXSA9IHsKICAgICB7IDcsCTgsCSAtMjU1IH0sCiAgICAgeyAxLAkwLAkgICAgMSB9LApAQCAtNjMsNyArNjMsNyBAQAogICAgIHsgNywgICAzMiwgICAtMjU2IH0sCiAgICAgeyA2LCAgIDMyLCAgICAgNzYgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I2ID0gRkFMU0U7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNiA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I2W10gPSB7CiAgICAgeyA1LCAgIDEwLAktMjA0OCB9LAogICAgIHsgNCwgICAgOSwJLTEwMjQgfSwKQEAgLTgwLDcgKzgwLDcgQEAKICAgICB7IDYsICAgMzIsCS0yMDQ5IH0sCiAgICAgeyA2LCAgIDMyLAkgMjA0OCB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjcgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I3ID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjdbXSA9IHsKICAgICB7IDQsCTksCS0xMDI0IH0sCiAgICAgeyAzLAk4LAkgLTUxMiB9LApAQCAtOTgsNyArOTgsNyBAQAogICAgIHsgNSwgICAzMiwJLTEwMjUgfSwKICAgICB7IDUsICAgMzIsCSAyMDQ4IH0sCiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjggPSBUUlVFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjggPSB0cnVlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I4W10gPSB7CiAgICAgeyA4LAkzLAkgIC0xNSB9LAogICAgIHsgOSwJMSwJICAgLTcgfSwKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIHsgOSwgICAzMiwJIDE2NzAgfSwKICAgICB7IDIsCTAsCQkwIH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9COSA9IFRSVUU7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9COSA9IHRydWU7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjlbXSA9IHsKICAgICB7IDgsCTQsCSAgLTMxIH0sCiAgICAgeyA5LAkyLAkgIC0xNSB9LApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgeyA5LCAgIDMyLAkgMzMzOSB9LAogICAgIHsgMiwJMCwJCTAgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxMCA9IFRSVUU7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTAgPSB0cnVlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMFtdID0gewogICAgIHsgNywJNCwJICAtMjEgfSwKICAgICB7IDgsCTAsCSAgIC01IH0sCkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICB7IDgsICAgMzIsCSA0MTY2IH0sCiAgICAgeyAyLAkwLAkJMCB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjExID0gRkFMU0U7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTEgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTFbXSA9IHsKICAgICB7IDEsCTAsCQkxIH0sCiAgICAgeyAyLAkxLAkJMiB9LApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgeyAwLCAgIDMyLAkJMCB9LAogICAgIHsgNywgICAzMiwJICAxNDEgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxMiA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjEyID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjEyW10gPSB7CiAgICAgeyAxLAkwLAkJMSB9LAogICAgIHsgMiwJMCwJCTIgfSwKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgIHsgMCwgICAzMiwJCTAgfSwKICAgICB7IDgsICAgMzIsCSAgIDczIH0KIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxMyA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxM1tdID0gewogICAgIHsgMSwJMCwJCTEgfSwKICAgICB7IDMsCTAsCQkyIH0sCkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICB7IDAsICAgMzIsCQkwIH0sCiAgICAgeyA3LCAgIDMyLAkgIDE0MSB9CiB9OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0ID0gRkFMU0U7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTQgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTRbXSA9IHsKICAgICB7IDMsCTAsCSAgIC0yIH0sCiAgICAgeyAzLAkwLAkgICAtMSB9LApAQCAtMjMyLDcgKzIzMiw3IEBACiAgICAgeyAwLCAgIDMyLAkgICAtMyB9LAogICAgIHsgMCwgICAzMiwJCTMgfQogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxNSA9IEZBTFNFOworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1ID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjE1W10gPSB7CiAgICAgeyA3LAk0LAkgIC0yNCB9LAogICAgIHsgNiwJMiwJICAgLTggfSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5jcHAKaW5kZXggOWVmNDQ2NC4uMDMwYjBjMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKICAgICBtX25IZWlnaHQJPSBoOwogICAgIGlmIChtX25XaWR0aCA8PSAwIHx8IG1fbkhlaWdodCA8PSAwIHx8IG1fbldpZHRoID4gSU5UX01BWCAtIDMxKSB7CiAgICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICBtX2JOZWVkRnJlZSA9IEZBTFNFOworICAgICAgICBtX2JOZWVkRnJlZSA9IGZhbHNlOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1fblN0cmlkZSAgPSAoKHcgKyAzMSkgPj4gNSkgPDwgMjsKQEAgLTI1LDcgKzI1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtX3BEYXRhID0gTlVMTDsKICAgICB9Ci0gICAgbV9iTmVlZEZyZWUgPSBUUlVFOworICAgIG1fYk5lZWRGcmVlID0gdHJ1ZTsKIH0KIENKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKGludDMyX3QgdywgaW50MzJfdCBoLCBpbnQzMl90IHN0cmlkZSwgdWludDhfdCpwQnVmKQogewpAQCAtMzMsNyArMzMsNyBAQAogICAgIG1fbkhlaWdodCA9IGg7CiAgICAgbV9uU3RyaWRlID0gc3RyaWRlOwogICAgIG1fcERhdGEgPSBwQnVmOwotICAgIG1fYk5lZWRGcmVlID0gRkFMU0U7CisgICAgbV9iTmVlZEZyZWUgPSBmYWxzZTsKIH0KIENKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKENKQmlnMl9JbWFnZSAmaW0pCiB7CkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgfQotICAgIG1fYk5lZWRGcmVlID0gVFJVRTsKKyAgICBtX2JOZWVkRnJlZSA9IHRydWU7CiB9CiBDSkJpZzJfSW1hZ2U6On5DSkJpZzJfSW1hZ2UoKQogewpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9wRGF0YSk7CiAgICAgfQogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KQorYm9vbCBDSkJpZzJfSW1hZ2U6OmdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KQogewogICAgIGlmICghbV9wRGF0YSkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTcyLDcgKzcyLDcgQEAKICAgICByZXR1cm4gKChtX3BEYXRhW21dID4+ICg3IC0gbikpICYgMSk7CiB9CiAKLWludDMyX3QgQ0pCaWcyX0ltYWdlOjpzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCB2KQoraW50MzJfdCBDSkJpZzJfSW1hZ2U6OnNldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5LCBib29sIHYpCiB7CiAgICAgaWYgKCFtX3BEYXRhKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTA0LDMxICsxMDQsMzEgQEAKICAgICAgICAgSkJJRzJfbWVtY3B5KG1fcERhdGEgKyBoVG8gKiBtX25TdHJpZGUsIG1fcERhdGEgKyBoRnJvbSAqIG1fblN0cmlkZSwgbV9uU3RyaWRlKTsKICAgICB9CiB9Ci12b2lkIENKQmlnMl9JbWFnZTo6ZmlsbChGWF9CT09MIHYpCit2b2lkIENKQmlnMl9JbWFnZTo6ZmlsbChib29sIHYpCiB7CiAgICAgaWYgKCFtX3BEYXRhKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgSkJJRzJfbWVtc2V0KG1fcERhdGEsIHYgPyAweGZmIDogMCwgbV9uU3RyaWRlICogbV9uSGVpZ2h0KTsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCitib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQogewogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wKTsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpCiB7CiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoTlVMTCA9PSBwU3JjUmVjdCB8fCAqcFNyY1JlY3QgPT0gRlhfUkVDVCgwLCAwLCBtX25XaWR0aCwgbV9uSGVpZ2h0KSkgewogICAgICAgICByZXR1cm4gY29tcG9zZVRvX29wdDIocERzdCwgeCwgeSwgb3ApOwogICAgIH0KICAgICByZXR1cm4gY29tcG9zZVRvX29wdDIocERzdCwgeCwgeSwgb3AsIHBTcmNSZWN0KTsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fdW5vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCitib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQogewogICAgIGludDMyX3QgdywgaCwgZHgsIGR5OwogICAgIGludDMyX3QgaSwgajsKQEAgLTE5MiwxNyArMTkyLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCiB7CiAgICAgaW50MzJfdCB4MCwgeDEsIHkwLCB5MSwgeHgsIHl5OwogICAgIHVpbnQ4X3QgKnBMaW5lU3JjLCAqcExpbmVEc3QsICpzcmNQdHIsICpkZXN0UHRyOwogICAgIEZYX0RXT1JEIHNyYzAsIHNyYzEsIHNyYywgZGVzdCwgczEsIHMyLCBtMSwgbTIsIG0zOwotICAgIEZYX0JPT0wgb25lQnl0ZTsKKyAgICBib29sIG9uZUJ5dGU7CiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoeSA8IDApIHsKICAgICAgICAgeTAgPSAteTsKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICB5MSA9IG1fbkhlaWdodDsKICAgICB9CiAgICAgaWYgKHkwID49IHkxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoeCA+PSAwKSB7CiAgICAgICAgIHgwID0geCAmIH43OwpAQCAtMjI3LDcgKzIyNyw3IEBACiAgICAgICAgIHgxID0gcERzdC0+bV9uV2lkdGg7CiAgICAgfQogICAgIGlmICh4MCA+PSB4MSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgczEgPSB4ICYgNzsKICAgICBzMiA9IDggLSBzMTsKQEAgLTY3OSwxOSArNjc5LDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3ApCitib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3ApCiB7CiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gcFNyYy0+Y29tcG9zZVRvKHRoaXMsIHgsIHksIG9wKTsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlRnJvbShpbnQzMl90IHgsIGludDMyX3QgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpCitib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQogewogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCwgcFNyY1JlY3QpOwogfQpAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgfQogICAgIHJldHVybiBwSW1hZ2U7CiB9Ci12b2lkIENKQmlnMl9JbWFnZTo6ZXhwYW5kKGludDMyX3QgaCwgRlhfQk9PTCB2KQordm9pZCBDSkJpZzJfSW1hZ2U6OmV4cGFuZChpbnQzMl90IGgsIGJvb2wgdikKIHsKICAgICBpZiAoIW1fcERhdGEgfHwgaCA8PSBtX25IZWlnaHQpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNzg4LDcgKzc4OCw3IEBACiAgICAgSkJJRzJfbWVtc2V0KG1fcERhdGEgKyBkd0hlaWdodCAqIGR3U3RyaWRlLCB2ID8gMHhmZiA6IDAsIChkd0ggLSBkd0hlaWdodCkgKiBkd1N0cmlkZSk7CiAgICAgbV9uSGVpZ2h0ID0gaDsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKK2Jvb2wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKIHsKICAgICBpbnQzMl90IHhzMCA9IDAsIHlzMCAgPSAwLCB4czEgID0gMCwgeXMxICAgPSAwLCB4ZDAgICAgPSAwLCB5ZDAgICAgICAgICAgPSAwLCB4ZDEgICAgICA9IDAsIAogICAgICAgICAgICAgIHlkMSA9IDAsIHh4ICAgPSAwLCB5eSAgID0gMCwgdyAgICAgPSAwLCBoICAgICAgPSAwLCBtaWRkbGVEd29yZHMgPSAwLCBsaW5lTGVmdCA9IDA7CkBAIC03OTksMTAgKzc5OSwxMCBAQAogICAgIHVpbnQ4X3QgKmxpbmVTcmMgPSBOVUxMLCAqbGluZURzdCA9IE5VTEwsICpzcCA9IE5VTEwsICpkcCA9IE5VTEw7CiAKICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh4IDwgLTEwNDg1NzYgfHwgeCA+IDEwNDg1NzYgfHwgeSA8IC0xMDQ4NTc2IHx8IHkgPiAxMDQ4NTc2KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZih5IDwgMCkgewogICAgICAgICB5czAgPSAteTsKQEAgLTEyMDUsMTcgKzEyMDUsMTcgQEAKICAgICB9CiAgICAgcmV0dXJuIDE7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQorYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKIHsKICAgICBpbnQzMl90IHhzMCwgeXMwLCB4czEsIHlzMSwgeGQwLCB5ZDAsIHhkMSwgeWQxLCB4eCwgeXksIHcsIGgsIG1pZGRsZUR3b3JkcywgbGluZUxlZnQ7CiAgICAgRlhfRFdPUkQgczEsIGQxLCBkMiwgc2hpZnQsIHNoaWZ0MSwgc2hpZnQyLCB0bXAsIHRtcDEsIHRtcDIsIG1hc2tMLCBtYXNrUiwgbWFza007CiAgICAgdWludDhfdCAqbGluZVNyYywgKmxpbmVEc3QsICpzcCwgKmRwOwogICAgIGludDMyX3Qgc3csIHNoOwogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHggPCAtMTA0ODU3NiB8fCB4ID4gMTA0ODU3NiB8fCB5IDwgLTEwNDg1NzYgfHwgeSA+IDEwNDg1NzYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN3ID0gcFNyY1JlY3QtPldpZHRoKCk7CiAgICAgc2ggPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgKaW5kZXggNDIzYmViYy4uZDUxZDk5OSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaApAQCAtMjgsMzEgKzI4LDMxIEBACiAKICAgICB+Q0pCaWcyX0ltYWdlKCk7CiAKLSAgICBGWF9CT09MIGdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KTsKKyAgICBib29sIGdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KTsKIAotICAgIGludDMyX3Qgc2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgdik7CisgICAgaW50MzJfdCBzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgYm9vbCB2KTsKIAogICAgIHZvaWQgY29weUxpbmUoaW50MzJfdCBoVG8sIGludDMyX3QgaEZyb20pOwogCi0gICAgdm9pZCBmaWxsKEZYX0JPT0wgdik7CisgICAgdm9pZCBmaWxsKGJvb2wgdik7CiAKLSAgICBGWF9CT09MIGNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7Ci0gICAgRlhfQk9PTCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKKyAgICBib29sIGNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CisgICAgYm9vbCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKIAotICAgIEZYX0JPT0wgY29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgICBib29sIGNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CiAKLSAgICBGWF9CT09MIGNvbXBvc2VUb19vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOworICAgIGJvb2wgY29tcG9zZVRvX29wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CiAKLSAgICBGWF9CT09MIGNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKLSAgICBGWF9CT09MIGNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CisgICAgYm9vbCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CisgICAgYm9vbCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOwogCi0gICAgRlhfQk9PTCBjb21wb3NlRnJvbShpbnQzMl90IHgsIGludDMyX3QgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCk7Ci0gICAgRlhfQk9PTCBjb21wb3NlRnJvbShpbnQzMl90IHgsIGludDMyX3QgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOworICAgIGJvb2wgY29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3ApOworICAgIGJvb2wgY29tcG9zZUZyb20oaW50MzJfdCB4LCBpbnQzMl90IHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKICAgICBDSkJpZzJfSW1hZ2UgKnN1YkltYWdlX3Vub3B0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCk7CiAKICAgICBDSkJpZzJfSW1hZ2UgKnN1YkltYWdlKGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCk7CiAKLSAgICB2b2lkIGV4cGFuZChpbnQzMl90IGgsIEZYX0JPT0wgdik7CisgICAgdm9pZCBleHBhbmQoaW50MzJfdCBoLCBib29sIHYpOwogcHVibGljOgogCiAgICAgaW50MzJfdCBtX25XaWR0aDsKQEAgLTYzLDYgKzYzLDYgQEAKIAogICAgIHVpbnQ4X3QgKm1fcERhdGE7CiAKLSAgICBGWF9CT09MIG1fYk5lZWRGcmVlOworICAgIGJvb2wgbV9iTmVlZEZyZWU7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGFnZS5oCmluZGV4IGIwN2ViYTguLmI0ZTE1OWYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGFnZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGFnZS5oCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgRlhfRFdPUkQgbV9kd1Jlc29sdXRpb25YLAogICAgICAgICAgICAgIG1fZHdSZXNvbHV0aW9uWTsKICAgICB1aW50OF90IG1fY0ZsYWdzOwotICAgIEZYX0JPT0wgbV9iSXNTdHJpcGVkOworICAgIGJvb2wgbV9iSXNTdHJpcGVkOwogICAgIEZYX1dPUkQgbV93TWF4U3RyaXBlU2l6ZTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwCmluZGV4IDBlNWI5MmYuLmMxMGQ0NjEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcApAQCAtOSw3ICs5LDcgQEAKIHsKICAgICBTRE5VTUVYU1lNUyA9IDA7CiAgICAgU0RFWFNZTVMgPSBOVUxMOwotICAgIG1fYkNvbnRleHRSZXRhaW5lZCA9IEZBTFNFOworICAgIG1fYkNvbnRleHRSZXRhaW5lZCA9IGZhbHNlOwogICAgIG1fZ2JDb250ZXh0ID0gbV9nckNvbnRleHQgPSBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCmluZGV4IDkxNTZlMzAuLjVmOTRkYzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCkBAIC0xOSw3ICsxOSw3IEBACiBwdWJsaWM6CiAgICAgRlhfRFdPUkQgU0ROVU1FWFNZTVM7CiAgICAgQ0pCaWcyX0ltYWdlICoqU0RFWFNZTVM7Ci0gICAgRlhfQk9PTCBtX2JDb250ZXh0UmV0YWluZWQ7CisgICAgYm9vbCBtX2JDb250ZXh0UmV0YWluZWQ7CiAgICAgSkJpZzJBcml0aEN0eCAqbV9nYkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAqbV9nckNvbnRleHQ7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmggYi9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaAppbmRleCBiYTQyOTE2Li4yZDdmM2FlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaAorKysgYi9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaApAQCAtMTQsOCArMTQsOCBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgfklGWENSVF9GaWxlQWNjZXNzKCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wJCU9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7CiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCkgY29uc3QgPSAwOwpAQCAtMjUsMTQgKzI1LDE0IEBACiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgPSAwOwogICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKSA9IDA7CiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlGbHVzaCgpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbAkJRmx1c2goKSA9IDA7CisgICAgdmlydHVhbCBib29sCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpID0gMDsKIH07CiBJRlhDUlRfRmlsZUFjY2VzcyoJRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKIGNsYXNzIENGWF9DUlRGaWxlU3RyZWFtIGZpbmFsIDogcHVibGljIElGWF9GaWxlU3RyZWFtCiB7CiBwdWJsaWM6Ci0gICAgQ0ZYX0NSVEZpbGVTdHJlYW0oSUZYQ1JUX0ZpbGVBY2Nlc3MqIHBGQSkgOiBtX3BGaWxlKHBGQSksIG1fZHdDb3VudCgxKSwgbV9iVXNlUmFuZ2UoRkFMU0UpLCBtX25PZmZzZXQoMCksIG1fblNpemUoMCkge30KKyAgICBDRlhfQ1JURmlsZVN0cmVhbShJRlhDUlRfRmlsZUFjY2VzcyogcEZBKSA6IG1fcEZpbGUocEZBKSwgbV9kd0NvdW50KDEpLCBtX2JVc2VSYW5nZShmYWxzZSksIG1fbk9mZnNldCgwKSwgbV9uU2l6ZSgwKSB7fQogICAgIH5DRlhfQ1JURmlsZVN0cmVhbSgpCiAgICAgewogICAgICAgICBpZiAobV9wRmlsZSkgewpAQCAtNTUsNyArNTUsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYlVzZVJhbmdlID8gbV9uU2l6ZSA6IG1fcEZpbGUtPkdldFNpemUoKTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCkgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJSXNFT0YoKSBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIEdldFBvc2l0aW9uKCkgPj0gR2V0U2l6ZSgpOwogICAgIH0KQEAgLTY3LDQyICs2Nyw0MiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwb3M7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sCQkJCVNldFJhbmdlKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRklMRVNJWkUgc2l6ZSkgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IHNpemUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IHNpemU7CiAgICAgICAgIHBvcyArPSBvZmZzZXQ7CiAKICAgICAgICAgaWYgKCFwb3MuSXNWYWxpZCgpIHx8IHBvcy5WYWx1ZU9yRGllKCkgPiBtX3BGaWxlLT5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIG1fbk9mZnNldCA9IG9mZnNldCwgbV9uU2l6ZSA9IHNpemU7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gVFJVRTsKKyAgICAgICAgbV9iVXNlUmFuZ2UgPSB0cnVlOwogICAgICAgICBtX3BGaWxlLT5TZXRQb3NpdGlvbihtX25PZmZzZXQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZAkJCQlDbGVhclJhbmdlKCkgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gRkFMU0U7CisgICAgICAgIG1fYlVzZVJhbmdlID0gZmFsc2U7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZQogICAgIHsKICAgICAgICAgaWYgKG1fYlVzZVJhbmdlICYmIG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IG9mZnNldDsKIAogICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKICAgICAgICAgICAgIHBvcyArPSBtX25PZmZzZXQ7CiAgICAgICAgICAgICBpZiAoIXBvcy5Jc1ZhbGlkKCkgfHwgcG9zLlZhbHVlT3JEaWUoKSA+IChzaXplX3QpR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gKEZYX0JPT0wpbV9wRmlsZS0+UmVhZFBvcyhidWZmZXIsIHNpemUsIHBvcy5WYWx1ZU9yRGllKCkpOworICAgICAgICByZXR1cm4gKGJvb2wpbV9wRmlsZS0+UmVhZFBvcyhidWZmZXIsIHNpemUsIHBvcy5WYWx1ZU9yRGllKCkpOwogICAgIH0KICAgICB2aXJ0dWFsIHNpemVfdAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUKICAgICB7CkBAIC0xMTQsMjAgKzExNCwyMCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtX3BGaWxlLT5SZWFkKGJ1ZmZlciwgc2l6ZSk7CiAgICAgfQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsCWJvb2wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlCiAgICAgewogICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKICAgICAgICAgICAgIG9mZnNldCArPSBtX25PZmZzZXQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGWF9CT09MKW1fcEZpbGUtPldyaXRlUG9zKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIChib29sKW1fcEZpbGUtPldyaXRlUG9zKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZsdXNoKCkgIG92ZXJyaWRlCisgICAgdmlydHVhbCBib29sCQkJCUZsdXNoKCkgIG92ZXJyaWRlCiAgICAgewogICAgICAgICByZXR1cm4gbV9wRmlsZS0+Rmx1c2goKTsKICAgICB9CiAgICAgSUZYQ1JUX0ZpbGVBY2Nlc3MqCW1fcEZpbGU7CiAgICAgRlhfRFdPUkQJCQltX2R3Q291bnQ7Ci0gICAgRlhfQk9PTAkJCQltX2JVc2VSYW5nZTsKKyAgICBib29sCQkJCW1fYlVzZVJhbmdlOwogICAgIEZYX0ZJTEVTSVpFCQkJbV9uT2Zmc2V0OwogICAgIEZYX0ZJTEVTSVpFCQkJbV9uU2l6ZTsKIH07CkBAIC0xMzcsMjMgKzEzNywyMyBAQAogY2xhc3MgQ0ZYX01lbW9yeVN0cmVhbSBmaW5hbCA6IHB1YmxpYyBJRlhfTWVtb3J5U3RyZWFtCiB7CiBwdWJsaWM6Ci0gICAgQ0ZYX01lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSkKKyAgICBDRlhfTWVtb3J5U3RyZWFtKGJvb2wgYkNvbnNlY3V0aXZlKQogICAgICAgICA6IG1fZHdDb3VudCgxKQogICAgICAgICAsIG1fblRvdGFsU2l6ZSgwKQogICAgICAgICAsIG1fbkN1clNpemUoMCkKICAgICAgICAgLCBtX25DdXJQb3MoMCkKICAgICAgICAgLCBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKQotICAgICAgICAsIG1fYlVzZVJhbmdlKEZBTFNFKQorICAgICAgICAsIG1fYlVzZVJhbmdlKGZhbHNlKQogICAgIHsKICAgICAgICAgbV9kd0ZsYWdzID0gRlhfTUVNU1RSRUFNX1Rha2VPdmVyIHwgKGJDb25zZWN1dGl2ZSA/IEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSA6IDApOwogICAgIH0KLSAgICBDRlhfTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIpCisgICAgQ0ZYX01lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyKQogICAgICAgICA6IG1fZHdDb3VudCgxKQogICAgICAgICAsIG1fblRvdGFsU2l6ZShuU2l6ZSkKICAgICAgICAgLCBtX25DdXJTaXplKG5TaXplKQogICAgICAgICAsIG1fbkN1clBvcygwKQogICAgICAgICAsIG1fbkdyb3dTaXplKEZYX01FTVNUUkVBTV9CbG9ja1NpemUpCi0gICAgICAgICwgbV9iVXNlUmFuZ2UoRkFMU0UpCisgICAgICAgICwgbV9iVXNlUmFuZ2UoZmFsc2UpCiAgICAgewogICAgICAgICBtX0Jsb2Nrcy5BZGQocEJ1ZmZlcik7CiAgICAgICAgIG1fZHdGbGFncyA9IEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSB8IChiVGFrZU92ZXIgPyBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgOiAwKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fYlVzZVJhbmdlID8gKEZYX0ZJTEVTSVpFKSBtX25TaXplIDogKEZYX0ZJTEVTSVpFKW1fbkN1clNpemU7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpICBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbAkJCQlJc0VPRigpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fbkN1clBvcyA+PSAoc2l6ZV90KUdldFNpemUoKTsKICAgICB9CkBAIC0xOTYsMzAgKzE5NiwzMCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwb3M7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpICBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbAkJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgc2l6ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHJhbmdlID0gc2l6ZTsKICAgICAgICAgcmFuZ2UgKz0gb2Zmc2V0OwogICAgICAgICBpZiAoIXJhbmdlLklzVmFsaWQoKSB8fCByYW5nZS5WYWx1ZU9yRGllKCkgPiBtX25DdXJTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBtX25PZmZzZXQgPSAoc2l6ZV90KW9mZnNldCwgbV9uU2l6ZSA9IChzaXplX3Qpc2l6ZTsKLSAgICAgICAgbV9iVXNlUmFuZ2UgPSBUUlVFOworICAgICAgICBtX2JVc2VSYW5nZSA9IHRydWU7CiAgICAgICAgIG1fbkN1clBvcyA9IG1fbk9mZnNldDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xlYXJSYW5nZSgpICBvdmVycmlkZQogICAgIHsKLSAgICAgICAgbV9iVXNlUmFuZ2UgPSBGQUxTRTsKKyAgICAgICAgbV9iVXNlUmFuZ2UgPSBmYWxzZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpICBvdmVycmlkZQorICAgIHZpcnR1YWwgYm9vbAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmICghYnVmZmVyIHx8ICFzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHNhZmVPZmZzZXQgPSBvZmZzZXQ7CkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghc2FmZU9mZnNldC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIG9mZnNldCA9IHNhZmVPZmZzZXQuVmFsdWVPckRpZSgpOwpAQCAtMjM2LDEzICsyMzYsMTMgQEAKICAgICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKICAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8IG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiBtX25DdXJTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOwogICAgICAgICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSB7CiAgICAgICAgICAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCAodWludDhfdCopbV9CbG9ja3NbMF0gKyAoc2l6ZV90KW9mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHNpemVfdCBuU3RhcnRCbG9jayA9IChzaXplX3Qpb2Zmc2V0IC8gbV9uR3Jvd1NpemU7CiAgICAgICAgIG9mZnNldCAtPSAoRlhfRklMRVNJWkUpKG5TdGFydEJsb2NrICogbV9uR3Jvd1NpemUpOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAgICAgICAgICAgICBuU3RhcnRCbG9jayArKzsKICAgICAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICB2aXJ0dWFsIHNpemVfdAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCiAgICAgewpAQCAtMjc2LDEwICsyNzYsMTAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gblJlYWQ7CiAgICAgfQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCisgICAgdmlydHVhbAlib29sCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSAgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmICghYnVmZmVyIHx8ICFzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7CiAgICAgICAgICAgICBvZmZzZXQgKz0gKEZYX0ZJTEVTSVpFKW1fbk9mZnNldDsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgICAgICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKICAgICAgICAgICAgIG5ld1BvcyArPSBvZmZzZXQ7CiAgICAgICAgICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKICAgICAgICAgICAgIGlmIChtX25DdXJQb3MgPiBtX25Ub3RhbFNpemUpIHsKQEAgLTMwMSwyNCArMzAxLDI0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghbV9CbG9ja3NbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZYU1lTX21lbWNweSgodWludDhfdCopbV9CbG9ja3NbMF0gKyAoc2l6ZV90KW9mZnNldCwgYnVmZmVyLCBzaXplKTsKICAgICAgICAgICAgIGlmIChtX25DdXJTaXplIDwgbV9uQ3VyUG9zKSB7CiAgICAgICAgICAgICAgICAgbV9uQ3VyU2l6ZSA9IG1fbkN1clBvczsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBGWF9TQUZFX1NJWkVfVCBuZXdQb3MgPSBzaXplOwogICAgICAgICBuZXdQb3MgKz0gb2Zmc2V0OwogICAgICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghRXhwYW5kQmxvY2tzKG5ld1Bvcy5WYWx1ZU9yRGllKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKICAgICAgICAgc2l6ZV90IG5TdGFydEJsb2NrID0gKHNpemVfdClvZmZzZXQgLyBtX25Hcm93U2l6ZTsKQEAgLTMzNCwxMyArMzM0LDEzIEBACiAgICAgICAgICAgICBuU3RhcnRCbG9jayArKzsKICAgICAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmx1c2goKSAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJRmx1c2goKSAgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzQ29uc2VjdXRpdmUoKSBjb25zdCAgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQkJSXNDb25zZWN1dGl2ZSgpIGNvbnN0ICBvdmVycmlkZQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZTsKICAgICB9CkBAIC0zNjAsNyArMzYwLDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX0Jsb2Nrcy5HZXRTaXplKCkgPyAodWludDhfdCopbV9CbG9ja3NbMF0gOiBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQXR0YWNoQnVmZmVyKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSkgIG92ZXJyaWRlCisgICAgdmlydHVhbCB2b2lkCQkJCUF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIGJvb2wgYlRha2VPdmVyID0gZmFsc2UpICBvdmVycmlkZQogICAgIHsKICAgICAgICAgaWYgKCEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzkwLDE2ICszOTAsMTYgQEAKICAgICBzaXplX3QJCQltX25DdXJQb3M7CiAgICAgc2l6ZV90CQkJbV9uR3Jvd1NpemU7CiAgICAgRlhfRFdPUkQJCW1fZHdGbGFnczsKLSAgICBGWF9CT09MCQkJbV9iVXNlUmFuZ2U7CisgICAgYm9vbAkJCW1fYlVzZVJhbmdlOwogICAgIHNpemVfdAkJCW1fbk9mZnNldDsKICAgICBzaXplX3QJCQltX25TaXplOwotICAgIEZYX0JPT0wJRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKQorICAgIGJvb2wJRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKQogICAgIHsKICAgICAgICAgaWYgKG1fbkN1clNpemUgPCBzaXplKSB7CiAgICAgICAgICAgICBtX25DdXJTaXplID0gc2l6ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA8PSBtX25Ub3RhbFNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7CiAgICAgICAgIHNpemUgPSAoc2l6ZSAtIG1fblRvdGFsU2l6ZSArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZTsKQEAgLTQwOSw3ICs0MDksNyBAQAogICAgICAgICAgICAgbV9CbG9ja3MuU2V0QXQoaUNvdW50ICsrLCBwQmxvY2spOwogICAgICAgICAgICAgbV9uVG90YWxTaXplICs9IG1fbkdyb3dTaXplOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9OwogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC00MjQsMTUgKzQyNCwxNSBAQAogICAgIF9GWF9NVFJBTkRPTUNPTlRFWFQoKQogICAgIHsKICAgICAgICAgbXRpID0gTVRfTiArIDE7Ci0gICAgICAgIGJIYXZlU2VlZCA9IEZBTFNFOworICAgICAgICBiSGF2ZVNlZWQgPSBmYWxzZTsKICAgICB9CiAgICAgRlhfRFdPUkQgbXRpOwotICAgIEZYX0JPT0wJIGJIYXZlU2VlZDsKKyAgICBib29sCSBiSGF2ZVNlZWQ7CiAgICAgRlhfRFdPUkQgbXRbTVRfTl07CiB9IEZYX01UUkFORE9NQ09OVEVYVCwgKiBGWF9MUE1UUkFORE9NQ09OVEVYVDsKIHR5cGVkZWYgRlhfTVRSQU5ET01DT05URVhUIGNvbnN0ICogRlhfTFBDTVRSQU5ET01DT05URVhUOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLUZYX0JPT0wgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKK2Jvb2wgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKICNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcAppbmRleCAzY2IyZmQwLi40OTdjMWJhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKICAgICByZXR1cm4gbmV3IENGWF9CaWRpQ2hhcjsKIH0KIENGWF9CaWRpQ2hhcjo6Q0ZYX0JpZGlDaGFyKCkKLSAgICA6IG1fYlNlcGFyYXRlTmV1dHJhbChUUlVFKQorICAgIDogbV9iU2VwYXJhdGVOZXV0cmFsKHRydWUpCiAgICAgLCBtX2lDdXJTdGFydCgwKQogICAgICwgbV9pQ3VyQ291bnQoMCkKICAgICAsIG1faUN1ckJpZGkoMCkKQEAgLTIyLDEyICsyMiwxMiBAQAogICAgICwgbV9pTGFzdENvdW50KDApCiB7CiB9Ci12b2lkIENGWF9CaWRpQ2hhcjo6U2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCkKK3ZvaWQgQ0ZYX0JpZGlDaGFyOjpTZXRQb2xpY3koYm9vbCBiU2VwYXJhdGVOZXV0cmFsKQogewogICAgIG1fYlNlcGFyYXRlTmV1dHJhbCA9IGJTZXBhcmF0ZU5ldXRyYWw7CiB9CiAKLUZYX0JPT0wgQ0ZYX0JpZGlDaGFyOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkKK2Jvb2wgQ0ZYX0JpZGlDaGFyOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkKIHsKICAgICBGWF9EV09SRCBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwogICAgIGludDMyX3QgaUJpZGlDbHMgPSAoZHdQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTOwpAQCAtNDMsMTAgKzQzLDEwIEBACiAgICAgICAgICAgICBpQ29udGV4dCA9IDI7CiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgICAgYm9vbCBiUmV0ID0gZmFsc2U7CiAgICAgaWYgKGlDb250ZXh0ICE9IG1faUN1ckJpZGkpIHsKICAgICAgICAgaWYgKG1fYlNlcGFyYXRlTmV1dHJhbCkgewotICAgICAgICAgICAgYlJldCA9IFRSVUU7CisgICAgICAgICAgICBiUmV0ID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtX2lDdXJCaWRpID09IDApIHsKICAgICAgICAgICAgICAgICBiUmV0ID0gKG1faUN1ckNvdW50ID4gMCk7CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgbV9pQ3VyQ291bnQgKys7CiAgICAgcmV0dXJuIGJSZXQ7CiB9Ci1GWF9CT09MIENGWF9CaWRpQ2hhcjo6RW5kQ2hhcigpCitib29sIENGWF9CaWRpQ2hhcjo6RW5kQ2hhcigpCiB7CiAgICAgbV9pTGFzdEJpZGkgPSBtX2lDdXJCaWRpOwogICAgIG1faUxhc3RTdGFydCA9IG1faUN1clN0YXJ0OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmggYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuaAppbmRleCBlNGMxZGRhLi4xMGExNmFmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuaAorKysgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuaApAQCAtMTUsMTQgKzE1LDE0IEBACiAgICAgQ0ZYX0JpZGlDaGFyKCk7CiAgICAgfkNGWF9CaWRpQ2hhcigpIG92ZXJyaWRlIHt9CiAKLSAgICB2b2lkIFNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwgPSBUUlVFKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEVuZENoYXIoKSBvdmVycmlkZTsKKyAgICB2b2lkIFNldFBvbGljeShib29sIGJTZXBhcmF0ZU5ldXRyYWwgPSB0cnVlKSBvdmVycmlkZTsKKyAgICBib29sIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSBvdmVycmlkZTsKKyAgICBib29sIEVuZENoYXIoKSBvdmVycmlkZTsKICAgICBpbnQzMl90IEdldEJpZGlJbmZvKGludDMyX3QgJmlTdGFydCwgaW50MzJfdCAmaUNvdW50KSBvdmVycmlkZTsKICAgICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgRlhfQk9PTAltX2JTZXBhcmF0ZU5ldXRyYWw7CisgICAgYm9vbAltX2JTZXBhcmF0ZU5ldXRyYWw7CiAgICAgaW50MzJfdAltX2lDdXJTdGFydDsKICAgICBpbnQzMl90CW1faUN1ckNvdW50OwogICAgIGludDMyX3QJbV9pQ3VyQmlkaTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcAppbmRleCA0YWIzNGJiLi5mMTM5MzY1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiB7CiAgICAgRlhfRnJlZShtX3BEYXRhKTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUoaW50IG5OZXdTaXplKQorYm9vbCBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShpbnQgbk5ld1NpemUpCiB7CiAgICAgaWYgKG5OZXdTaXplIDw9IDApIHsKICAgICAgICAgRlhfRnJlZShtX3BEYXRhKTsKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgdG90YWxTaXplICo9IG1fblVuaXRTaXplOwogICAgICAgICBpZiAoIXRvdGFsU2l6ZS5Jc1ZhbGlkKCkpIHsKICAgICAgICAgICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX3BEYXRhID0gRlhfQWxsb2ModWludDhfdCwgdG90YWxTaXplLlZhbHVlT3JEaWUoKSk7CiAgICAgICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gbk5ld1NpemU7CkBAIC01MCwzOCArNTAsMzggQEAKICAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHRvdGFsU2l6ZSA9IG5OZXdNYXg7CiAgICAgICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKICAgICAgICAgaWYgKCF0b3RhbFNpemUuSXNWYWxpZCgpIHx8IG5OZXdNYXggPCBtX25TaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdWludDhfdCogcE5ld0RhdGEgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcERhdGEsIHRvdGFsU2l6ZS5WYWx1ZU9yRGllKCkpOwogICAgICAgICBpZiAocE5ld0RhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYU1lTX21lbXNldChwTmV3RGF0YSArIG1fblNpemUgKiBtX25Vbml0U2l6ZSwgMCwgKG5OZXdNYXggLSBtX25TaXplKSAqIG1fblVuaXRTaXplKTsKICAgICAgICAgbV9wRGF0YSA9IHBOZXdEYXRhOwogICAgICAgICBtX25TaXplID0gbk5ld1NpemU7CiAgICAgICAgIG1fbk1heFNpemUgPSBuTmV3TWF4OwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQorYm9vbCBDRlhfQmFzaWNBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpCiB7CiAgICAgaW50IG5PbGRTaXplID0gbV9uU2l6ZTsKICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gbmV3U2l6ZSA9IG1fblNpemU7CiAgICAgbmV3U2l6ZSArPSBzcmMubV9uU2l6ZTsKICAgICBpZiAobV9uVW5pdFNpemUgIT0gc3JjLm1fblVuaXRTaXplIHx8ICFuZXdTaXplLklzVmFsaWQoKSB8fCAhU2V0U2l6ZShuZXdTaXplLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBuT2xkU2l6ZSAqIG1fblVuaXRTaXplLCBzcmMubV9wRGF0YSwgc3JjLm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpDb3B5KGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpCitib29sIENGWF9CYXNpY0FycmF5OjpDb3B5KGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpCiB7CiAgICAgaWYgKCFTZXRTaXplKHNyYy5tX25TaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEsIHNyYy5tX3BEYXRhLCBzcmMubV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHVpbnQ4X3QqIENGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpCiB7CkBAIC0xMDMsMzEgKzEwMywzMSBAQAogICAgIH0KICAgICByZXR1cm4gbV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplOwogfQotRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6UmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCkKK2Jvb2wgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpCiB7CiAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkNvdW50IDw9IDAgfHwgbV9uU2l6ZSA8IG5JbmRleCArIG5Db3VudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IG5Nb3ZlQ291bnQgPSBtX25TaXplIC0gKG5JbmRleCArIG5Db3VudCk7CiAgICAgaWYgKG5Nb3ZlQ291bnQpIHsKICAgICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemUsIG1fcERhdGEgKyAobkluZGV4ICsgbkNvdW50KSAqIG1fblVuaXRTaXplLCBuTW92ZUNvdW50ICogbV9uVW5pdFNpemUpOwogICAgIH0KICAgICBtX25TaXplIC09IG5Db3VudDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkKK2Jvb2wgQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkKIHsKICAgICBpZiAocE5ld0FycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwTmV3QXJyYXktPm1fblNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICghSW5zZXJ0U3BhY2VBdChuU3RhcnRJbmRleCwgcE5ld0FycmF5LT5tX25TaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBuU3RhcnRJbmRleCAqIG1fblVuaXRTaXplLCBwTmV3QXJyYXktPm1fcERhdGEsIHBOZXdBcnJheS0+bV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIGNvbnN0IHZvaWQqIENGWF9CYXNpY0FycmF5OjpHZXREYXRhUHRyKGludCBpbmRleCkgY29uc3QKIHsKQEAgLTI2MCw3ICsyNjAsNyBAQAogICAgIH0KICAgICByZXR1cm4gcFNwb3Q7CiB9Ci12b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlU2VnbWVudChjb25zdCB1aW50OF90KiBwU2VnbWVudCwgaW50IGNvdW50LCBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdAordm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZVNlZ21lbnQoY29uc3QgdWludDhfdCogcFNlZ21lbnQsIGludCBjb3VudCwgYm9vbCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7CiAgICAgICAgIGlmICghY2FsbGJhY2socGFyYW0sICh2b2lkKikocFNlZ21lbnQgKyBpICogbV9Vbml0U2l6ZSkpKSB7CkBAIC0yNjksNyArMjY5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci12b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlSW5kZXgoaW50IGxldmVsLCBpbnQmIHN0YXJ0LCB2b2lkKiogcEluZGV4LCBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksIHZvaWQqIHBhcmFtKSBjb25zdAordm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZUluZGV4KGludCBsZXZlbCwgaW50JiBzdGFydCwgdm9pZCoqIHBJbmRleCwgYm9vbCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKIHsKICAgICBpZiAobGV2ZWwgPT0gMCkgewogICAgICAgICBpbnQgY291bnQgPSBtX0RhdGFTaXplIC0gc3RhcnQ7CkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci12b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlKEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlKGJvb2wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0CiB7CiAgICAgaWYgKG1fcEluZGV4ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCmluZGV4IDVlZWIzM2IuLjQ3YzFjNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCkBAIC0xMDg2LDkgKzEwODYsOSBAQAogICAgIGlmIChkID09IDAuMGYpIHsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CisgICAgYm9vbCBiTmVnYXRpdmUgPSBmYWxzZTsKICAgICBpZiAoZCA8IDApIHsKLSAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKKyAgICAgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKICAgICAgICAgZCA9IC1kOwogICAgIH0KICAgICBpbnQgc2NhbGUgPSAxOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAKaW5kZXggOWZjNDAwZS4uZDdjMWExYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwCkBAIC0zMjEsNyArMzIxLDcgQEAKICAgICBtX0xvYWRpbmdQb3MgPSAwOwogICAgIG1fTG9hZGluZ1NpemUgPSBkd1NpemU7CiB9Ci1GWF9CT09MIENGWF9BcmNoaXZlTG9hZGVyOjpJc0VPRigpCitib29sIENGWF9BcmNoaXZlTG9hZGVyOjpJc0VPRigpCiB7CiAgICAgcmV0dXJuIG1fTG9hZGluZ1BvcyA+PSBtX0xvYWRpbmdTaXplOwogfQpAQCAtMzcyLDE0ICszNzIsMTQgQEAKICAgICBzdHIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKGNvbnN0IHVuc2lnbmVkIHNob3J0KillbmNvZGVkLmNfc3RyKCksIGVuY29kZWQuR2V0TGVuZ3RoKCkpOwogICAgIHJldHVybiAqdGhpczsKIH0KLUZYX0JPT0wgQ0ZYX0FyY2hpdmVMb2FkZXI6OlJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKQorYm9vbCBDRlhfQXJjaGl2ZUxvYWRlcjo6UmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpCiB7CiAgICAgaWYgKG1fTG9hZGluZ1BvcyArIGR3U2l6ZSA+IG1fTG9hZGluZ1NpemUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYU1lTX21lbWNweShwQnVmLCBtX3BMb2FkaW5nQnVmICsgbV9Mb2FkaW5nUG9zLCBkd1NpemUpOwogICAgIG1fTG9hZGluZ1BvcyArPSBkd1NpemU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9CaXRTdHJlYW06OkluaXQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKIHsKQEAgLTQ0MSw5ICs0NDEsOSBAQAogICAgICAgICBtX3BCdWZmZXIgPSBOVUxMOwogICAgIH0KIH0KLUZYX0JPT0wgSUZYX0J1ZmZlckFyY2hpdmU6OkZsdXNoKCkKK2Jvb2wgSUZYX0J1ZmZlckFyY2hpdmU6OkZsdXNoKCkKIHsKLSAgICBGWF9CT09MIGJSZXQgPSBEb1dvcmsobV9wQnVmZmVyLCBtX0xlbmd0aCk7CisgICAgYm9vbCBiUmV0ID0gRG9Xb3JrKG1fcEJ1ZmZlciwgbV9MZW5ndGgpOwogICAgIG1fTGVuZ3RoID0gMDsKICAgICByZXR1cm4gYlJldDsKIH0KQEAgLTQ4OCw3ICs0ODgsNyBAQAogQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpDRlhfRmlsZUJ1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKQogICAgIDogSUZYX0J1ZmZlckFyY2hpdmUoc2l6ZSkKICAgICAsIG1fcEZpbGUoTlVMTCkKLSAgICAsIG1fYlRha2VvdmVyKEZBTFNFKQorICAgICwgbV9iVGFrZW92ZXIoZmFsc2UpCiB7CiB9CiBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6On5DRlhfRmlsZUJ1ZmZlckFyY2hpdmUoKQpAQCAtNTAxLDU4ICs1MDEsNTggQEAKICAgICAgICAgbV9wRmlsZS0+UmVsZWFzZSgpOwogICAgIH0KICAgICBtX3BGaWxlID0gTlVMTDsKLSAgICBtX2JUYWtlb3ZlciA9IEZBTFNFOworICAgIG1fYlRha2VvdmVyID0gZmFsc2U7CiAgICAgSUZYX0J1ZmZlckFyY2hpdmU6OkNsZWFyKCk7CiB9Ci1GWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShJRlhfU3RyZWFtV3JpdGUgKnBGaWxlLCBGWF9CT09MIGJUYWtlb3ZlciApCitib29sIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShJRlhfU3RyZWFtV3JpdGUgKnBGaWxlLCBib29sIGJUYWtlb3ZlciApCiB7CiAgICAgaWYgKCFwRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcEZpbGUgJiYgbV9iVGFrZW92ZXIpIHsKICAgICAgICAgbV9wRmlsZS0+UmVsZWFzZSgpOwogICAgIH0KICAgICBtX3BGaWxlID0gcEZpbGU7CiAgICAgbV9iVGFrZW92ZXIgPSBiVGFrZW92ZXI7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpCitib29sIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpCiB7CiAgICAgaWYgKCFmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcEZpbGUgJiYgbV9iVGFrZW92ZXIpIHsKICAgICAgICAgbV9wRmlsZS0+UmVsZWFzZSgpOwogICAgIH0KICAgICBtX3BGaWxlID0gRlhfQ3JlYXRlRmlsZVdyaXRlKGZpbGVuYW1lKTsKICAgICBpZiAoIW1fcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1fYlRha2VvdmVyID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX2JUYWtlb3ZlciA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkKK2Jvb2wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBdHRhY2hGaWxlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lKQogewogICAgIGlmICghZmlsZW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CiAgICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKICAgICB9CiAgICAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7CiAgICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX2JUYWtlb3ZlciA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9iVGFrZW92ZXIgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkRvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkKK2Jvb2wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAgICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXBCdWYgfHwgc2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gbV9wRmlsZS0+V3JpdGVCbG9jayhwQnVmLCBzaXplKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwCmluZGV4IDJlODMwODAuLjIyYjliZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcApAQCAtNDUsMTUgKzQ1LDE1IEBACiAgICAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOwogICAgIHRvcCA9IHRvcCA8IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKIH0KLUZYX0JPT0wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsIEZYX0ZMT0FUIGhpZ2gxLCBGWF9GTE9BVCBsb3cyLCBGWF9GTE9BVCBoaWdoMiwKK2Jvb2wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsIEZYX0ZMT0FUIGhpZ2gxLCBGWF9GTE9BVCBsb3cyLCBGWF9GTE9BVCBoaWdoMiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmxvdywgRlhfRkxPQVQmIGludGVyaGlnaCkKIHsKICAgICBpZiAobG93MSA+PSBoaWdoMiB8fCBsb3cyID49IGhpZ2gxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnRlcmxvdyA9IGxvdzEgPiBsb3cyID8gbG93MSA6IGxvdzI7CiAgICAgaW50ZXJoaWdoID0gaGlnaDEgPiBoaWdoMiA/IGhpZ2gyIDogaGlnaDE7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBleHRlcm4gIkMiIGludCBGWFNZU19yb3VuZChGWF9GTE9BVCBkKQogewpAQCAtMTk4LDE4ICsxOTgsMTggQEAKICAgICByZWN0Lk5vcm1hbGl6ZSgpOwogICAgIHJldHVybiByZWN0OwogfQotRlhfQk9PTCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdAorYm9vbCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdAogewogICAgIENGWF9GbG9hdFJlY3QgbjEgPSAqdGhpczsKICAgICBuMS5Ob3JtYWxpemUoKTsKICAgICBDRlhfRmxvYXRSZWN0IG4yID0gb3RoZXJfcmVjdDsKICAgICBuMi5Ob3JtYWxpemUoKTsKICAgICBpZiAobjIubGVmdCA+PSBuMS5sZWZ0ICYmIG4yLnJpZ2h0IDw9IG4xLnJpZ2h0ICYmIG4yLmJvdHRvbSA+PSBuMS5ib3R0b20gJiYgbjIudG9wIDw9IG4xLnRvcCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENGWF9GbG9hdFJlY3Q6OkNvbnRhaW5zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIGNvbnN0Citib29sIENGWF9GbG9hdFJlY3Q6OkNvbnRhaW5zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIGNvbnN0CiB7CiAgICAgQ0ZYX0Zsb2F0UmVjdCBuMSA9ICp0aGlzOwogICAgIG4xLk5vcm1hbGl6ZSgpOwpAQCAtMjk5LDEzICsyOTksMTMgQEAKICAgICBGWF9GTE9BVCBmZiA9IG0xLmUgKiBtMi5iICsgbTEuZiAqIG0yLmQgKyBtMi5mOwogICAgIG0uYSA9IGFhLCBtLmIgPSBiYiwgbS5jID0gY2MsIG0uZCA9IGRkLCBtLmUgPSBlZSwgbS5mID0gZmY7CiB9Ci12b2lkIENGWF9NYXRyaXg6OkNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBGWF9CT09MIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OkNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBib29sIGJQcmVwZW5kZWQpCiB7CiAgICAgQ0ZYX01hdHJpeCBtOwogICAgIG0uU2V0KGEsIGIsIGMsIGQsIGUsIGYpOwogICAgIENvbmNhdChtLCBiUHJlcGVuZGVkKTsKIH0KLXZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIEZYX0JPT0wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIGJvb2wgYlByZXBlbmRlZCkKIHsKICAgICBpZiAoYlByZXBlbmRlZCkgewogICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCBtLCAqdGhpcyk7CkBAIC0zMTMsMjUgKzMxMywyNSBAQAogICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCAqdGhpcywgbSk7CiAgICAgfQogfQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgRlhfQk9PTCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgYm9vbCBiUHJlcGVuZGVkKQogewogICAgIENGWF9NYXRyaXggbTsKICAgICBtLlNldFJldmVyc2Uoc3JjKTsKICAgICBDb25jYXQobSwgYlByZXBlbmRlZCk7CiB9Ci1GWF9CT09MIENGWF9NYXRyaXg6OklzSW52ZXJ0aWJsZSgpIGNvbnN0Citib29sIENGWF9NYXRyaXg6OklzSW52ZXJ0aWJsZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIEZYU1lTX2ZhYnMoYSAqIGQgLSBiICogYykgPj0gMC4wMDAxZjsKIH0KLUZYX0JPT0wgQ0ZYX01hdHJpeDo6SXM5MFJvdGF0ZWQoKSBjb25zdAorYm9vbCBDRlhfTWF0cml4OjpJczkwUm90YXRlZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIEZYU1lTX2ZhYnMoYSAqIDEwMDApIDwgRlhTWVNfZmFicyhiKSAmJiBGWFNZU19mYWJzKGQgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYyk7CiB9Ci1GWF9CT09MIENGWF9NYXRyaXg6OklzU2NhbGVkKCkgY29uc3QKK2Jvb2wgQ0ZYX01hdHJpeDo6SXNTY2FsZWQoKSBjb25zdAogewogICAgIHJldHVybiBGWFNZU19mYWJzKGIgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYSkgJiYgRlhTWVNfZmFicyhjICogMTAwMCkgPCBGWFNZU19mYWJzKGQpOwogfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgYm9vbCBiUHJlcGVuZGVkKQogewogICAgIGlmIChiUHJlcGVuZGVkKSB7CiAgICAgICAgIGUgKz0geCAqIGEgKyB5ICogYzsKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICBlICs9IHgsIGYgKz0geTsKICAgICB9CiB9Ci12b2lkIENGWF9NYXRyaXg6OlNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgRlhfQk9PTCBiUHJlcGVuZGVkKQordm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIGJvb2wgYlByZXBlbmRlZCkKIHsKICAgICBhICo9IHN4LCBkICo9IHN5OwogICAgIGlmIChiUHJlcGVuZGVkKSB7CkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICAgICAgZiAqPSBzeTsKICAgICB9CiB9Ci12b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpCit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBib29sIGJQcmVwZW5kZWQpCiB7CiAgICAgRlhfRkxPQVQgY29zVmFsdWUgPSBGWFNZU19jb3MoZlJhZGlhbik7CiAgICAgRlhfRkxPQVQgc2luVmFsdWUgPSBGWFNZU19zaW4oZlJhZGlhbik7CkBAIC0zNjUsMTMgKzM2NSwxMyBAQAogICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCAqdGhpcywgbSk7CiAgICAgfQogfQotdm9pZCBDRlhfTWF0cml4OjpSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLCBGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHksIEZYX0JPT0wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6Um90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5LCBib29sIGJQcmVwZW5kZWQpCiB7CiAgICAgVHJhbnNsYXRlKGR4LCBkeSwgYlByZXBlbmRlZCk7CiAgICAgUm90YXRlKGZSYWRpYW4sIGJQcmVwZW5kZWQpOwogICAgIFRyYW5zbGF0ZSgtZHgsIC1keSwgYlByZXBlbmRlZCk7CiB9Ci12b2lkIENGWF9NYXRyaXg6OlNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwgRlhfRkxPQVQgZkJldGFSYWRpYW4sIEZYX0JPT0wgYlByZXBlbmRlZCkKK3ZvaWQgQ0ZYX01hdHJpeDo6U2hlYXIoRlhfRkxPQVQgZkFscGhhUmFkaWFuLCBGWF9GTE9BVCBmQmV0YVJhZGlhbiwgYm9vbCBiUHJlcGVuZGVkKQogewogICAgIENGWF9NYXRyaXggbTsKICAgICBtLlNldCgxLCBGWFNZU190YW4oZkFscGhhUmFkaWFuKSwgRlhTWVNfdGFuKGZCZXRhUmFkaWFuKSwgMSwgMCwgMCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcAppbmRleCAyNDk3Yzc0Li41NjJmNzQxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKQEAgLTEyLDEyICsxMiwxMiBAQAogdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNUUl9UPgogVCBGWFNZU19TdHJUb0ludChTVFJfVCBzdHIpCiB7Ci0gICAgRlhfQk9PTCBuZWcgPSBGQUxTRTsKKyAgICBib29sIG5lZyA9IGZhbHNlOwogICAgIGlmIChzdHIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKCpzdHIgPT0gJy0nKSB7Ci0gICAgICAgIG5lZyA9IFRSVUU7CisgICAgICAgIG5lZyA9IHRydWU7CiAgICAgICAgIHN0ciArKzsKICAgICB9CiAgICAgVCBudW0gPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcAppbmRleCBlMzRhY2IwLi43ZGU3YjYxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcApAQCAtNjksMTUgKzY5LDE1IEBACiAgICAgcktleSA9IHBBc3NvY1JldC0+a2V5OwogICAgIHJWYWx1ZSA9IHBBc3NvY1JldC0+dmFsdWU7CiB9Ci1GWF9CT09MIENGWF9NYXBQdHJUb1B0cjo6TG9va3VwKHZvaWQqIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKK2Jvb2wgQ0ZYX01hcFB0clRvUHRyOjpMb29rdXAodm9pZCoga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAogewogICAgIEZYX0RXT1JEIG5IYXNoOwogICAgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKICAgICBpZiAocEFzc29jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJWYWx1ZSA9IHBBc3NvYy0+dmFsdWU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkKiBDRlhfTWFwUHRyVG9QdHI6OkdldFZhbHVlQXQodm9pZCoga2V5KSBjb25zdAogewpAQCAtMTQwLDcgKzE0MCw3IEBACiAgICAgcmV0dXJuIHBBc3NvYzsKIH0KIHZvaWQgQ0ZYX01hcFB0clRvUHRyOjpJbml0SGFzaFRhYmxlKAotICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpCisgICAgRlhfRFdPUkQgbkhhc2hTaXplLCBib29sIGJBbGxvY05vdykKIHsKICAgICBBU1NFUlQobV9uQ291bnQgPT0gMCk7CiAgICAgQVNTRVJUKG5IYXNoU2l6ZSA+IDApOwpAQCAtMTUzLDEwICsxNTMsMTAgQEAKICAgICB9CiAgICAgbV9uSGFzaFRhYmxlU2l6ZSA9IG5IYXNoU2l6ZTsKIH0KLUZYX0JPT0wgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkodm9pZCoga2V5KQorYm9vbCBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUtleSh2b2lkKiBrZXkpCiB7CiAgICAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDQXNzb2MqKiBwcEFzc29jUHJldjsKICAgICBwcEFzc29jUHJldiA9ICZtX3BIYXNoVGFibGVbSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZV07CkBAIC0xNjUsMTEgKzE2NSwxMSBAQAogICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7CiAgICAgICAgICAgICAqcHBBc3NvY1ByZXYgPSBwQXNzb2MtPnBOZXh0OwogICAgICAgICAgICAgRnJlZUFzc29jKHBBc3NvYyk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHBwQXNzb2NQcmV2ID0gJnBBc3NvYy0+cE5leHQ7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENGWF9NYXBQdHJUb1B0cjo6RnJlZUFzc29jKENGWF9NYXBQdHJUb1B0cjo6Q0Fzc29jKiBwQXNzb2MpCiB7CkBAIC0zMjUsMTggKzMyNSwxOCBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLUZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAorYm9vbCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0CiB7CiAgICAgRlhfRFdPUkQgbkhhc2g7CiAgICAgQ0Fzc29jKiBwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpOwogICAgIGlmIChwQXNzb2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgclZhbHVlID0gcEFzc29jLT52YWx1ZTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6SW5pdEhhc2hUYWJsZSgKLSAgICBGWF9EV09SRCBuSGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93KQorICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgYm9vbCBiQWxsb2NOb3cpCiB7CiAgICAgQVNTRVJUKG1fbkNvdW50ID09IDApOwogICAgIEFTU0VSVChuSGFzaFNpemUgPiAwKTsKQEAgLTM1OSwxMCArMzU5LDEwIEBACiAgICAgfQogICAgIHJldHVybiBuSGFzaDsKIH0KLUZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KQorYm9vbCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpCiB7CiAgICAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDQXNzb2MqKiBwcEFzc29jUHJldjsKICAgICBwcEFzc29jUHJldiA9ICZtX3BIYXNoVGFibGVbSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZV07CkBAIC0zNzEsMTEgKzM3MSwxMSBAQAogICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7CiAgICAgICAgICAgICAqcHBBc3NvY1ByZXYgPSBwQXNzb2MtPnBOZXh0OwogICAgICAgICAgICAgRnJlZUFzc29jKHBBc3NvYyk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHBwQXNzb2NQcmV2ID0gJnBBc3NvYy0+cE5leHQ7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBzdHJ1Y3QgX0NvbXBhY3RTdHJpbmcgewogICAgIHVpbnQ4X3QJCW1fQ29tcGFjdExlbjsKQEAgLTM5MCwxNiArMzkwLDE2IEBACiAgICAgICAgIEZYX0ZyZWUocENvbXBhY3QtPm1fcEJ1ZmZlcik7CiAgICAgfQogfQotc3RhdGljIEZYX0JPT0wgX0NvbXBhY3RTdHJpbmdTYW1lKF9Db21wYWN0U3RyaW5nKiBwQ29tcGFjdCwgY29uc3QgdWludDhfdCogcFN0ciwgaW50IGxlbikKK3N0YXRpYyBib29sIF9Db21wYWN0U3RyaW5nU2FtZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsIGNvbnN0IHVpbnQ4X3QqIHBTdHIsIGludCBsZW4pCiB7CiAgICAgaWYgKGxlbiA8IHNpemVvZihfQ29tcGFjdFN0cmluZykpIHsKICAgICAgICAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gIT0gbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgmcENvbXBhY3QtPm1fTGVuSGlnaCwgcFN0ciwgbGVuKSA9PSAwOwogICAgIH0KICAgICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiAhPSAweGZmIHx8IHBDb21wYWN0LT5tX0xlbkhpZ2ggKiAyNTYgKyBwQ29tcGFjdC0+bV9MZW5Mb3cgIT0gbGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gRlhTWVNfbWVtY21wKHBDb21wYWN0LT5tX3BCdWZmZXIsIHBTdHIsIGxlbikgPT0gMDsKIH0KQEAgLTQ5NywxOCArNDk3LDE4IEBACiAgICAgck5leHRQb3NpdGlvbiA9IE5VTEw7CiAgICAgcmV0dXJuIHJWYWx1ZTsKIH0KLUZYX0JPT0wgX0NNYXBMb29rdXBDYWxsYmFjayh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpCitib29sIF9DTWFwTG9va3VwQ2FsbGJhY2sodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKQogewogICAgIHJldHVybiAhX0NvbXBhY3RTdHJpbmdTYW1lKChfQ29tcGFjdFN0cmluZyopcERhdGEsICgoQ0ZYX0J5dGVTdHJpbmdDKilwYXJhbSktPkdldFB0cigpLCAoKENGWF9CeXRlU3RyaW5nQyopcGFyYW0pLT5HZXRMZW5ndGgoKSk7CiB9Ci1GWF9CT09MIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Citib29sIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0CiB7CiAgICAgdm9pZCogcCA9IG1fQnVmZmVyLkl0ZXJhdGUoX0NNYXBMb29rdXBDYWxsYmFjaywgKHZvaWQqKSZrZXkpOwogICAgIGlmICghcCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgclZhbHVlID0gKih2b2lkKiopKChfQ29tcGFjdFN0cmluZyopcCArIDEpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6U2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqIHZhbHVlKQogewpAQCAtNTc5LDE1ICs1NzksMTUgQEAKICAgICBGWF9EV09SRCBrZXk7CiAgICAgRlhfRFdPUkQgdmFsdWU7CiB9OwotRlhfQk9PTCBDRlhfQ01hcERXb3JkVG9EV29yZDo6TG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdAorYm9vbCBDRlhfQ01hcERXb3JkVG9EV29yZDo6TG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdAogewogICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZrZXksIG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0RXb3JkUGFpciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfRFdvcmRQYWlyKSwgX0NvbXBhcmVEV29yZCk7CiAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdmFsdWUgPSAoKEZYX0RXT1JEKilwUmVzdWx0KVsxXTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIEZYX1BPU0lUSU9OIENGWF9DTWFwRFdvcmRUb0RXb3JkOjpHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKaW5kZXggMjZlZWFjYy4uMTM0MzM3NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgbV9wQ2FsbGJhY2sobV9wRGF0YSk7CiAgICAgfQogfQotdm9pZCBDRlhfUHJpdmF0ZURhdGE6OkFkZERhdGEodm9pZCogcE1vZHVsZUlkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssIEZYX0JPT0wgYlNlbGZEZXN0cnVjdCkKK3ZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpBZGREYXRhKHZvaWQqIHBNb2R1bGVJZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLCBib29sIGJTZWxmRGVzdHJ1Y3QpCiB7CiAgICAgaWYgKHBNb2R1bGVJZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQ2LDI2ICs0NiwyNiBAQAogfQogdm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVEYXRhKHZvaWQqIHBNb2R1bGVJZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKQogewotICAgIEFkZERhdGEocE1vZHVsZUlkLCBwRGF0YSwgY2FsbGJhY2ssIEZBTFNFKTsKKyAgICBBZGREYXRhKHBNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBmYWxzZSk7CiB9CiB2b2lkIENGWF9Qcml2YXRlRGF0YTo6U2V0UHJpdmF0ZU9iaih2b2lkKiBwTW9kdWxlSWQsIENGWF9EZXN0cnVjdE9iamVjdCogcE9iaikKIHsKLSAgICBBZGREYXRhKHBNb2R1bGVJZCwgcE9iaiwgTlVMTCwgVFJVRSk7CisgICAgQWRkRGF0YShwTW9kdWxlSWQsIHBPYmosIE5VTEwsIHRydWUpOwogfQotRlhfQk9PTCBDRlhfUHJpdmF0ZURhdGE6OlJlbW92ZVByaXZhdGVEYXRhKHZvaWQqIHBNb2R1bGVJZCkKK2Jvb2wgQ0ZYX1ByaXZhdGVEYXRhOjpSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBwTW9kdWxlSWQpCiB7CiAgICAgaWYgKHBNb2R1bGVJZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9QUklWQVRFREFUQSogcExpc3QgPSBtX0RhdGFMaXN0LkdldERhdGEoKTsKICAgICBpbnQgY291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7CiAgICAgICAgIGlmIChwTGlzdFtpXS5tX3BNb2R1bGVJZCA9PSBwTW9kdWxlSWQpIHsKICAgICAgICAgICAgIG1fRGF0YUxpc3QuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkKiBDRlhfUHJpdmF0ZURhdGE6OkdldFByaXZhdGVEYXRhKHZvaWQqIHBNb2R1bGVJZCkKIHsKQEAgLTkwLDE4ICs5MCwxOCBAQAogICAgIH0KICAgICBtX0RhdGFMaXN0LlJlbW92ZUFsbCgpOwogfQotdm9pZCBGWF9hdG9udW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJjLCBGWF9CT09MJiBiSW50ZWdlciwgdm9pZCogcERhdGEpCit2b2lkIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cmMsIGJvb2wmIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKIHsKICAgICBpZiAoRlhTWVNfbWVtY2hyKHN0cmMuR2V0UHRyKCksICcuJywgc3RyYy5HZXRMZW5ndGgoKSkgPT0gTlVMTCkgewotICAgICAgICBiSW50ZWdlciA9IFRSVUU7CisgICAgICAgIGJJbnRlZ2VyID0gdHJ1ZTsKICAgICAgICAgaW50IGNjID0gMCwgaW50ZWdlciA9IDA7CiAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwogICAgICAgICBpbnQgbGVuID0gc3RyYy5HZXRMZW5ndGgoKTsKLSAgICAgICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiTmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKICAgICAgICAgICAgIGNjKys7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGJOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICAgICBjYysrOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgewpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgKihpbnQqKXBEYXRhID0gaW50ZWdlcjsKICAgICB9IGVsc2UgewotICAgICAgICBiSW50ZWdlciA9IEZBTFNFOworICAgICAgICBiSW50ZWdlciA9IGZhbHNlOwogICAgICAgICAqKEZYX0ZMT0FUKilwRGF0YSA9IEZYX2F0b2Yoc3RyYyk7CiAgICAgfQogfQpAQCAtMTI5LDEzICsxMjksMTMgQEAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CiAgICAgaW50IGNjID0gMDsKLSAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOworICAgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CiAgICAgY29uc3QgRlhfQ0hBUiogc3RyID0gc3RyYy5HZXRDU3RyKCk7CiAgICAgaW50IGxlbiA9IHN0cmMuR2V0TGVuZ3RoKCk7CiAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKICAgICAgICAgY2MrKzsKICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKLSAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKKyAgICAgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKICAgICAgICAgY2MrKzsKICAgICB9CiAgICAgd2hpbGUgKGNjIDwgbGVuKSB7CkBAIC0xODcsMTMgKzE4NywxMyBAQAogfQogI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfICYmIF9NU0NfVkVSIDwgMTkwMAogCi1zdGF0aWMgRlhfQk9PTCBGWF9Jc0RpZ2l0KHVpbnQ4X3QgY2gpCitzdGF0aWMgYm9vbCBGWF9Jc0RpZ2l0KHVpbnQ4X3QgY2gpCiB7Ci0gICAgcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpID8gdHJ1ZSA6IGZhbHNlOwogfQotc3RhdGljIEZYX0JPT0wgRlhfSXNYRGlnaXQodWludDhfdCBjaCkKK3N0YXRpYyBib29sIEZYX0lzWERpZ2l0KHVpbnQ4X3QgY2gpCiB7Ci0gICAgcmV0dXJuIChGWF9Jc0RpZ2l0KGNoKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByZXR1cm4gKEZYX0lzRGlnaXQoY2gpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpID8gdHJ1ZSA6IGZhbHNlOwogfQogc3RhdGljIHVpbnQ4X3QgRlhfTWFrZVVwcGVyKHVpbnQ4X3QgY2gpCiB7CkBAIC0yOTksNyArMjk5LDcgQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhKCkge30KICAgICBIQU5ETEUJCQkJbV9IYW5kbGU7Ci0gICAgRlhfQk9PTAkJCQltX2JFbmQ7CisgICAgYm9vbAkJCQltX2JFbmQ7CiB9OwogY2xhc3MgQ0ZpbmRGaWxlRGF0YUEgOiBwdWJsaWMgQ0ZpbmRGaWxlRGF0YQogewpAQCAtMzMyLDcgKzMzMiw3IEBACiAgICAgICAgIGRlbGV0ZSBwRGF0YTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHBEYXRhLT5tX2JFbmQgPSBGQUxTRTsKKyAgICBwRGF0YS0+bV9iRW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIHBEYXRhOwogI2Vsc2UKICAgICBESVIqIGRpciA9IG9wZW5kaXIocGF0aCk7CkBAIC0zNTIsODIgKzM1Miw4MiBAQAogICAgICAgICBkZWxldGUgcERhdGE7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBwRGF0YS0+bV9iRW5kID0gRkFMU0U7CisgICAgcERhdGEtPm1fYkVuZCA9IGZhbHNlOwogICAgIHJldHVybiBwRGF0YTsKICNlbHNlCiAgICAgRElSKiBkaXIgPSBvcGVuZGlyKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwYXRoKSk7CiAgICAgcmV0dXJuIGRpcjsKICNlbmRpZgogfQotRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwgRlhfQk9PTCYgYkZvbGRlcikKK2Jvb2wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfQnl0ZVN0cmluZyYgZmlsZW5hbWUsIGJvb2wmIGJGb2xkZXIpCiB7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAjaWZuZGVmIF9XSU4zMl9XQ0UKICAgICBDRmluZEZpbGVEYXRhQSogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YUEqKWhhbmRsZTsKICAgICBpZiAocERhdGEtPm1fYkVuZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZmlsZW5hbWUgPSBwRGF0YS0+bV9GaW5kRGF0YS5jRmlsZU5hbWU7CiAgICAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CiAgICAgaWYgKCFGaW5kTmV4dEZpbGVBKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgewotICAgICAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKKyAgICAgICAgcERhdGEtPm1fYkVuZCA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogI2Vsc2UKICAgICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YVcqKWhhbmRsZTsKICAgICBpZiAocERhdGEtPm1fYkVuZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZmlsZW5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lKTsKICAgICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKICAgICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7Ci0gICAgICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOworICAgICAgICBwRGF0YS0+bV9iRW5kID0gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiAjZW5kaWYKICNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCiAgICAgYWJvcnQoKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogI2Vsc2UKICAgICBzdHJ1Y3QgZGlyZW50ICpkZSA9IHJlYWRkaXIoKERJUiopaGFuZGxlKTsKICAgICBpZiAoZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZmlsZW5hbWUgPSBkZS0+ZF9uYW1lOwogICAgIGJGb2xkZXIgPSBkZS0+ZF90eXBlID09IERUX0RJUjsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKICNlbmRpZgogfQotRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9XaWRlU3RyaW5nJiBmaWxlbmFtZSwgRlhfQk9PTCYgYkZvbGRlcikKK2Jvb2wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsIGJvb2wmIGJGb2xkZXIpCiB7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAgICAgQ0ZpbmRGaWxlRGF0YVcqIHBEYXRhID0gKENGaW5kRmlsZURhdGFXKiloYW5kbGU7CiAgICAgaWYgKHBEYXRhLT5tX2JFbmQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZpbGVuYW1lID0gcERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lOwogICAgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOwogICAgIGlmICghRmluZE5leHRGaWxlVyhwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKLSAgICAgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7CisgICAgICAgIHBEYXRhLT5tX2JFbmQgPSB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKICNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCiAgICAgYWJvcnQoKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogI2Vsc2UKICAgICBzdHJ1Y3QgZGlyZW50ICpkZSA9IHJlYWRkaXIoKERJUiopaGFuZGxlKTsKICAgICBpZiAoZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZmlsZW5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGRlLT5kX25hbWUpOwogICAgIGJGb2xkZXIgPSBkZS0+ZF90eXBlID09IERUX0RJUjsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKICNlbmRpZgogfQogdm9pZCBGWF9DbG9zZUZvbGRlcih2b2lkKiBoYW5kbGUpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCmluZGV4IGI2YjU5NTUuLmJiMjM2YWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCkBAIC05ODAsMTEgKzk4MCwxMSBAQAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KICAgICBpbnQgY2MgPSAwOwotICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CisgICAgYm9vbCBiTmVnYXRpdmUgPSBmYWxzZTsKICAgICBpZiAoc3RyWzBdID09ICcrJykgewogICAgICAgICBjYysrOwogICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOworICAgICAgICBiTmVnYXRpdmUgPSB0cnVlOwogICAgICAgICBjYysrOwogICAgIH0KICAgICBpbnQgaW50ZWdlciA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcAppbmRleCA0NjYyZThmLi5mZTZmMjlmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKQEAgLTcyLDEyICs3MiwxMiBAQAogICAgIEZYU1lTX2Fzc2VydChoRmlsZSAhPSBOVUxMKTsKICAgICByZXR1cm4gKChJRlhDUlRfRmlsZUFjY2VzcyopaEZpbGUpLT5Xcml0ZVBvcyhwQnVmZmVyLCBzekJ1ZmZlciwgcG9zKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9GbHVzaChGWF9IRklMRSBoRmlsZSkKK2Jvb2wgRlhfRmlsZV9GbHVzaChGWF9IRklMRSBoRmlsZSkKIHsKICAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7CiAgICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+Rmx1c2goKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9UcnVuY2F0ZShGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgc3pGaWxlKQorYm9vbCBGWF9GaWxlX1RydW5jYXRlKEZYX0hGSUxFIGhGaWxlLCBGWF9GSUxFU0laRSBzekZpbGUpCiB7CiAgICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwogICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPlRydW5jYXRlKHN6RmlsZSk7CkBAIC0xMjIsMTEgKzEyMiwxMSBAQAogewogICAgIHJldHVybiBGWF9DcmVhdGVGaWxlU3RyZWFtKGZpbGVuYW1lLCBGWF9GSUxFTU9ERV9SZWFkT25seSk7CiB9Ci1JRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IGR3U2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIpCitJRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IGR3U2l6ZSwgYm9vbCBiVGFrZU92ZXIpCiB7CiAgICAgcmV0dXJuIG5ldyBDRlhfTWVtb3J5U3RyZWFtKHBCdWZmZXIsIGR3U2l6ZSwgYlRha2VPdmVyKTsKIH0KLUlGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSkKK0lGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShib29sIGJDb25zZWN1dGl2ZSkKIHsKICAgICByZXR1cm4gbmV3IENGWF9NZW1vcnlTdHJlYW0oYkNvbnNlY3V0aXZlKTsKIH0KQEAgLTE2MCwxMCArMTYwLDEwIEBACiAgICAgICAgIHJldHVybiAwLjBmOwogICAgIH0KICAgICBpbnQzMl90IGlVc2VkTGVuID0gMDsKLSAgICBGWF9CT09MIGJOZWd0aXZlID0gRkFMU0U7CisgICAgYm9vbCBiTmVndGl2ZSA9IGZhbHNlOwogICAgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgewogICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgIGJOZWd0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGJOZWd0aXZlID0gdHJ1ZTsKICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICBpVXNlZExlbisrOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMzAsNyArMjMwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGNoMSAtIGNoMjsKIH0KLUZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGNvbnN0IEZYX0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSkKK0ZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGNvbnN0IEZYX0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgYm9vbCBiSWdub3JlQ2FzZSkKIHsKICAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsKICAgICBpZiAoaUxlbmd0aCA8IDApIHsKQEAgLTI0OSw3ICsyNDksNyBAQAogICAgIH0KICAgICByZXR1cm4gZHdIYXNoQ29kZTsKIH0KLUZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UpCitGWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBib29sIGJJZ25vcmVDYXNlKQogewogICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwpOwogICAgIGlmIChpTGVuZ3RoIDwgMCkgewpAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgZm9yIChpID0gMTsgaSA8IE1UX047IGkgKyspIHsKICAgICAgICAgcEJ1ZltpXSA9ICgxODEyNDMzMjUzVUwgKiAocEJ1ZltpIC0gMV0gXiAocEJ1ZltpIC0gMV0gPj4gMzApKSArIGkpOwogICAgIH0KLSAgICBwQ29udGV4dC0+YkhhdmVTZWVkID0gVFJVRTsKKyAgICBwQ29udGV4dC0+YkhhdmVTZWVkID0gdHJ1ZTsKICAgICByZXR1cm4gcENvbnRleHQ7CiB9CiBGWF9EV09SRCBGWF9SYW5kb21fTVRfR2VuZXJhdGUodm9pZCogcENvbnRleHQpCkBAIC0zNDcsOCArMzQ3LDggQEAKICAgICBkbyB7CiAgICAgICAgIDo6R2V0U3lzdGVtVGltZSgmc3QyKTsKICAgICB9IHdoaWxlIChGWFNZU19tZW1jbXAoJnN0MSwgJnN0Miwgc2l6ZW9mKFNZU1RFTVRJTUUpKSA9PSAwKTsKLSAgICBGWF9EV09SRCBkd0hhc2gxID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKSZzdDEsIHNpemVvZihzdDEpLCBUUlVFKTsKLSAgICBGWF9EV09SRCBkd0hhc2gyID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKSZzdDIsIHNpemVvZihzdDIpLCBUUlVFKTsKKyAgICBGWF9EV09SRCBkd0hhc2gxID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKSZzdDEsIHNpemVvZihzdDEpLCB0cnVlKTsKKyAgICBGWF9EV09SRCBkd0hhc2gyID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKSZzdDIsIHNpemVvZihzdDIpLCB0cnVlKTsKICAgICA6OnNyYW5kKChkd0hhc2gxIDw8IDE2KSB8IChGWF9EV09SRClkd0hhc2gyKTsKICNlbHNlCiAgICAgdGltZV90IHRtTGFzdCA9IHRpbWUoTlVMTCksIHRtQ3VyOwpAQCAtMzYwLDE1ICszNjAsMTUgQEAKICAgICB9CiB9CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotRlhfQk9PTCBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCitib29sIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCkKIHsKICAgICBIQ1JZUFRQUk9WIGhDUCA9IE5VTEw7CiAgICAgaWYgKCE6OkNyeXB0QWNxdWlyZUNvbnRleHQoJmhDUCwgTlVMTCwgTlVMTCwgUFJPVl9SU0FfRlVMTCwgMCkgfHwgaENQID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIDo6Q3J5cHRHZW5SYW5kb20oaENQLCBpQ291bnQgKiBzaXplb2YoRlhfRFdPUkQpLCAodWludDhfdCopcEJ1ZmZlcik7CiAgICAgOjpDcnlwdFJlbGVhc2VDb250ZXh0KGhDUCwgMCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAjZW5kaWYKIHZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQ3J5cHRvKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCkKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAKaW5kZXggZDY2YTU4YS4uMWQ2M2RhOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAKQEAgLTEzLDI3ICsxMywyNyBAQAogewogICAgIHJldHVybiBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07CiB9Ci1GWF9CT09MIEZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpCitib29sIEZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpCiB7CiAgICAgRlhfRFdPUkQgZHdSZXQgPSAoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCljaF0gJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsKICAgICByZXR1cm4gZHdSZXQgPT0gRlhfQ0hBUlRZUEVfVGFiIHx8IGR3UmV0ID09IEZYX0NIQVJUWVBFX0NvbnRyb2w7CiB9Ci1GWF9CT09MIEZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKQorYm9vbCBGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCkKIHsKICAgICByZXR1cm4gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpY2hdICYgMHg4MDAwKSAhPSAwOwogfQotRlhfQk9PTCBGWF9Jc0NvbWJpbmF0aW9uQ2hhcihGWF9XQ0hBUiB3Y2gpCitib29sIEZYX0lzQ29tYmluYXRpb25DaGFyKEZYX1dDSEFSIHdjaCkKIHsKICAgICBGWF9EV09SRCBkd1Byb3BzID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spOwogICAgIHJldHVybiBkd1Byb3BzID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOwogfQotRlhfQk9PTAlGWF9Jc0JpZGlDaGFyKEZYX1dDSEFSIHdjaCkKK2Jvb2wJRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpCiB7CiAgICAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKICAgICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKICAgICByZXR1cm4gKEZYX0JJRElDTEFTU19SID09IGlCaWRpQ2xzIHx8IEZYX0JJRElDTEFTU19BTCA9PSBpQmlkaUNscyk7CiB9Ci1GWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCkKK0ZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBib29sIGJSVEwsIGJvb2wgYlZlcnRpY2FsKQogewogICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07CiAgICAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIHdjaDsKIH0KLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9EV09SRCBkd1Byb3BzLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKQorRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0RXT1JEIGR3UHJvcHMsIGJvb2wgYlJUTCwgYm9vbCBiVmVydGljYWwpCiB7CiAgICAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKICAgICBpZiAoYlJUTCAmJiBkd1RlbXAgPCAweEZGODAwMDAwKSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwCmluZGV4IGRjZjkxZDEuLjczNjk1YTYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwCkBAIC0xMiwzNCArMTIsMzQgQEAKICAgICAgICAgbV9wRGF0YUFjYy0+UmVsZWFzZSgpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IHNpemUpCitib29sIENYTUxfUGFyc2VyOjpJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQogewogICAgIG1fcERhdGFBY2MgPSBuZXcgQ1hNTF9EYXRhQnVmQWNjKHBCdWZmZXIsIHNpemUpOwotICAgIHJldHVybiBJbml0KFRSVUUpOworICAgIHJldHVybiBJbml0KHRydWUpOwogfQotRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCkKK2Jvb2wgQ1hNTF9QYXJzZXI6OkluaXQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpCiB7CiAgICAgbV9wRGF0YUFjYyA9IG5ldyBDWE1MX0RhdGFTdG1BY2MocEZpbGVSZWFkKTsKLSAgICByZXR1cm4gSW5pdChUUlVFKTsKKyAgICByZXR1cm4gSW5pdCh0cnVlKTsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIpCitib29sIENYTUxfUGFyc2VyOjpJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKQogewogICAgIGlmICghcEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9wRGF0YUFjYyA9IHBCdWZmZXI7Ci0gICAgcmV0dXJuIEluaXQoRkFMU0UpOworICAgIHJldHVybiBJbml0KGZhbHNlKTsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoRlhfQk9PTCBiT3duZGVkU3RyZWFtKQorYm9vbCBDWE1MX1BhcnNlcjo6SW5pdChib29sIGJPd25kZWRTdHJlYW0pCiB7CiAgICAgbV9iT3duZWRTdHJlYW0gPSBiT3duZGVkU3RyZWFtOwogICAgIG1fbk9mZnNldCA9IDA7CiAgICAgcmV0dXJuIFJlYWROZXh0QmxvY2soKTsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OlJlYWROZXh0QmxvY2soKQorYm9vbCBDWE1MX1BhcnNlcjo6UmVhZE5leHRCbG9jaygpCiB7CiAgICAgaWYgKCFtX3BEYXRhQWNjLT5SZWFkTmV4dEJsb2NrKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcEJ1ZmZlciA9IG1fcERhdGFBY2MtPkdldEJsb2NrQnVmZmVyKCk7CiAgICAgbV9kd0J1ZmZlclNpemUgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja1NpemUoKTsKQEAgLTQ3LDEwICs0NywxMCBAQAogICAgIG1fZHdJbmRleCA9IDA7CiAgICAgcmV0dXJuIG1fZHdCdWZmZXJTaXplID4gMDsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OklzRU9GKCkKK2Jvb2wgQ1hNTF9QYXJzZXI6OklzRU9GKCkKIHsKICAgICBpZiAoIW1fcERhdGFBY2MtPklzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBtX2R3SW5kZXggPj0gbV9kd0J1ZmZlclNpemU7CiB9CkBAIC04MiwyNyArODIsMjcgQEAKICAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAogICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MDEsIDB4MDEsCiB9OwotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UodWludDhfdCBjaCkKK2Jvb2wgZ19GWENSVF9YTUxfSXNXaGl0ZVNwYWNlKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9TcGFjZUNoYXIpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzTGV0dGVyKHVpbnQ4X3QgY2gpCitib29sIGdfRlhDUlRfWE1MX0lzTGV0dGVyKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9MZXR0ZXIpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzRGlnaXRhbCh1aW50OF90IGNoKQorYm9vbCBnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwodWludDhfdCBjaCkKIHsKICAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0RpZ2l0YWwpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzTmFtZUludHJvKHVpbnQ4X3QgY2gpCitib29sIGdfRlhDUlRfWE1MX0lzTmFtZUludHJvKHVpbnQ4X3QgY2gpCiB7CiAgICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lSW50cm8pICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzTmFtZUNoYXIodWludDhfdCBjaCkKK2Jvb2wgZ19GWENSVF9YTUxfSXNOYW1lQ2hhcih1aW50OF90IGNoKQogewogICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUNoYXIpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzSGV4Q2hhcih1aW50OF90IGNoKQorYm9vbCBnX0ZYQ1JUX1hNTF9Jc0hleENoYXIodWludDhfdCBjaCkKIHsKICAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0hleENoYXIpICE9IDA7CiB9CkBAIC0zMTAsMTMgKzMxMCwxMyBAQAogICAgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CiAgICAgdmFsdWUgPSBkZWNvZGVyLkdldFJlc3VsdCgpOwogfQotdm9pZCBDWE1MX1BhcnNlcjo6R2V0VGFnTmFtZShDRlhfQnl0ZVN0cmluZyAmc3BhY2UsIENGWF9CeXRlU3RyaW5nICZuYW1lLCBGWF9CT09MICZiRW5kVGFnLCBGWF9CT09MIGJTdGFydFRhZykKK3ZvaWQgQ1hNTF9QYXJzZXI6OkdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgYm9vbCAmYkVuZFRhZywgYm9vbCBiU3RhcnRUYWcpCiB7CiAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKICAgICBpZiAoSXNFT0YoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJFbmRUYWcgPSBGQUxTRTsKKyAgICBiRW5kVGFnID0gZmFsc2U7CiAgICAgdWludDhfdCBjaDsKICAgICBpbnQzMl90IGlTdGF0ZSA9IGJTdGFydFRhZyA/IDEgOiAwOwogICAgIGRvIHsKQEAgLTM0NSwxMCArMzQ1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRW5kVGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTM1OSwxNCArMzU5LDE0IEBACiAgICAgICAgIH0KICAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwogfQotQ1hNTF9FbGVtZW50KiBDWE1MX1BhcnNlcjo6UGFyc2VFbGVtZW50KENYTUxfRWxlbWVudCogcFBhcmVudCwgRlhfQk9PTCBiU3RhcnRUYWcpCitDWE1MX0VsZW1lbnQqIENYTUxfUGFyc2VyOjpQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LCBib29sIGJTdGFydFRhZykKIHsKICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwogICAgIGlmIChJc0VPRigpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyB0YWdfbmFtZSwgdGFnX3NwYWNlOwotICAgIEZYX0JPT0wgYkVuZFRhZzsKKyAgICBib29sIGJFbmRUYWc7CiAgICAgR2V0VGFnTmFtZSh0YWdfc3BhY2UsIHRhZ19uYW1lLCBiRW5kVGFnLCBiU3RhcnRUYWcpOwogICAgIGlmICh0YWdfbmFtZS5Jc0VtcHR5KCkgfHwgYkVuZFRhZykgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQyNyw3ICs0MjcsNyBAQAogICAgIH0KICAgICBDRlhfVVRGOERlY29kZXIgZGVjb2RlcjsKICAgICBDRlhfV2lkZVRleHRCdWYgY29udGVudDsKLSAgICBGWF9CT09MIGJDREFUQSA9IEZBTFNFOworICAgIGJvb2wgYkNEQVRBID0gZmFsc2U7CiAgICAgaW50MzJfdCBpU3RhdGUgPSAwOwogICAgIGRvIHsKICAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7CkBAIC00NjUsMTAgKzQ2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LkNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiQ0RBVEEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJDREFUQSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcFN1YkVsZW1lbnQgPSBQYXJzZUVsZW1lbnQocEVsZW1lbnQsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ1hNTF9FbGVtZW50KiBwU3ViRWxlbWVudCA9IFBhcnNlRWxlbWVudChwRWxlbWVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFN1YkVsZW1lbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTA5LDEwICs1MDksMTAgQEAKICAgICBJbnNlcnRDb250ZW50U2VnbWVudChiQ0RBVEEsIGRhdGFTdHIsIHBFbGVtZW50KTsKICAgICBjb250ZW50LkNsZWFyKCk7CiAgICAgZGVjb2Rlci5DbGVhcigpOwotICAgIGJDREFUQSA9IEZBTFNFOworICAgIGJDREFUQSA9IGZhbHNlOwogICAgIHJldHVybiBwRWxlbWVudDsKIH0KLXZvaWQgQ1hNTF9QYXJzZXI6Okluc2VydENvbnRlbnRTZWdtZW50KEZYX0JPT0wgYkNEQVRBLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnQsIENYTUxfRWxlbWVudCogcEVsZW1lbnQpCit2b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChib29sIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KQogewogICAgIGlmIChjb250ZW50LklzRW1wdHkoKSkgewogICAgICAgICByZXR1cm47CkBAIC01MjIsMTYgKzUyMiwxNiBAQAogICAgIHBFbGVtZW50LT5tX0NoaWxkcmVuLkFkZCgodm9pZCopQ1hNTF9FbGVtZW50OjpDb250ZW50KTsKICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQocENvbnRlbnQpOwogfQotc3RhdGljIENYTUxfRWxlbWVudCogWE1MX0NvbnRpbnVlUGFyc2UoQ1hNTF9QYXJzZXIgJnBhcnNlciwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKK3N0YXRpYyBDWE1MX0VsZW1lbnQqIFhNTF9Db250aW51ZVBhcnNlKENYTUxfUGFyc2VyICZwYXJzZXIsIGJvb2wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCiB7CiAgICAgcGFyc2VyLm1fYlNhdmVTcGFjZUNoYXJzID0gYlNhdmVTcGFjZUNoYXJzOwotICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBwYXJzZXIuUGFyc2VFbGVtZW50KE5VTEwsIEZBTFNFKTsKKyAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gcGFyc2VyLlBhcnNlRWxlbWVudChOVUxMLCBmYWxzZSk7CiAgICAgaWYgKHBQYXJzZWRTaXplKSB7CiAgICAgICAgICpwUGFyc2VkU2l6ZSA9IHBhcnNlci5tX25PZmZzZXQ7CiAgICAgfQogICAgIHJldHVybiBwRWxlbWVudDsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKK0NYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKIHsKICAgICBDWE1MX1BhcnNlciBwYXJzZXI7CiAgICAgaWYgKCFwYXJzZXIuSW5pdCgodWludDhfdCopcEJ1ZmZlciwgc2l6ZSkpIHsKQEAgLTUzOSw3ICs1MzksNyBAQAogICAgIH0KICAgICByZXR1cm4gWE1MX0NvbnRpbnVlUGFyc2UocGFyc2VyLCBiU2F2ZVNwYWNlQ2hhcnMsIHBQYXJzZWRTaXplKTsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQorQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIGJvb2wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCiB7CiAgICAgQ1hNTF9QYXJzZXIgcGFyc2VyOwogICAgIGlmICghcGFyc2VyLkluaXQocEZpbGUpKSB7CkBAIC01NDcsNyArNTQ3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIsIGJvb2wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCiB7CiAgICAgQ1hNTF9QYXJzZXIgcGFyc2VyOwogICAgIGlmICghcGFyc2VyLkluaXQocEJ1ZmZlcikpIHsKQEAgLTYwMCw3ICs2MDAsNyBAQAogICAgIH0KICAgICBtX0NoaWxkcmVuLlJlbW92ZUFsbCgpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXRUYWdOYW1lKEZYX0JPT0wgYlF1YWxpZmllZCkgY29uc3QKK0NGWF9CeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0VGFnTmFtZShib29sIGJRdWFsaWZpZWQpIGNvbnN0CiB7CiAgICAgaWYgKCFiUXVhbGlmaWVkIHx8IG1fUVNwYWNlTmFtZS5Jc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIG1fVGFnTmFtZTsKQEAgLTYxMCw3ICs2MTAsNyBAQAogICAgIGJzVGFnICs9IG1fVGFnTmFtZTsKICAgICByZXR1cm4gYnNUYWc7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldE5hbWVzcGFjZShGWF9CT09MIGJRdWFsaWZpZWQpIGNvbnN0CitDRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldE5hbWVzcGFjZShib29sIGJRdWFsaWZpZWQpIGNvbnN0CiB7CiAgICAgaWYgKGJRdWFsaWZpZWQpIHsKICAgICAgICAgcmV0dXJuIG1fUVNwYWNlTmFtZTsKQEAgLTY0NCw2MSArNjQ0LDYxIEBACiAgICAgbmFtZSA9IGl0ZW0ubV9BdHRyTmFtZTsKICAgICB2YWx1ZSA9IGl0ZW0ubV9WYWx1ZTsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpIYXNBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKK2Jvb2wgQ1hNTF9FbGVtZW50OjpIYXNBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKIHsKICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICByZXR1cm4gbV9BdHRyTWFwLkxvb2t1cChic1NwYWNlLCBic05hbWUpICE9IE5VTEw7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QKK2Jvb2wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdAogewogICAgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7CiAgICAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShuYW1lLCBic1NwYWNlLCBic05hbWUpOwogICAgIHJldHVybiBHZXRBdHRyVmFsdWUoYnNTcGFjZSwgYnNOYW1lLCBhdHRyaWJ1dGUpOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0Citib29sIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7CiAgICAgaWYgKHBWYWx1ZSkgewogICAgICAgICBhdHRyaWJ1dGUgPSAqcFZhbHVlOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3QKK2Jvb2wgQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdAogewogICAgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7CiAgICAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShuYW1lLCBic1NwYWNlLCBic05hbWUpOwogICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwd3NWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoYnNTcGFjZSwgYnNOYW1lKTsKICAgICBpZiAocHdzVmFsdWUpIHsKICAgICAgICAgYXR0cmlidXRlID0gcHdzVmFsdWUtPkdldEludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTAlDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0Citib29sCUNYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKICAgICBpZiAocHdzVmFsdWUpIHsKICAgICAgICAgYXR0cmlidXRlID0gcHdzVmFsdWUtPkdldEludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0Citib29sIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICByZXR1cm4gR2V0QXR0ckZsb2F0KGJzU3BhY2UsIGJzTmFtZSwgYXR0cmlidXRlKTsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdAorYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0CiB7CiAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoc3BhY2UsIG5hbWUpOwogICAgIGlmIChwVmFsdWUpIHsKICAgICAgICAgYXR0cmlidXRlID0gcFZhbHVlLT5HZXRGbG9hdCgpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50Q2hpbGRyZW4oKSBjb25zdAogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAKaW5kZXggZTcxODI5NDMuLjgxM2FmMDIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmNwcApAQCAtNDAsMjAgKzQwLDIwIEBACiB7CiAgICAgQ2xvc2UoKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKIHsKICAgICBpZiAobV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKICAgICBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhkd01vZGUsIHN0ck1vZGUpOwogICAgIG1faEZpbGUgPSBGWFNZU19mb3BlbihmaWxlTmFtZS5HZXRDU3RyKCksIHN0ck1vZGUuY19zdHIoKSk7CiAgICAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKIHsKICAgICBpZiAobV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyTW9kZTsKICAgICBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhkd01vZGUsIHN0ck1vZGUpOwpAQCAtMTI4LDQ1ICsxMjgsNDUgQEAKICAgICBGWFNZU19mc2VlayhtX2hGaWxlLCBwb3MsIEZYU1lTX1NFRUtfU0VUKTsKICAgICByZXR1cm4gRlhTWVNfZndyaXRlKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpGbHVzaCgpCitib29sIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6Rmx1c2goKQogewogICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuICFGWFNZU19mZmx1c2gobV9oRmlsZSk7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCitib29sIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfRXhpc3QoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiByZW1vdmUoZmlsZU5hbWUuR2V0Q1N0cigpKSA+IC0xOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiBGWF9GaWxlX0RlbGV0ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICBDRlhDUlRfRmlsZUFjY2Vzc19DUlQgc3JjLCBkc3Q7CiAgICAgaWYgKCFzcmMuT3BlbihmaWxlTmFtZVNyYywgRlhfRklMRU1PREVfUmVhZE9ubHkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9GSUxFU0laRSBzaXplID0gc3JjLkdldFNpemUoKTsKICAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghZHN0Lk9wZW4oZmlsZU5hbWVEc3QsIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgbnVtID0gMDsKICAgICB1aW50OF90KiBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgMzI3NjgpOwpAQCAtMTc2LDE3ICsxNzYsMTcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfQ29weShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOwogfQotRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIHJlbmFtZShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9Nb3ZlKEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5oCmluZGV4IDRmZDA1ODguLmQ5NWFlNGYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5oCkBAIC0xNyw4ICsxNyw4IEBACiBwdWJsaWM6CiAgICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUKCk7CiAgICAgdmlydHVhbCB+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CiAgICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwpAQCAtMjgsOCArMjgsOCBAQAogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwogICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CisgICAgdmlydHVhbCBib29sCQlGbHVzaCgpOworICAgIHZpcnR1YWwgYm9vbAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKIHByb3RlY3RlZDoKICAgICBGWFNZU19GSUxFKgltX2hGaWxlOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcAppbmRleCA4NDY0NmVmLi5lYjcyMTNlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwCkBAIC0zNCwxNyArMzQsMTcgQEAKIHsKICAgICBDbG9zZSgpOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCitib29sIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKIHsKICAgICBpZiAobV9uRkQgPiAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50MzJfdCBuRmxhZ3MsIG5NYXNrczsKICAgICBGWENSVF9Qb3NpeF9HZXRGaWxlTW9kZShkd01vZGUsIG5GbGFncywgbk1hc2tzKTsKICAgICBtX25GRCA9IG9wZW4oZmlsZU5hbWUuR2V0Q1N0cigpLCBuRmxhZ3MsIG5NYXNrcyk7CiAgICAgcmV0dXJuIG1fbkZEID4gLTE7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQogewogICAgIHJldHVybiBPcGVuKEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpLCBkd01vZGUpOwogfQpAQCAtMTIxLDQ4ICsxMjEsNDggQEAKICAgICB9CiAgICAgcmV0dXJuIFdyaXRlKHBCdWZmZXIsIHN6QnVmZmVyKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkZsdXNoKCkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkZsdXNoKCkKIHsKICAgICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gZnN5bmMobV9uRkQpID4gLTE7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCitib29sIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCiB7CiAgICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuICFmdHJ1bmNhdGUobV9uRkQsIHN6RmlsZSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKK2Jvb2wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiBhY2Nlc3MoZmlsZU5hbWUuR2V0Q1N0cigpLCBGX09LKSA+IC0xOwogfQotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCitib29sIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9FeGlzdChGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCitib29sIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIHJlbW92ZShmaWxlTmFtZS5HZXRDU3RyKCkpID4gLTE7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCitib29sIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIEZYX0ZpbGVfRGVsZXRlKEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4IHNyYywgZHN0OwogICAgIGlmICghc3JjLk9wZW4oZmlsZU5hbWVTcmMsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRklMRVNJWkUgc2l6ZSA9IHNyYy5HZXRTaXplKCk7CiAgICAgaWYgKCFzaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIWRzdC5PcGVuKGZpbGVOYW1lRHN0LCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBudW0gPSAwOwogICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCAzMjc2OCk7CkBAIC0xNzQsMTcgKzE3NCwxNyBAQAogICAgICAgICBudW0gPSBzcmMuUmVhZChwQnVmZmVyLCAzMjc2OCk7CiAgICAgfQogICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gRlhfRmlsZV9Db3B5KEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKICAgICByZXR1cm4gcmVuYW1lKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiBGWF9GaWxlX01vdmUoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmggYi9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oCmluZGV4IDM5ZGYxYzguLjY1M2ExNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguaApAQCAtMTUsOCArMTUsOCBAQAogcHVibGljOgogICAgIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCk7CiAgICAgdmlydHVhbCB+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKKyAgICB2aXJ0dWFsIGJvb2wJCU9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKKyAgICB2aXJ0dWFsIGJvb2wJCU9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKICAgICB2aXJ0dWFsIHZvaWQJCUNsb3NlKCk7CiAgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7CiAgICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCkgY29uc3Q7CkBAIC0yNiw4ICsyNiw4IEBACiAgICAgdmlydHVhbCBzaXplX3QJCVdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CiAgICAgdmlydHVhbCBzaXplX3QJCVJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlGbHVzaCgpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKKyAgICB2aXJ0dWFsIGJvb2wJCUZsdXNoKCk7CisgICAgdmlydHVhbCBib29sCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOwogcHJvdGVjdGVkOgogICAgIGludDMyX3QJbV9uRkQ7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmNwcAppbmRleCBkNGUzODMwLi43ZWZmYWI2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmNwcApAQCAtOCwxOSArOCwxOSBAQAogI2luY2x1ZGUgImZ4Y3J0X3dpbmRvd3MuaCIKIAogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgRlhfRFdPUkQgZHdBdHRyaSA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNBKGZpbGVOYW1lLkdldENTdHIoKSk7CiAgICAgaWYgKGR3QXR0cmkgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAoZHdBdHRyaSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMDsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgRlhfRFdPUkQgZHdBdHRyaSA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNXKChMUENXU1RSKWZpbGVOYW1lLkdldFB0cigpKTsKICAgICBpZiAoZHdBdHRyaSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIChkd0F0dHJpICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSA9PSAwOwogfQpAQCAtNTUsMTAgKzU1LDEwIEBACiB7CiAgICAgQ2xvc2UoKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uOwogICAgIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoZHdNb2RlLCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbik7CkBAIC02OCwxMCArNjgsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCiB7CiAgICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYX0RXT1JEIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uOwogICAgIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoZHdNb2RlLCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbik7CkBAIC0xNzQsNDEgKzE3NCw0MSBAQAogICAgIH0KICAgICByZXR1cm4gV3JpdGUocEJ1ZmZlciwgc3pCdWZmZXIpOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Rmx1c2goKQorYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Rmx1c2goKQogewogICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIDo6Rmx1c2hGaWxlQnVmZmVycyhtX2hGaWxlKTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKK2Jvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKIHsKICAgICBpZiAoU2V0UG9zaXRpb24oc3pGaWxlKSA9PSAoRlhfRklMRVNJWkUpIC0gMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIDo6U2V0RW5kT2ZGaWxlKG1faEZpbGUpOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQorYm9vbCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQogewogICAgIHJldHVybiA6OkRlbGV0ZUZpbGVBKGZpbGVOYW1lLkdldENTdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCitib29sIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCiB7CiAgICAgcmV0dXJuIDo6RGVsZXRlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWUuR2V0UHRyKCkpOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7Ci0gICAgcmV0dXJuIDo6Q29weUZpbGVBKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpLCBGQUxTRSk7CisgICAgcmV0dXJuIDo6Q29weUZpbGVBKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpLCBmYWxzZSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQorYm9vbCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKIHsKLSAgICByZXR1cm4gOjpDb3B5RmlsZVcoKExQQ1dTVFIpZmlsZU5hbWVTcmMuR2V0UHRyKCksIChMUENXU1RSKWZpbGVOYW1lRHN0LkdldFB0cigpLCBGQUxTRSk7CisgICAgcmV0dXJuIDo6Q29weUZpbGVXKChMUENXU1RSKWZpbGVOYW1lU3JjLkdldFB0cigpLCAoTFBDV1NUUilmaWxlTmFtZURzdC5HZXRQdHIoKSwgZmFsc2UpOwogfQotRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKK2Jvb2wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCiB7CiAgICAgcmV0dXJuIDo6TW92ZUZpbGVBKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCitib29sIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQogewogICAgIHJldHVybiA6Ok1vdmVGaWxlVygoTFBDV1NUUilmaWxlTmFtZVNyYy5HZXRQdHIoKSwgKExQQ1dTVFIpZmlsZU5hbWVEc3QuR2V0UHRyKCkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oCmluZGV4IDhkZDJjZGQuLjQxNGI4NjMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmgKQEAgLTE1LDggKzE1LDggQEAKIHB1YmxpYzoKICAgICBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOwogICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX1dpbjY0KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CisgICAgdmlydHVhbCBib29sCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7CiAgICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwpAQCAtMjYsOCArMjYsOCBAQAogICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwogICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKICAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CisgICAgdmlydHVhbCBib29sCQlGbHVzaCgpOworICAgIHZpcnR1YWwgYm9vbAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKIHByb3RlY3RlZDoKICAgICB2b2lkKgltX2hGaWxlOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaCBiL2NvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaAppbmRleCAxMDljN2E0Li5lYzhiZGMyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC94bWxfaW50LmgKKysrIGIvY29yZS9zcmMvZnhjcnQveG1sX2ludC5oCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgewogICAgICAgICBkZWxldGUgdGhpczsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKQorICAgIHZpcnR1YWwgYm9vbAkJCUlzRU9GKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX2R3Q3VyUG9zID49IG1fZHdTaXplOwogICAgIH0KQEAgLTM1LDE2ICszNSwxNiBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKQorICAgIHZpcnR1YWwgYm9vbAkJCVJlYWROZXh0QmxvY2soYm9vbCBiUmVzdGFydCA9IGZhbHNlKQogICAgIHsKICAgICAgICAgaWYgKGJSZXN0YXJ0KSB7CiAgICAgICAgICAgICBtX2R3Q3VyUG9zID0gMDsKICAgICAgICAgfQogICAgICAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7CiAgICAgICAgICAgICBtX2R3Q3VyUG9zID0gbV9kd1NpemU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqCQlHZXRCbG9ja0J1ZmZlcigpCiAgICAgewpAQCAtODUsNyArODUsNyBAQAogICAgIHsKICAgICAgICAgZGVsZXRlIHRoaXM7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpCiAgICAgewogICAgICAgICByZXR1cm4gbV9uU3RhcnQgKyAoRlhfRklMRVNJWkUpbV9kd1NpemUgPj0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKICAgICB9CkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZE5leHRCbG9jayhGWF9CT09MIGJSZXN0YXJ0ID0gRkFMU0UpCisgICAgdmlydHVhbCBib29sCQkJUmVhZE5leHRCbG9jayhib29sIGJSZXN0YXJ0ID0gZmFsc2UpCiAgICAgewogICAgICAgICBpZiAoYlJlc3RhcnQpIHsKICAgICAgICAgICAgIG1fblN0YXJ0ID0gMDsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICBGWF9GSUxFU0laRSBuTGVuZ3RoID0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKICAgICAgICAgbV9uU3RhcnQgKz0gKEZYX0ZJTEVTSVpFKW1fZHdTaXplOwogICAgICAgICBpZiAobV9uU3RhcnQgPj0gbkxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1fZHdTaXplID0gKHNpemVfdClGWF9NSU4oRlhfWE1MREFUQVNUUkVBTV9CdWZmZXJTaXplLCBuTGVuZ3RoIC0gbV9uU3RhcnQpOwogICAgICAgICBpZiAoIW1fcEJ1ZmZlcikgewpAQCAtMTM2LDI4ICsxMzYsMjggQEAKIHB1YmxpYzoKICAgICB+Q1hNTF9QYXJzZXIoKTsKICAgICBJRlhfQnVmZmVyUmVhZCoJbV9wRGF0YUFjYzsKLSAgICBGWF9CT09MCQkJbV9iT3duZWRTdHJlYW07CisgICAgYm9vbAkJCW1fYk93bmVkU3RyZWFtOwogICAgIEZYX0ZJTEVTSVpFCQltX25PZmZzZXQ7Ci0gICAgRlhfQk9PTAkJCW1fYlNhdmVTcGFjZUNoYXJzOworICAgIGJvb2wJCQltX2JTYXZlU3BhY2VDaGFyczsKICAgICBjb25zdCB1aW50OF90KgkJbV9wQnVmZmVyOwogICAgIHNpemVfdAkJCW1fZHdCdWZmZXJTaXplOwogICAgIEZYX0ZJTEVTSVpFCQltX25CdWZmZXJPZmZzZXQ7CiAgICAgc2l6ZV90CQkJbV9kd0luZGV4OwotICAgIEZYX0JPT0wJCQlJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICBGWF9CT09MCQkJSW5pdChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCk7Ci0gICAgRlhfQk9PTAkJCUluaXQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIpOwotICAgIEZYX0JPT0wJCQlJbml0KEZYX0JPT0wgYk93bmRlZFN0cmVhbSk7Ci0gICAgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soKTsKLSAgICBGWF9CT09MCQkJSXNFT0YoKTsKLSAgICBGWF9CT09MCQkJSGF2ZUF2YWlsRGF0YSgpOworICAgIGJvb2wJCQlJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICBib29sCQkJSW5pdChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCk7CisgICAgYm9vbAkJCUluaXQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIpOworICAgIGJvb2wJCQlJbml0KGJvb2wgYk93bmRlZFN0cmVhbSk7CisgICAgYm9vbAkJCVJlYWROZXh0QmxvY2soKTsKKyAgICBib29sCQkJSXNFT0YoKTsKKyAgICBib29sCQkJSGF2ZUF2YWlsRGF0YSgpOwogICAgIHZvaWQJCQlTa2lwV2hpdGVTcGFjZXMoKTsKICAgICB2b2lkCQkJR2V0TmFtZShDRlhfQnl0ZVN0cmluZyYgc3BhY2UsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKICAgICB2b2lkCQkJR2V0QXR0clZhbHVlKENGWF9XaWRlU3RyaW5nICZ2YWx1ZSk7CiAgICAgRlhfRFdPUkQJCUdldENoYXJSZWYoKTsKLSAgICB2b2lkCQkJR2V0VGFnTmFtZShDRlhfQnl0ZVN0cmluZyAmc3BhY2UsIENGWF9CeXRlU3RyaW5nICZuYW1lLCBGWF9CT09MICZiRW5kVGFnLCBGWF9CT09MIGJTdGFydFRhZyA9IEZBTFNFKTsKKyAgICB2b2lkCQkJR2V0VGFnTmFtZShDRlhfQnl0ZVN0cmluZyAmc3BhY2UsIENGWF9CeXRlU3RyaW5nICZuYW1lLCBib29sICZiRW5kVGFnLCBib29sIGJTdGFydFRhZyA9IGZhbHNlKTsKICAgICB2b2lkCQkJU2tpcExpdGVyYWxzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLSAgICBDWE1MX0VsZW1lbnQqCVBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIEZYX0JPT0wgYlN0YXJ0VGFnID0gRkFMU0UpOwotICAgIHZvaWQJCQlJbnNlcnRDb250ZW50U2VnbWVudChGWF9CT09MIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKKyAgICBDWE1MX0VsZW1lbnQqCVBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIGJvb2wgYlN0YXJ0VGFnID0gZmFsc2UpOworICAgIHZvaWQJCQlJbnNlcnRDb250ZW50U2VnbWVudChib29sIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKICAgICB2b2lkCQkJSW5zZXJ0Q0RBVEFTZWdtZW50KENGWF9VVEY4RGVjb2RlciYgZGVjb2RlciwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CiB9Owogdm9pZCBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGdWxsTmFtZSwgQ0ZYX0J5dGVTdHJpbmdDICZic1NwYWNlLCBDRlhfQnl0ZVN0cmluZ0MgJmJzTmFtZSk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oCmluZGV4IDI5YjU2YzcuLmM4ZDYyMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oCkBAIC0yMiw3ICsyMiw3IEBACiBjbGFzcyBDRlhfQWdnRGV2aWNlRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKIHsKIHB1YmxpYzoKLSAgICBDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCk7CisgICAgQ0ZYX0FnZ0RldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpOwogICAgIHZpcnR1YWwgfkNGWF9BZ2dEZXZpY2VEcml2ZXIoKTsKICAgICB2b2lkCQkJCUluaXRQbGF0Zm9ybSgpOwogICAgIHZvaWQJCQkJRGVzdHJveVBsYXRmb3JtKCk7CkBAIC0zMiwyMiArMzIsMjIgQEAKIAogCiAgICAgdmlydHVhbCB2b2lkCQlTYXZlU3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOworICAgIHZpcnR1YWwgdm9pZAkJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCk7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTU4LDQ0ICs1OCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgIHZpcnR1YWwgYm9vbAkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwogCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAkJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CisgICAgdmlydHVhbCBib29sCQlHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKIAogCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworICAgIHZpcnR1YWwgYm9vbAkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBib29sIGJERWRnZSA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogICBHZXRCYWNrRHJvcCgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9wT3JpRGV2aWNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorICAgIHZpcnR1YWwgYm9vbAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICB2aXJ0dWFsIGJvb2wJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICAgIHZpcnR1YWwgYm9vbAkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgdmlydHVhbCB2b2lkCQlDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCisgICAgdmlydHVhbCBib29sICAgICBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlSZW5kZXJSYXN0ZXJpemVyKEZYX05BTUVTUEFDRV9ERUNMQVJFKGFnZywgcmFzdGVyaXplcl9zY2FubGluZV9hYSkmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCisgICAgdmlydHVhbCBib29sCQlSZW5kZXJSYXN0ZXJpemVyKEZYX05BTUVTUEFDRV9ERUNMQVJFKGFnZywgcmFzdGVyaXplcl9zY2FubGluZV9hYSkmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKIAogICAgIHZvaWQJCQkJU2V0Q2xpcE1hc2soRlhfTkFNRVNQQUNFX0RFQ0xBUkUoYWdnLCByYXN0ZXJpemVyX3NjYW5saW5lX2FhKSYgcmFzdGVyaXplcik7CkBAIC0xMTcsOSArMTE3LDkgQEAKICAgICB2b2lkKgkJCQltX3BEd1JlbmRlclRhcnRnZXQ7CiAgICAgaW50CQkJCQltX0ZpbGxGbGFnczsKICAgICBpbnQJCQkJCW1fRGl0aGVyQml0czsKLSAgICBGWF9CT09MCQkJCW1fYlJnYkJ5dGVPcmRlcjsKKyAgICBib29sCQkJCW1fYlJnYkJ5dGVPcmRlcjsKICAgICBDRlhfRElCaXRtYXAqICAgICAgIG1fcE9yaURldmljZTsKLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fYkdyb3VwS25vY2tvdXQ7CisgICAgYm9vbCAgICAgICAgICAgICBtX2JHcm91cEtub2Nrb3V0OwogfTsKIAogI2VuZGlmICAvLyBGWF9BR0dfRFJJVkVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAgYi9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAKaW5kZXggMTE4ZGI3Yi4uMmY5NmVmNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meF9hZ2dfZHJpdmVyLmNwcApAQCAtMTE5LDcgKzExOSw3IEBACiBzdGF0aWMgdm9pZCBSYXN0ZXJpemVTdHJva2UoYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBhZ2c6OnBhdGhfc3RvcmFnZSYgcGF0aF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIEZYX0ZMT0FUIHNjYWxlID0gMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2VBZGp1c3QgPSBGQUxTRSwgRlhfQk9PTCBiVGV4dE1vZGUgPSBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJva2VBZGp1c3QgPSBmYWxzZSwgYm9vbCBiVGV4dE1vZGUgPSBmYWxzZSkKIHsKICAgICBhZ2c6OmxpbmVfY2FwX2UgY2FwOwogICAgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewpAQCAtMTg1LDExICsxODUsMTEgQEAKICAgICAgICAgcmFzdGVyaXplci5hZGRfcGF0aF90cmFuc2Zvcm1lZChzdHJva2UsIHBPYmplY3QyRGV2aWNlKTsKICAgICB9CiB9Ci1JRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpDcmVhdGVGeGdlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCitJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpDcmVhdGVGeGdlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpCiB7CiAgICAgcmV0dXJuIG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIDAsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKIH0KLUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkNGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQorQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q0ZYX0FnZ0RldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpCiB7CiAgICAgbV9wQml0bWFwID0gcEJpdG1hcDsKICAgICBtX0RpdGhlckJpdHMgPSBkaXRoZXJfYml0czsKQEAgLTIxNywxMSArMjE3LDExIEBACiB2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkRlc3Ryb3lQbGF0Zm9ybSgpCiB7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KICNlbmRpZgogaW50IENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICB9CiAgICAgbV9TdGF0ZVN0YWNrLkFkZChwQ2xpcCk7CiB9Ci12b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpCit2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpCiB7CiAgICAgaWYgKG1fU3RhdGVTdGFjay5HZXRTaXplKCkgPT0gMCkgewogICAgICAgICBkZWxldGUgbV9wQ2xpcFJnbjsKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgZmluYWxfcmVuZGVyLCAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKICAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RNYXNrRihwYXRoX3JlY3QubGVmdCwgcGF0aF9yZWN0LnRvcCwgbWFzayk7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCkBAIC0zMjIsNyArMzIyLDcgQEAKICAgICAgICAgICAgIHJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKICAgICAgICAgICAgIG1fcENsaXBSZ24tPkludGVyc2VjdFJlY3QocmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOwpAQCAtMzMzLDkgKzMzMyw5IEBACiAgICAgcmFzdGVyaXplci5hZGRfcGF0aChwYXRoX2RhdGEubV9QYXRoRGF0YSk7CiAgICAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HID8gYWdnOjpmaWxsX25vbl96ZXJvIDogYWdnOjpmaWxsX2V2ZW5fb2RkKTsKICAgICBTZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKTsKICAgICByYXN0ZXJpemVyLmZpbGxpbmdfcnVsZShhZ2c6OmZpbGxfbm9uX3plcm8pOwogICAgIFNldENsaXBNYXNrKHJhc3Rlcml6ZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogY2xhc3MgQ0ZYX1JlbmRlcmVyIAogewpAQCAtMzYxLDggKzM2MSw4IEBACiAgICAgICAgICAgICAgICAgbV9CbHVlLAogICAgICAgICAgICAgICAgIG1fR3JheTsKICAgICBGWF9EV09SRAltX0NvbG9yOwotICAgIEZYX0JPT0wJCW1fYkZ1bGxDb3ZlcjsKLSAgICBGWF9CT09MICAgICBtX2JSZ2JCeXRlT3JkZXI7CisgICAgYm9vbAkJbV9iRnVsbENvdmVyOworICAgIGJvb2wgICAgIG1fYlJnYkJ5dGVPcmRlcjsKICAgICBDRlhfRElCaXRtYXAqIG1fcE9yaURldmljZTsKICAgICBGWF9SRUNUCQltX0NsaXBCb3g7CiAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKgltX3BDbGlwTWFzazsKQEAgLTM3MSw3ICszNzEsNyBAQAogICAgIHZvaWQgKENGWF9SZW5kZXJlcjo6KmNvbXBvc2l0ZV9zcGFuKSh1aW50OF90KiwgaW50LCBpbnQsIGludCwgdWludDhfdCosIGludCwgaW50LCB1aW50OF90KiwgdWludDhfdCopOwogcHVibGljOgogICAgIHZvaWQgcHJlcGFyZSh1bnNpZ25lZCkge30KLSAgICB2b2lkIENvbXBvc2l0ZVNwYW4odWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbiwgaW50IEJwcCwgRlhfQk9PTCBiRGVzdEFscGhhLAorICAgIHZvaWQgQ29tcG9zaXRlU3Bhbih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLCBpbnQgQnBwLCBib29sIGJEZXN0QWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgdWludDhfdCogY292ZXJfc2NhbiwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbikKICAgICB7CkBAIC05NTUsNyArOTU1LDcgQEAKICAgICAgICAgICAgIG9yaV9zY2FuID0gbV9wT3JpRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcE9yaURldmljZS0+R2V0UGl0Y2goKSAqIHk7CiAgICAgICAgIH0KICAgICAgICAgaW50IEJwcCA9IG1fcERldmljZS0+R2V0QlBQKCkgLyA4OwotICAgICAgICBGWF9CT09MIGJEZXN0QWxwaGEgPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkgfHwgbV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpOworICAgICAgICBib29sIGJEZXN0QWxwaGEgPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkgfHwgbV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpOwogICAgICAgICB1bnNpZ25lZCBudW1fc3BhbnMgPSBzbC5udW1fc3BhbnMoKTsKICAgICAgICAgdHlwZW5hbWUgU2NhbmxpbmU6OmNvbnN0X2l0ZXJhdG9yIHNwYW4gPSBzbC5iZWdpbigpOwogICAgICAgICB3aGlsZSAoMSkgewpAQCAtOTg4LDcgKzk4OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBGWF9CT09MIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgIGJvb2wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJSZ2JCeXRlT3JkZXIsCiAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCiAgICAgewogICAgICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwpAQCAtMTAwOCw4ICsxMDA4LDggQEAKICAgICAgICAgICAgIG1fcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpOwogICAgICAgICB9CiAgICAgICAgIG1fYkZ1bGxDb3ZlciA9IGJGdWxsQ292ZXI7Ci0gICAgICAgIEZYX0JPT0wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICAgICAgICBGWF9CT09MIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKKyAgICAgICAgYm9vbCBiT2JqZWN0Q01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgICAgIGJvb2wgYkRldmljZUNNWUsgPSBwRGV2aWNlLT5Jc0NteWtJbWFnZSgpOwogICAgICAgICBtX0FscGhhID0gYk9iamVjdENNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CiAgICAgICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKQEAgLTEwMzksNyArMTAzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChiRGV2aWNlQ01ZSykgewogICAgICAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwpAQCAtMTA1MSw3ICsxMDUxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICghcEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOwogICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmbV9Db2xvciwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CkBAIC0xMTAwLDIyICsxMTAwLDIyIEBACiAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDEpIHsKICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH07Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIoYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiR3JvdXBLbm9ja291dCwKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0ID8gbV9wT3JpRGV2aWNlIDogTlVMTDsKICAgICBDRlhfUmVuZGVyZXIgcmVuZGVyOwogICAgIGlmICghcmVuZGVyLkluaXQobV9wQml0bWFwLCBwdCwgbV9wQ2xpcFJnbiwgY29sb3IsIGJGdWxsQ292ZXIsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGFnZzo6c2NhbmxpbmVfdTggc2NhbmxpbmU7CiAgICAgYWdnOjpyZW5kZXJfc2NhbmxpbmVzKHJhc3Rlcml6ZXIsIHNjYW5saW5lLCByZW5kZXIsIChtX0ZpbGxGbGFncyAmIEZYRklMTF9OT1BBVEhTTU9PVEgpICE9IDApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtMTEyNywxMCArMTEyNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9GaWxsRmxhZ3MgPSBmaWxsX21vZGU7CiAgICAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2NvbG9yKSB7CkBAIC0xMTQwLDggKzExNDAsOCBAQAogICAgICAgICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKICAgICAgICAgcmFzdGVyaXplci5hZGRfcGF0aChwYXRoX2RhdGEubV9QYXRoRGF0YSk7CiAgICAgICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORyA/IGFnZzo6ZmlsbF9ub25femVybyA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7Ci0gICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIGZhbHNlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CkBAIC0xMTUxLDEyICsxMTUxLDEyIEBACiAgICAgICAgICAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwogICAgICAgICAgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7CiAgICAgICAgICAgICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICAgICAgICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgTlVMTCwgcEdyYXBoU3RhdGUsIDEsIEZBTFNFLCBmaWxsX21vZGUgJiBGWF9TVFJPS0VfVEVYVF9NT0RFKTsKKyAgICAgICAgICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgTlVMTCwgcEdyYXBoU3RhdGUsIDEsIGZhbHNlLCBmaWxsX21vZGUgJiBGWF9TVFJPS0VfVEVYVF9NT0RFKTsKICAgICAgICAgICAgIGludCBmaWxsX2ZsYWcgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpIDw8IDggfCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOwogICAgICAgICAgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgbV9iR3JvdXBLbm9ja291dCwgZmlsbF9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4MSwgbWF0cml4MjsKICAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CkBAIC0xMTc0LDEzICsxMTc0LDEzIEBACiAgICAgICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCAmbWF0cml4MSk7CiAgICAgICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwogICAgICAgICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICAgICAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpOworICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwgbWF0cml4MS5hLCBmYWxzZSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CiAgICAgICAgIGludCBmaWxsX2ZsYWcgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpIDw8IDggfCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOwogICAgICAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBtX2JHcm91cEtub2Nrb3V0LCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIFJnYkJ5dGVPcmRlclNldFBpeGVsKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHgsIGludCB5LCBGWF9EV09SRCBhcmdiKQogewpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKICAgICB3aWR0aCA9IHJlY3QuV2lkdGgoKTsKICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKSwgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKSwgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKICAgICBpbnQgQnBwID0gcEJpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIEZYX0JPT0wgYkFscGhhID0gcEJpdG1hcC0+SGFzQWxwaGEoKTsKKyAgICBib29sIGJBbHBoYSA9IHBCaXRtYXAtPkhhc0FscGhhKCk7CiAgICAgaW50IGRpYl9hcmdiID0gRlhBUkdCX1RPQkdST1JERVJESUIoYXJnYik7CiAgICAgdWludDhfdCogcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CkBAIC0xMzE3LDcgKzEzMTcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICAgICAgICBBU1NFUlQoZmFsc2UpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiIHx8IGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7CiAgICAgICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYikgewpAQCAtMTM1MSw3ICsxMzUxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICAgIEFTU0VSVChmYWxzZSk7CiAgICAgfQogfQogRlhfQVJHQiBfRGVmYXVsdENNWUsyQVJHQihGWF9DTVlLIGNteWssIHVpbnQ4X3QgYWxwaGEpCkBAIC0xMzYxLDkgKzEzNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKICAgICByZXR1cm4gQXJnYkVuY29kZShhbHBoYSwgciwgZywgYik7CiB9Ci1GWF9CT09MIF9EaWJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBfRGliU2V0UGl4ZWwoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKLSAgICBGWF9CT09MIGJPYmpDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKKyAgICBib29sIGJPYmpDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKICAgICBpbnQgYWxwaGEgPSBiT2JqQ01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CiAgICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKQEAgLTEzNzYsNyArMTM3Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKICAgICAgICAgICAgIGlmICghYk9iakNNWUspIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGJPYmpDTVlLKSB7CkBAIC0xMzg4LDEyICsxMzg4LDEyIEBACiAgICAgaWYgKHBEZXZpY2UtPm1fcEFscGhhTWFzaykgewogICAgICAgICBwRGV2aWNlLT5tX3BBbHBoYU1hc2stPlNldFBpeGVsKHgsIHksIGFscGhhIDw8IDI0KTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewogICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKQEAgLTE0MTMsMTIgKzE0MTMsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKSB7CiAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpOwotICAgICAgICAgICAgRlhfQk9PTCBiQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgICAgICAgICBib29sIGJDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKICAgICAgICAgICAgIGludCBuZXdfYWxwaGEgPSBiQ01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwogICAgICAgICAgICAgbmV3X2FscGhhID0gbmV3X2FscGhhICogcE1hc2stPkdldFNjYW5saW5lKHkpW3hdIC8gMjU1OwogICAgICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewogICAgICAgICAgICAgICAgIFJnYkJ5dGVPcmRlclNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgKGNvbG9yICYgMHhmZmZmZmYpIHwgKG5ld19hbHBoYSA8PCAyNCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGJDTVlLKSB7CiAgICAgICAgICAgICAgICAgRlhTRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZywgbmV3X2FscGhhKTsKQEAgLTE0MjgsMTUgKzE0MjgsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBfRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCitib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfUkVDVCBjbGlwX3JlY3Q7CiAgICAgR2V0Q2xpcEJveCgmY2xpcF9yZWN0KTsKQEAgLTE0NDUsNyArMTQ0NSw3IEBACiAgICAgICAgIGRyYXdfcmVjdC5JbnRlcnNlY3QoKnBSZWN0KTsKICAgICB9CiAgICAgaWYgKGRyYXdfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMIHx8IG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewpAQCAtMTQ1MywyNyArMTQ1MywyNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbV9wQml0bWFwLT5Db21wb3NpdGVSZWN0KGRyYXdfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wLCBkcmF3X3JlY3QuV2lkdGgoKSwgZHJhd19yZWN0LkhlaWdodCgpLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgKGNvbnN0IENGWF9ESUJpdG1hcCopbV9wQ2xpcFJnbi0+R2V0TWFzaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBkcmF3X3JlY3QubGVmdCAtIGNsaXBfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wIC0gY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQorYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQogewogICAgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKICAgICAgICAgcFJlY3QtPmxlZnQgPSBwUmVjdC0+dG9wID0gMDsKICAgICAgICAgcFJlY3QtPnJpZ2h0ID0gR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKTsKICAgICAgICAgcFJlY3QtPmJvdHRvbSA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgICpwUmVjdCA9IG1fcENsaXBSZ24tPkdldEJveCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiREVkZ2UpCitib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBib29sIGJERWRnZSkKIHsKICAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGJERWRnZSkgewogICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CkBAIC0xNDgxLDIzICsxNDgxLDIzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwQml0bWFwLT5HZXRXaWR0aCgpLCB0b3AgKyBwQml0bWFwLT5HZXRIZWlnaHQoKSk7CiAgICAgQ0ZYX0RJQml0bWFwICpwQmFjayA9IE5VTEw7CiAgICAgaWYgKG1fcE9yaURldmljZSkgewogICAgICAgICBwQmFjayA9IG1fcE9yaURldmljZS0+Q2xvbmUoJnJlY3QpOwogICAgICAgICBpZiAoIXBCYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHBCYWNrLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcEJhY2stPkdldFdpZHRoKCksIHBCYWNrLT5HZXRIZWlnaHQoKSwgbV9wQml0bWFwLCAwLCAwKTsKICAgICB9IGVsc2UgewogICAgICAgICBwQmFjayA9IG1fcEJpdG1hcC0+Q2xvbmUoJnJlY3QpOwogICAgIH0KICAgICBpZiAoIXBCYWNrKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gVFJVRTsKKyAgICBib29sIGJSZXQgPSB0cnVlOwogICAgIGxlZnQgPSBsZWZ0ID49IDAgPyAwIDogbGVmdDsKICAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7CiAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewpAQCAtMTUwOCwxMSArMTUwOCwxMSBAQAogICAgIGRlbGV0ZSBwQmFjazsKICAgICByZXR1cm4gYlJldDsKIH0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCitib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKQogICAgICAgICByZXR1cm4gbV9wQml0bWFwLT5Db21wb3NpdGVNYXNrKGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwgYXJnYiwKQEAgLTE1MjAsMTIgKzE1MjAsMTIgQEAKICAgICByZXR1cm4gbV9wQml0bWFwLT5Db21wb3NpdGVCaXRtYXAobGVmdCwgdG9wLCBwU3JjUmVjdC0+V2lkdGgoKSwgcFNyY1JlY3QtPkhlaWdodCgpLCBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgYmxlbmRfdHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBhcmdiLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChkZXN0X3dpZHRoID09IHBTb3VyY2UtPkdldFdpZHRoKCkgJiYgZGVzdF9oZWlnaHQgPT0gcFNvdXJjZS0+R2V0SGVpZ2h0KCkpIHsKICAgICAgICAgRlhfUkVDVCByZWN0KDAsIDAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKQEAgLTE1MzYsMzAgKzE1MzYsMzAgQEAKICAgICBGWF9SRUNUIGRlc3RfY2xpcCA9IGRlc3RfcmVjdDsKICAgICBkZXN0X2NsaXAuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOwogICAgIENGWF9CaXRtYXBDb21wb3NlciBjb21wb3NlcjsKLSAgICBjb21wb3Nlci5Db21wb3NlKG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgMjU1LCBhcmdiLCBkZXN0X2NsaXAsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CisgICAgY29tcG9zZXIuQ29tcG9zZShtX3BCaXRtYXAsIG1fcENsaXBSZ24sIDI1NSwgYXJnYiwgZGVzdF9jbGlwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwogICAgIGRlc3RfY2xpcC5PZmZzZXQoLWRlc3RfcmVjdC5sZWZ0LCAtZGVzdF9yZWN0LnRvcCk7CiAgICAgQ0ZYX0ltYWdlU3RyZXRjaGVyIHN0cmV0Y2hlcjsKICAgICBpZiAoc3RyZXRjaGVyLlN0YXJ0KCZjb21wb3NlciwgcFNvdXJjZSwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGRlc3RfY2xpcCwgZmxhZ3MpKSB7CiAgICAgICAgIHN0cmV0Y2hlci5Db250aW51ZShOVUxMKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCitib29sCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDRlhfSW1hZ2VSZW5kZXJlciogcFJlbmRlcmVyID0gbmV3IENGWF9JbWFnZVJlbmRlcmVyOwogICAgIHBSZW5kZXJlci0+U3RhcnQobV9wQml0bWFwLCBtX3BDbGlwUmduLCBwU291cmNlLCBiaXRtYXBfYWxwaGEsIGFyZ2IsIHBNYXRyaXgsIHJlbmRlcl9mbGFncywgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICBoYW5kbGUgPSBwUmVuZGVyZXI7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKHZvaWQqIHBIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQorYm9vbAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuICgoQ0ZYX0ltYWdlUmVuZGVyZXIqKXBIYW5kbGUpLT5Db250aW51ZShwUGF1c2UpOwogfQpAQCAtMTU3MiwzMCArMTU3MiwzMCBAQAogfQogQ0ZYX0Z4Z2VEZXZpY2U6OkNGWF9GeGdlRGV2aWNlKCkKIHsKLSAgICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOworICAgIG1fYk93bmVkQml0bWFwID0gZmFsc2U7CiB9Ci1GWF9CT09MIENGWF9GeGdlRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQorYm9vbCBDRlhfRnhnZURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCkKIHsKICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBTZXRCaXRtYXAocEJpdG1hcCk7CiAgICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CiAgICAgU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRnhnZURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpCitib29sIENGWF9GeGdlRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkKIHsKLSAgICBtX2JPd25lZEJpdG1hcCA9IFRSVUU7CisgICAgbV9iT3duZWRCaXRtYXAgPSB0cnVlOwogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgewogICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIFNldEJpdG1hcChwQml0bWFwKTsKLSAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gbmV3IENGWF9BZ2dEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIEZBTFNFLCBwT3JpRGV2aWNlLCBGQUxTRSk7CisgICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBmYWxzZSwgcE9yaURldmljZSwgZmFsc2UpOwogICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9GeGdlRGV2aWNlOjp+Q0ZYX0Z4Z2VEZXZpY2UoKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcAppbmRleCAyZGFkMDEwLi5mNWFjNmMwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcApAQCAtODcsMjMgKzg3LDIzIEBACiAgICAgfQogICAgIHJldHVybiBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKTsKIH0KLUZYX0JPT0wgQ0ZQRl9Ta2lhRm9udDo6R2V0R2x5cGhCQm94KGludDMyX3QgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCkKK2Jvb2wgQ0ZQRl9Ta2lhRm9udDo6R2V0R2x5cGhCQm94KGludDMyX3QgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCkKIHsKICAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKEZYRlRfSXNfRmFjZV9Ucmlja3kobV9GYWNlKSkgewogICAgICAgICBpZiAoRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGlHbHlwaEluZGV4LCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewogICAgICAgICAgICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgRlhGVF9HbHlwaCBnbHlwaDsKICAgICAgICAgaWYgKEZYRlRfR2V0X0dseXBoKG1fRmFjZS0+Z2x5cGgsICZnbHlwaCkpIHsKICAgICAgICAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYRlRfQkJveCBjYm94OwogICAgICAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7CkBAIC0xMTksMjQgKzExOSwyNCBAQAogICAgICAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKICAgICB9CiAgICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGlHbHlwaEluZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSk7CiAgICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpKTsKICAgICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpOwogICAgIHJ0QkJveC50b3AgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZQRl9Ta2lhRm9udDo6R2V0QkJveChGWF9SRUNUICZydEJCb3gpCitib29sIENGUEZfU2tpYUZvbnQ6OkdldEJCb3goRlhfUkVDVCAmcnRCQm94KQogewogICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBydEJCb3gubGVmdCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZhY2UpKTsKICAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV95TWluKG1fRmFjZSkpOwogICAgIHJ0QkJveC5yaWdodCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeE1heChtX0ZhY2UpKTsKICAgICBydEJCb3guYm90dG9tID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRIZWlnaHQoKSBjb25zdAogewpAQCAtMTY3LDEwICsxNjcsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPih1bFNpemUpOwogfQotRlhfQk9PTCBDRlBGX1NraWFGb250OjpJbml0Rm9udChDRlBGX1NraWFGb250TWdyICpwRm9udE1nciwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5LCBGWF9EV09SRCBkd1N0eWxlLCB1aW50OF90IHVDaGFyc2V0KQorYm9vbCBDRlBGX1NraWFGb250OjpJbml0Rm9udChDRlBGX1NraWFGb250TWdyICpwRm9udE1nciwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5LCBGWF9EV09SRCBkd1N0eWxlLCB1aW50OF90IHVDaGFyc2V0KQogewogICAgIGlmICghcEZvbnRNZ3IgfHwgIXBGb250RGVzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzd2l0Y2ggKHBGb250RGVzLT5HZXRUeXBlKCkpIHsKICAgICAgICAgY2FzZSBGUEZfU0tJQUZPTlRUWVBFX1BhdGg6IHsKQEAgLTE4OSwxNiArMTg5LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fZHdTdHlsZSA9IGR3U3R5bGU7CiAgICAgbV91Q2hhcnNldCA9IHVDaGFyc2V0OwogICAgIG1fcEZvbnRNZ3IgPSBwRm9udE1ncjsKICAgICBtX3BGb250RGVzID0gcEZvbnREZXM7CiAgICAgbV9kd1JlZkNvdW50ID0gMTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oCmluZGV4IDQ5ODE5ZDQuLjkwY2Y1Y2IgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmgKQEAgLTM5LDEzICszOSwxMyBAQAogICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0QXNjZW50KCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQzMl90CQlHZXREZXNjZW50KCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCk7CisgICAgdmlydHVhbCBib29sCQkJR2V0R2x5cGhCQm94KGludDMyX3QgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCk7CisgICAgdmlydHVhbCBib29sCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpOwogCiAgICAgdmlydHVhbCBpbnQzMl90CQlHZXRIZWlnaHQoKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Rm9udERhdGEoRlhfRFdPUkQgZHdUYWJsZSwgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKTsKLSAgICBGWF9CT09MCQkJCQlJbml0Rm9udChDRlBGX1NraWFGb250TWdyICpwRm9udE1nciwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5LCBGWF9EV09SRCBkd1N0eWxlLCB1aW50OF90IHVDaGFyc2V0KTsKKyAgICBib29sCQkJCQlJbml0Rm9udChDRlBGX1NraWFGb250TWdyICpwRm9udE1nciwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5LCBGWF9EV09SRCBkd1N0eWxlLCB1aW50OF90IHVDaGFyc2V0KTsKIHByb3RlY3RlZDoKICAgICBDRlBGX1NraWFGb250TWdyCQkqbV9wRm9udE1ncjsKICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvcgkqbV9wRm9udERlczsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5jcHAKaW5kZXggODZiYjA1Mi4uOGM4MzUzOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5jcHAKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLXN0YXRpYyB1aW50MzJfdCBGUEZfR2V0SGFzaENvZGVfU3RyaW5nQShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UgPSBGQUxTRSkKK3N0YXRpYyB1aW50MzJfdCBGUEZfR2V0SGFzaENvZGVfU3RyaW5nQShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIGJvb2wgYklnbm9yZUNhc2UgPSBmYWxzZSkKIHsKICAgICBpZiAoIXBTdHIpIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDgsMjcgKzIwOCwyNyBAQAogICAgICAgICBic0ZvbnQgKz0gIlNlcmlmIjsKICAgICB9CiAgICAgYnNGb250ICs9IHVDaGFyc2V0OwotICAgIHJldHVybiBGUEZfR2V0SGFzaENvZGVfU3RyaW5nQShic0ZvbnQuY19zdHIoKSwgYnNGb250LkdldExlbmd0aCgpLCBUUlVFKTsKKyAgICByZXR1cm4gRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoYnNGb250LmNfc3RyKCksIGJzRm9udC5HZXRMZW5ndGgoKSwgdHJ1ZSk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBGUEZfU2tpYUlzQ0pLKHVpbnQ4X3QgdUNoYXJzZXQpCitzdGF0aWMgYm9vbCBGUEZfU2tpYUlzQ0pLKHVpbnQ4X3QgdUNoYXJzZXQpCiB7CiAgICAgcmV0dXJuICh1Q2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkKICAgICAgICAgICAgfHwgKHVDaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQpIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBGUEZfU2tpYU1heWJlU3ltYm9sKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYWNlbmFtZSkKK3N0YXRpYyBib29sIEZQRl9Ta2lhTWF5YmVTeW1ib2woY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhY2VuYW1lKQogewogICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IGJzRmFjZW5hbWU7CiAgICAgYnNOYW1lLk1ha2VMb3dlcigpOwogICAgIHJldHVybiBic05hbWUuRmluZCgic3ltYm9sIikgPiAtMTsKIH0KLXN0YXRpYyBGWF9CT09MIEZQRl9Ta2lhTWF5YmVBcmFiaWMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhY2VuYW1lKQorc3RhdGljIGJvb2wgRlBGX1NraWFNYXliZUFyYWJpYyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gYnNGYWNlbmFtZTsKICAgICBic05hbWUuTWFrZUxvd2VyKCk7CiAgICAgcmV0dXJuIGJzTmFtZS5GaW5kKCJhcmFiaWMiKSA+IC0xOwogfQogQ0ZQRl9Ta2lhRm9udE1ncjo6Q0ZQRl9Ta2lhRm9udE1ncigpCi0gICAgOiBtX2JMb2FkZWQoRkFMU0UpLCBtX0ZUTGlicmFyeShOVUxMKQorICAgIDogbV9iTG9hZGVkKGZhbHNlKSwgbV9GVExpYnJhcnkoTlVMTCkKIHsKIH0KIENGUEZfU2tpYUZvbnRNZ3I6On5DRlBGX1NraWFGb250TWdyKCkKQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgICAgICBGWEZUX0RvbmVfRnJlZVR5cGUobV9GVExpYnJhcnkpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0ZQRl9Ta2lhRm9udE1ncjo6SW5pdEZUTGlicmFyeSgpCitib29sIENGUEZfU2tpYUZvbnRNZ3I6OkluaXRGVExpYnJhcnkoKQogewogICAgIGlmIChtX0ZUTGlicmFyeSA9PSBOVUxMKSB7CiAgICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbV9GVExpYnJhcnkpOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgfQogICAgIFNjYW5QYXRoKEZYX0JTVFJDKCIvc3lzdGVtL2ZvbnRzIikpOwogICAgIE91dHB1dFN5c3RlbUZvbnRzKCk7Ci0gICAgbV9iTG9hZGVkID0gVFJVRTsKKyAgICBtX2JMb2FkZWQgPSB0cnVlOwogfQogdm9pZCBDRlBGX1NraWFGb250TWdyOjpMb2FkUHJpdmF0ZUZvbnQoSUZYX0ZpbGVSZWFkKiBwRm9udEZpbGUpCiB7CkBAIC0yODksNyArMjg5LDcgQEAKICAgICBGWF9EV09SRCBkd0ZhY2VOYW1lID0gRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShic0ZhbWlseW5hbWUpOwogICAgIEZYX0RXT1JEIGR3U3Vic3QgPSBGUEZfU2tpYUdldFN1YnN0Rm9udChkd0ZhY2VOYW1lKTsKICAgICBGWF9EV09SRCBkd1N1YnN0U2FucyA9IEZQRl9Ta2lhR2V0U2Fuc0ZvbnQoZHdGYWNlTmFtZSk7Ci0gICAgRlhfQk9PTCBiTWF5YmVTeW1ib2wgPSBGUEZfU2tpYU1heWJlU3ltYm9sKGJzRmFtaWx5bmFtZSk7CisgICAgYm9vbCBiTWF5YmVTeW1ib2wgPSBGUEZfU2tpYU1heWJlU3ltYm9sKGJzRmFtaWx5bmFtZSk7CiAgICAgaWYgKHVDaGFyc2V0ICE9IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVCAmJiBGUEZfU2tpYU1heWJlQXJhYmljKGJzRmFtaWx5bmFtZSkpIHsKICAgICAgICAgdUNoYXJzZXQgPSBGWEZPTlRfQVJBQklDX0NIQVJTRVQ7CiAgICAgfSBlbHNlIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUICYmIChkd01hdGNoICYgRlBGX01BVENIRk9OVF9SRVBMQUNFQU5TSSkpIHsKQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICBpZiAoZHdGYWNlTmFtZSA9PSBkd1N5c0ZvbnROYW1lKSB7CiAgICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYk1hdGNoZWROYW1lID0gKG5GaW5kID09IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTEpOworICAgICAgICBib29sIGJNYXRjaGVkTmFtZSA9IChuRmluZCA9PSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxKTsKICAgICAgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0JPTEQpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0JPTEQpKSB7CiAgICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7CiAgICAgICAgIH0KQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkd1N1YnN0ID09IGR3U3lzRm9udE5hbWUgfHwgZHdTdWJzdFNhbnMgPT0gZHdTeXNGb250TmFtZSkgewogICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMjsKLSAgICAgICAgICAgIGJNYXRjaGVkTmFtZSA9IFRSVUU7CisgICAgICAgICAgICBiTWF0Y2hlZE5hbWUgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIHx8IGJNYXliZVN5bWJvbCkgewogICAgICAgICAgICAgaWYgKG5GaW5kID4gbk1heCAmJiBiTWF0Y2hlZE5hbWUpIHsKQEAgLTM5OSw3ICszOTksNyBAQAogICAgIGFyZ3MucGF0aG5hbWUgPSAoRlRfU3RyaW5nKilic0ZpbGUuR2V0Q1N0cigpOwogICAgIEZYRlRfRmFjZSBmYWNlOwogICAgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgMCwgNjQpOwogICAgIHJldHVybiBmYWNlOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgYXJncy5tZW1vcnlfc2l6ZSA9IHN6QnVmZmVyOwogICAgIEZYRlRfRmFjZSBmYWNlOwogICAgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgMCwgNjQpOwogICAgIHJldHVybiBmYWNlOwpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7Ci0gICAgRlhfQk9PTAliRm9sZGVyID0gRkFMU0U7CisgICAgYm9vbAliRm9sZGVyID0gZmFsc2U7CiAgICAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgZmlsZW5hbWUsIGJGb2xkZXIpKSB7CiAgICAgICAgIGlmIChiRm9sZGVyKSB7CiAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gRlhfQlNUUkMoIi4iKSB8fCBmaWxlbmFtZSA9PSBGWF9CU1RSQygiLi4iKSkgewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5oIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5oCmluZGV4IDhjNzIxZmYuLmI0ZWJlOTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmgKQEAgLTk0LDcgKzk0LDcgQEAKIHB1YmxpYzoKICAgICBDRlBGX1NraWFGb250TWdyKCk7CiAgICAgdmlydHVhbCB+Q0ZQRl9Ta2lhRm9udE1ncigpOwotICAgIEZYX0JPT0wJCQkJCUluaXRGVExpYnJhcnkoKTsKKyAgICBib29sCQkJCQlJbml0RlRMaWJyYXJ5KCk7CiAgICAgdmlydHVhbCB2b2lkCQkJTG9hZFN5c3RlbUZvbnRzKCk7CiAgICAgdmlydHVhbCB2b2lkCQkJTG9hZFByaXZhdGVGb250KElGWF9GaWxlUmVhZCogcEZvbnRGaWxlKTsKICAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkUHJpdmF0ZUZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZpbGVOYW1lKTsKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIHZvaWQJCQkJU2NhbkZpbGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlKTsKICAgICB2b2lkCQkJCVJlcG9ydEZhY2UoRlhGVF9GYWNlIGZhY2UsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlc2MpOwogICAgIHZvaWQJCQkJT3V0cHV0U3lzdGVtRm9udHMoKTsKLSAgICBGWF9CT09MCQkJCW1fYkxvYWRlZDsKKyAgICBib29sCQkJCW1fYkxvYWRlZDsKICAgICBDRlhfUHRyQXJyYXkJCW1fRm9udEZhY2VzOwogICAgIEZYRlRfTGlicmFyeQkJbV9GVExpYnJhcnk7CiAgICAgQ0ZYX01hcFB0clRvUHRyCQltX0ZhbWlseUZvbnRzOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcAppbmRleCAzZTJmYzQ1Li40ZjJiYzE1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcApAQCAtMTAsMjAgKzEwLDIwIEBACiAgICAgOiBtX3BGb250TWdyKE5VTEwpCiB7CiB9Ci1GWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkluaXQoSUZQRl9Gb250TWdyICpwRm9udE1ncikKK2Jvb2wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6SW5pdChJRlBGX0ZvbnRNZ3IgKnBGb250TWdyKQogewogICAgIGlmICghcEZvbnRNZ3IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHBGb250TWdyLT5Mb2FkU3lzdGVtRm9udHMoKTsKICAgICBtX3BGb250TWdyID0gcEZvbnRNZ3I7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKK2Jvb2wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci12b2lkKiBDRlhfQW5kcm9pZEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKK3ZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgYm9vbCYgYkV4YWN0KQogewogICAgIGlmICghbV9wRm9udE1ncikgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTU3LDIxICs1NywyMSBAQAogICAgIH0KICAgICByZXR1cm4gKChJRlBGX0ZvbnQqKWhGb250KS0+R2V0Rm9udERhdGEodGFibGUsIGJ1ZmZlciwgc2l6ZSk7CiB9Ci1GWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKK2Jvb2wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQogewogICAgIGlmICghaEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG5hbWUgPSAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRGYW1pbHlOYW1lKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCitib29sIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCiB7CiAgICAgaWYgKCFoRm9udCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgY2hhcnNldCA9ICgoSUZQRl9Gb250KiloRm9udCktPkdldENoYXJzZXQoKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpEZWxldGVGb250KHZvaWQqIGhGb250KQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5oIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5oCmluZGV4IDgzYzA0YTAuLjA3NWI3OWUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmgKQEAgLTE4LDE4ICsxOCwxOCBAQAogICAgICAgICBkZWxldGUgdGhpczsKICAgICB9CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcik7CisgICAgdmlydHVhbAlib29sCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOwogCi0gICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBGWF9CT09MJiBiRXhhY3QpOworICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgYm9vbCYgYkV4YWN0KTsKIAogICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CisgICAgdmlydHVhbCBib29sCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICAgIHZpcnR1YWwgYm9vbAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CiAKICAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpOwogICAgIHZpcnR1YWwgdm9pZCogICAgICAgUmV0YWluRm9udCh2b2lkKiBoRm9udCk7Ci0gICAgRlhfQk9PTAkJCQlJbml0KElGUEZfRm9udE1nciAqcEZvbnRNZ3IpOworICAgIGJvb2wJCQkJSW5pdChJRlBGX0ZvbnRNZ3IgKnBGb250TWdyKTsKIHByb3RlY3RlZDoKICAgICBJRlBGX0ZvbnRNZ3IJCSptX3BGb250TWdyOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmggYi9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oCmluZGV4IDcxNWU0OGQuLjBlNmM5ZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIHZvaWQqCUNyZWF0ZUZvbnQoY29uc3QgdWludDhfdCogcEZvbnREYXRhLCBGWF9EV09SRCBkd0ZvbnRTaXplKTsKICAgICB2b2lkCURlc3Ryb3lGb250KHZvaWQqIHBGb250KTsKICAgICB2b2lkCXNldEdyYXBoaWNzVGV4dE1hdHJpeCh2b2lkKiBncmFwaGljcywgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KTsKLSAgICBGWF9CT09MCWRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiAgICAgICAgICAgICAgICBncmFwaGljcywKKyAgICBib29sCWRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiAgICAgICAgICAgICAgICBncmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgIGZvbnRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqICAgICAgICAgICAgIGdseXBoSW5kaWNlcywKQEAgLTkyLDI2ICs5MiwyNiBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTCBJc1BTUHJpbnREcml2ZXIoKQorICAgIHZpcnR1YWwgYm9vbCBJc1BTUHJpbnREcml2ZXIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydFJlbmRlcmluZygpCisgICAgdmlydHVhbCBib29sCVN0YXJ0UmVuZGVyaW5nKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkCUVuZFJlbmRlcmluZygpIHt9CiAgICAgdmlydHVhbCB2b2lkCVNhdmVTdGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCk7CisgICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKQEAgLTEyMSwzNiArMTIxLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgIHZpcnR1YWwgYm9vbCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICB2aXJ0dWFsIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CisgICAgdmlydHVhbCBib29sCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSk7CisgICAgdmlydHVhbCBib29sCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICB2aXJ0dWFsIGJvb2wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKKyAgICB2aXJ0dWFsIGJvb2wJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCisgICAgdmlydHVhbCBib29sIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgQ2xlYXJEcml2ZXIoKTsKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgIHZvaWQgc2V0RmlsbEluZm8oRlhfQVJHQiBhcmdiKTsKICAgICB2b2lkIHNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhICogcGF0aERhdGEpOwogICAgIEZYX0ZMT0FUIGdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEgKiBncmFwaFN0YXRlLCBDR0FmZmluZVRyYW5zZm9ybSBjdG0pOwotICAgIEZYX0JPT0wgQ0dfRHJhd0dseXBSdW4oaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAorICAgIGJvb2wgQ0dfRHJhd0dseXBSdW4oaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgICBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICAgIHBDYWNoZSwKQEAgLTE5NSw5ICsxOTUsOSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSlfdG90YWxTaXplOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc0VPRigpIG92ZXJyaWRlCiAgICAgewogICAgICAgICByZXR1cm4gX29mZlNldCA9PSBfdG90YWxTaXplOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAKaW5kZXggOWRiODA3Yy4uOWY0NzEyYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKIHsKICAgICByZXR1cm4gTlVMTDsKIH0KLXN0YXRpYyBGWF9CT09MIF9DR0RyYXdHbHlwaFJ1bihDR0NvbnRleHRSZWYgICAgICAgICAgICAgICBwQ29udGV4dCwKK3N0YXRpYyBib29sIF9DR0RyYXdHbHlwaFJ1bihDR0NvbnRleHRSZWYgICAgICAgICAgICAgICBwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqICAgICAgICAgICAgICAgICAgcEZvbnQsCkBAIC01MSwxMCArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChuQ2hhcnMgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeDsKLSAgICBGWF9CT09MIGJOZWdTaXplID0gZm9udF9zaXplIDwgMDsKKyAgICBib29sIGJOZWdTaXplID0gZm9udF9zaXplIDwgMDsKICAgICBpZiAoYk5lZ1NpemUpIHsKICAgICAgICAgZm9udF9zaXplID0gLWZvbnRfc2l6ZTsKICAgICB9CkBAIC02NiwxMSArNjYsMTEgQEAKICAgICBDUXVhcnR6MkQmIHF1YXJ0ejJkID0gKChDQXBwbGVQbGF0Zm9ybSAqKSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKICAgICBpZiAoIXBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKICAgICAgICAgaWYgKHBGb250LT5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcEZvbnQtPm1fcFBsYXRmb3JtRm9udCA9IHF1YXJ0ejJkLkNyZWF0ZUZvbnQocEZvbnQtPm1fcEZvbnREYXRhLCBwRm9udC0+bV9kd1NpemUpOwogICAgICAgICBpZiAoTlVMTCA9PSBwRm9udC0+bV9wUGxhdGZvcm1Gb250KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9XT1JELCAzMj4gZ2x5cGhfaW5kaWNlcyhuQ2hhcnMpOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKIH0KIHN0YXRpYyB2b2lkIF9Eb05vdGhpbmcodm9pZCAqaW5mbywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHt9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludAkJCQkJCSBuQ2hhcnMsCitib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludAkJCQkJCSBuQ2hhcnMsCiAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TICoJIHBDaGFyUG9zLAogICAgICAgICBDRlhfRm9udCAqCQkJCSBwRm9udCwKICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSAqCQkJIHBDYWNoZSwKQEAgLTExMSwyMiArMTExLDIyIEBACiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CisgICAgYm9vbCBiQm9sZCA9IHBGb250LT5Jc0JvbGQoKTsKICAgICBpZiAoIWJCb2xkICYmIHBGb250LT5HZXRTdWJzdEZvbnQoKSAmJgogICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA+PSA1MDAgJiYKICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPD0gNjAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSArKykgewogICAgICAgICBpZiAocENoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBDR0NvbnRleHRSZWYgY3R4ID0gQ0dDb250ZXh0UmVmKG1fcFBsYXRmb3JtR3JhcGhpY3MpOwogICAgIGlmIChOVUxMID09IGN0eCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjdHgpOwogICAgIENHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShjdHgsIGtDR1RleHRGaWxsQ2xpcCk7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgICAgIENHRmxvYXQgZGVjb2RlX2ZbMl0gPSB7MjU1LmYsIDAuZn07CiAgICAgICAgICAgICBwSW1hZ2VDRyA9IENHSW1hZ2VNYXNrQ3JlYXRlKHBDbGlwTWFzay0+R2V0V2lkdGgoKSwgcENsaXBNYXNrLT5HZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgOCwgcENsaXBNYXNrLT5HZXRQaXRjaCgpLCBwQ2xpcE1hc2tEYXRhUHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9mLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9mLCBmYWxzZSk7CiAgICAgICAgICAgICBDR0RhdGFQcm92aWRlclJlbGVhc2UocENsaXBNYXNrRGF0YVByb3ZpZGVyKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGN0eCwgcmVjdF9jZyk7CiAgICAgfQotICAgIEZYX0JPT0wgcmV0ID0gX0NHRHJhd0dseXBoUnVuKGN0eCwgbkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgYXJnYiwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgYm9vbCByZXQgPSBfQ0dEcmF3R2x5cGhSdW4oY3R4LCBuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBhcmdiLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICBpZiAocEltYWdlQ0cpIHsKICAgICAgICAgQ0dJbWFnZVJlbGVhc2UocEltYWdlQ0cpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwCmluZGV4IDA0YjA0YjguLjVlNTkwOGIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcApAQCAtMjgsNyArMjgsNyBAQAogY2xhc3MgQ0ZYX01hY0ZvbnRJbmZvIDogcHVibGljIENGWF9Gb2xkZXJGb250SW5mbwogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBGWF9CT09MJiBiRXhhY3QpOworICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBib29sJiBiRXhhY3QpOwogfTsKICNkZWZpbmUgSkFQQU5fR09USElDICJIaXJhZ2lubyBLYWt1IEdvdGhpYyBQcm8gVzYiCiAjZGVmaW5lIEpBUEFOX01JTkNITyAiSGlyYWdpbm8gTWluY2hvIFBybyBXNiIKQEAgLTQ0LDE0ICs0NCwxNCBAQAogICAgICAgICBmYWNlID0gSkFQQU5fTUlOQ0hPOwogICAgIH0KIH0KLXZvaWQqIENGWF9NYWNGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKK3ZvaWQqIENGWF9NYWNGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIGJvb2wmIGJFeGFjdCkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gY3N0cl9mYWNlOwogICAgIGludCBpQmFzZUZvbnQ7CiAgICAgZm9yIChpQmFzZUZvbnQgPSAwOyBpQmFzZUZvbnQgPCAxMjsgaUJhc2VGb250ICsrKQogICAgICAgICBpZiAoZmFjZSA9PSBDRlhfQnl0ZVN0cmluZ0MoQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wTmFtZSkpIHsKICAgICAgICAgICAgIGZhY2UgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BTdWJzdE5hbWU7Ci0gICAgICAgICAgICBiRXhhY3QgPSBUUlVFOworICAgICAgICAgICAgYkV4YWN0ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcAppbmRleCBkMWU0ZjU0Li44YWE2ODlmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5KSk7CiB9Ci1GWF9CT09MIENRdWFydHoyRDo6ZHJhd0dyYXBoaWNzU3RyaW5nKHZvaWQqICAgICAgICAgICAgICAgICBncmFwaGljcywKK2Jvb2wgQ1F1YXJ0ejJEOjpkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgIGdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgIGZvbnRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiAgICAgICAgICAgICAgZ2x5cGhJbmRpY2VzLApAQCAtODYsNyArODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiAgICAgbWF0cml4ICkKIHsKICAgICBpZiAoIWdyYXBoaWNzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IChDR0NvbnRleHRSZWYpIGdyYXBoaWNzOwogICAgIENHQ29udGV4dFNldEZvbnQoY29udGV4dCwgKENHRm9udFJlZilmb250KTsKQEAgLTExMyw3ICsxMTMsNyBAQAogI2lmIENHRkxPQVRfSVNfRE9VQkxFCiAgICAgQ0dQb2ludCogZ2x5cGhQb3NpdGlvbnNDRyA9IG5ldyBDR1BvaW50W2NoYXJzQ291bnRdOwogICAgIGlmICghZ2x5cGhQb3NpdGlvbnNDRykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoYXJzQ291bnQ7ICsraW5kZXgpIHsKICAgICAgICAgZ2x5cGhQb3NpdGlvbnNDR1tpbmRleF0ueCA9IGdseXBoUG9zaXRpb25zW2luZGV4XS54OwpAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgZGVsZXRlW10gZ2x5cGhQb3NpdGlvbnNDRzsKICNlbmRpZgogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENRdWFydHoyRDo6c2F2ZUdyYXBoaWNzU3RhdGUodm9pZCAqIGdyYXBoaWNzKQogewpAQCAtMjUxLDcgKzI1MSw3IEBACiAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfY29udGV4dCk7CiAgICAgbV9zYXZlQ291bnQrKzsKIH0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgaXNLZWVwU2F2ZWQgKQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoYm9vbCBpc0tlZXBTYXZlZCApCiB7CiAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfY29udGV4dCk7CiAgICAgaWYgKGlzS2VlcFNhdmVkKSB7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgbV9zYXZlQ291bnQtLTsKICAgICB9CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICBwYXRoRGF0YSwKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqICAgIHBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiAgIG1hdHJpeCwKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBmaWxsTW9kZSApCiB7CkBAIC0yNzIsMTMgKzI3MiwxMyBAQAogICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtLCBfZm94aXREZXZpY2UyVXNlcik7CiAgICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBtKTsKICAgICBzZXRQYXRoVG9Db250ZXh0KHBhdGhEYXRhKTsKLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CiAgICAgaWYgKChmaWxsTW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7CiAgICAgICAgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIENHQ29udGV4dEVPQ2xpcChfY29udGV4dCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogRlhfRkxPQVQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Z2V0TGluZVdpZHRoKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSAqIGdyYXBoU3RhdGUsIENHQWZmaW5lVHJhbnNmb3JtIGN0bSkKIHsKQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgIH0KICAgICByZXR1cm4gbGluZVdpZHRoOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICAgIHBhdGhEYXRhLAorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICAgIHBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiAgICAgbWF0cml4LAogICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqICAgZ3JhcGhTdGF0ZSApCiB7CkBAIC0zMDksOSArMzA5LDkgQEAKICAgICBzZXRTdHJva2VJbmZvKGdyYXBoU3RhdGUsIDB4RkYwMDAwMDAsIGxpbmVXaWR0aCk7CiAgICAgc2V0UGF0aFRvQ29udGV4dChwYXRoRGF0YSk7CiAgICAgQ0dDb250ZXh0UmVwbGFjZVBhdGhXaXRoU3Ryb2tlZFBhdGgoX2NvbnRleHQpOwotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKICAgICBDR0NvbnRleHRDbGlwKF9jb250ZXh0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyBDR0JsZW5kTW9kZSBHZXRDR0JsZW5kTW9kZShpbnQgYmxlbmRfdHlwZSkKIHsKQEAgLTM3MSw3ICszNzEsNyBAQAogICAgIH0KICAgICByZXR1cm4gbW9kZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICAgICAgcGF0aERhdGEsCitib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogICAgICAgIHBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiAgICAgICBtYXRyaXgsCiAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogICAgIGdyYXBoU3RhdGUsCiAgICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgIGZpbGxBcmdiLApAQCAtNDIzLDEwICs0MjMsMTAgQEAKICAgICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDYpIHsKICAgICAgICAgQ0dDb250ZXh0RHJhd1BhdGgoX2NvbnRleHQsIGtDR1BhdGhFT0ZpbGxTdHJva2UpOwogICAgIH0KLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIHJldHVybiBUUlVFOworICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqICAgICAgICAgcmVjdCwKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogICAgICAgICByZWN0LAogICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICAgICAgIGZpbGxBcmdiLAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmxhZwkgICAsCiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgaWNjVHJhbnNmb3JtICwKQEAgLTQ0OSw5ICs0NDksOSBAQAogICAgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgewogICAgICAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUICAgICAgICAgICB4MSwKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCAgICAgICAgICAgeDEsCiAgICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICB5MSwKICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgIHgyLAogICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgeTIsCkBAIC00ODMsOSArNDgzLDkgQEAKICAgICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKICAgICAgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiByZWN0KQorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHJlY3QpCiB7CiAgICAgQ0dSZWN0IHIgPSBDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3goX2NvbnRleHQpOwogICAgIHIgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyLCBfdXNlcjJGb3hpdERldmljZSk7CkBAIC00OTMsMjIgKzQ5MywyMiBAQAogICAgIHJlY3QtPnRvcAkJPSBGWFNZU19mbG9vcihyLm9yaWdpbi55KTsKICAgICByZWN0LT5yaWdodAkJPSBGWFNZU19jZWlsKHIub3JpZ2luLnggKyByLnNpemUud2lkdGgpOwogICAgIHJlY3QtPmJvdHRvbQk9IEZYU1lTX2NlaWwoci5vcmlnaW4ueSArIHIuc2l6ZS5oZWlnaHQpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiAgICAgYml0bWFwLAorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiAgICAgYml0bWFwLAogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbGVmdCwKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHRvcCwKICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgRlhfQk9PTCBiREVkZ2UpCisgICAgICAgIGJvb2wgYkRFZGdlKQogewogICAgIGlmIChGWERDX1BSSU5URVIgPT0gX2RldmljZUNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoYml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIShfcmVuZGVyQ2FwcyB8IEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDR1BvaW50IHB0ID0gQ0dQb2ludE1ha2UobGVmdCwgdG9wKTsKICAgICBwdCA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShwdCwgX2ZveGl0RGV2aWNlMlVzZXIpOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAgICAgcHQueSAqPSBGWFNZU19mYWJzKGN0bS5kKTsKICAgICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoX2NvbnRleHQpOwogICAgIGlmIChOVUxMID09IGltYWdlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDR0Zsb2F0IHdpZHRoCT0gKENHRmxvYXQpIGJpdG1hcC0+R2V0V2lkdGgoKTsKICAgICBDR0Zsb2F0IGhlaWdodAk9IChDR0Zsb2F0KSBiaXRtYXAtPkdldEhlaWdodCgpOwpAQCAtNTUyLDkgKzU1Miw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiAgICAgIHBCaXRtYXAsCitib29sIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiAgICAgIHBCaXRtYXAsCiAgICAgICAgIEZYX0FSR0IgICAgICAgICAgICAgICAgICAgICBhcmdiLAogICAgICAgICBjb25zdCBGWF9SRUNUKiAgICAgICAgICAgICAgc3JjUmVjdCwKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVmdCwKQEAgLTU5OCw4ICs1OTgsOCBAQAogICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7Ci0gICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQml0bWFwUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCdWZmZXIoKSwKQEAgLTYyOSw4ICs2MjksOCBAQAogICAgICAgICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgewogICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXAxOwogICAgICAgICB9Ci0gICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpIDwgMzIpIHsKICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOwpAQCAtNjQyLDE1ICs2NDIsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBCaXRtYXAxLT5IYXNBbHBoYSgpKSB7CiAgICAgICAgIGlmIChwQml0bWFwMSA9PSBwQml0bWFwKSB7CiAgICAgICAgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CiAgICAgICAgICAgICBpZiAoIXBCaXRtYXAxKSB7Ci0gICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcEJpdG1hcDEtPkdldEhlaWdodCgpOyByb3cgKyspIHsKQEAgLTY4MiwxMCArNjgyLDEwIEBACiAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKICAgICAgICAgZGVsZXRlIHBCaXRtYXAxOwogICAgIH0KLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIHJldHVybiBUUlVFOworICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqICAgICAgcEJpdG1hcCwKICAgICAgICAgRlhfQVJHQiAgICAgICAgICAgICAgICAgICAgIGFyZ2IsCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlZnQsCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3RvcCwKQEAgLTcyMyw4ICs3MjMsOCBAQAogICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7Ci0gICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQml0bWFwUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCdWZmZXIoKSwKQEAgLTc1NCw4ICs3NTQsOCBAQAogICAgICAgICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgewogICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXAxOwogICAgICAgICB9Ci0gICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpIDwgMzIpIHsKICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOwpAQCAtNzY3LDE1ICs3NjcsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBCaXRtYXAxLT5IYXNBbHBoYSgpKSB7CiAgICAgICAgIGlmIChwQml0bWFwMSA9PSBwQml0bWFwKSB7CiAgICAgICAgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CiAgICAgICAgICAgICBpZiAoIXBCaXRtYXAxKSB7Ci0gICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcEJpdG1hcDEtPkdldEhlaWdodCgpOyByb3cgKyspIHsKQEAgLTc5NiwxMCArNzk2LDEwIEBACiAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKICAgICAgICAgZGVsZXRlIHBCaXRtYXAxOwogICAgIH0KLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIHJldHVybiBUUlVFOworICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKK2Jvb2wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0dfRHJhd0dseXBSdW4oaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAogICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogICAgICBwQ2hhclBvcywKICAgICAgICAgQ0ZYX0ZvbnQqICAgICAgICAgICAgICAgICAgcEZvbnQsCiAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICAgIHBDYWNoZSwKQEAgLTgxMSwxNiArODExLDE2IEBACiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG5DaGFycyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9ICgoQ0FwcGxlUGxhdGZvcm0gKikgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7CiAgICAgaWYgKCFwRm9udC0+bV9wUGxhdGZvcm1Gb250KSB7CiAgICAgICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgPT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiREZIZWlTdGQtVzUiKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBGb250LT5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KHBGb250LT5tX3BGb250RGF0YSwgcEZvbnQtPm1fZHdTaXplKTsKICAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfV09SRCwgMzI+IGdseXBoX2luZGljZXMobkNoYXJzKTsKQEAgLTg3MiwxMCArODcyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDR0dseXBoKilnbHlwaF9pbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9wb3NpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycyk7Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBSZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAorYm9vbCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAogICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogICAgcENoYXJQb3MsCiAgICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICBwRm9udCwKICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogICAgICAgICAgIHBDYWNoZSwKQEAgLTg4NiwyNCArODg2LDI0IEBACiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChOVUxMID09IHBGb250IHx8IE5VTEwgPT0gX2NvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CisgICAgYm9vbCBiQm9sZCA9IHBGb250LT5Jc0JvbGQoKTsKICAgICBpZiAoIWJCb2xkICYmIHBGb250LT5HZXRTdWJzdEZvbnQoKSAmJgogICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA+PSA1MDAgJiYKICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPD0gNjAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBTYXZlU3RhdGUoKTsKICAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX2NvbnRleHQsIGtDR1RleHRGaWxsQ2xpcCk7Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgICBib29sIHJldCA9IGZhbHNlOwogICAgIGludDMyX3QgaSA9IDA7CiAgICAgd2hpbGUgKGkgPCBuQ2hhcnMpIHsKICAgICAgICAgaWYgKHBDaGFyUG9zW2ldLm1fYkdseXBoQWRqdXN0IHx8IGZvbnRfc2l6ZSA8IDApIHsKICAgICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKGksIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBOVUxMLCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05MjAsNyArOTIwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKDEsIGNoYXJfcG9zLCBwRm9udCwgcENhY2hlLCAmZ2xwaHlfbWF0cml4LCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICBpZiAoIXJldCkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArKzsKQEAgLTkzNCw3ICs5MzQsNyBAQAogICAgIGlmIChpID4gMCkgewogICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bihpLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgTlVMTCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgIH0KLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIHZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6c2V0U3Ryb2tlSW5mbyhjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUsIEZYX0FSR0IgYXJnYiwgRlhfRkxPQVQgbGluZVdpZHRoKQpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIH0KIENGWF9RdWFydHpEZXZpY2U6OkNGWF9RdWFydHpEZXZpY2UoKQogewotICAgIG1fYk93bmVkQml0bWFwID0gRkFMU0U7CisgICAgbV9iT3duZWRCaXRtYXAgPSBmYWxzZTsKICAgICBtX3BDb250ZXh0ID0gTlVMTDsKIH0KIENGWF9RdWFydHpEZXZpY2U6On5DRlhfUXVhcnR6RGV2aWNlKCkKQEAgLTEwOTAsNyArMTA5MCw3IEBACiB7CiAgICAgcmV0dXJuIG1fcENvbnRleHQ7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2U6OkF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MpCitib29sIENGWF9RdWFydHpEZXZpY2U6OkF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MpCiB7CiAgICAgaWYgKG1fcENvbnRleHQpIHsKICAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShtX3BDb250ZXh0KTsKQEAgLTEwOTksMzAgKzEwOTksMzAgQEAKICAgICBDR0NvbnRleHRSZXRhaW4obV9wQ29udGV4dCk7CiAgICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyKG1fcENvbnRleHQsIG5EZXZpY2VDbGFzcyk7CiAgICAgU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQorYm9vbCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQogewogICAgIFNldEJpdG1hcChwQml0bWFwKTsKICAgICBtX3BDb250ZXh0ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAocEJpdG1hcCk7CiAgICAgaWYgKE5VTEwgPT0gbV9wQ29udGV4dCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyKG1fcENvbnRleHQsIEZYRENfRElTUExBWSk7CiAgICAgU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCitib29sIENGWF9RdWFydHpEZXZpY2U6OkNyZWF0ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCkKIHsKICAgICBpZiAoKHVpbnQ4X3QpZm9ybWF0IDwgMzIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgewogICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1fYk93bmVkQml0bWFwID0gVFJVRTsKKyAgICBtX2JPd25lZEJpdG1hcCA9IHRydWU7CiAgICAgcmV0dXJuIEF0dGFjaChwQml0bWFwKTsKIH0KICNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmggYi9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgKaW5kZXggODI1Y2FiZS4uYTY4MzRmZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaApAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QmIGNsaXBfcmVjdCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgZmxhZ3MpOwogICAgIH5DU3RyZXRjaEVuZ2luZSgpOwotICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBib29sCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiBwdWJsaWM6CiAgICAgRlhESUJfRm9ybWF0IG1fRGVzdEZvcm1hdDsKICAgICBpbnQJCW1fRGVzdEJwcCwgbV9TcmNCcHAsIG1fYkhhc0FscGhhOwpAQCAtODQsOCArODQsOCBAQAogICAgIGludCAJbV9GbGFnczsKICAgICBDV2VpZ2h0VGFibGUJbV9XZWlnaHRUYWJsZTsKICAgICBpbnQJCW1fQ3VyUm93OwotICAgIEZYX0JPT0wJU3RhcnRTdHJldGNoSG9yeigpOwotICAgIEZYX0JPT0wJQ29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgYm9vbAlTdGFydFN0cmV0Y2hIb3J6KCk7CisgICAgYm9vbAlDb250aW51ZVN0cmV0Y2hIb3J6KElGWF9QYXVzZSogcFBhdXNlKTsKICAgICB2b2lkCVN0cmV0Y2hWZXJ0KCk7CiAgICAgaW50CQltX1N0YXRlOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAKaW5kZXggY2I5OWEzNy4uOWY0NTRjYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CiAgICAgfQogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CiAgICAgfQogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKQEAgLTU1OCw3ICs1NTgsNyBAQAogICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CiAgICAgfQogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewpAQCAtNjA1LDcgKzYwNSw3IEBACiAgICAgfQogICAgIGlmIChibGVuZF90eXBlKSB7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CiAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CkBAIC02ODksNyArNjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewogICAgICAgICBpZiAoc3JjX2FscGhhX3NjYW4gPT0gTlVMTCkgewogICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gMDsKQEAgLTg5Niw3ICs4OTYsNyBAQAogICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwogICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CkBAIC05NTcsNyArOTU3LDcgQEAKICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewpAQCAtMTEyMSw3ICsxMTIxLDcgQEAKICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CiAgICAgaWYgKHNyY19hbHBoYV9zY2FuID09IE5VTEwpIHsKICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewpAQCAtMTI0Myw3ICsxMjQzLDcgQEAKIGlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXAodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKICAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwogICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKQEAgLTEyNjYsNyArMTI2Niw3IEBACiBpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CkBAIC0xMzU3LDcgKzEzNTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCAxKTsKICAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwpAQCAtMTQ4Nyw3ICsxNDg3LDcgQEAKICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7CkBAIC0xNjMwLDcgKzE2MzAsNyBAQAogewogICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewogICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwpAQCAtMTY2OCw3ICsxNjY4LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CkBAIC0xNzA0LDcgKzE3MDQsNyBAQAogewogICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewogICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwpAQCAtMTc3OCw3ICsxNzc4LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CkBAIC0xODM2LDcgKzE4MzYsNyBAQAogICAgIGludCByZXNldF9ncmF5ID0gcFBhbGV0dGVbMF07CiAgICAgaW50IHNldF9ncmF5ID0gcFBhbGV0dGVbMV07CiAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpID8gc2V0X2dyYXkgOiByZXNldF9ncmF5OwpAQCAtMTg3MCw3ICsxODcwLDcgQEAKICAgICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwogICAgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOwogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKQEAgLTI3ODcsNyArMjc4Nyw3IEBACiB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7CiAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewpAQCAtMjg0NCw3ICsyODQ0LDcgQEAKIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKQEAgLTI4ODEsNyArMjg4MSw3IEBACiBpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgZGVzdF9CcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKICAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7CiAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKQEAgLTI5MjgsNyArMjkyOCw3IEBACiBpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwKQogewogICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CiAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7CiAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKQEAgLTI5OTUsNyArMjk5NSw3IEBACiBpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCiB7CiAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKICAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwogICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpjbGlwX3NjYW4gKys7CkBAIC0zMDM5LDcgKzMwMzksNyBAQAogaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKIHsKICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwogICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CiAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewogICAgICAgICB1aW50OF90IHNyY19hbHBoYSA9ICpjbGlwX3NjYW4gKys7CkBAIC0zNDk1LDcgKzM0OTUsNyBAQAogICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwogICAgIH0KIH0KLWlubGluZSBGWF9CT09MIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBpbnQgYWxwaGFfZmxhZywgRlhfRFdPUkQgbWFza19jb2xvciwgaW50JiBtYXNrX2FscGhhLAoraW5saW5lIGJvb2wgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlTWFzayhGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIGludCBhbHBoYV9mbGFnLCBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQmIG1hc2tfYWxwaGEsCiAgICAgICAgIGludCYgbWFza19yZWQsIGludCYgbWFza19ncmVlbiwgaW50JiBtYXNrX2JsdWUsIGludCYgbWFza19ibGFjaywKICAgICAgICAgdm9pZCogaWNjX21vZHVsZSwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKQEAgLTM1MTMsNyArMzUxMyw3IEBACiAgICAgICAgIG1hc2tfYmx1ZSA9IEZYQVJHQl9CKG1hc2tfY29sb3IpOwogICAgIH0KICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewogICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewpAQCAtMzU1MCwxNSArMzU1MCwxNSBAQAogICAgICAgICAgICAgbWFza19ibHVlID0gbWFza19jb2xvcl9wWzBdOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW5saW5lIHZvaWQgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlUGFsZXR0ZShGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAogICAgICAgICBGWF9EV09SRComIHBEZXN0UGFsZXR0ZSwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAogICAgICAgICB2b2lkKiBpY2NfbW9kdWxlLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSAoSUNvZGVjX0ljY01vZHVsZSopaWNjX21vZHVsZTsKLSAgICBGWF9CT09MIGlzU3JjQ215ayA9IHNyY19mb3JtYXQgJiAweDA0MDAgPyBUUlVFIDogRkFMU0U7Ci0gICAgRlhfQk9PTCBpc0RzdENteWsgPSBkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IFRSVUUgOiBGQUxTRTsKKyAgICBib29sIGlzU3JjQ215ayA9IHNyY19mb3JtYXQgJiAweDA0MDAgPyB0cnVlIDogZmFsc2U7CisgICAgYm9vbCBpc0RzdENteWsgPSBkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IHRydWUgOiBmYWxzZTsKICAgICBwRGVzdFBhbGV0dGUgPSBOVUxMOwogICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CiAgICAgICAgIGlmIChwU3JjUGFsZXR0ZSkgewpAQCAtMzY3OSw3ICszNjc5LDcgQEAKICAgICBtX3BTcmNQYWxldHRlID0gTlVMTDsKICAgICBtX3BDYWNoZVNjYW5saW5lID0gTlVMTDsKICAgICBtX0NhY2hlU2l6ZSA9IDA7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7CisgICAgbV9iUmdiQnl0ZU9yZGVyID0gZmFsc2U7CiAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CiB9CiBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjp+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpCkBAIC0zNjkxLDggKzM2OTEsOCBAQAogICAgICAgICBGWF9GcmVlKG1fcENhY2hlU2NhbmxpbmUpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6SW5pdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBpbnQzMl90IHdpZHRoLCBGWF9EV09SRCogcFNyY1BhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgaW50IGJsZW5kX3R5cGUsIEZYX0JPT0wgYkNsaXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitib29sIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgaW50MzJfdCB3aWR0aCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIGludCBibGVuZF90eXBlLCBib29sIGJDbGlwLCBib29sIGJSZ2JCeXRlT3JkZXIsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKICAgICBtX0Rlc3RGb3JtYXQgPSBkZXN0X2Zvcm1hdDsKQEAgLTM3MDcsNyArMzcwNyw3IEBACiAgICAgfQogICAgIG1fcEljY1RyYW5zZm9ybSA9IHBJY2NUcmFuc2Zvcm07CiAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwTWFzayB8fCBtX1NyY0Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewogICAgICAgICByZXR1cm4gX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlTWFzayhkZXN0X2Zvcm1hdCwgYWxwaGFfZmxhZywgbWFza19jb2xvciwKQEAgLTM3MTUsMTEgKzM3MTUsMTEgQEAKICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCAmJiAofnNyY19mb3JtYXQgJiAweDA0MDApICYmIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgobV9TcmNGb3JtYXQgJiAweGZmKSA8PSA4KSB7CiAgICAgICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VQYWxldHRlKHNyY19mb3JtYXQsIGRlc3RfZm9ybWF0LCBtX3BTcmNQYWxldHRlLCBwU3JjUGFsZXR0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLCBwSWNjVHJhbnNmb3JtKTsKQEAgLTM3MjcsNyArMzcyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDAyMDAgPyAyIDogMCkKICAgICAgICAgICAgICAgICAgICAgICAgICArIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDQgOiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICsgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSA/IDggOiAwKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBtX1RyYW5zcGFyZW5jeSA9IChzcmNfZm9ybWF0ICYgMHgwMjAwID8gMCA6IDEpCiAgICAgICAgICAgICAgICAgICAgICArIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAyKQpAQCAtMzczNiw3ICszNzM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICsgKHNyY19mb3JtYXQgJiAweDA0MDAgPyAxNiA6IDApCiAgICAgICAgICAgICAgICAgICAgICArIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDMyIDogMCkKICAgICAgICAgICAgICAgICAgICAgICsgKHBJY2NUcmFuc2Zvcm0gPyA2NCA6IDApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVSZ2JCaXRtYXBMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAogICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkKQEAgLTQwNTksMjIgKzQwNTksMjIgQEAKICAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIGJvb2wgYlJnYkJ5dGVPcmRlciwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEFTU0VSVCghcFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSk7CiAgICAgQVNTRVJUKG1fYnBwID49IDgpOwogICAgIGlmIChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcENsaXBNYXNrID0gTlVMTDsKICAgICBGWF9SRUNUIGNsaXBfYm94OwpAQCAtNDA4NiwxMSArNDA4NiwxMSBAQAogICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKICAgICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCksIHdpZHRoLCBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCksIDAsIGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBNYXNrICE9IE5VTEwsIGJSZ2JCeXRlT3JkZXIsIDAsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgZGVzdF9CcHAgPSBtX2JwcCAvIDg7CiAgICAgaW50IHNyY19CcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgRlhfQk9PTCBiUmdiID0gc3JjX0JwcCA+IDEgJiYgIXBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCk7CisgICAgYm9vbCBiUmdiID0gc3JjX0JwcCA+IDEgJiYgIXBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCk7CiAgICAgQ0ZYX0RJQml0bWFwKiBwU3JjQWxwaGFNYXNrID0gcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrOwogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7CiAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogZGVzdF9CcHA7CkBAIC00MTA3LDI3ICs0MTA3LDI3IEBACiAgICAgICAgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIHNyY19zY2FuX2V4dHJhX2FscGhhLCBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIGJvb2wgYlJnYkJ5dGVPcmRlciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBBU1NFUlQocE1hc2stPklzQWxwaGFNYXNrKCkpOwogICAgIEFTU0VSVChtX2JwcCA+PSA4KTsKICAgICBpZiAoIXBNYXNrLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcE1hc2stPkdldFdpZHRoKCksIHBNYXNrLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBzcmNfYWxwaGEgPSAodWludDhfdCkoYWxwaGFfZmxhZyA+PiA4KSA/IChhbHBoYV9mbGFnICYgMHhmZikgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQ2xpcE1hc2sgPSBOVUxMOwogICAgIEZYX1JFQ1QgY2xpcF9ib3g7CkBAIC00MTQwLDcgKzQxNDAsNyBAQAogICAgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7CiAgICAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBjb21wb3NpdG9yOwogICAgIGlmICghY29tcG9zaXRvci5Jbml0KEdldEZvcm1hdCgpLCBwTWFzay0+R2V0Rm9ybWF0KCksIHdpZHRoLCBOVUxMLCBjb2xvciwgYmxlbmRfdHlwZSwgcENsaXBNYXNrICE9IE5VTEwsIGJSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewogICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKQEAgLTQxNTYsMjEgKzQxNTYsMjEgQEAKICAgICAgICAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4gKyBzcmNfbGVmdCwgd2lkdGgsIGNsaXBfc2NhbiwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZVJlY3QoaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZVJlY3QoaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IHNyY19hbHBoYSA9IChhbHBoYV9mbGFnID4+IDgpID8gKGFscGhhX2ZsYWcgJiAweGZmKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7CiAgICAgcmVjdC5JbnRlcnNlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOwogICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHdpZHRoID0gcmVjdC5XaWR0aCgpOwogICAgIEZYX0RXT1JEIGRzdF9jb2xvcjsKQEAgLTQyMTAsNyArNDIxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9icHAgPT0gMSkgewogICAgICAgICBBU1NFUlQoIUlzQ215a0ltYWdlKCkgJiYgKHVpbnQ4X3QpKGFscGhhX2ZsYWcgPj4gOCkgPT0gMCk7CkBAIC00MjQ4LDExICs0MjQ4LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgQVNTRVJUKG1fYnBwID49IDI0KTsKICAgICBpZiAobV9icHAgPCAyNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0gJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSkgewogICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CkBAIC00MjYyLDE1ICs0MjYyLDE1IEBACiAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKICAgICAgICAgZWxzZSBpZiAoIShhbHBoYV9mbGFnID4+IDgpICYmIElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZighSXNDbXlrSW1hZ2UoKSkgewogICAgICAgICBjb2xvcl9wWzNdID0gKHVpbnQ4X3Qpc3JjX2FscGhhOwogICAgIH0KICAgICBpbnQgQnBwID0gbV9icHAgLyA4OwotICAgIEZYX0JPT0wgYkFscGhhID0gSGFzQWxwaGEoKTsKLSAgICBGWF9CT09MIGJBcmdiID0gR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYiA/IFRSVUUgOiBGQUxTRTsKKyAgICBib29sIGJBbHBoYSA9IEhhc0FscGhhKCk7CisgICAgYm9vbCBiQXJnYiA9IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IgPyB0cnVlIDogZmFsc2U7CiAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKICAgICAgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3cgKyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyByZWN0LmxlZnQgKiBCcHA7CkBAIC00MjkxLDcgKzQyOTEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7CiAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyByZWN0LmxlZnQgKiBCcHA7CkBAIC00MzQ2LDcgKzQzNDYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0ZYX0JpdG1hcENvbXBvc2VyOjpDRlhfQml0bWFwQ29tcG9zZXIoKQogewpAQCAtNDM1NCw3ICs0MzU0LDcgQEAKICAgICBtX3BTY2FubGluZUFscGhhViA9IE5VTEw7CiAgICAgbV9wQ2xpcFNjYW5WID0gTlVMTDsKICAgICBtX3BBZGRDbGlwU2NhbiA9IE5VTEw7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7CisgICAgbV9iUmdiQnl0ZU9yZGVyID0gZmFsc2U7CiAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CiB9CiBDRlhfQml0bWFwQ29tcG9zZXI6On5DRlhfQml0bWFwQ29tcG9zZXIoKQpAQCAtNDM3Myw4ICs0MzczLDggQEAKICAgICB9CiB9CiB2b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6Q29tcG9zZShDRlhfRElCaXRtYXAqIHBEZXN0LCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIEZYX0JPT0wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsIEZYX0JPT0wgYkZsaXBZLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIGJvb2wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsIGJvb2wgYkZsaXBZLCBib29sIGJSZ2JCeXRlT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgbV9wQml0bWFwID0gcERlc3Q7CkBAIC00Mzk3LDEyICs0Mzk3LDEyIEBACiAgICAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKICAgICBtX0JsZW5kVHlwZSA9IGJsZW5kX3R5cGU7CiB9Ci1GWF9CT09MIENGWF9CaXRtYXBDb21wb3Nlcjo6U2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpCitib29sIENGWF9CaXRtYXBDb21wb3Nlcjo6U2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpCiB7CiAgICAgbV9TcmNGb3JtYXQgPSBzcmNfZm9ybWF0OwogICAgIGlmICghbV9Db21wb3NpdG9yLkluaXQobV9wQml0bWFwLT5HZXRGb3JtYXQoKSwgc3JjX2Zvcm1hdCwgd2lkdGgsIHBTcmNQYWxldHRlLCBtX01hc2tDb2xvciwgRlhESUJfQkxFTkRfTk9STUFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2xpcE1hc2sgIT0gTlVMTCB8fCAobV9CaXRtYXBBbHBoYSA8IDI1NSksIG1fYlJnYkJ5dGVPcmRlciwgbV9BbHBoYUZsYWcsIG1fcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX2JWZXJ0aWNhbCkgewogICAgICAgICBtX3BTY2FubGluZVYgPSBGWF9BbGxvYyh1aW50OF90LCBtX3BCaXRtYXAtPkdldEJQUCgpIC8gOCAqIHdpZHRoICsgNCk7CkBAIC00NDE0LDcgKzQ0MTQsNyBAQAogICAgIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7CiAgICAgICAgIG1fcEFkZENsaXBTY2FuID0gRlhfQWxsb2ModWludDhfdCwgbV9iVmVydGljYWwgPyBtX3BCaXRtYXAtPkdldEhlaWdodCgpIDogbV9wQml0bWFwLT5HZXRXaWR0aCgpKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6RG9Db21wb3NlKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBkZXN0X3dpZHRoLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCmluZGV4IGQ3ODYwYWUuLjdlNWEwMzQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIENGWF9QYWxldHRlKCk7CiAgICAgfkNGWF9QYWxldHRlKCk7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCAgICAgIEJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgZHdQYWxldHRlVHlwZSk7CisgICAgYm9vbCAgICAgIEJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgZHdQYWxldHRlVHlwZSk7CiAgICAgRlhfRFdPUkQqICAgIEdldFBhbGV0dGUoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcFBhbGV0dGU7CkBAIC0yMjcsMTAgKzIyNywxMCBAQAogICAgIH0KICAgICBtX2x1dCA9IDA7CiB9Ci1GWF9CT09MIENGWF9QYWxldHRlOjpCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IHBhbF90eXBlKQorYm9vbCBDRlhfUGFsZXR0ZTo6QnVpbGRQYWxldHRlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBwYWxfdHlwZSkKIHsKICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9wUGFsZXR0ZSAhPSBOVUxMKSB7CiAgICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7CkBAIC0yNzcsOSArMjc3LDkgQEAKICAgICAgICAgd2luX21hY19wYWwgPSAoRlhfRFdPUkQqKWdfZHdNYWNQYWxldHRlOwogICAgIH0KICAgICBfT2J0YWluX1BhbChtX2FMdXQsIG1fY0x1dCwgbV9wUGFsZXR0ZSwgcGFsX3R5cGUsIHdpbl9tYWNfcGFsLCBtX2x1dCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKIHsKICAgICB1aW50OF90IHNldF9ncmF5LCByZXNldF9ncmF5OwpAQCAtMjk2LDkgKzI5Niw5IEBACiAgICAgICAgICAgICBkZXN0X3NjYW4gKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKIHsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewpAQCAtMzA2LDkgKzMwNiw5IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBGWF9EV09SRCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKQEAgLTM1OSw5ICszNTksOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICsrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CkBAIC00MDIsOSArNDAyLDkgQEAKICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXlbKnNyY19zY2FuKytdOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfUmdiT3JDbXlrMkdyYXkodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaW50IEJwcCA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKQEAgLTQ1MSw3ICs0NTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW5saW5lIHZvaWQgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCkBAIC00NzYsNyArNDc2LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUGx0MlBsdFJnYjgodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBGWF9EV09SRCogZHN0X3BsdCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBfQ29udmVydEJ1ZmZlcl9JbmRleENvcHkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKQEAgLTUxNSw5ICs1MTUsOSBAQAogICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRzdF9wbHQsIHNyY19wbHQsIHBsdF9zaXplICogNCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1pbmxpbmUgRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2lubGluZSBib29sIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4X05vVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBGWF9EV09SRCogZHN0X3BsdCkKIHsKICAgICBpbnQgYnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwpAQCAtNTI3LDcgKzUyNyw3IEBACiAgICAgRlhfRFdPUkQqIGNMdXQgPSBwYWxldHRlLkdldENvbG9yTHV0KCk7CiAgICAgRlhfRFdPUkQqIGFMdXQgPSBwYWxldHRlLkdldEFtb3VudEx1dCgpOwogICAgIGlmIChjTHV0ID09IE5VTEwgfHwgYUx1dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgbHV0ID0gcGFsZXR0ZS5HZXRsdXQoKTsKICAgICBGWF9EV09SRCogcFBhbGV0dGUgPSBwYWxldHRlLkdldFBhbGV0dGUoKTsKQEAgLTU3MSwxMiArNTcxLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgRlhTWVNfbWVtY3B5KGRzdF9wbHQsIHBQYWxldHRlLCBzaXplb2YoRlhfRFdPUkQpICogMjU2KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjgodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBGWF9EV09SRCogZHN0X3BsdCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKLSAgICBGWF9CT09MIHJldCA9IF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4X05vVHJhbnNmb3JtKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZHN0X3BsdCk7CisgICAgYm9vbCByZXQgPSBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRzdF9wbHQpOwogICAgIGlmIChyZXQgJiYgcEljY1RyYW5zZm9ybSkgewogICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKQEAgLTU4OCw3ICs1ODgsNyBAQAogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKIHsKICAgICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKQEAgLTYxMSw5ICs2MTEsOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbXBzOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKIHsKICAgICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKQEAgLTYyOSw5ICs2MjksOSBAQAogICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CkBAIC02NzYsOSArNjc2LDkgQEAKICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwpAQCAtNzIyLDkgKzcyMiw5IEBACiAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8yNGJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKQEAgLTc0MSw5ICs3NDEsOSBAQAogICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogMyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBfQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewpAQCAtNzYzLDkgKzc2Myw5IEBACiAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIGRlc3Rfc2Nhbiwgd2lkdGgpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIF9Db252ZXJ0QnVmZmVyX1JnYjJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaW50IGNvbXBzID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwpAQCAtNzkzLDkgKzc5Myw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgX0NvbnZlcnRCdWZmZXJfMzJicHBDbXlrMlJnYjMyKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewpAQCAtODIxLDkgKzgyMSw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKK2Jvb2wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiYgZF9wYWwsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKQEAgLTgzNSw4ICs4MzUsOCBAQAogICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgogICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgogICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazogewogICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewpAQCAtODUzLDcgKzg1Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiYTogewpAQCAtODY3LDcgKzg2Nyw3IEBACiAgICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wYWwsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEZYRElCX1JnYjoKICAgICAgICAgY2FzZSBGWERJQl9SZ2JhOiB7CkBAIC04ODksNyArODg5LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMzJicHBSZ2IyUmdiMjQoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBGWERJQl9BcmdiOgogICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7CkBAIC05MTEsMTIgKzkxMSwxMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIENGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6Q2xvbmVDb252ZXJ0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgY29uc3QgRlhfUkVDVCogcENsaXAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIGNvbnN0CiB7CkBAIC05MzksNyArOTM5LDcgQEAKICAgICAgICAgZGVsZXRlIHBDbG9uZTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgICBib29sIHJldCA9IHRydWU7CiAgICAgQ0ZYX0RJQml0bWFwKiBwU3JjQWxwaGEgPSBOVUxMOwogICAgIGlmIChtX0FscGhhRmxhZyAmIDIpIHsKICAgICAgICAgcFNyY0FscGhhID0gKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpID8gR2V0QWxwaGFNYXNrKCkgOiBtX3BBbHBoYU1hc2s7CkBAIC05ODEsMTUgKzk4MSwxNSBAQAogICAgIH0KICAgICByZXR1cm4gcENsb25lOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtKQorYm9vbCBDRlhfRElCaXRtYXA6OkNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7CiAgICAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQgJiYgcEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrICYmIHNyY19mb3JtYXQgPT0gRlhESUJfOGJwcFJnYiAmJiBtX3BQYWxldHRlID09IE5VTEwpIHsKICAgICAgICAgbV9BbHBoYUZsYWcgPSAxOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiICYmIHNyY19mb3JtYXQgPT0gRlhESUJfUmdiMzIgJiYgcEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7CiAgICAgICAgIG1fQWxwaGFGbGFnID0gMjsKQEAgLTEwMDAsMTMgKzEwMDAsMTMgQEAKICAgICAgICAgICAgICAgICBzY2FubGluZSArPSA0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaW50IGRlc3RfYnBwID0gZGVzdF9mb3JtYXQgJiAweGZmOwogICAgIGludCBkZXN0X3BpdGNoID0gKGRlc3RfYnBwICogbV9XaWR0aCArIDMxKSAvIDMyICogNDsKICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRlc3RfcGl0Y2ggKiBtX0hlaWdodCArIDQpOwogICAgIGlmIChkZXN0X2J1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBOVUxMOwogICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiKSB7CkBAIC0xMDI2LDEzICsxMDI2LDEzIEBACiAgICAgICAgICAgICBwQWxwaGFNYXNrID0gR2V0QWxwaGFNYXNrKCk7CiAgICAgICAgICAgICBpZiAocEFscGhhTWFzayA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtX3BBbHBoYU1hc2sgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmICghQnVpbGRBbHBoYU1hc2soKSkgewogICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBBbHBoYU1hc2sgPSBtX3BBbHBoYU1hc2s7CiAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrID0gTlVMTDsKQEAgLTEwNDEsNyArMTA0MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgICBib29sIHJldCA9IGZhbHNlOwogICAgIEZYX0RXT1JEKiBwYWxfOGJwcCA9IE5VTEw7CiAgICAgcmV0ID0gQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIG1fV2lkdGgsIG1fSGVpZ2h0LCB0aGlzLCAwLCAwLCBwYWxfOGJwcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgaWYgKCFyZXQpIHsKQEAgLTEwNTQsNyArMTA1NCw3IEBACiAgICAgICAgIGlmIChkZXN0X2J1ZikgewogICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BBbHBoYU1hc2sgJiYgcEFscGhhTWFzayAhPSBtX3BBbHBoYU1hc2spIHsKICAgICAgICAgZGVsZXRlIG1fcEFscGhhTWFzazsKQEAgLTEwNjcsMTAgKzEwNjcsMTAgQEAKICAgICBpZiAoIW1fYkV4dEJ1ZikgewogICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CiAgICAgfQotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOworICAgIG1fYkV4dEJ1ZiA9IGZhbHNlOwogICAgIG1fcEJ1ZmZlciA9IGRlc3RfYnVmOwogICAgIG1fYnBwID0gKHVpbnQ4X3QpZGVzdF9mb3JtYXQ7CiAgICAgbV9BbHBoYUZsYWcgPSAodWludDhfdCkoZGVzdF9mb3JtYXQgPj4gOCk7CiAgICAgbV9QaXRjaCA9IGRlc3RfcGl0Y2g7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwCmluZGV4IDczOTBjNDMuLmYxNDNhYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwCkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICBtX1NyY0hlaWdodCA9IHBTcmNCaXRtYXAtPkdldEhlaWdodCgpOwogICAgIG1fU3JjUGl0Y2ggPSAobV9TcmNXaWR0aCAqIG1fU3JjQnBwICsgMzEpIC8gMzIgKiA0OwogICAgIGlmICgoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgPT0gMCkgewotICAgICAgICBGWF9CT09MIGJJbnRlcnBvbCA9IGZsYWdzICYgRlhESUJfSU5URVJQT0wgfHwgZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MOworICAgICAgICBib29sIGJJbnRlcnBvbCA9IGZsYWdzICYgRlhESUJfSU5URVJQT0wgfHwgZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MOwogICAgICAgICBpZiAoIWJJbnRlcnBvbCAmJiBGWFNZU19hYnMoZGVzdF93aWR0aCkgIT0gMCAmJiBGWFNZU19hYnMoZGVzdF9oZWlnaHQpIDwgbV9TcmNXaWR0aCAqIG1fU3JjSGVpZ2h0ICogOCAvIEZYU1lTX2FicyhkZXN0X3dpZHRoKSkgewogICAgICAgICAgICAgZmxhZ3MgPSBGWERJQl9JTlRFUlBPTDsKICAgICAgICAgfQpAQCAtMjgwLDE2ICsyODAsMTYgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgd2hpbGUgKG1fU3RhdGUgPT0gMSkgewogICAgICAgICBpZiAoQ29udGludWVTdHJldGNoSG9yeihwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1fU3RhdGUgPSAyOwogICAgICAgICBTdHJldGNoVmVydCgpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1N0cmV0Y2hFbmdpbmU6On5DU3RyZXRjaEVuZ2luZSgpCiB7CkBAIC0zMDYsNDYgKzMwNiw0NiBAQAogICAgICAgICBGWF9GcmVlKG1fcERlc3RNYXNrU2NhbmxpbmUpOwogICAgIH0KIH0KLUZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OlN0YXJ0U3RyZXRjaEhvcnooKQorYm9vbCBDU3RyZXRjaEVuZ2luZTo6U3RhcnRTdHJldGNoSG9yeigpCiB7CiAgICAgaWYgKG1fRGVzdFdpZHRoID09IDAgfHwgbV9wRGVzdFNjYW5saW5lID09IE5VTEwgfHwgbV9TcmNDbGlwLkhlaWdodCgpID4gKGludCkoKDFVIDw8IDI5KSAvIG1fSW50ZXJQaXRjaCkgfHwgbV9TcmNDbGlwLkhlaWdodCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcEludGVyQnVmID0gRlhfVHJ5QWxsb2ModW5zaWduZWQgY2hhciwgbV9TcmNDbGlwLkhlaWdodCgpICogbV9JbnRlclBpdGNoKTsKICAgICBpZiAobV9wSW50ZXJCdWYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fcFNvdXJjZSAmJiBtX2JIYXNBbHBoYSAmJiBtX3BTb3VyY2UtPm1fcEFscGhhTWFzaykgewogICAgICAgICBtX3BFeHRyYUFscGhhQnVmID0gRlhfQWxsb2MyRCh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCksIG1fRXh0cmFNYXNrUGl0Y2gpOwogICAgICAgICBGWF9EV09SRCBzaXplID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIDggKyAzMSkgLyAzMiAqIDQ7CiAgICAgICAgIG1fcERlc3RNYXNrU2NhbmxpbmUgPSBGWF9UcnlBbGxvYyh1bnNpZ25lZCBjaGFyLCBzaXplKTsKICAgICAgICAgaWYgKCFtX3BEZXN0TWFza1NjYW5saW5lKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgbV9XZWlnaHRUYWJsZS5DYWxjKG1fRGVzdFdpZHRoLCBtX0Rlc3RDbGlwLmxlZnQsIG1fRGVzdENsaXAucmlnaHQsIG1fU3JjV2lkdGgsIG1fU3JjQ2xpcC5sZWZ0LCBtX1NyY0NsaXAucmlnaHQsIG1fRmxhZ3MpOwogICAgIGlmIChtX1dlaWdodFRhYmxlLm1fcFdlaWdodFRhYmxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtX0N1clJvdyA9IG1fU3JjQ2xpcC50b3A7CiAgICAgbV9TdGF0ZSA9IDE7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAjZGVmaW5lIEZYX1NUUkVDSF9QQVVTRV9ST1dTCTEwCi1GWF9CT09MIENTdHJldGNoRW5naW5lOjpDb250aW51ZVN0cmV0Y2hIb3J6KElGWF9QYXVzZSogcFBhdXNlKQorYm9vbCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAoIW1fRGVzdFdpZHRoKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAobV9wU291cmNlLT5Ta2lwVG9TY2FubGluZShtX0N1clJvdywgcFBhdXNlKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBCcHAgPSBtX0Rlc3RCcHAgLyA4OwogICAgIGludCByb3dzX3RvX2dvID0gRlhfU1RSRUNIX1BBVVNFX1JPV1M7CiAgICAgZm9yICg7IG1fQ3VyUm93IDwgbV9TcmNDbGlwLmJvdHRvbTsgbV9DdXJSb3cgKyspIHsKICAgICAgICAgaWYgKHJvd3NfdG9fZ28gPT0gMCkgewogICAgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJvd3NfdG9fZ28gPSBGWF9TVFJFQ0hfUEFVU0VfUk9XUzsKICAgICAgICAgfQpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgcm93c190b19nbyAtLTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgQ1N0cmV0Y2hFbmdpbmU6OlN0cmV0Y2hWZXJ0KCkKIHsKQEAgLTY5Nyw3ICs2OTcsNyBAQAogICAgIH0KICAgICByZXR1cm4gZm9ybWF0OwogfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0KElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdCwKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiByZWN0LCBGWF9EV09SRCBmbGFncykKIHsKQEAgLTcyMiw3ICs3MjIsNyBAQAogICAgICAgICAgICAgcGFsW2ldID0gQXJnYkVuY29kZShhLCByLCBnLCBiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBwYWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHBTb3VyY2UtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBDbXlrICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSkgewogICAgICAgICBGWF9DTVlLIHBhbFsyNTZdOwpAQCAtNzM3LDE3ICs3MzcsMTcgQEAKICAgICAgICAgICAgIHBhbFtpXSA9IENteWtFbmNvZGUoYywgbSwgeSwgayk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwRGVzdC0+U2V0SW5mbyhyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIG1fRGVzdEZvcm1hdCwgcGFsKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghcERlc3QtPlNldEluZm8ocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoZmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSB7CiAgICAgICAgIHJldHVybiBTdGFydFF1aWNrU3RyZXRjaCgpOwogICAgIH0KICAgICByZXR1cm4gU3RhcnRTdHJldGNoKCk7CiB9Ci1GWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSB7CiAgICAgICAgIHJldHVybiBDb250aW51ZVF1aWNrU3RyZXRjaChwUGF1c2UpOwpAQCAtNzU1LDM5ICs3NTUsMzkgQEAKICAgICByZXR1cm4gQ29udGludWVTdHJldGNoKHBQYXVzZSk7CiB9CiAjZGVmaW5lIE1BWF9QUk9HUkVTU0lWRV9TVFJFVENIX1BJWEVMUwkxMDAwMDAwCi1GWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRTdHJldGNoKCkKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydFN0cmV0Y2goKQogewogICAgIG1fcFN0cmV0Y2hFbmdpbmUgPSBuZXcgQ1N0cmV0Y2hFbmdpbmUobV9wRGVzdCwgbV9EZXN0Rm9ybWF0LCBtX0Rlc3RXaWR0aCwgbV9EZXN0SGVpZ2h0LCBtX0NsaXBSZWN0LCBtX3BTb3VyY2UsIG1fRmxhZ3MpOwogICAgIG1fcFN0cmV0Y2hFbmdpbmUtPlN0YXJ0U3RyZXRjaEhvcnooKTsKICAgICBpZiAobV9wU291cmNlLT5HZXRXaWR0aCgpICogbV9wU291cmNlLT5HZXRIZWlnaHQoKSA8IE1BWF9QUk9HUkVTU0lWRV9TVFJFVENIX1BJWEVMUykgewogICAgICAgICBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShOVUxMKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgaWYgKG1fcFN0cmV0Y2hFbmdpbmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fcFN0cmV0Y2hFbmdpbmUtPkNvbnRpbnVlKHBQYXVzZSk7CiB9Ci1GWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRRdWlja1N0cmV0Y2goKQorYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkKIHsKLSAgICBtX2JGbGlwWCA9IEZBTFNFOwotICAgIG1fYkZsaXBZID0gRkFMU0U7CisgICAgbV9iRmxpcFggPSBmYWxzZTsKKyAgICBtX2JGbGlwWSA9IGZhbHNlOwogICAgIGlmIChtX0Rlc3RXaWR0aCA8IDApIHsKLSAgICAgICAgbV9iRmxpcFggPSBUUlVFOworICAgICAgICBtX2JGbGlwWCA9IHRydWU7CiAgICAgICAgIG1fRGVzdFdpZHRoID0gLW1fRGVzdFdpZHRoOwogICAgIH0KICAgICBpZiAobV9EZXN0SGVpZ2h0IDwgMCkgewotICAgICAgICBtX2JGbGlwWSA9IFRSVUU7CisgICAgICAgIG1fYkZsaXBZID0gdHJ1ZTsKICAgICAgICAgbV9EZXN0SGVpZ2h0ID0gLW1fRGVzdEhlaWdodDsKICAgICB9CiAgICAgbV9MaW5lSW5kZXggPSAwOwogICAgIEZYX0RXT1JEIHNpemUgPSBtX0NsaXBSZWN0LldpZHRoKCk7CiAgICAgaWYgKHNpemUgJiYgbV9EZXN0QlBQID4gKGludCkoSU5UX01BWCAvIHNpemUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzaXplICo9IG1fRGVzdEJQUDsKICAgICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIChzaXplIC8gOCArIDMpIC8gNCAqIDQpOwpAQCAtNzk2LDE0ICs3OTYsMTQgQEAKICAgICB9CiAgICAgaWYgKG1fcFNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkgPCBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKICAgICAgICAgQ29udGludWVRdWlja1N0cmV0Y2goTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9wU2NhbmxpbmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IHJlc3VsdF93aWR0aCA9IG1fQ2xpcFJlY3QuV2lkdGgoKSwgcmVzdWx0X2hlaWdodCA9IG1fQ2xpcFJlY3QuSGVpZ2h0KCk7CiAgICAgaW50IHNyY19oZWlnaHQgPSBtX3BTb3VyY2UtPkdldEhlaWdodCgpOwpAQCAtODIzLDcgKzgyMyw3IEBACiAgICAgICAgICAgICBzcmNfeSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUoc3JjX3ksIHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9wU291cmNlLT5Eb3duU2FtcGxlU2NhbmxpbmUoc3JjX3ksIG1fcFNjYW5saW5lLCBtX0Rlc3RCUFAsIG1fRGVzdFdpZHRoLCBtX2JGbGlwWCwgbV9DbGlwUmVjdC5sZWZ0LCByZXN1bHRfd2lkdGgpOwogICAgICAgICBpZiAobV9wTWFza1NjYW5saW5lKSB7CkBAIC04MzEsNSArODMxLDUgQEAKICAgICAgICAgfQogICAgICAgICBtX3BEZXN0LT5Db21wb3NlU2NhbmxpbmUoZGVzdF95LCBtX3BTY2FubGluZSwgbV9wTWFza1NjYW5saW5lKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcAppbmRleCA4YTg2NGYxLi5lZmQ4ODZlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgImRpYl9pbnQuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KLUZYX0JPT0wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqJiBwYWwsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwogdm9pZCBDbXlrRGVjb2RlKEZYX0RXT1JEIGNteWssIGludCYgYywgaW50JiBtLCBpbnQmIHksIGludCYgaykKIHsKQEAgLTUyLDM5ICs1MiwzOSBAQAogfQogQ0ZYX0RJQml0bWFwOjpDRlhfRElCaXRtYXAoKQogewotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOworICAgIG1fYkV4dEJ1ZiA9IGZhbHNlOwogICAgIG1fcEJ1ZmZlciA9IE5VTEw7CiAgICAgbV9wUGFsZXR0ZSA9IE5VTEw7CiB9CiAjZGVmaW5lIF9NQVhfT09NX0xJTUlUXwkxMjAwMDAwMAotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIHVpbnQ4X3QqIHBCdWZmZXIsIGludCBwaXRjaCkKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyLCBpbnQgcGl0Y2gpCiB7CiAgICAgbV9wQnVmZmVyID0gTlVMTDsKICAgICBtX2JwcCA9ICh1aW50OF90KWZvcm1hdDsKICAgICBtX0FscGhhRmxhZyA9ICh1aW50OF90KShmb3JtYXQgPj4gOCk7CiAgICAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gbV9QaXRjaCA9IDA7CiAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgcGl0Y2ggPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKElOVF9NQVggLSAzMSkgLyB3aWR0aCA8IChmb3JtYXQgJiAweGZmKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFwaXRjaCkgewogICAgICAgICBwaXRjaCA9ICh3aWR0aCAqIChmb3JtYXQgJiAweGZmKSArIDMxKSAvIDMyICogNDsKICAgICB9CiAgICAgaWYgKCgxIDw8IDMwKSAvIHBpdGNoIDwgaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAocEJ1ZmZlcikgewogICAgICAgICBtX3BCdWZmZXIgPSBwQnVmZmVyOwotICAgICAgICBtX2JFeHRCdWYgPSBUUlVFOworICAgICAgICBtX2JFeHRCdWYgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBzaXplID0gcGl0Y2ggKiBoZWlnaHQgKyA0OwogICAgICAgICBpbnQgb29tbGltaXQgPSBfTUFYX09PTV9MSU1JVF87CiAgICAgICAgIGlmIChvb21saW1pdCA+PSAwICYmIHNpemUgPj0gb29tbGltaXQpIHsKICAgICAgICAgICAgIG1fcEJ1ZmZlciA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIHNpemUpOwogICAgICAgICAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwpAQCAtOTQsMzMgKzk0LDMzIEBACiAgICAgbV9IZWlnaHQgPSBoZWlnaHQ7CiAgICAgbV9QaXRjaCA9IHBpdGNoOwogICAgIGlmIChIYXNBbHBoYSgpICYmIGZvcm1hdCAhPSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgICAgICAgYm9vbCByZXQgPSB0cnVlOwogICAgICAgICByZXQgPSBCdWlsZEFscGhhTWFzaygpOwogICAgICAgICBpZiAoIXJldCkgewogICAgICAgICAgICAgaWYgKCFtX2JFeHRCdWYgJiYgbV9wQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwogICAgICAgICAgICAgICAgIG1fcEJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICAgICAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gbV9QaXRjaCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpCitib29sIENGWF9ESUJpdG1hcDo6Q29weShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKQogewogICAgIGlmIChtX3BCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghQ3JlYXRlKHBTcmMtPkdldFdpZHRoKCksIHBTcmMtPkdldEhlaWdodCgpLCBwU3JjLT5HZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENvcHlQYWxldHRlKHBTcmMtPkdldFBhbGV0dGUoKSk7CiAgICAgQ29weUFscGhhTWFzayhwU3JjLT5tX3BBbHBoYU1hc2spOwogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBTcmMtPkdldEhlaWdodCgpOyByb3cgKyspIHsKICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIHBTcmMtPkdldFNjYW5saW5lKHJvdyksIG1fUGl0Y2gpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9ESUJpdG1hcDo6fkNGWF9ESUJpdG1hcCgpCiB7CkBAIC0yMTgsMTkgKzIxOCwxOSBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDRlhfRElCU291cmNlOjpCdWlsZEFscGhhTWFzaygpCitib29sIENGWF9ESUJTb3VyY2U6OkJ1aWxkQWxwaGFNYXNrKCkKIHsKICAgICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgbV9wQWxwaGFNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICBpZiAoIW1fcEFscGhhTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKICAgICAgICAgZGVsZXRlIG1fcEFscGhhTWFzazsKICAgICAgICAgbV9wQWxwaGFNYXNrID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEZYU1lTX21lbXNldChtX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpLCAweGZmLCBtX3BBbHBoYU1hc2stPkdldEhlaWdodCgpKm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBGWF9EV09SRCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlRW50cnkoaW50IGluZGV4KSBjb25zdAogewpAQCAtMzY3LDE1ICszNjcsMTUgQEAKICAgICB3aWR0aCA9IGRlc3RfcmVjdC5yaWdodCAtIGRlc3RfcmVjdC5sZWZ0OwogICAgIGhlaWdodCA9IGRlc3RfcmVjdC5ib3R0b20gLSBkZXN0X3JlY3QudG9wOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorYm9vbCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLCBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIE5VTEwpOwogICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7CiAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAobV9icHAgPT0gOCkgewogICAgICAgICAgICAgZGVzdF9mb3JtYXQgPSBGWERJQl84YnBwTWFzazsKQEAgLTQxMCwyNSArNDEwLDI1IEBACiAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gbV9wQnVmZmVyICsgZGVzdF90b3AgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogR2V0QlBQKCkgLyA4OwogICAgICAgICBGWF9EV09SRCogZF9wbHQgPSBOVUxMOwogICAgICAgICBpZighQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIG1fUGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BsdCwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCitib29sIENGWF9ESUJpdG1hcDo6VHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywgRlhfRFdPUkQgY29sb3IsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQVNTRVJUKEhhc0FscGhhKCkgJiYgKG1fYnBwID49IDI0KSk7CiAgICAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKICAgICBpZiAoIUhhc0FscGhhKCkgfHwgIXBNYXNrLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgMjQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBNYXNrLT5HZXRXaWR0aCgpLCBwTWFzay0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBzcmNfYnBwID0gcE1hc2stPkdldEJQUCgpOwogICAgIGludCBhbHBoYTsKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7CiAgICAgICAgIGVsc2UgaWYgKCEoYWxwaGFfZmxhZyA+PiA4KSAmJiBJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoIUlzQ215a0ltYWdlKCkpIHsKQEAgLTUwNyw3ICs1MDcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfRElCU291cmNlOjpDb3B5UGFsZXR0ZShjb25zdCBGWF9EV09SRCogcFNyYywgRlhfRFdPUkQgc2l6ZSkKIHsKQEAgLTU3MCwyMSArNTcwLDIxIEBACiAgICAgfQogICAgIHJldHVybiBwTWFzazsKIH0KLUZYX0JPT0wgQ0ZYX0RJQlNvdXJjZTo6Q29weUFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCkKK2Jvb2wgQ0ZYX0RJQlNvdXJjZTo6Q29weUFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCkKIHsKICAgICBpZiAoIUhhc0FscGhhKCkgfHwgR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBBbHBoYU1hc2spIHsKICAgICAgICAgRlhfUkVDVCByZWN0KDAsIDAsIHBBbHBoYU1hc2stPm1fV2lkdGgsIHBBbHBoYU1hc2stPm1fSGVpZ2h0KTsKICAgICAgICAgaWYgKHBDbGlwKSB7CiAgICAgICAgICAgICByZWN0LkludGVyc2VjdCgqcENsaXApOwogICAgICAgICAgICAgaWYgKHJlY3QuSXNFbXB0eSgpIHx8IHJlY3QuV2lkdGgoKSAhPSBtX1dpZHRoIHx8IHJlY3QuSGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHBBbHBoYU1hc2stPm1fV2lkdGggIT0gbV9XaWR0aCB8fCBwQWxwaGFNYXNrLT5tX0hlaWdodCAhPSBtX0hlaWdodCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykKQEAgLTU5MywyNSArNTkzLDI1IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbV9wQWxwaGFNYXNrLT5DbGVhcigweGZmMDAwMDAwKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjb25zdCBpbnQgZ19DaGFubmVsT2Zmc2V0W10gPSB7MCwgMiwgMSwgMCwgMCwgMSwgMiwgMywgM307Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKQorYm9vbCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCkKIHsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9ESUJTb3VyY2UqIHBTcmNDbG9uZSA9IChDRlhfRElCU291cmNlKilwU3JjQml0bWFwOwogICAgIENGWF9ESUJpdG1hcCogcERzdCA9IHRoaXM7CiAgICAgaW50IGRlc3RPZmZzZXQsIHNyY09mZnNldDsKICAgICBpZiAoc3JjQ2hhbm5lbCA9PSBGWERJQl9BbHBoYSkgewogICAgICAgICBpZiAoIXBTcmNCaXRtYXAtPkhhc0FscGhhKCkgJiYgIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewogICAgICAgICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCXzhicHBNYXNrKTsKICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewpAQCAtNjIxLDcgKzYyMSw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA8IDI0KSB7CiAgICAgICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewpAQCAtNjMwLDcgKzYzMCw3IEBACiAgICAgICAgICAgICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KChGWERJQl9Gb3JtYXQpKChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDE4KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHNyY09mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtzcmNDaGFubmVsXTsKQEAgLTY0MSw3ICs2NDEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVzdE9mZnNldCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CkBAIC02NTAsNyArNjUwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CiAgICAgICAgICAgICAgICAgZGVzdE9mZnNldCA9IDM7CkBAIC02NjEsNyArNjYxLDcgQEAKICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEdldEJQUCgpIDwgMjQpIHsKICAgICAgICAgICAgIGlmIChIYXNBbHBoYSgpKSB7CkBAIC02NjksNyArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZQogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwpAQCAtNjgwLDcgKzY4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZGVzdE9mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtkZXN0Q2hhbm5lbF07CkBAIC02OTQsNyArNjk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzEwLDcgKzcxMCw3IEBACiAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICB9CiAgICAgICAgIGlmIChwU3JjTWF0Y2hlZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcFNyY0Nsb25lID0gcFNyY01hdGNoZWQ7CiAgICAgfQpAQCAtNzMyLDI0ICs3MzIsMjQgQEAKICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXAgJiYgcFNyY0Nsb25lICE9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzaykgewogICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBpbnQgdmFsdWUpCitib29sIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGRlc3RPZmZzZXQ7CiAgICAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhKSB7CiAgICAgICAgIGlmIChJc0FscGhhTWFzaygpKSB7CiAgICAgICAgICAgICBpZighQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVzdE9mZnNldCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZXN0T2Zmc2V0ID0gMDsKICAgICAgICAgICAgIGlmKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CiAgICAgICAgICAgICAgICAgZGVzdE9mZnNldCA9IDM7CkBAIC03NTcsMjEgKzc1NywyMSBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoR2V0QlBQKCkgPCAyNCkgewogICAgICAgICAgICAgaWYgKEhhc0FscGhhKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlCiAjaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCiAgICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAjZWxzZQogICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNzgwLDExICs3ODAsMTEgQEAKICAgICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwogICAgIGlmIChCcHAgPT0gMSkgewogICAgICAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCB2YWx1ZSwgbV9IZWlnaHQgKiBtX1BpdGNoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7CiAgICAgICAgIEZYU1lTX21lbXNldChtX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpLCB2YWx1ZSwgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSptX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgdWludDhfdCogc2Nhbl9saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIGRlc3RPZmZzZXQ7CkBAIC03OTMsMTYgKzc5MywxNiBAQAogICAgICAgICAgICAgc2Nhbl9saW5lICs9IEJwcDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpNdWx0aXBseUFscGhhKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXApCitib29sIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQVNTRVJUKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwogICAgIGlmICghcFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFJc0FscGhhTWFzaygpICYmICFIYXNBbHBoYSgpKSB7CiAgICAgICAgIHJldHVybiBMb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgcFNyY0JpdG1hcCwgRlhESUJfQWxwaGEpOwpAQCAtODEyLDcgKzgxMiw3IEBACiAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7CiAgICAgICAgIEFTU0VSVChwU3JjQ2xvbmUgIT0gTlVMTCk7CiAgICAgICAgIGlmIChwU3JjQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChJc0FscGhhTWFzaygpKSB7CkBAIC04MjAsNyArODIwLDcgQEAKICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewogICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgbV9QaXRjaCAqIHJvdzsKQEAgLTg0NCw3ICs4NDQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIG1fUGl0Y2ggKiByb3cgKyAzOwpAQCAtODYxLDE3ICs4NjEsMTcgQEAKICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6R2V0R3JheURhdGEodm9pZCogcEljY1RyYW5zZm9ybSkKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewogICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKICAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXlbMl07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7CkBAIC04ODMsNyArODgzLDcgQEAKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQocE1hc2stPkdldEJ1ZmZlcigpLCBncmF5WzBdLCBwTWFzay0+R2V0UGl0Y2goKSAqIG1fSGVpZ2h0KTsKICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CkBAIC05MDIsNyArOTAyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7CiAgICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdWludDhfdCBncmF5WzI1Nl07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKQEAgLTkxNCw3ICs5MTQsNyBAQAogICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBwTWFzay0+R2V0QnVmZmVyKCkgKyByb3cgKiBwTWFzay0+R2V0UGl0Y2goKTsKQEAgLTkzMSw3ICs5MzEsNyBAQAogICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CkBAIC05NDksNyArOTQ5LDcgQEAKICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKICAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwpAQCAtOTY0LDE5ICs5NjQsMTkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpCitib29sIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7CiAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6CiAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDA0LDE4ICsxMDA0LDE4IEBACiAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoSXNDbXlrSW1hZ2UoKSkgewogICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdCgoRlhESUJfRm9ybWF0KShHZXRGb3JtYXQoKSB8IDB4MDIwMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogRlhfRFdPUkQgQ0ZYX0RJQml0bWFwOjpHZXRQaXhlbChpbnQgeCwgaW50IHkpIGNvbnN0CiB7CkBAIC0xMTIyLDcgKzExMjIsNyBAQAogICAgIH0KIH0KIHZvaWQgQ0ZYX0RJQml0bWFwOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgYm9vbCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAogewogICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xMTc5LDE1ICsxMTc5LDE1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLCBGWF9EV09SRCBiYWNrY29sb3IpCitib29sIENGWF9ESUJpdG1hcDo6Q29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLCBGWF9EV09SRCBiYWNrY29sb3IpCiB7CiAgICAgQVNTRVJUKCFJc0FscGhhTWFzaygpKTsKICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgSXNBbHBoYU1hc2soKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaW50IGZjLCBmbSwgZnksIGZrLCBiYywgYm0sIGJ5LCBiazsKICAgICBpbnQgZnIsIGZnLCBmYiwgYnIsIGJnLCBiYjsKLSAgICBGWF9CT09MIGlzQ215a0ltYWdlID0gSXNDbXlrSW1hZ2UoKTsKKyAgICBib29sIGlzQ215a0ltYWdlID0gSXNDbXlrSW1hZ2UoKTsKICAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKICAgICAgICAgZmMgPSBGWFNZU19HZXRDVmFsdWUoZm9yZWNvbG9yKTsKICAgICAgICAgZm0gPSBGWFNZU19HZXRNVmFsdWUoZm9yZWNvbG9yKTsKQEAgLTEyMDgsMTAgKzEyMDgsMTAgQEAKICAgICBpZiAobV9icHAgPD0gOCkgewogICAgICAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKICAgICAgICAgICAgIGlmIChmb3JlY29sb3IgPT0gMHhmZiAmJiBiYWNrY29sb3IgPT0gMCAmJiBtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChmb3JlY29sb3IgPT0gMCAmJiBiYWNrY29sb3IgPT0gMHhmZmZmZmYgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKICAgICAgICAgICAgIEJ1aWxkUGFsZXR0ZSgpOwpAQCAtMTIzMiw3ICsxMjMyLDcgQEAKICAgICAgICAgICAgICAgICBtX3BQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgYnIgKyAoZnIgLSBicikgKiBncmF5IC8gMjU1LCBiZyArIChmZyAtIGJnKSAqIGdyYXkgLyAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiICsgKGZiIC0gYmIpICogZ3JheSAvIDI1NSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGlzQ215a0ltYWdlKSB7CiAgICAgICAgIGlmIChmb3JlY29sb3IgPT0gMHhmZiAmJiBiYWNrY29sb3IgPT0gMHgwMCkgewpAQCAtMTI0OCw3ICsxMjQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gMjU1IC0gRlhSR0IyR1JBWShyLCBnLCBiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChmb3JlY29sb3IgPT0gMCAmJiBiYWNrY29sb3IgPT0gMHhmZmZmZmYpIHsKICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewpAQCAtMTI2Miw3ICsxMjYyLDcgQEAKICAgICAgICAgICAgICAgICBzY2FubGluZSArPSBnYXA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewpAQCAtMTI5MSwxOCArMTI5MSwxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkRpdGhlckZTKGNvbnN0IEZYX0RXT1JEKiBwUGFsZXR0ZSwgaW50IHBhbF9zaXplLCBjb25zdCBGWF9SRUNUKiBwUmVjdCkKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpEaXRoZXJGUyhjb25zdCBGWF9EV09SRCogcFBhbGV0dGUsIGludCBwYWxfc2l6ZSwgY29uc3QgRlhfUkVDVCogcFJlY3QpCiB7CiAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9icHAgIT0gOCAmJiBtX3BQYWxldHRlICE9IE5VTEwgJiYgbV9BbHBoYUZsYWcgIT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fV2lkdGggPCA0ICYmIG1fSGVpZ2h0IDwgNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKICAgICBpZiAocFJlY3QpIHsKQEAgLTEzNzQsOSArMTM3NCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1DRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkZsaXBJbWFnZShGWF9CT09MIGJYRmxpcCwgRlhfQk9PTCBiWUZsaXApIGNvbnN0CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkZsaXBJbWFnZShib29sIGJYRmxpcCwgYm9vbCBiWUZsaXApIGNvbnN0CiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwRmxpcHBlZCA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgaWYgKCFwRmxpcHBlZC0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBHZXRGb3JtYXQoKSkpIHsKQEAgLTE0ODAsNyArMTQ4MCw3IEBACiAgICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwogICAgIH0KIH0KLXZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKQordm9pZCBDRlhfRmlsdGVyZWRESUI6OkxvYWRTcmMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgYm9vbCBiQXV0b0Ryb3BTcmMpCiB7CiAgICAgbV9wU3JjID0gcFNyYzsKICAgICBtX2JBdXRvRHJvcFNyYyA9IGJBdXRvRHJvcFNyYzsKQEAgLTE0OTksNyArMTQ5OSw3IEBACiAgICAgcmV0dXJuIG1fcFNjYW5saW5lOwogfQogdm9pZCBDRlhfRmlsdGVyZWRESUI6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0CisgICAgICAgIGludCBkZXN0X3dpZHRoLCBib29sIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0CiB7CiAgICAgbV9wU3JjLT5Eb3duU2FtcGxlU2NhbmxpbmUobGluZSwgZGVzdF9zY2FuLCBkZXN0X2JwcCwgZGVzdF93aWR0aCwgYkZsaXBYLCBjbGlwX2xlZnQsIGNsaXBfd2lkdGgpOwogICAgIFRyYW5zbGF0ZURvd25TYW1wbGVzKGRlc3Rfc2NhbiwgZGVzdF9zY2FuLCBjbGlwX3dpZHRoLCBkZXN0X2JwcCk7CkBAIC0xNTA4LDE4ICsxNTA4LDE4IEBACiB7CiAgICAgbV9TdGF0dXMgPSAwOwogICAgIG1fcFRyYW5zZm9ybWVyID0gTlVMTDsKLSAgICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKKyAgICBtX2JSZ2JCeXRlT3JkZXIgPSBmYWxzZTsKICAgICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKIH0KIENGWF9JbWFnZVJlbmRlcmVyOjp+Q0ZYX0ltYWdlUmVuZGVyZXIoKQogewogICAgIGRlbGV0ZSBtX3BUcmFuc2Zvcm1lcjsKIH0KLWV4dGVybiBGWF9SRUNUIF9GWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0JPT0wgYkZsaXBYLCBGWF9CT09MIGJGbGlwWSk7Ci1GWF9CT09MIENGWF9JbWFnZVJlbmRlcmVyOjpTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKK2V4dGVybiBGWF9SRUNUIF9GWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgYkZsaXBYLCBib29sIGJGbGlwWSk7Citib29sIENGWF9JbWFnZVJlbmRlcmVyOjpTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkaWJfZmxhZ3MsIGJvb2wgYlJnYkJ5dGVPcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBtX01hdHJpeCA9ICpwTWF0cml4OwpAQCAtMTUyOCw3ICsxNTI4LDcgQEAKICAgICBtX0NsaXBCb3ggPSBwQ2xpcFJnbiA/IHBDbGlwUmduLT5HZXRCb3goKSA6IEZYX1JFQ1QoMCwgMCwgcERldmljZS0+R2V0V2lkdGgoKSwgcERldmljZS0+R2V0SGVpZ2h0KCkpOwogICAgIG1fQ2xpcEJveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CiAgICAgaWYgKG1fQ2xpcEJveC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcERldmljZSA9IHBEZXZpY2U7CiAgICAgbV9wQ2xpcFJnbiA9IHBDbGlwUmduOwpAQCAtMTU0MCw3ICsxNTQwLDcgQEAKICAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwogICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CiAgICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgICBib29sIHJldCA9IHRydWU7CiAgICAgaWYgKChGWFNZU19mYWJzKG1fTWF0cml4LmIpID49IDAuNWYgfHwgbV9NYXRyaXguYSA9PSAwKSB8fAogICAgICAgICAgICAgKEZYU1lTX2ZhYnMobV9NYXRyaXguYykgPj0gMC41ZiB8fCBtX01hdHJpeC5kID09IDApICkgewogICAgICAgICBpZiAoRlhTWVNfZmFicyhtX01hdHJpeC5hKSA8IEZYU1lTX2ZhYnMobV9NYXRyaXguYikgLyAyMCAmJiBGWFNZU19mYWJzKG1fTWF0cml4LmQpIDwgRlhTWVNfZmFicyhtX01hdHJpeC5jKSAvIDIwICYmCkBAIC0xNTUwLDE4ICsxNTUwLDE4IEBACiAgICAgICAgICAgICBGWF9SRUNUIGJpdG1hcF9jbGlwID0gbV9DbGlwQm94OwogICAgICAgICAgICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CiAgICAgICAgICAgICBiaXRtYXBfY2xpcCA9IF9GWERJQl9Td2FwQ2xpcEJveChiaXRtYXBfY2xpcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fTWF0cml4LmMgPiAwLCBtX01hdHJpeC5iIDwgMCk7Ci0gICAgICAgICAgICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LCBUUlVFLAorICAgICAgICAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsIG1fQ2xpcEJveCwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDAsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOwogICAgICAgICAgICAgaWYgKCFtX1N0cmV0Y2hlci5TdGFydCgmbV9Db21wb3NlciwgcFNvdXJjZSwgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIGJpdG1hcF9jbGlwLCBkaWJfZmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fU3RhdHVzID0gMTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbV9TdGF0dXMgPSAyOwogICAgICAgICBtX3BUcmFuc2Zvcm1lciA9IG5ldyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKICAgICAgICAgbV9wVHJhbnNmb3JtZXItPlN0YXJ0KHBTb3VyY2UsICZtX01hdHJpeCwgZGliX2ZsYWdzLCAmbV9DbGlwQm94KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpbnQgZGVzdF93aWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsKICAgICBpZiAobV9NYXRyaXguYSA8IDApIHsKQEAgLTE1NzIsMzIgKzE1NzIsMzIgQEAKICAgICAgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CiAgICAgfQogICAgIGlmIChkZXN0X3dpZHRoID09IDAgfHwgZGVzdF9oZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKICAgICBiaXRtYXBfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKICAgICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKICAgICBtX1N0YXR1cyA9IDE7CiAgICAgcmV0ID0gbV9TdHJldGNoZXIuU3RhcnQoJm1fQ29tcG9zZXIsIHBTb3VyY2UsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBiaXRtYXBfY2xpcCwgZGliX2ZsYWdzKTsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCitib29sIENGWF9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBpZiAobV9TdGF0dXMgPT0gMSkgewogICAgICAgICByZXR1cm4gbV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDIpIHsKICAgICAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcFRyYW5zZm9ybWVyLT5tX1N0b3Jlci5EZXRhY2goKTsKICAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewogICAgICAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7CkBAIC0xNjE4LDkgKzE2MTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBCaXRtYXAsIDAsIDAsIG1fQmxlbmRUeXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIG1fcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ0ZYX0JpdG1hcFN0b3Jlcjo6Q0ZYX0JpdG1hcFN0b3JlcigpCiB7CkBAIC0xNjUzLDE2ICsxNjUzLDE2IEBACiAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X2FscGhhX2J1Ziwgc2Nhbl9leHRyYV9hbHBoYSwgbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX0JpdG1hcFN0b3Jlcjo6U2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpCitib29sIENGWF9CaXRtYXBTdG9yZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQogewogICAgIG1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CiAgICAgaWYgKCFtX3BCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBzcmNfZm9ybWF0KSkgewogICAgICAgICBkZWxldGUgbV9wQml0bWFwOwogICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBTcmNQYWxldHRlKSB7CiAgICAgICAgIG1fcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyY1BhbGV0dGUpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKaW5kZXggZTM0ZTcxNS4uMDFiYzE2NyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgICAgeTEgLz0gYmFzZTsKICAgICB9CiB9OwotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpTd2FwWFkoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwLCBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApIGNvbnN0CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OlN3YXBYWShib29sIGJYRmxpcCwgYm9vbCBiWUZsaXAsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkgY29uc3QKIHsKICAgICBGWF9SRUNUIGRlc3RfY2xpcCgwLCAwLCBtX0hlaWdodCwgbV9XaWR0aCk7CiAgICAgaWYgKHBEZXN0Q2xpcCkgewpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgcmV0dXJuIHBUcmFuc0JpdG1hcDsKIH0KICNkZWZpbmUgRklYMTZfMDA1IDAuMDVmCi1GWF9SRUNUIF9GWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0JPT0wgYkZsaXBYLCBGWF9CT09MIGJGbGlwWSkKK0ZYX1JFQ1QgX0ZYRElCX1N3YXBDbGlwQm94KEZYX1JFQ1QmIGNsaXAsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBiRmxpcFgsIGJvb2wgYkZsaXBZKQogewogICAgIEZYX1JFQ1QgcmVjdDsKICAgICBpZiAoYkZsaXBZKSB7CkBAIC0yMDYsNyArMjA2LDcgQEAKIENGWF9JbWFnZVRyYW5zZm9ybWVyOjp+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKQogewogfQotRlhfQk9PTCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6U3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERlc3RNYXRyaXgsIGludCBmbGFncywgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKQorYm9vbCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6U3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERlc3RNYXRyaXgsIGludCBmbGFncywgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKQogewogICAgIG1fcE1hdHJpeCA9IChDRlhfQWZmaW5lTWF0cml4KilwRGVzdE1hdHJpeDsKICAgICBDRlhfRmxvYXRSZWN0IHVuaXRfcmVjdCA9IHBEZXN0TWF0cml4LT5HZXRVbml0UmVjdCgpOwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgICAgIHJlc3VsdF9jbGlwLkludGVyc2VjdCgqcERlc3RDbGlwKTsKICAgICB9CiAgICAgaWYgKHJlc3VsdF9jbGlwLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbV9SZXN1bHRMZWZ0ID0gcmVzdWx0X2NsaXAubGVmdDsKICAgICBtX1Jlc3VsdFRvcCA9IHJlc3VsdF9jbGlwLnRvcDsKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgICAgICByZXN1bHRfY2xpcCA9IF9GWERJQl9Td2FwQ2xpcEJveChyZXN1bHRfY2xpcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBEZXN0TWF0cml4LT5jID4gMCwgcERlc3RNYXRyaXgtPmIgPCAwKTsKICAgICAgICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBkZXN0X2hlaWdodCwgZGVzdF93aWR0aCwgcmVzdWx0X2NsaXAsIGZsYWdzKTsKICAgICAgICAgbV9TdGF0dXMgPSAxOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmIChGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5iKSA8IEZJWDE2XzAwNSAmJiBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5jKSA8IEZJWDE2XzAwNSkgewogICAgICAgICBpbnQgZGVzdF93aWR0aCA9IHBEZXN0TWF0cml4LT5hID4gMCA/IChpbnQpRlhTWVNfY2VpbChwRGVzdE1hdHJpeC0+YSkgOiAoaW50KUZYU1lTX2Zsb29yKHBEZXN0TWF0cml4LT5hKTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgICByZXN1bHRfY2xpcC5PZmZzZXQoLXJlc3VsdF9yZWN0LmxlZnQsIC1yZXN1bHRfcmVjdC50b3ApOwogICAgICAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZXN1bHRfY2xpcCwgZmxhZ3MpOwogICAgICAgICBtX1N0YXR1cyA9IDI7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaW50IHN0cmV0Y2hfd2lkdGggPSAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmEsIHBEZXN0TWF0cml4LT5iKSk7CiAgICAgaW50IHN0cmV0Y2hfaGVpZ2h0ID0gKGludClGWFNZU19jZWlsKEZYU1lTX3NxcnQyKHBEZXN0TWF0cml4LT5jLCBwRGVzdE1hdHJpeC0+ZCkpOwpAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgbV9TdHJldGNoQ2xpcC5JbnRlcnNlY3QoMCwgMCwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOwogICAgIG1fU3RyZXRjaGVyLlN0YXJ0KCZtX1N0b3JlciwgcFNyYywgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQsIG1fU3RyZXRjaENsaXAsIGZsYWdzKTsKICAgICBtX1N0YXR1cyA9IDM7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB1aW50OF90IF9iaWxpbmVhcl9pbnRlcnBvbChjb25zdCB1aW50OF90KiBidWYsIGludCByb3dfb2Zmc2V0X2wsIGludCByb3dfb2Zmc2V0X3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBpbnQgc3JjX2NvbF9yLCBpbnQgcmVzX3gsIGludCByZXNfeSwKQEAgLTMzNSwzMCArMzM1LDMwIEBACiAgICAgfQogICAgIHJldHVybiBmb3JtYXQ7CiB9Ci1GWF9CT09MIENGWF9JbWFnZVRyYW5zZm9ybWVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIGlmIChtX1N0YXR1cyA9PSAxKSB7CiAgICAgICAgIGlmIChtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSkgewogICAgICAgICAgICAgbV9TdG9yZXIuUmVwbGFjZShtX1N0b3Jlci5HZXRCaXRtYXAoKS0+U3dhcFhZKG1fcE1hdHJpeC0+YyA+IDAsIG1fcE1hdHJpeC0+YiA8IDApKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fU3RhdHVzID09IDIpIHsKICAgICAgICAgcmV0dXJuIG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSk7CiAgICAgfQogICAgIGlmIChtX1N0YXR1cyAhPSAzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGludCBzdHJldGNoX3dpZHRoID0gbV9TdHJldGNoQ2xpcC5XaWR0aCgpOwogICAgIGludCBzdHJldGNoX2hlaWdodCA9IG1fU3RyZXRjaENsaXAuSGVpZ2h0KCk7CiAgICAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldEJ1ZmZlcigpOwogICAgIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmX21hc2sgPSBOVUxMOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAgICAgRlhESUJfRm9ybWF0IHRyYW5zZm9ybUYgPSBfR2V0VHJhbnNmb3JtZWRGb3JtYXQobV9TdHJldGNoZXIubV9wU291cmNlKTsKICAgICBpZiAoIXBUcmFuc2Zvcm1lZC0+Q3JlYXRlKG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0LCB0cmFuc2Zvcm1GKSkgewogICAgICAgICBkZWxldGUgcFRyYW5zZm9ybWVkOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcFRyYW5zZm9ybWVkLT5DbGVhcigwKTsKICAgICBpZiAocFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2spIHsKQEAgLTY0MSw3ICs2NDEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkhhc0FscGhhID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkhhc0FscGhhKCk7CisgICAgICAgICAgICBib29sIGJIYXNBbHBoYSA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5IYXNBbHBoYSgpOwogICAgICAgICAgICAgaW50IGRlc3RCcHAgPSBwVHJhbnNmb3JtZWQtPkdldEJQUCgpIC8gODsKICAgICAgICAgICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJiAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgewogICAgICAgICAgICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwpAQCAtNzg2LDUgKzc4Niw1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbV9TdG9yZXIuUmVwbGFjZShwVHJhbnNmb3JtZWQpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAKaW5kZXggMGJhYTk5Yy4uZWNkZDFiMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZGV2aWNlLmNwcApAQCAtMzUsNyArMzUsNyBAQAogICAgICAgICBtX0NsaXBCb3guYm90dG9tID0gbV9IZWlnaHQ7CiAgICAgfQogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydFJlbmRlcmluZygpCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0UmVuZGVyaW5nKCkKIHsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdGFydFJlbmRlcmluZygpOwogfQpAQCAtNDcsNyArNDcsNyBAQAogewogICAgIG1fcERldmljZURyaXZlci0+U2F2ZVN0YXRlKCk7CiB9Ci12b2lkIENGWF9SZW5kZXJEZXZpY2U6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpCit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OlJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpCiB7CiAgICAgbV9wRGV2aWNlRHJpdmVyLT5SZXN0b3JlU3RhdGUoYktlZXBTYXZlZCk7CiAgICAgVXBkYXRlQ2xpcEJveCgpOwpAQCAtNjAsNyArNjAsNyBAQAogewogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldENUTSgpOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdAogewogICAgIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSB7CiAgICAgICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9DbXlrYSA6IEZYRElCX0NteWspOwpAQCAtNzQsMzcgKzc0LDM3IEBACiAgICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX09VVFBVVCA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IpOwogI2VuZGlmCiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aEZpbGwocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgZmlsbF9tb2RlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgVXBkYXRlQ2xpcEJveCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5TZXRDbGlwX1BhdGhTdHJva2UocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBVcGRhdGVDbGlwQm94KCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCkKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KQogewogICAgIENGWF9QYXRoRGF0YSBwYXRoOwogICAgIHBhdGguQXBwZW5kUmVjdCgoRlhfRkxPQVQpKHBSZWN0LT5sZWZ0KSwgKEZYX0ZMT0FUKShwUmVjdC0+Ym90dG9tKSwgKEZYX0ZMT0FUKShwUmVjdC0+cmlnaHQpLCAoRlhfRkxPQVQpKHBSZWN0LT50b3ApKTsKICAgICBpZiAoIVNldENsaXBfUGF0aEZpbGwoJnBhdGgsIE5VTEwsIEZYRklMTF9XSU5ESU5HKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgVXBkYXRlQ2xpcEJveCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpVcGRhdGVDbGlwQm94KCkKIHsKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgIG1fQ2xpcEJveC5yaWdodCA9IG1fV2lkdGg7CiAgICAgbV9DbGlwQm94LmJvdHRvbSA9IG1fSGVpZ2h0OwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBGWF9EV09SRCBzdHJva2VfY29sb3IsIGludCBmaWxsX21vZGUsCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICAgIHkyID0gcFBvaW50c1sxXS5tX1BvaW50WTsKICAgICAgICAgfQogICAgICAgICBEcmF3Q29zbWV0aWNMaW5lKHgxLCB5MSwgeDIsIHkyLCBmaWxsX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICgocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSAmJiBzdHJva2VfYWxwaGEgPT0gMCkgewogICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RfZjsKQEAgLTE4NCwxMyArMTg0LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKEZpbGxSZWN0KCZyZWN0X2ksIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYoKGZpbGxfbW9kZSAmIDMpICYmIHN0cm9rZV9hbHBoYSA9PSAwICYmICEoZmlsbF9tb2RlICYgRlhfRklMTF9TVFJPS0UpICYmICEoZmlsbF9tb2RlICYgRlhfRklMTF9URVhUX01PREUpKSB7CiAgICAgICAgIENGWF9QYXRoRGF0YSBuZXdQYXRoOwotICAgICAgICBGWF9CT09MIGJUaGluID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlRoaW4gPSBmYWxzZTsKICAgICAgICAgaWYgKHBQYXRoRGF0YS0+R2V0WmVyb0FyZWFQYXRoKG5ld1BhdGgsIChDRlhfTWF0cml4KilwT2JqZWN0MkRldmljZSwgYlRoaW4sIG1fcERldmljZURyaXZlci0+R2V0RHJpdmVyVHlwZSgpKSkgewogICAgICAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGU7CiAgICAgICAgICAgICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gMC4wZjsKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgIH0KICAgICBpZiAoKGZpbGxfbW9kZSAmIDMpICYmIGZpbGxfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMHhmZiAmJiAoZmlsbF9tb2RlICYgRlhfRklMTF9TVFJPS0UpKSB7CiAgICAgICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94OwogICAgICAgICBpZiAocEdyYXBoU3RhdGUpIHsKQEAgLTIzMiwxOSArMjMyLDE5IEBACiAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IGJib3guR2V0T3V0dGVyUmVjdCgpOwogICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwLCBCYWNrZHJvcDsKICAgICAgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIGZTY2FsZVgpLCBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJpdG1hcC5IYXNBbHBoYSgpKSB7CiAgICAgICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7CiAgICAgICAgICAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBOVUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOwogICAgICAgICB9CiAgICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UuQXR0YWNoKCZiaXRtYXAsIDAsIEZBTFNFLCAmQmFja2Ryb3AsIFRSVUUpOworICAgICAgICBiaXRtYXBfZGV2aWNlLkF0dGFjaCgmYml0bWFwLCAwLCBmYWxzZSwgJkJhY2tkcm9wLCB0cnVlKTsKICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CiAgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewogICAgICAgICAgICAgbWF0cml4ID0gKnBPYmplY3QyRGV2aWNlOwpAQCAtMjUyLDUxICsyNTIsNTEgQEAKICAgICAgICAgbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKICAgICAgICAgbWF0cml4LkNvbmNhdChmU2NhbGVYLCAwLCAwLCBmU2NhbGVZLCAwLCAwKTsKICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkdldERldmljZURyaXZlcigpLT5EcmF3UGF0aChwUGF0aERhdGEsICZtYXRyaXgsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIGZTY2FsZVgpLCBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpOwogICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCByZWN0LmxlZnQsIHJlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOwogICAgIH0KICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKG1fcERldmljZURyaXZlci0+U2V0UGl4ZWwoeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgRlhfUkVDVCByZWN0KHgsIHksIHggKyAxLCB5ICsgMSk7CiAgICAgcmV0dXJuIEZpbGxSZWN0KCZyZWN0LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CiAgICAgaWYgKG1fcERldmljZURyaXZlci0+RmlsbFJlY3QocFJlY3QsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7CiAgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKCZiaXRtYXAsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlUmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKTsKICAgICBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cygmYml0bWFwLCAwLCAmc3JjX3JlY3QsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgIGludCBmaWxsX21vZGUsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoKChtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX1BBVEgpICYmCiAgICAgICAgICAgICAoRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSAmJiBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA9PSAweGZmKSkgfHwKICAgICAgICAgICAgIGNvbG9yID49IDB4ZmYwMDAwMDApCiAgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdDb3NtZXRpY0xpbmUoeDEsIHkxLCB4MiwgeTIsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaF9zdGF0ZTsKICAgICBDRlhfUGF0aERhdGEgcGF0aDsKQEAgLTMwNSwxMCArMzA1LDEwIEBACiAgICAgcGF0aC5TZXRQb2ludCgxLCB4MiwgeTIsIEZYUFRfTElORVRPKTsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmcGF0aCwgTlVMTCwgJmdyYXBoX3N0YXRlLCAwLCBjb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKIH0KQEAgLTMxNiw3ICszMTYsNyBAQAogewogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldEJhY2tEcm9wKCk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX21vZGUsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEFTU0VSVCghcEJpdG1hcC0+SXNBbHBoYU1hc2soKSk7CkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIEZYU1lTX3JvdW5kKGxlZnQgKyBwQml0bWFwLT5HZXRXaWR0aCgpIC8gZlNjYWxlWCksIEZYU1lTX3JvdW5kKHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpIC8gZlNjYWxlWSkpOwogICAgIGRlc3RfcmVjdC5JbnRlcnNlY3QobV9DbGlwQm94KTsKICAgICBpZiAoZGVzdF9yZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1JFQ1Qgc3JjX3JlY3QoZGVzdF9yZWN0LmxlZnQgLSBsZWZ0LCBkZXN0X3JlY3QudG9wIC0gdG9wLAogICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LmxlZnQgLSBsZWZ0ICsgZGVzdF9yZWN0LldpZHRoKCksIGRlc3RfcmVjdC50b3AgLSB0b3AgKyBkZXN0X3JlY3QuSGVpZ2h0KCkpOwpAQCAtMzM3LDI5ICszMzcsMjkgQEAKICAgICBpZiAoKGJsZW5kX21vZGUgIT0gRlhESUJfQkxFTkRfTk9STUFMICYmICEobV9SZW5kZXJDYXBzICYgRlhSQ19CTEVORF9NT0RFKSkgfHwKICAgICAgICAgICAgIChwQml0bWFwLT5IYXNBbHBoYSgpICYmICEobV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9JTUFHRSkpKSB7CiAgICAgICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50IGJnX3BpeGVsX3dpZHRoID0gRlhTWVNfcm91bmQoZGVzdF9yZWN0LldpZHRoKCkgKiBmU2NhbGVYKTsKICAgICAgICAgaW50IGJnX3BpeGVsX2hlaWdodCA9IEZYU1lTX3JvdW5kKGRlc3RfcmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpOwogICAgICAgICBDRlhfRElCaXRtYXAgYmFja2dyb3VuZDsKICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZShiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKCZiYWNrZ3JvdW5kLCBkZXN0X3JlY3QubGVmdCwgZGVzdF9yZWN0LnRvcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWJhY2tncm91bmQuQ29tcG9zaXRlQml0bWFwKDAsIDAsIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcCwgc3JjX3JlY3QubGVmdCwgc3JjX3JlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUsIE5VTEwsIEZBTFNFLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUsIE5VTEwsIGZhbHNlLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCk7CiAgICAgICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cygmYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBkZXN0X3JlY3QubGVmdCwgZGVzdF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKICAgICB9CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIGJsZW5kX21vZGUsIDAsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF9tb2RlKQogewpAQCAtMzY3LDE3ICszNjcsMTcgQEAKICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9DbGlwQm94OwogICAgIGNsaXBfYm94LkludGVyc2VjdChkZXN0X3JlY3QpOwogICAgIGlmIChjbGlwX2JveC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIDAsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIDAsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX21vZGUpOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9EV09SRCBhcmdiLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9EV09SRCBhcmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCBhcmdiLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC0zODYsMTMgKzM4NiwxMyBAQAogICAgIGNsaXBfYm94LkludGVyc2VjdChkZXN0X3JlY3QpOwogICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlN0cmV0Y2hESUJpdHMocEJpdG1hcCwgYXJnYiwgbGVmdCwgdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgJmNsaXBfYm94LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX21vZGUpCiB7CiAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRESUJpdHMocEJpdG1hcCwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LCBmbGFncywgaGFuZGxlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF9tb2RlKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6Q29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6Q29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5Db250aW51ZURJQml0cyhoYW5kbGUsIHBQYXVzZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcAppbmRleCA2YTk1MGJmLi43YTVlMGNjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAKQEAgLTEzLDggKzEzLDggQEAKIHsKICAgICBtX3BTdWJzdEZvbnQgPSBOVUxMOwogICAgIG1fRmFjZSA9IE5VTEw7Ci0gICAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKLSAgICBtX2JWZXJ0aWNhbCA9IEZBTFNFOworICAgIG1fYkVtYmVkZGVkID0gZmFsc2U7CisgICAgbV9iVmVydGljYWwgPSBmYWxzZTsKICAgICBtX3BGb250RGF0YSA9IE5VTEw7CiAgICAgbV9wRm9udERhdGFBbGxvY2F0aW9uID0gTlVMTDsKICAgICBtX2R3U2l6ZSA9IDA7CkBAIC0yNCw3ICsyNCw3IEBACiAgICAgbV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbiA9IE5VTEw7CiAgICAgbV9wRHdGb250ID0gTlVMTDsKICAgICBtX2hIYW5kbGUgPSBOVUxMOwotICAgIG1fYkR3TG9hZGVkID0gRkFMU0U7CisgICAgbV9iRHdMb2FkZWQgPSBmYWxzZTsKIH0KIENGWF9Gb250Ojp+Q0ZYX0ZvbnQoKQogewpAQCAtNjEsMTAgKzYxLDEwIEBACiAgICAgRlhGVF9Eb25lX0ZhY2UobV9GYWNlKTsKICAgICBtX0ZhY2UgPSBOVUxMOwogfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBGWF9CT09MIGJWZXJ0aWNhbCkKK2Jvb2wgQ0ZYX0ZvbnQ6OkxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgYm9vbCBiVmVydGljYWwpCiB7Ci0gICAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKKyAgICBtX2JFbWJlZGRlZCA9IGZhbHNlOwogICAgIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOwogICAgIG1fcFN1YnN0Rm9udCA9IG5ldyBDRlhfU3Vic3RGb250OwogICAgIG1fRmFjZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+RmluZFN1YnN0Rm9udChmYWNlX25hbWUsIGJUcnVlVHlwZSwgZmxhZ3MsIHdlaWdodCwgaXRhbGljX2FuZ2xlLApAQCAtNzksNyArNzksNyBAQAogICAgICAgICBtX3BGb250RGF0YSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX0Jhc2UobV9GYWNlKTsKICAgICAgICAgbV9kd1NpemUgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9TaXplKG1fRmFjZSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogZXh0ZXJuICJDIiB7CiAgICAgdW5zaWduZWQgbG9uZyBfRlRTdHJlYW1SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCkBAIC05OSw3ICs5OSw3IEBACiAgICAgewogICAgIH0KIH07Ci1GWF9CT09MIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwgRlhGVF9GYWNlKiBGYWNlLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWEZUX1N0cmVhbSogc3RyZWFtKQorYm9vbCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBGWEZUX1N0cmVhbSBzdHJlYW0xID0gKEZYRlRfU3RyZWFtKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZiAoRlhGVF9TdHJlYW1SZWMpKTsKICAgICBzdHJlYW0xLT5iYXNlID0gTlVMTDsKQEAgLTExMywxNiArMTEzLDE2IEBACiAgICAgYXJncy5zdHJlYW0gPSBzdHJlYW0xOwogICAgIGlmIChGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCAmYXJncywgMCwgRmFjZSkpIHsKICAgICAgICAgRlhfRnJlZShzdHJlYW0xKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChzdHJlYW0pIHsKICAgICAgICAgKnN0cmVhbSA9IHN0cmVhbTE7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSkKK2Jvb2wgQ0ZYX0ZvbnQ6OkxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpCiB7Ci0gICAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKKyAgICBtX2JFbWJlZGRlZCA9IGZhbHNlOwogICAgIEZYRlRfTGlicmFyeSBsaWJyYXJ5OwogICAgIGlmIChDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5ID09IE5VTEwpIHsKICAgICAgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5KTsKQEAgLTEzMCwxMSArMTMwLDExIEBACiAgICAgbGlicmFyeSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnk7CiAgICAgRlhGVF9TdHJlYW0gc3RyZWFtID0gTlVMTDsKICAgICBpZiAoIV9Mb2FkRmlsZShsaWJyYXJ5LCAmbV9GYWNlLCBwRmlsZSwgJnN0cmVhbSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG1fcE93bmVkU3RyZWFtID0gc3RyZWFtOwogICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogaW50IENGWF9Gb250OjpHZXRHbHlwaFdpZHRoKEZYX0RXT1JEIGdseXBoX2luZGV4KQogewpAQCAtMTY5LDIwICsxNjksMjAgQEAKICAgICB9CiAgICAgcmV0dXJuIGZhY2U7CiB9Ci1GWF9CT09MIENGWF9Gb250OjpMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkKK2Jvb2wgQ0ZYX0ZvbnQ6OkxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKQogewogICAgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwogICAgIEZYU1lTX21lbWNweShtX3BGb250RGF0YUFsbG9jYXRpb24sIGRhdGEsIHNpemUpOwogICAgIG1fRmFjZSA9IEZUX0xvYWRGb250KCh1aW50OF90KiltX3BGb250RGF0YUFsbG9jYXRpb24sIHNpemUpOwogICAgIG1fcEZvbnREYXRhID0gKHVpbnQ4X3QqKW1fcEZvbnREYXRhQWxsb2NhdGlvbjsKLSAgICBtX2JFbWJlZGRlZCA9IFRSVUU7CisgICAgbV9iRW1iZWRkZWQgPSB0cnVlOwogICAgIG1fZHdTaXplID0gc2l6ZTsKICAgICByZXR1cm4gbV9GYWNlICE9IE5VTEw7CiB9Ci1GWF9CT09MIENGWF9Gb250OjpJc1RURm9udCgpCitib29sIENGWF9Gb250OjpJc1RURm9udCgpCiB7CiAgICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gRlhGVF9Jc19GYWNlX1RUX09UKG1fRmFjZSkgPT0gRlhGVF9GQUNFX0ZMQUdfU0ZOVDsKIH0KQEAgLTIwMiwyNSArMjAyLDI1IEBACiAgICAgaW50IGRlc2NlbnQgPSBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpOwogICAgIHJldHVybiBkZXNjZW50OwogfQotRlhfQk9PTCBDRlhfRm9udDo6R2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUICZiYm94KQorYm9vbCBDRlhfRm9udDo6R2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUICZiYm94KQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKEZYRlRfSXNfRmFjZV9Ucmlja3kobV9GYWNlKSkgewogICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX1NldF9DaGFyX1NpemUobV9GYWNlLCAwLCAxMDAwICogNjQsIDcyLCA3Mik7CiAgICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOwogICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBGWEZUX0JCb3ggY2JveDsKICAgICAgICAgRlRfR2x5cGggZ2x5cGg7CiAgICAgICAgIGVycm9yID0gRlhGVF9HZXRfR2x5cGgoKChGWEZUX0ZhY2UpbV9GYWNlKS0+Z2x5cGgsICZnbHlwaCk7CiAgICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYRlRfR2x5cGhfR2V0X0NCb3goZ2x5cGgsIEZYRlRfR0xZUEhfQkJPWF9QSVhFTFMsICZjYm94KTsKICAgICAgICAgaW50IHBpeGVsX3NpemVfeCA9ICgoRlhGVF9GYWNlKW1fRmFjZSktPnNpemUtPm1ldHJpY3MueF9wcGVtLApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgICAgICAgIHJldHVybiBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KSA9PSAwOwogICAgIH0KICAgICBpZiAoRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgZW0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKICAgICBpZiAoZW0gPT0gMCkgewpAQCAtMjYwLDM0ICsyNjAsMzQgQEAKICAgICAgICAgYmJveC5yaWdodCA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpICogMTAwMCAvIGVtOwogICAgICAgICBiYm94LmJvdHRvbSA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSkgKiAxMDAwIC8gZW07CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfRm9udDo6SXNJdGFsaWMoKQorYm9vbCBDRlhfRm9udDo6SXNJdGFsaWMoKQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgRlhfQk9PTCByZXQgPSBGWEZUX0lzX0ZhY2VfSXRhbGljKG1fRmFjZSkgPT0gRlhGVF9TVFlMRV9GTEFHX0lUQUxJQzsKKyAgICBib29sIHJldCA9IEZYRlRfSXNfRmFjZV9JdGFsaWMobV9GYWNlKSA9PSBGWEZUX1NUWUxFX0ZMQUdfSVRBTElDOwogICAgIGlmICghcmV0KSB7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cihGWEZUX0dldF9GYWNlX1N0eWxlX05hbWUobV9GYWNlKSk7CiAgICAgICAgIHN0ci5NYWtlTG93ZXIoKTsKICAgICAgICAgaWYgKHN0ci5GaW5kKCJpdGFsaWMiKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OklzQm9sZCgpCitib29sIENGWF9Gb250OjpJc0JvbGQoKQogewogICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIEZYRlRfSXNfRmFjZV9Cb2xkKG1fRmFjZSkgPT0gRlhGVF9TVFlMRV9GTEFHX0JPTEQ7CiB9Ci1GWF9CT09MIENGWF9Gb250OjpJc0ZpeGVkV2lkdGgoKQorYm9vbCBDRlhfRm9udDo6SXNGaXhlZFdpZHRoKCkKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBGWEZUX0lzX0ZhY2VfZml4ZWR3aWR0aChtX0ZhY2UpOwogfQpAQCAtMzMxLDEwICszMzEsMTAgQEAKICAgICB9CiAgICAgcmV0dXJuIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7CiB9Ci1GWF9CT09MIENGWF9Gb250OjpHZXRCQm94KEZYX1JFQ1QgJmJib3gpCitib29sIENGWF9Gb250OjpHZXRCQm94KEZYX1JFQ1QgJmJib3gpCiB7CiAgICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbnQgZW0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKICAgICBpZiAoZW0gPT0gMCkgewpAQCAtMzQ4LDcgKzM0OCw3IEBACiAgICAgICAgIGJib3gucmlnaHQgPSBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKSAqIDEwMDAgLyBlbTsKICAgICAgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKSAqIDEwMDAgLyBlbTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBpbnQgQ0ZYX0ZvbnQ6OkdldEhlaWdodCgpCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcAppbmRleCAxNDQyN2E1Li4xNWYwMjJlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKQEAgLTE4LDkgKzE4LDkgQEAKICAgICBtX1N1YnN0RmxhZ3MgPSAwOwogICAgIG1fV2VpZ2h0ID0gMDsKICAgICBtX0l0YWxpY0FuZ2xlID0gMDsKLSAgICBtX2JTdWJzdE9mQ0pLID0gRkFMU0U7CisgICAgbV9iU3Vic3RPZkNKSyA9IGZhbHNlOwogICAgIG1fV2VpZ2h0Q0pLID0gMDsKLSAgICBtX2JJdGxpY0NKSyA9IEZBTFNFOworICAgIG1fYkl0bGljQ0pLID0gZmFsc2U7CiB9CiBDVFRGb250RGVzYzo6fkNUVEZvbnREZXNjKCkKIHsKQEAgLTM4LDExICszOCwxMSBAQAogICAgICAgICBGWF9GcmVlKG1fcEZvbnREYXRhKTsKICAgICB9CiB9Ci1GWF9CT09MIENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkKK2Jvb2wgQ1RURm9udERlc2M6OlJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKQogewogICAgIGlmIChtX1R5cGUgPT0gMSkgewogICAgICAgICBpZiAobV9TaW5nbGVGYWNlLm1fcEZhY2UgIT0gZmFjZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtX1R5cGUgPT0gMikgewogICAgICAgICBpbnQgaTsKQEAgLTUxLDE1ICs1MSwxNSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICBpZiAoaSA9PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIG1fUmVmQ291bnQgLS07CiAgICAgaWYgKG1fUmVmQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGRlbGV0ZSB0aGlzOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0ZYX0ZvbnRNZ3I6OkNGWF9Gb250TWdyKCkKIHsKQEAgLTk4LDcgKzk4LDcgQEAKIHsKICAgICBtX3BCdWlsdGluTWFwcGVyLT5TZXRTeXN0ZW1Gb250SW5mbyhwRm9udEluZm8pOwogfQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLAorRlhGVF9GYWNlIENGWF9Gb250TWdyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIGJvb2wgYlRydWVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLCBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KQogewogICAgIGlmIChtX0ZUTGlicmFyeSA9PSBOVUxMKSB7CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc2V0Q1AsIHBTdWJzdEZvbnQpOwogfQogRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiYgcEZvbnREYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSkKIHsKICAgICBDRlhfQnl0ZVN0cmluZyBrZXkoZmFjZV9uYW1lKTsKICAgICBrZXkgKz0gJywnOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiBGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCkKIHsKICAgICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gbmV3IENUVEZvbnREZXNjOwogICAgIHBGb250RGVzYy0+bV9UeXBlID0gMTsKQEAgLTQzMywxMCArNDMzLDEwIEBACiB7CiAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5HZXRTdGFuZGFyZEZvbnQoZGF0YSwgc2l6ZSwgaWQpOwogfQotRlhfQk9PTCBDRlhfRm9udE1ncjo6R2V0U3RhbmRhcmRGb250KGNvbnN0IHVpbnQ4X3QqJiBwRm9udERhdGEsIEZYX0RXT1JEJiBzaXplLCBpbnQgaW5kZXgpCitib29sIENGWF9Gb250TWdyOjpHZXRTdGFuZGFyZEZvbnQoY29uc3QgdWludDhfdComIHBGb250RGF0YSwgRlhfRFdPUkQmIHNpemUsIGludCBpbmRleCkKIHsKICAgICBpZiAoaW5kZXggPiAxNSB8fCBpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHsKICAgICAgICAgaWYgKGluZGV4ID49IDE0KSB7CkBAIC00NTIsMTQgKzQ1MiwxNCBAQAogICAgICAgICAgICAgc2l6ZSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9kd1NpemU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBDRlhfRm9udE1hcHBlcjo6Q0ZYX0ZvbnRNYXBwZXIoKQogewogICAgIEZYU1lTX21lbXNldChtX0ZveGl0RmFjZXMsIDAsIHNpemVvZiBtX0ZveGl0RmFjZXMpOwogICAgIG1fTU1GYWNlc1swXSA9IG1fTU1GYWNlc1sxXSA9IE5VTEw7CiAgICAgbV9wRm9udEluZm8gPSBOVUxMOwotICAgIG1fYkxpc3RMb2FkZWQgPSBGQUxTRTsKKyAgICBtX2JMaXN0TG9hZGVkID0gZmFsc2U7CiAgICAgbV9wRm9udEVudW1lcmF0b3IgPSBOVUxMOwogfQogQ0ZYX0ZvbnRNYXBwZXI6On5DRlhfRm9udE1hcHBlcigpCkBAIC01ODMsMTAgKzU4MywxMCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvbnN0IHVpbnQ4X3QqIHB0ciA9IG5hbWU7Ci0gICAgRlhfQk9PTCBiTG9jYWxpemVkID0gRkFMU0U7CisgICAgYm9vbCBiTG9jYWxpemVkID0gZmFsc2U7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLkdldExlbmd0aCgpOyBpICsrKQogICAgICAgICBpZiAocHRyW2ldID4gMHg4MCkgewotICAgICAgICAgICAgYkxvY2FsaXplZCA9IFRSVUU7CisgICAgICAgICAgICBiTG9jYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgaWYgKGJMb2NhbGl6ZWQpIHsKQEAgLTYyMCw3ICs2MjAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1fcEZvbnRJbmZvLT5FbnVtRm9udExpc3QodGhpcyk7Ci0gICAgbV9iTGlzdExvYWRlZCA9IFRSVUU7CisgICAgbV9iTGlzdExvYWRlZCA9IHRydWU7CiB9CiBDRlhfQnl0ZVN0cmluZyBDRlhfRm9udE1hcHBlcjo6TWF0Y2hJbnN0YWxsZWRGb250cyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbm9ybV9uYW1lKQogewpAQCAtODQ3LDcgKzg0Nyw3IEBACiAgICAgfQogICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwogfQotaW50MzJfdCBHZXRTdHlsZVR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmJzU3R5bGUsIEZYX0JPT0wgYlJldmVydCkKK2ludDMyX3QgR2V0U3R5bGVUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZic1N0eWxlLCBib29sIGJSZXZlcnQpCiB7CiAgICAgaW50MzJfdCBpTGVuID0gYnNTdHlsZS5HZXRMZW5ndGgoKTsKICAgICBpZiAoIWlMZW4pIHsKQEAgLTg3MiwxNSArODcyLDE1IEBACiAgICAgfQogICAgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChDRlhfQnl0ZVN0cmluZyBuYW1lLCBpbnQgJlBpdGNoRmFtaWx5KQorYm9vbCBDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KENGWF9CeXRlU3RyaW5nIG5hbWUsIGludCAmUGl0Y2hGYW1pbHkpCiB7CiAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIk15cmlhZFBybyIpKSB7CiAgICAgICAgIFBpdGNoRmFtaWx5ICY9IH5GWEZPTlRfRkZfUk9NQU47Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAorRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBib29sIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IFdpbmRvd0NQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KQogewogICAgIGlmICghKGZsYWdzICYgRlhGT05UX1VTRUVYVEVSTkFUVFIpKSB7CkBAIC05MjMsMTQgKzkyMywxNCBAQAogICAgIH0KICAgICBpbnQgaUJhc2VGb250ID0gMDsKICAgICBDRlhfQnl0ZVN0cmluZyBmYW1pbHksIHN0eWxlOwotICAgIEZYX0JPT0wJYkhhc0NvbW1hID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiSGFzSHlwZW4gPSBGQUxTRTsKKyAgICBib29sCWJIYXNDb21tYSA9IGZhbHNlOworICAgIGJvb2wgYkhhc0h5cGVuID0gZmFsc2U7CiAgICAgaW50IGZpbmQgPSBTdWJzdE5hbWUuRmluZChGWF9CU1RSQygiLCIpLCAwKTsKICAgICBpZiAoZmluZCA+PSAwKSB7CiAgICAgICAgIGZhbWlseSA9IFN1YnN0TmFtZS5MZWZ0KGZpbmQpOwogICAgICAgICBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoZmFtaWx5KTsKICAgICAgICAgc3R5bGUgPSBTdWJzdE5hbWUuTWlkKGZpbmQgKyAxKTsKLSAgICAgICAgYkhhc0NvbW1hID0gVFJVRTsKKyAgICAgICAgYkhhc0NvbW1hID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWU7CiAgICAgfQpAQCAtOTM5LDkgKzkzOSw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGludCBQaXRjaEZhbWlseSA9IDA7Ci0gICAgRlhfQk9PTCBiSXRhbGljID0gRkFMU0U7CisgICAgYm9vbCBiSXRhbGljID0gZmFsc2U7CiAgICAgRlhfRFdPUkQgblN0eWxlID0gMDsKLSAgICBGWF9CT09MIGJTdHlsZUF2YWlsID0gRkFMU0U7CisgICAgYm9vbCBiU3R5bGVBdmFpbCA9IGZhbHNlOwogICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewogICAgICAgICBmYW1pbHkgPSBnX0Jhc2UxNEZvbnROYW1lc1tpQmFzZUZvbnRdOwogICAgICAgICBpZiAoKGlCYXNlRm9udCAlIDQpID09IDEgfHwgKGlCYXNlRm9udCAlIDQpID09IDIpIHsKQEAgLTk2MiwxMiArOTYyLDEyIEBACiAgICAgICAgICAgICBpZiAoZmluZCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgc3R5bGUgPSBmYW1pbHkuTWlkKGZpbmQgKyAxKTsKICAgICAgICAgICAgICAgICBmYW1pbHkgPSBmYW1pbHkuTGVmdChmaW5kKTsKLSAgICAgICAgICAgICAgICBiSGFzSHlwZW4gPSBUUlVFOworICAgICAgICAgICAgICAgIGJIYXNIeXBlbiA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiSGFzSHlwZW4pIHsKICAgICAgICAgICAgIGludCBuTGVuID0gZmFtaWx5LkdldExlbmd0aCgpOwotICAgICAgICAgICAgaW50MzJfdCBuUmV0ID0gR2V0U3R5bGVUeXBlKGZhbWlseSwgVFJVRSk7CisgICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoZmFtaWx5LCB0cnVlKTsKICAgICAgICAgICAgIGlmIChuUmV0ID4gLTEpIHsKICAgICAgICAgICAgICAgICBmYW1pbHkgPSBmYW1pbHkuTGVmdChuTGVuIC0gZ19Gb250U3R5bGVzW25SZXRdLmxlbik7CiAgICAgICAgICAgICAgICAgaWYgKG5SZXQgPT0gMCkgewpAQCAtOTk1LDE3ICs5OTUsMTcgQEAKICAgICAgICAgaW50IG5MZW4gPSBzdHlsZS5HZXRMZW5ndGgoKTsKICAgICAgICAgY29uc3QgRlhfQ0hBUiogcFN0eWxlID0gc3R5bGU7CiAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgRlhfQk9PTCBiRmlyc3RJdGVtID0gVFJVRTsKKyAgICAgICAgYm9vbCBiRmlyc3RJdGVtID0gdHJ1ZTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmOwogICAgICAgICB3aGlsZSAoaSA8IG5MZW4pIHsKICAgICAgICAgICAgIGJ1ZiA9IFBhcnNlU3R5bGUocFN0eWxlLCBuTGVuLCBpKTsKLSAgICAgICAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShidWYsIEZBTFNFKTsKKyAgICAgICAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShidWYsIGZhbHNlKTsKICAgICAgICAgICAgIGlmICgoaSAmJiAhYlN0eWxlQXZhaWwpIHx8ICghaSAmJiBuUmV0IDwgMCkpIHsKICAgICAgICAgICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWU7CiAgICAgICAgICAgICAgICAgaUJhc2VGb250ID0gMTI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5SZXQgPj0gMCkgewotICAgICAgICAgICAgICAgIGJTdHlsZUF2YWlsID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiU3R5bGVBdmFpbCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoblJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCkgewpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5SZXQgPT0gMSkgewogICAgICAgICAgICAgICAgIGlmIChiRmlyc3RJdGVtKSB7CkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpICs9IGJ1Zi5HZXRMZW5ndGgoKSArIDE7CiAgICAgICAgIH0KQEAgLTEwNDIsOSArMTA0Miw5IEBACiAgICAgICAgIHdlaWdodCA9IG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQgPyA5MDAgOiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMKTsKICAgICB9CiAgICAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfSXRhbGljKSB7Ci0gICAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgICAgICBiSXRhbGljID0gdHJ1ZTsKICAgICB9Ci0gICAgRlhfQk9PTCBiQ0pLID0gRkFMU0U7CisgICAgYm9vbCBiQ0pLID0gZmFsc2U7CiAgICAgaW50IGlFeGFjdCA9IDA7CiAgICAgaW50IENoYXJzZXQgPSBGWEZPTlRfQU5TSV9DSEFSU0VUOwogICAgIGlmIChXaW5kb3dDUCkgewpAQCAtMTA1NCw3ICsxMDU0LDcgQEAKICAgICB9CiAgICAgaWYgKENoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQgfHwgQ2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKICAgICAgICAgICAgIENoYXJzZXQgPT0gRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCB8fCBDaGFyc2V0ID09IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKSB7Ci0gICAgICAgIGJDSksgPSBUUlVFOworICAgICAgICBiQ0pLID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsKICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKQEAgLTEwNjksMjEgKzEwNjksMjEgQEAKICAgICAgICAgaWYgKCFiQ0pLKSB7CiAgICAgICAgICAgICBpZiAoIUNoZWNrU3VwcG9ydFRoaXJkUGFydEZvbnQoZmFtaWx5LCBQaXRjaEZhbWlseSkpIHsKICAgICAgICAgICAgICAgICBpZiAoaXRhbGljX2FuZ2xlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYkl0YWxpYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJJdGFsaWMgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYkl0YWxpYyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9iU3Vic3RPZkNKSyA9IFRSVUU7CisgICAgICAgICAgICBwU3Vic3RGb250LT5tX2JTdWJzdE9mQ0pLID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChuU3R5bGUpIHsKICAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX1dlaWdodENKSyA9IHdlaWdodDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHRDSksgPSBGWEZPTlRfRldfTk9STUFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfSXRhbGljKSB7Ci0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9iSXRsaWNDSksgPSBUUlVFOworICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fYkl0bGljQ0pLID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xMTIzLDcgKzExMjMsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGZsYWdzICYgRlhGT05UX0lUQUxJQykgewotICAgICAgICAgICAgYkl0YWxpYyA9IFRSVUU7CisgICAgICAgICAgICBiSXRhbGljID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpRXhhY3QgPSAhbWF0Y2guSXNFbXB0eSgpOwpAQCAtMTEzNCw5ICsxMTM0LDkgQEAKICAgICBpZiAoaEZvbnQgPT0gTlVMTCkgewogICAgICAgICBpZiAoYkNKSykgewogICAgICAgICAgICAgaWYgKGl0YWxpY19hbmdsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYkl0YWxpYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkl0YWxpYyA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiSXRhbGljID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OwogICAgICAgICB9CkBAIC0xMjIxLDE4ICsxMjIxLDE4IEBACiAgICAgfQogICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gU3Vic3ROYW1lOwogICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IENoYXJzZXQ7Ci0gICAgRlhfQk9PTCBiTmVlZFVwZGF0ZVdlaWdodCA9IEZBTFNFOworICAgIGJvb2wgYk5lZWRVcGRhdGVXZWlnaHQgPSBmYWxzZTsKICAgICBpZiAoRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkpIHsKICAgICAgICAgaWYgKHdlaWdodCA9PSBGWEZPTlRfRldfQk9MRCkgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IFRSVUU7CisgICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAod2VpZ2h0ID09IEZYRk9OVF9GV19OT1JNQUwpIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gRkFMU0U7CisgICAgICAgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBUUlVFOworICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChiTmVlZFVwZGF0ZVdlaWdodCkgewpAQCAtMTI2Miw3ICsxMjYyLDcgQEAKICAgICBtX0ZpbGVTaXplID0gMDsKICAgICBtX0ZvbnRPZmZzZXQgPSAwOwogICAgIG1fV2VpZ2h0ID0gMDsKLSAgICBtX2JJdGFsaWMgPSBGQUxTRTsKKyAgICBtX2JJdGFsaWMgPSBmYWxzZTsKICAgICBtX1BpdGNoRmFtaWx5ID0gMDsKIH0KIENGb250RmlsZUZhY2VJbmZvOjp+Q0ZvbnRGaWxlRmFjZUluZm8oKQpAQCAtMTI3Miw3ICsxMjcyLDcgQEAKICAgICB9CiAgICAgbV9GYWNlID0gTlVMTDsKIH0KLWV4dGVybiBGWF9CT09MIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwgRlhGVF9GYWNlKiBGYWNlLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWEZUX1N0cmVhbSogc3RyZWFtKTsKK2V4dGVybiBib29sIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwgRlhGVF9GYWNlKiBGYWNlLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWEZUX1N0cmVhbSogc3RyZWFtKTsKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwogSUZYX1N5c3RlbUZvbnRJbmZvKiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoKQogewpAQCAtMTMwMCwxMyArMTMwMCwxMyBAQAogewogICAgIGRlbGV0ZSB0aGlzOwogfQotRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKK2Jvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCiB7CiAgICAgbV9wTWFwcGVyID0gcE1hcHBlcjsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGF0aExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7CiAgICAgICAgIFNjYW5QYXRoKG1fUGF0aExpc3RbaV0pOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpTY2FuUGF0aChDRlhfQnl0ZVN0cmluZyYgcGF0aCkKIHsKQEAgLTEzMTUsNyArMTMxNSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7Ci0gICAgRlhfQk9PTCBiRm9sZGVyOworICAgIGJvb2wgYkZvbGRlcjsKICAgICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUoaGFuZGxlLCBmaWxlbmFtZSwgYkZvbGRlcikpIHsKICAgICAgICAgaWYgKGJGb2xkZXIpIHsKICAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PSAiLiIgfHwgZmlsZW5hbWUgPT0gIi4uIikgewpAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKICAgICB9CiAgICAgbV9Gb250TGlzdC5TZXRBdChmYWNlbmFtZSwgcEluZm8pOwogfQotdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpCit2b2lkKiBDRlhfRm9sZGVyRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkKIHsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTE1MDYsMTYgKzE1MDYsMTYgQEAKIHZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpEZWxldGVGb250KHZvaWQqIGhGb250KQogewogfQotRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKK2Jvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCiB7CiAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENGb250RmFjZUluZm8qIHBGb250ID0gKENGb250RmFjZUluZm8qKWhGb250OwogICAgIG5hbWUgPSBwRm9udC0+bV9GYWNlTmFtZTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQorYm9vbCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAKaW5kZXggODYxYWZkMi4uOWY0OTNhNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAKQEAgLTMwLDkgKzMwLDkgQEAKIGNsYXNzIENGWF9MaW51eEZvbnRJbmZvIDogcHVibGljIENGWF9Gb2xkZXJGb250SW5mbwogewogcHVibGljOgotICAgIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAkJCQlQYXJzZUZvbnRDZmcoKTsKLSAgICB2b2lkKgkJCQlGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSk7CisgICAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KSBvdmVycmlkZTsKKyAgICBib29sCQkJCVBhcnNlRm9udENmZygpOworICAgIHZvaWQqCQkJCUZpbmRGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgYm9vbCBiTWF0Y2hOYW1lKTsKIH07CiAjZGVmaW5lIExJTlVYX0dQTkFNRVNJWkUJNgogc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgfQogICAgIHJldHVybiAyOwogfQotdm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLCBpbnQmIGlFeGFjdCkKK3ZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgaW50JiBpRXhhY3QpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKICAgICBpbnQgaUJhc2VGb250OwpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICByZXR1cm4gR2V0Rm9udChmYWNlKTsKICAgICB9CiAgICAgdm9pZCogcCA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiQ0pLID0gVFJVRTsKKyAgICBib29sIGJDSksgPSB0cnVlOwogICAgIHN3aXRjaCAoY2hhcnNldCkgewogICAgICAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOiB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IEdldEphcGFuZXNlUHJlZmVyZW5jZShjc3RyX2ZhY2UsIHdlaWdodCwgcGl0Y2hfZmFtaWx5KTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBiQ0pLID0gRkFMU0U7CisgICAgICAgICAgICBiQ0pLID0gZmFsc2U7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW50MzJfdCBfTGludXhHZXRTaW1pbGFyVmFsdWUoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9EV09SRCBzdHlsZSkKK3N0YXRpYyBpbnQzMl90IF9MaW51eEdldFNpbWlsYXJWYWx1ZShpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBwaXRjaF9mYW1pbHksIEZYX0RXT1JEIHN0eWxlKQogewogICAgIGludDMyX3QgaVNpbWlsYXJWYWx1ZSA9IDA7CiAgICAgaWYgKChzdHlsZSAmIEZYRk9OVF9CT0xEKSA9PSAod2VpZ2h0ID4gNDAwKSkgewpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgfQogICAgIHJldHVybiBpU2ltaWxhclZhbHVlOwogfQotdm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86OkZpbmRGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgRlhfQk9PTCBiTWF0Y2hOYW1lKQordm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86OkZpbmRGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgYm9vbCBiTWF0Y2hOYW1lKQogewogICAgIENGb250RmFjZUluZm8qIHBGaW5kID0gTlVMTDsKICAgICBGWF9EV09SRCBjaGFyc2V0X2ZsYWcgPSBfTGludXhHZXRDaGFyc2V0KGNoYXJzZXQpOwpAQCAtMjE3LDkgKzIxNyw5IEBACiAgICAgfQogICAgIHJldHVybiBwSW5mbzsKIH0KLUZYX0JPT0wgQ0ZYX0xpbnV4Rm9udEluZm86OlBhcnNlRm9udENmZygpCitib29sIENGWF9MaW51eEZvbnRJbmZvOjpQYXJzZUZvbnRDZmcoKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwCmluZGV4IGIxNDEwYjMuLjRiYzlhODggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wYXRoLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIG1fTWFzayA9IG5ld19tYXNrOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFTU0VSVChGQUxTRSk7CisgICAgQVNTRVJUKGZhbHNlKTsKIH0KIENGWF9QYXRoRGF0YTo6Q0ZYX1BhdGhEYXRhKCkKIHsKQEAgLTI1Nyw4ICsyNTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhhbGZfd2lkdGgsIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KQogewogICAgIEZYX0ZMT0FUIHN0YXJ0X2sgPSAwLCBzdGFydF9jID0gMCwgZW5kX2sgPSAwLCBlbmRfYyA9IDAsIHN0YXJ0X2xlbiA9IDAsIHN0YXJ0X2RjID0gMCwgZW5kX2xlbiA9IDAsIGVuZF9kYyA9IDA7Ci0gICAgRlhfQk9PTCBiU3RhcnRWZXJ0ID0gRlhTWVNfZmFicyhzdGFydF94IC0gbWlkZGxlX3gpIDwgMS4wZiAvIDIwOwotICAgIEZYX0JPT0wgYkVuZFZlcnQgPSBGWFNZU19mYWJzKG1pZGRsZV94IC0gZW5kX3gpIDwgMS4wZiAvIDIwOworICAgIGJvb2wgYlN0YXJ0VmVydCA9IEZYU1lTX2ZhYnMoc3RhcnRfeCAtIG1pZGRsZV94KSA8IDEuMGYgLyAyMDsKKyAgICBib29sIGJFbmRWZXJ0ID0gRlhTWVNfZmFicyhtaWRkbGVfeCAtIGVuZF94KSA8IDEuMGYgLyAyMDsKICAgICBpZiAoYlN0YXJ0VmVydCAmJiBiRW5kVmVydCkgewogICAgICAgICBpbnQgc3RhcnRfZGlyID0gbWlkZGxlX3kgPiBzdGFydF95ID8gMSA6IC0xOwogICAgICAgICBGWF9GTE9BVCBwb2ludF95ID0gbWlkZGxlX3kgKyBoYWxmX3dpZHRoICogc3RhcnRfZGlyOwpAQCAtMzQyLDEyICszNDIsMTIgQEAKICAgICBpbnQgaVBvaW50ID0gMDsKICAgICBGWF9GTE9BVCBoYWxmX3dpZHRoID0gbGluZV93aWR0aDsKICAgICBpbnQgaVN0YXJ0UG9pbnQsIGlFbmRQb2ludCwgaU1pZGRsZVBvaW50OwotICAgIEZYX0JPT0wgYkpvaW47CisgICAgYm9vbCBiSm9pbjsKICAgICB3aGlsZSAoaVBvaW50IDwgbV9Qb2ludENvdW50KSB7CiAgICAgICAgIGlmIChtX3BQb2ludHNbaVBvaW50XS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKICAgICAgICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50ICsgMTsKICAgICAgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKLSAgICAgICAgICAgIGJKb2luID0gRkFMU0U7CisgICAgICAgICAgICBiSm9pbiA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1fcFBvaW50c1tpUG9pbnRdLm1fRmxhZyA9PSBGWFBUX0JFWklFUlRPKSB7CiAgICAgICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpUG9pbnRdLm1fUG9pbnRYLCBtX3BQb2ludHNbaVBvaW50XS5tX1BvaW50WSk7CkBAIC0zNTcsMTIgKzM1NywxMiBAQAogICAgICAgICAgICAgaWYgKGlQb2ludCA9PSBtX1BvaW50Q291bnQgLSAxIHx8IG1fcFBvaW50c1tpUG9pbnQgKyAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKICAgICAgICAgICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCAtIDE7CiAgICAgICAgICAgICAgICAgaUVuZFBvaW50ID0gaVBvaW50OwotICAgICAgICAgICAgICAgIGJKb2luID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkpvaW4gPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOwogICAgICAgICAgICAgICAgIGlNaWRkbGVQb2ludCA9IGlQb2ludDsKICAgICAgICAgICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQgKyAxOwotICAgICAgICAgICAgICAgIGJKb2luID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiSm9pbiA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRlhfRkxPQVQgc3RhcnRfeCA9IG1fcFBvaW50c1tpU3RhcnRQb2ludF0ubV9Qb2ludFg7CkBAIC0zODksMTAgKzM4OSwxMCBAQAogICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0obV9wUG9pbnRzW2ldLm1fUG9pbnRYLCBtX3BQb2ludHNbaV0ubV9Qb2ludFkpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MJmJUaGluLCBGWF9CT09MIGJBZGp1c3QpIGNvbnN0Citib29sIENGWF9QYXRoRGF0YTo6R2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgYm9vbCZiVGhpbiwgYm9vbCBiQWRqdXN0KSBjb25zdAogewogICAgIGlmIChtX1BvaW50Q291bnQgPCAzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobV9Qb2ludENvdW50ID09IDMgJiYgKG1fcFBvaW50c1swXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTU9WRVRPICYmCiAgICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYgKG1fcFBvaW50c1syXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPCkBAIC00MjIsMTkgKzQyMiwxOSBAQAogICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIG1fcFBvaW50c1sxXS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOwogICAgICAgICB9CiAgICAgICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbMV0ubV9Qb2ludFkpIHsKLSAgICAgICAgICAgIGJUaGluID0gVFJVRTsKKyAgICAgICAgICAgIGJUaGluID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICgoKG1fUG9pbnRDb3VudCA+IDMpICYmIChtX1BvaW50Q291bnQgJSAyKSkpIHsKICAgICAgICAgaW50IG1pZCA9IG1fUG9pbnRDb3VudCAvIDI7Ci0gICAgICAgIEZYX0JPT0wgYlplcm9BcmVhID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlplcm9BcmVhID0gZmFsc2U7CiAgICAgICAgIENGWF9QYXRoRGF0YSB0X3BhdGg7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlkOyBpKyspIHsKICAgICAgICAgICAgIGlmICghKG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX1BvaW50WAogICAgICAgICAgICAgICAgICAgICAmJiBtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRZID09IG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9Qb2ludFkgJiYKICAgICAgICAgICAgICAgICAgICAgKChtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9CRVpJRVJUTyAmJiAobV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8pKSkgewotICAgICAgICAgICAgICAgIGJaZXJvQXJlYSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlplcm9BcmVhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBuZXdfY291bnQgPSB0X3BhdGguR2V0UG9pbnRDb3VudCgpOwpAQCAtNDQ0LDggKzQ0NCw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFiWmVyb0FyZWEpIHsKICAgICAgICAgICAgIE5ld1BhdGguQXBwZW5kKCZ0X3BhdGgsIE5VTEwpOwotICAgICAgICAgICAgYlRoaW4gPSBUUlVFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBiVGhpbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgc3RyYXRQb2ludCA9IDA7CkBAIC00ODgsNyArNDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOwogICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCwgbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCwgbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwogICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7Ci0gICAgICAgICAgICAgICAgICAgIGJUaGluID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYlRoaW4gPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKQEAgLTQ5Nyw0MiArNDk3LDQyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fUG9pbnRDb3VudCA+IDMgJiYgTmV3UGF0aC5HZXRQb2ludENvdW50KCkpIHsKLSAgICAgICAgYlRoaW4gPSBUUlVFOworICAgICAgICBiVGhpbiA9IHRydWU7CiAgICAgfQogICAgIGlmIChOZXdQYXRoLkdldFBvaW50Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoKSBjb25zdAorYm9vbCBDRlhfUGF0aERhdGE6OklzUmVjdCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fUG9pbnRDb3VudCAhPSA1ICYmIG1fUG9pbnRDb3VudCAhPSA0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKG1fUG9pbnRDb3VudCA9PSA1ICYmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRYIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzWzBdLm1fUG9pbnRZICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WSkpIHx8CiAgICAgICAgICAgICAobV9wUG9pbnRzWzBdLm1fUG9pbnRYID09IG1fcFBvaW50c1syXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRZKSB8fAogICAgICAgICAgICAgKG1fcFBvaW50c1sxXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYgbV9wUG9pbnRzWzFdLm1fUG9pbnRZID09IG1fcFBvaW50c1szXS5tX1BvaW50WSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNDsgaSArKykgewogICAgICAgICBpZiAoKG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfTElORVRPKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fcFBvaW50c1tpXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYICYmIG1fcFBvaW50c1tpXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG1fUG9pbnRDb3VudCA9PSA1IHx8IChtX3BQb2ludHNbM10ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSk7CiB9Ci1GWF9CT09MIENGWF9QYXRoRGF0YTo6SXNSZWN0KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9GbG9hdFJlY3QqIHBSZWN0KSBjb25zdAorYm9vbCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QKIHsKICAgICBpZiAocE1hdHJpeCA9PSBOVUxMKSB7CiAgICAgICAgIGlmICghSXNSZWN0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAocFJlY3QpIHsKICAgICAgICAgICAgIHBSZWN0LT5sZWZ0ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRYOwpAQCAtNTQxLDI3ICs1NDEsMjcgQEAKICAgICAgICAgICAgIHBSZWN0LT50b3AgPSBtX3BQb2ludHNbMl0ubV9Qb2ludFk7CiAgICAgICAgICAgICBwUmVjdC0+Tm9ybWFsaXplKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAobV9Qb2ludENvdW50ICE9IDUgJiYgbV9Qb2ludENvdW50ICE9IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgobV9Qb2ludENvdW50ID09IDUgJiYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFggfHwgbV9wUG9pbnRzWzBdLm1fUG9pbnRZICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WSkpIHx8CiAgICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fUG9pbnRYID09IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1fUG9pbnRDb3VudCA9PSA0ICYmIG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYgbV9wUG9pbnRzWzBdLm1fUG9pbnRZICE9IG1fcFBvaW50c1szXS5tX1BvaW50WSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfRkxPQVQgeFs1XSwgeVs1XTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUG9pbnRDb3VudDsgaSArKykgewogICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0obV9wUG9pbnRzW2ldLm1fUG9pbnRYLCBtX3BQb2ludHNbaV0ubV9Qb2ludFksIHhbaV0sIHlbaV0pOwogICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgaWYgKChtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoeFtpXSAhPSB4W2kgLSAxXSAmJiB5W2ldICE9IHlbaSAtIDFdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTU3Miw3ICs1NzIsNyBAQAogICAgICAgICBwUmVjdC0+dG9wID0geVsyXTsKICAgICAgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgQ0ZYX1BhdGhEYXRhOjpDb3B5KGNvbnN0IENGWF9QYXRoRGF0YSAmc3JjKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BzLmNwcAppbmRleCBiYTVjNWZiLi5lMzc1Mjg4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BzLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BzLmNwcApAQCAtMTAsNyArMTAsNyBAQAogc3RydWN0IFBTR2x5cGggewogICAgIENGWF9Gb250KgkJbV9wRm9udDsKICAgICBGWF9EV09SRAkJbV9HbHlwaEluZGV4OwotICAgIEZYX0JPT0wJCQltX2JHbHlwaEFkanVzdDsKKyAgICBib29sCQkJbV9iR2x5cGhBZGp1c3Q7CiAgICAgRlhfRkxPQVQJCW1fQWRqdXN0TWF0cml4WzRdOwogfTsKIGNsYXNzIENQU0ZvbnQKQEAgLTIyLDggKzIyLDggQEAKIENGWF9QU1JlbmRlcmVyOjpDRlhfUFNSZW5kZXJlcigpCiB7CiAgICAgbV9wT3V0cHV0ID0gTlVMTDsKLSAgICBtX2JDb2xvclNldCA9IG1fYkdyYXBoU3RhdGVTZXQgPSBGQUxTRTsKLSAgICBtX2JJbml0ZWQgPSBGQUxTRTsKKyAgICBtX2JDb2xvclNldCA9IG1fYkdyYXBoU3RhdGVTZXQgPSBmYWxzZTsKKyAgICBtX2JJbml0ZWQgPSBmYWxzZTsKIH0KIENGWF9QU1JlbmRlcmVyOjp+Q0ZYX1BTUmVuZGVyZXIoKQogewpAQCAtMzMsNyArMzMsNyBAQAogICAgIH0KIH0KICNkZWZpbmUgT1VUUFVUX1BTKHN0cikgbV9wT3V0cHV0LT5PdXRwdXRQUyhzdHIsIHNpemVvZiBzdHItMSkKLXZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LCBpbnQgcHNsZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJDbXlrT3V0cHV0KQordm9pZCBDRlhfUFNSZW5kZXJlcjo6SW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc2xldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgYkNteWtPdXRwdXQpCiB7CiAgICAgbV9QU0xldmVsID0gcHNsZXZlbDsKICAgICBtX3BPdXRwdXQgPSBwT3V0cHV0OwpAQCAtNDIsMTAgKzQyLDEwIEBACiAgICAgbV9DbGlwQm94LmJvdHRvbSA9IGhlaWdodDsKICAgICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7CiB9Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpCitib29sIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpCiB7CiAgICAgaWYgKG1fYkluaXRlZCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHN0YXRpYyBjb25zdCBjaGFyIGluaXRfc3RyW10gPSAiXG5zYXZlXG4vaW0vaW5pdG1hdHJpeCBsb2FkIGRlZlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL24vbmV3cGF0aCBsb2FkIGRlZi9tL21vdmV0byBsb2FkIGRlZi9sL2xpbmV0byBsb2FkIGRlZi9jL2N1cnZldG8gbG9hZCBkZWYvaC9jbG9zZXBhdGggbG9hZCBkZWZcbiIKQEAgLTU3LDE1ICs1NywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2NtL2NvbmNhdCBsb2FkIGRlZi9DbS9jdXJyZW50bWF0cml4IGxvYWQgZGVmL214L21hdHJpeCBsb2FkIGRlZi9zbS9zZXRtYXRyaXggbG9hZCBkZWZcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgIE9VVFBVVF9QUyhpbml0X3N0cik7Ci0gICAgbV9iSW5pdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX2JJbml0ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBDRlhfUFNSZW5kZXJlcjo6RW5kUmVuZGVyaW5nKCkKIHsKICAgICBpZiAobV9iSW5pdGVkKSB7CiAgICAgICAgIE9VVFBVVF9QUygiXG5yZXN0b3JlXG4iKTsKICAgICB9Ci0gICAgbV9iSW5pdGVkID0gRkFMU0U7CisgICAgbV9iSW5pdGVkID0gZmFsc2U7CiB9CiB2b2lkIENGWF9QU1JlbmRlcmVyOjpTYXZlU3RhdGUoKQogewpAQCAtNzMsNyArNzMsNyBAQAogICAgIE9VVFBVVF9QUygicVxuIik7CiAgICAgbV9DbGlwQm94U3RhY2suQWRkKG1fQ2xpcEJveCk7CiB9Ci12b2lkIENGWF9QU1JlbmRlcmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQordm9pZCBDRlhfUFNSZW5kZXJlcjo6UmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCkKIHsKICAgICBTdGFydFJlbmRlcmluZygpOwogICAgIGlmIChiS2VlcFNhdmVkKSB7CkBAIC04MSw3ICs4MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgT1VUUFVUX1BTKCJRXG4iKTsKICAgICB9Ci0gICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gRkFMU0U7CisgICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gZmFsc2U7CiAgICAgbV9DbGlwQm94ID0gbV9DbGlwQm94U3RhY2suR2V0QXQobV9DbGlwQm94U3RhY2suR2V0U2l6ZSgpIC0gMSk7CiAgICAgaWYgKCFiS2VlcFNhdmVkKSB7CiAgICAgICAgIG1fQ2xpcEJveFN0YWNrLlJlbW92ZUF0KG1fQ2xpcEJveFN0YWNrLkdldFNpemUoKSAtIDEpOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgIE9VVFBVVF9QUygic3Ryb2tlcGF0aCBXIG5cbiIpOwogICAgIH0KIH0KLUZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbCBDRlhfUFNSZW5kZXJlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtMTg5LDEzICsxODksMTMgQEAKICAgICBpbnQgZmlsbF9hbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGZpbGxfY29sb3IpOwogICAgIGludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CiAgICAgaWYgKGZpbGxfYWxwaGEgJiYgZmlsbF9hbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHN0cm9rZV9hbHBoYSAmJiBzdHJva2VfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChmaWxsX2FscGhhID09IDAgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChzdHJva2VfYWxwaGEpIHsKICAgICAgICAgU2V0R3JhcGhTdGF0ZShwR3JhcGhTdGF0ZSk7CkBAIC0yMzMsNyArMjMzLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBPVVRQVVRfUFMoIlxuIik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9QU1JlbmRlcmVyOjpTZXRHcmFwaFN0YXRlKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpCiB7CkBAIC0yNTksNyArMjU5LDcgQEAKICAgICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQgPDwgRlhfQlNUUkMoIiBNXG4iKTsKICAgICB9CiAgICAgbV9DdXJHcmFwaFN0YXRlLkNvcHkoKnBHcmFwaFN0YXRlKTsKLSAgICBtX2JHcmFwaFN0YXRlU2V0ID0gVFJVRTsKKyAgICBtX2JHcmFwaFN0YXRlU2V0ID0gdHJ1ZTsKICAgICBpZiAoYnVmLkdldFNpemUoKSkgewogICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwogICAgIH0KQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgbGVmdCwgaW50IHRvcCwKK2Jvb2wgQ0ZYX1BTUmVuZGVyZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGxlZnQsIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgU3RhcnRSZW5kZXJpbmcoKTsKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkobGVmdCksIChGWF9GTE9BVCkodG9wICsgcFNvdXJjZS0+R2V0SGVpZ2h0KCkpKTsKICAgICByZXR1cm4gRHJhd0RJQml0cyhwU291cmNlLCBjb2xvciwgJm1hdHJpeCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENGWF9QU1JlbmRlcmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKQEAgLTMyMiwyMCArMzIyLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShkZXN0X2xlZnQpLCAoRlhfRkxPQVQpKGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpKTsKICAgICByZXR1cm4gRHJhd0RJQml0cyhwU291cmNlLCBjb2xvciwgJm1hdHJpeCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6RHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwKK2Jvb2wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBTdGFydFJlbmRlcmluZygpOwogICAgIGlmICgocE1hdHJpeC0+YSA9PSAwICYmIHBNYXRyaXgtPmIgPT0gMCkgfHwgKHBNYXRyaXgtPmMgPT0gMCAmJiBwTWF0cml4LT5kID09IDApKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChjb2xvcikgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkgJiYgKGFscGhhIDwgMjU1IHx8IHBTb3VyY2UtPkdldEJQUCgpICE9IDEpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBPVVRQVVRfUFMoInFcbiIpOwogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CkBAIC0zNTgsNyArMzU4LDcgQEAKICAgICAgICAgRmF4Q29tcHJlc3NEYXRhKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsIG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKICAgICAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgICAgIFNldENvbG9yKGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgIG1fYkNvbG9yU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBtX2JDb2xvclNldCA9IGZhbHNlOwogICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgdHJ1ZVsiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIDFbIik7CkBAIC00MDYsNyArNDA2LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAocENvbnZlcnRlZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBPVVRQVVRfUFMoIlxuUVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50IEJwcCA9IHBDb252ZXJ0ZWQtPkdldEJQUCgpIC8gODsKICAgICAgICAgdWludDhfdCogb3V0cHV0X2J1ZiA9IE5VTEw7CkBAIC00NjIsMTQgKzQ2MiwxNCBAQAogICAgICAgICBGWF9GcmVlKG91dHB1dF9idWYpOwogICAgIH0KICAgICBPVVRQVVRfUFMoIlxuUVxuIik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9QU1JlbmRlcmVyOjpTZXRDb2xvcihGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewogICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKICAgICB9Ci0gICAgRlhfQk9PTCBiQ01ZSyA9IEZBTFNFOworICAgIGJvb2wgYkNNWUsgPSBmYWxzZTsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CiAgICAgICAgIGNvbG9yID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAgICAgICAgICAgICAgICAgPDwgRlhBUkdCX0IoY29sb3IpIC8gMjU1LjAgPDwgRlhfQlNUUkMoIiByZ1xuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJDTVlLID09IG1fYkNteWtPdXRwdXQpIHsKLSAgICAgICAgICAgIG1fYkNvbG9yU2V0ID0gVFJVRTsKKyAgICAgICAgICAgIG1fYkNvbG9yU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgIG1fTGFzdENvbG9yID0gY29sb3I7CiAgICAgICAgIH0KICAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKQEAgLTU4OCw3ICs1ODgsNyBAQAogICAgICAgICA8PCBGWF9CU1RSQygiLyIpIDw8IHBzX2dseXBoaW5kZXggPDwgRlhfQlNUUkMoIiBwdXRcbiIpOwogICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CiB9Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKK2Jvb2wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKQEAgLTU5NiwxMCArNTk2LDEwIEBACiAgICAgU3RhcnRSZW5kZXJpbmcoKTsKICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoKHBPYmplY3QyRGV2aWNlLT5hID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmIgPT0gMCkgfHwgKHBPYmplY3QyRGV2aWNlLT5jID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmQgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKQEAgLTYyOCw3ICs2MjgsNyBAQAogICAgIH0KICAgICBidWYgPDwgRlhfQlNUUkMoIlFcbiIpOwogICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENGWF9QU1JlbmRlcmVyOjpXcml0ZVBTQmluYXJ5KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBsZW4pCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcAppbmRleCA1OWE0Y2ZiLi5jNWRhNjZhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAKIEZYX1JFQ1QgRlhHRV9HZXRHbHlwaHNCQm94KEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzLCBpbnQgYW50aV9hbGlhcywgRlhfRkxPQVQgcmV0aW5hU2NhbGVYLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkpCiB7CiAgICAgRlhfUkVDVCByZWN0KDAsIDAsIDAsIDApOwotICAgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgICBib29sIGJTdGFydGVkID0gZmFsc2U7CiAgICAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKICAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07CiAgICAgICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCogcEdseXBoID0gZ2x5cGgubV9wR2x5cGg7CkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gY2hhcl9yaWdodDsKICAgICAgICAgICAgIHJlY3QudG9wID0gY2hhcl90b3A7CiAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGNoYXJfYm90dG9tOwotICAgICAgICAgICAgYlN0YXJ0ZWQgPSBUUlVFOworICAgICAgICAgICAgYlN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHJlY3QubGVmdCA+IGNoYXJfbGVmdCkgewogICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IGNoYXJfbGVmdDsKQEAgLTg3LDkgKzg3LDkgQEAKIHN0YXRpYyB2b2lkIF9BZGp1c3RHbHlwaFNwYWNlKEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzKQogewogICAgIEFTU0VSVChuQ2hhcnMgPiAxKTsKLSAgICBGWF9CT09MIGJWZXJ0aWNhbCA9IEZBTFNFOworICAgIGJvb2wgYlZlcnRpY2FsID0gZmFsc2U7CiAgICAgaWYgKHBHbHlwaEFuZFBvc1tuQ2hhcnMgLSAxXS5tX09yaWdpblggPT0gcEdseXBoQW5kUG9zWzBdLm1fT3JpZ2luWCkgewotICAgICAgICBiVmVydGljYWwgPSBUUlVFOworICAgICAgICBiVmVydGljYWwgPSB0cnVlOwogICAgIH0gZWxzZSBpZiAocEdseXBoQW5kUG9zW25DaGFycyAtIDFdLm1fT3JpZ2luWSAhPSBwR2x5cGhBbmRQb3NbMF0ubV9PcmlnaW5ZKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICBiZ3JhWzNdID0gKGFscGhhX2ZsYWcgPj4gMjQpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOwogICAgIGFyZ2IgPSBGWEFSR0JfTUFLRShiZ3JhWzNdLCBiZ3JhWzJdLCBiZ3JhWzFdLCBiZ3JhWzBdKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Tm9ybWFsVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MkRldmljZSwKICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgRlhfRFdPUkQgdGV4dF9mbGFncywKQEAgLTE3MSwxMiArMTcxLDEyIEBACiAjZW5kaWYKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwVGV4dDJEZXZpY2UsIGZvbnRfc2l6ZSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShmaWxsX2NvbG9yKTsKICAgICAgICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSkgewogI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwpAQCAtMTg2LDcgKzE4Niw3IEBACiAjZW5kaWYKICNlbmRpZgogICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgIH0KICAgICBDRlhfQWZmaW5lTWF0cml4IGNoYXIyZGV2aWNlLCBkZXZpY2VDdG0sIHRleHQyRGV2aWNlOwpAQCAtMjA0LDI0ICsyMDQsMjQgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpbnQgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTU9OTzsKLSAgICBGWF9CT09MIGJOb3JtYWwgPSBGQUxTRTsKKyAgICBib29sIGJOb3JtYWwgPSBmYWxzZTsKICAgICBpZiAoKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9TTU9PVEgpID09IDApIHsKICAgICAgICAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19ESVNQTEFZICYmIG1fYnBwID4gMSkgewotICAgICAgICAgICAgRlhfQk9PTCBiQ2xlYXJUeXBlOworICAgICAgICAgICAgYm9vbCBiQ2xlYXJUeXBlOwogICAgICAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgPT0gTlVMTCAmJiAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0NMRUFSVFlQRSkpIHsKLSAgICAgICAgICAgICAgICBiQ2xlYXJUeXBlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBiQ2xlYXJUeXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9DTEVBUlRZUEU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKG1fUmVuZGVyQ2FwcyAmIChGWFJDX0FMUEhBX09VVFBVVCB8IEZYUkNfQ01ZS19PVVRQVVQpKSkgewogICAgICAgICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX0xDRDsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiTm9ybWFsID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9icHAgPCAxNikgewogICAgICAgICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJDbGVhclR5cGUgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBpZiAoYkNsZWFyVHlwZSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7Ci0gICAgICAgICAgICAgICAgICAgIGJOb3JtYWwgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiTm9ybWFsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjc4LDcgKzI3OCw3IEBACiAgICAgYm1wX3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CiAgICAgaWYgKGJtcF9yZWN0LklzRW1wdHkoKSkgewogICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaW50IHBpeGVsX3dpZHRoID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuV2lkdGgoKSAqIHNjYWxlX3gpOwogICAgIGludCBwaXhlbF9oZWlnaHQgPSBGWFNZU19yb3VuZChibXBfcmVjdC5IZWlnaHQoKSAqIHNjYWxlX3kpOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAgICAgICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7CiAgICAgICAgIGlmICghYml0bWFwLkNyZWF0ZShwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0LCBGWERJQl8xYnBwTWFzaykpIHsKICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7CiAgICAgICAgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKQEAgLTMwOCwxOSArMzA4LDE5IEBACiAgICAgaWYgKG1fYnBwID09IDgpIHsKICAgICAgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQpKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFiaXRtYXAuSGFzQWxwaGEoKSAmJiAhYml0bWFwLklzQWxwaGFNYXNrKCkpIHsKICAgICAgICAgYml0bWFwLkNsZWFyKDB4RkZGRkZGRkYpOwogICAgICAgICBpZiAoIUdldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApKSB7CiAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7CkBAIC0zNTIsMTMgKzM1MiwxMyBAQAogICAgICAgICBpbnQgbnJvd3MgPSBwR2x5cGgtPkdldEhlaWdodCgpOwogICAgICAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCkgewogICAgICAgICAgICAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlTWFzayhsZWZ0LCB0b3AsIG5jb2xzLCBucm93cywgcEdseXBoLCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIGZhbHNlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewogICAgICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiQkdSU3RyaXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9CR1JfU1RSSVBFOworICAgICAgICBib29sIGJCR1JTdHJpcGUgPSB0ZXh0X2ZsYWdzICYgRlhURVhUX0JHUl9TVFJJUEU7CiAgICAgICAgIG5jb2xzIC89IDM7CiAgICAgICAgIGludCB4X3N1YnBpeGVsID0gKGludCkoZ2x5cGgubV9mT3JpZ2luWCAqIDMpICUgMzsKICAgICAgICAgdWludDhfdCogc3JjX2J1ZiA9IHBHbHlwaC0+R2V0QnVmZmVyKCk7CkBAIC05NDUsOSArOTQ1LDkgQEAKICAgICAgICAgU2V0RElCaXRzKCZiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCk7CiAgICAgfQogICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd1RleHRQYXRoKGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd1RleHRQYXRoKGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLApAQCAtOTczLDcgKzk3Myw3IEBACiAgICAgICAgIG1hdHJpeC5Db25jYXQoKnBUZXh0MlVzZXIpOwogICAgICAgICBDRlhfUGF0aERhdGEgVHJhbnNmb3JtZWRQYXRoKCpwUGF0aCk7CiAgICAgICAgIFRyYW5zZm9ybWVkUGF0aC5UcmFuc2Zvcm0oJm1hdHJpeCk7Ci0gICAgICAgIEZYX0JPT0wgYkhhc0FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/CisgICAgICAgIGJvb2wgYkhhc0FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIHx8IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsbF9jb2xvciB8fCBzdHJva2VfY29sb3IpOwogICAgICAgICBpZiAoYkhhc0FscGhhKSB7CkBAIC05ODksMjQgKzk4OSwyNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOwogICAgICAgICAgICAgaWYgKCFEcmF3UGF0aCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChwQ2xpcHBpbmdQYXRoKSB7CiAgICAgICAgICAgICBwQ2xpcHBpbmdQYXRoLT5BcHBlbmQoJlRyYW5zZm9ybWVkUGF0aCwgcFVzZXIyRGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIENGWF9Gb250Q2FjaGU6On5DRlhfRm9udENhY2hlKCkKIHsKLSAgICBGcmVlQ2FjaGUoVFJVRSk7CisgICAgRnJlZUNhY2hlKHRydWUpOwogfQogCiBDRlhfRmFjZUNhY2hlKiBDRlhfRm9udENhY2hlOjpHZXRDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCkKIHsKICAgICBGWEZUX0ZhY2UgaW50ZXJuYWxfZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7Ci0gICAgY29uc3QgRlhfQk9PTCBiRXh0ZXJuYWwgPSBpbnRlcm5hbF9mYWNlID09IG51bGxwdHI7CisgICAgY29uc3QgYm9vbCBiRXh0ZXJuYWwgPSBpbnRlcm5hbF9mYWNlID09IG51bGxwdHI7CiAgICAgRlhGVF9GYWNlIGZhY2UgPSBiRXh0ZXJuYWwgPwogICAgICAgICAoRlhGVF9GYWNlKXBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9FeHRIYW5kbGUgOiBpbnRlcm5hbF9mYWNlOwogICAgIENGWF9GVENhY2hlTWFwJiBtYXAgPSBiRXh0ZXJuYWwgPyBtX0V4dEZhY2VNYXAgOiBtX0ZURmFjZU1hcDsKQEAgLTEwMjgsNyArMTAyOCw3IEBACiB2b2lkIENGWF9Gb250Q2FjaGU6OlJlbGVhc2VDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCkKIHsKICAgICBGWEZUX0ZhY2UgaW50ZXJuYWxfZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7Ci0gICAgY29uc3QgRlhfQk9PTCBiRXh0ZXJuYWwgPSBpbnRlcm5hbF9mYWNlID09IG51bGxwdHI7CisgICAgY29uc3QgYm9vbCBiRXh0ZXJuYWwgPSBpbnRlcm5hbF9mYWNlID09IG51bGxwdHI7CiAgICAgRlhGVF9GYWNlIGZhY2UgPSBiRXh0ZXJuYWwgPwogICAgICAgICAoRlhGVF9GYWNlKXBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9FeHRIYW5kbGUgOiBpbnRlcm5hbF9mYWNlOwogICAgIENGWF9GVENhY2hlTWFwJiBtYXAgPSAgYkV4dGVybmFsID8gbV9FeHRGYWNlTWFwIDogbV9GVEZhY2VNYXA7CkBAIC0xMDQzLDcgKzEwNDMsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRm9udENhY2hlOjpGcmVlQ2FjaGUoRlhfQk9PTCBiUmVsZWFzZSkKK3ZvaWQgQ0ZYX0ZvbnRDYWNoZTo6RnJlZUNhY2hlKGJvb2wgYlJlbGVhc2UpCiB7CiAgICAgZm9yIChhdXRvIGl0ID0gbV9GVEZhY2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9GVEZhY2VNYXAuZW5kKCk7KSB7CiAgICAgICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CkBAIC0xMDk1LDcgKzEwOTUsNyBAQAogfQogI2VuZGlmCiBDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6Okxvb2tVcEdseXBoQml0bWFwKENGWF9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBGYWNlR2x5cGhzS2V5LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLAorICAgICAgICBDRlhfQnl0ZVN0cmluZ0MmIEZhY2VHbHlwaHNLZXksIEZYX0RXT1JEIGdseXBoX2luZGV4LCBib29sIGJGb250U3R5bGUsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcykKIHsKICAgICBDRlhfU2l6ZUdseXBoQ2FjaGUqIHBTaXplQ2FjaGUgPSBOVUxMOwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKICAgICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLlNldEF0KCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LCBwR2x5cGhCaXRtYXApOwogICAgIHJldHVybiBwR2x5cGhCaXRtYXA7CiB9Ci1jb25zdCBDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OkxvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCitjb25zdCBDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OkxvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBib29sIGJGb250U3R5bGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcywgaW50JiB0ZXh0X2ZsYWdzKQogewogICAgIGlmIChnbHlwaF9pbmRleCA9PSAoRlhfRFdPUkQpIC0gMSkgewpAQCAtMTMxMSw3ICsxMzExLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLUNGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6UmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLAorQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBib29sIGJGb250U3R5bGUsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcykKIHsKICAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKQEAgLTEzMjIsNyArMTMyMiw3IEBACiAgICAgZnRfbWF0cml4Lnh5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXRDKCkgLyA2NCAqIDY1NTM2KTsKICAgICBmdF9tYXRyaXgueXggPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPkdldEIoKSAvIDY0ICogNjU1MzYpOwogICAgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0RCgpIC8gNjQgKiA2NTUzNik7Ci0gICAgRlhfQk9PTCBiVXNlQ0pLU3ViRm9udCA9IEZBTFNFOworICAgIGJvb2wgYlVzZUNKS1N1YkZvbnQgPSBmYWxzZTsKICAgICBjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250ID0gcEZvbnQtPkdldFN1YnN0Rm9udCgpOwogICAgIGlmIChwU3Vic3RGb250KSB7CiAgICAgICAgIGJVc2VDSktTdWJGb250ID0gcFN1YnN0Rm9udC0+bV9iU3Vic3RPZkNKSyAmJiBiRm9udFN0eWxlOwpAQCAtMTQyMiwxOCArMTQyMiwxOCBAQAogICAgIH0KICAgICByZXR1cm4gcEdseXBoQml0bWFwOwogfQotRlhfQk9PTCBfT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwKK2Jvb2wgX091dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfaW5kZXgsIEZYX0FSR0IgYXJnYikKIHsKICAgICBDRlhfRElCaXRtYXAqIHBEaWIgPSAoQ0ZYX0RJQml0bWFwKilkaWI7CiAgICAgRlhGVF9GYWNlIGZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwogICAgIGludCBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChmYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX0JJVE1BUCk7CiAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBlcnJvciA9IEZYRlRfUmVuZGVyX0dseXBoKGZhY2UsIEZYRlRfUkVOREVSX01PREVfTk9STUFMKTsKICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCBibXdpZHRoID0gRlhGVF9HZXRfQml0bWFwX1dpZHRoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7CiAgICAgaW50IGJtaGVpZ2h0ID0gRlhGVF9HZXRfQml0bWFwX1Jvd3MoRlhGVF9HZXRfR2x5cGhfQml0bWFwKGZhY2UpKTsKQEAgLTE0NTEsMTMgKzE0NTEsMTMgQEAKICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3RfcGl0Y2gpOwogICAgIH0KICAgICBwRGliLT5Db21wb3NpdGVNYXNrKHggKyBsZWZ0LCB5IC0gdG9wLCBibXdpZHRoLCBibWhlaWdodCwgJm1hc2ssIGFyZ2IsIDAsIDApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBPdXRwdXRUZXh0KHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCitib29sIE91dHB1dFRleHQodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dF9tYXRyaXgsIHVuc2lnbmVkIHNob3J0IGNvbnN0KiB0ZXh0LCB1bnNpZ25lZCBsb25nIGFyZ2IpCiB7CiAgICAgaWYgKCFwRm9udCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhGVF9GYWNlIGZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwogICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAocEZvbnQtPm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKTsKQEAgLTE0OTAsOSArMTQ5MCw5IEBACiAgICAgfQogICAgIGlmIChwVGV4dF9tYXRyaXgpCiAgICAgICAgIFJlc2V0VHJhbnNmb3JtKGZhY2UpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBPdXRwdXRHbHlwaCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAorYm9vbCBPdXRwdXRHbHlwaCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCB1bnNpZ25lZCBsb25nIGdseXBoX2luZGV4LCB1bnNpZ25lZCBsb25nIGFyZ2IpCiB7CiAgICAgRlhGVF9NYXRyaXggIGZ0X21hdHJpeDsKQEAgLTE1MDcsNyArMTUwNyw3IEBACiAgICAgICAgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykoZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CiAgICAgfQogICAgIFNjb3BlZEZvbnRUcmFuc2Zvcm0gc2NvcGVkX3RyYW5zZm9ybShwRm9udC0+bV9GYWNlLCAmZnRfbWF0cml4KTsKLSAgICBGWF9CT09MIHJldCA9IF9PdXRwdXRHbHlwaChkaWIsIHgsIHksIHBGb250LAorICAgIGJvb2wgcmV0ID0gX091dHB1dEdseXBoKGRpYiwgeCwgeSwgcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIGFyZ2IpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xNTMzLDcgKzE1MzMsNyBAQAogICAgIHJldHVybiBwR2x5cGhQYXRoOwogfQogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEZYX0JPT0wJCQltX2JDb3VudDsKKyAgICBib29sCQkJbV9iQ291bnQ7CiAgICAgaW50CQkJCW1fUG9pbnRDb3VudDsKICAgICBGWF9QQVRIUE9JTlQqCW1fcFBvaW50czsKICAgICBpbnQJCQkJbV9DdXJYOwpAQCAtMTY4NCw3ICsxNjg0LDcgQEAKICAgICBmdW5jcy5zaGlmdCA9IDA7CiAgICAgZnVuY3MuZGVsdGEgPSAwOwogICAgIE9VVExJTkVfUEFSQU1TIHBhcmFtczsKLSAgICBwYXJhbXMubV9iQ291bnQgPSBUUlVFOworICAgIHBhcmFtcy5tX2JDb3VudCA9IHRydWU7CiAgICAgcGFyYW1zLm1fUG9pbnRDb3VudCA9IDA7CiAgICAgRlhGVF9PdXRsaW5lX0RlY29tcG9zZShGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksICZmdW5jcywgJnBhcmFtcyk7CiAgICAgaWYgKHBhcmFtcy5tX1BvaW50Q291bnQgPT0gMCkgewpAQCAtMTY5Miw3ICsxNjkyLDcgQEAKICAgICB9CiAgICAgQ0ZYX1BhdGhEYXRhKiBwUGF0aCA9IG5ldyBDRlhfUGF0aERhdGE7CiAgICAgcFBhdGgtPlNldFBvaW50Q291bnQocGFyYW1zLm1fUG9pbnRDb3VudCk7Ci0gICAgcGFyYW1zLm1fYkNvdW50ID0gRkFMU0U7CisgICAgcGFyYW1zLm1fYkNvdW50ID0gZmFsc2U7CiAgICAgcGFyYW1zLm1fUG9pbnRDb3VudCA9IDA7CiAgICAgcGFyYW1zLm1fcFBvaW50cyA9IHBQYXRoLT5HZXRQb2ludHMoKTsKICAgICBwYXJhbXMubV9DdXJYID0gcGFyYW1zLm1fQ3VyWSA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmggYi9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgKaW5kZXggMTJmYWM2YS4uMmU4NjFiYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaApAQCAtMzIsMTIgKzMyLDEyIEBACiAgICAgICAgIG1fUmVmQ291bnQgPSAwOwogICAgIH0KICAgICB+Q1RURm9udERlc2MoKTsKLSAgICBGWF9CT09MCQkJUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOworICAgIGJvb2wJCQlSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSk7CiAgICAgaW50CQkJCW1fVHlwZTsKICAgICB1bmlvbiB7CiAgICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBGWF9CT09MCQltX2JJdGFsaWM7Ci0gICAgICAgICAgICBGWF9CT09MCQltX2JCb2xkOworICAgICAgICAgICAgYm9vbAkJbV9iSXRhbGljOworICAgICAgICAgICAgYm9vbAkJbV9iQm9sZDsKICAgICAgICAgICAgIEZYRlRfRmFjZQltX3BGYWNlOwogICAgICAgICB9IG1fU2luZ2xlRmFjZTsKICAgICAgICAgc3RydWN0IHsKQEAgLTYzLDkgKzYzLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBVbmljb2RlOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKKyAgICB2aXJ0dWFsIGJvb2wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9OwogI2RlZmluZSBDSEFSU0VUX0ZMQUdfQU5TSQkJMQpAQCAtOTcsNyArOTcsNyBAQAogICAgIEZYX0RXT1JECQkJbV9GaWxlU2l6ZTsKICAgICBGWF9EV09SRAkJCW1fRm9udE9mZnNldDsKICAgICBpbnQJCQkJCW1fV2VpZ2h0OwotICAgIEZYX0JPT0wJCQkJbV9iSXRhbGljOworICAgIGJvb2wJCQkJbV9iSXRhbGljOwogICAgIGludAkJCQkJbV9QaXRjaEZhbWlseTsKICAgICBDRlhfQnl0ZVN0cmluZwkJbV9Gb250VGFibGVzOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmNwcAppbmRleCAzNDM3ZWI0Li4xM2JiNzUzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuY3BwCkBAIC0xMjk4LDcgKzEyOTgsNyBAQAogCiAKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRlhfQk9PTCBDRlhfU2tpYVJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICBib29sIENGWF9Ta2lhUmVuZGVyZXI6OkluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiUmdiQnl0ZU9yZGVyLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkgLy9UaGUgYWxwaGEgZmxhZyBtdXN0IGJlIGZpbGxfZmxhZyBpZiBleGlzdC4KICAgICB7CiAgICAgICAgIG1fcERldmljZSA9IHBEZXZpY2U7CkBAIC0xMzMxLDggKzEzMzEsOCBAQAogCiAgICAgICAgIG1fYkZ1bGxDb3ZlciA9IGJGdWxsQ292ZXI7CiAKLSAgICAgICAgRlhfQk9PTCBiT2JqZWN0Q01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7Ci0gICAgICAgIEZYX0JPT0wgYkRldmljZUNNWUsgPSBwRGV2aWNlLT5Jc0NteWtJbWFnZSgpOworICAgICAgICBib29sIGJPYmplY3RDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKKyAgICAgICAgYm9vbCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CiAKICAgICAgICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CiAKQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsIChjb25zdCB1aW50OF90KikmbV9Db2xvciwgMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gT2JqZWN0IFJHQgogICAgICAgICAgICAgICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMzg1LDcgKzEzODUsNyBAQAogICAgICAgICAgICAgICAgIG1fR3JlZW4gPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsxXTsKICAgICAgICAgICAgICAgICBtX0JsdWUgID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CiAgICAgICAgICAgICAgICAgbV9HcmF5ICA9ICgodWludDhfdCopJm1fQ29sb3IpWzNdOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgICBjb2xvciA9IGJPYmplY3RDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7CkBAIC0xNDk2LDggKzE0OTYsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb21wb3NpdGVfc3BhbiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE1OTUsNyArMTU5NSw3IEBACiAgICAgICAgIGJsaXRWKHgsIHksIGhlaWdodCwgcmlnaHRBbHBoYSk7CiAgICAgfQogCi0gICAgRlhfQk9PTCBDRlhfU2tpYUE4UmVuZGVyZXI6OkluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCkKKyAgICBib29sIENGWF9Ta2lhQThSZW5kZXJlcjo6SW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKQogICAgIHsKICAgICAgICAgbV9wRGV2aWNlID0gcERldmljZTsKICAgICAgICAgbV9MZWZ0ID0gTGVmdDsKQEAgLTE2MDQsNiArMTYwNCw2IEBACiAgICAgICAgICAgICBtX2RzdFdpZHRoID0gbV9MZWZ0ICsgcERldmljZS0+R2V0V2lkdGgoKTsKICAgICAgICAgICAgIG1fZHN0SGVpZ2h0ID0gbV9Ub3AgKyBwRGV2aWNlLT5HZXRIZWlnaHQoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5oIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaAppbmRleCBlNjBjNjM5Li5jZDQxMWRhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmgKQEAgLTE1LDkgKzE1LDkgQEAKIAkJCQltX0JsdWUsCQkvLyBZZWxsb3cKIAkJCQltX0dyYXk7CQkvLyBCbGFjawogCUZYX0RXT1JECW1fQ29sb3I7CS8vIEZYX0FSR0Igb3IgRlhfQ01ZSwotCUZYX0JPT0wJCW1fYkZ1bGxDb3ZlcjsKKwlib29sCQltX2JGdWxsQ292ZXI7CiAJaW50CQkJbV9Qcm9jZXNzRmlsdGVyOwotCUZYX0JPT0wgICAgIG1fYlJnYkJ5dGVPcmRlcjsKKwlib29sICAgICBtX2JSZ2JCeXRlT3JkZXI7CiAKIAlGWF9SRUNUCQkJCW1fQ2xpcEJveDsKIAlDRlhfRElCaXRtYXAqCQltX3BEZXZpY2U7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAogCiAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZYX0JPT0wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisJYm9vbCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYlJnYkJ5dGVPcmRlciwKIAkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7IC8vVGhlIGFscGhhIGZsYWcgbXVzdCBiZSBmaWxsX2ZsYWcgaWYgZXhpc3QuCiB9OwogY2xhc3MgQ0ZYX1NraWFBOFJlbmRlcmVyIDogcHVibGljIFNrQmxpdHRlcgpAQCAtMjE4LDcgKzIxOCw3IEBACiAJdmlydHVhbCB2b2lkIGJsaXRSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAl2aXJ0dWFsCXZvaWQgYmxpdEFudGlSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTa0FscGhhIGxlZnRBbHBoYSwgU2tBbHBoYSByaWdodEFscGhhKTsKIAkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IExlZnQsIGludCBUb3ApOworCWJvb2wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKTsKIAlDRlhfRElCaXRtYXAqIG1fcERldmljZTsKIAlpbnQgbV9MZWZ0OwogCWludCBtX1RvcDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwCmluZGV4IDQxY2UwNzcuLjcyNDc4YjEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcApAQCAtNDYsMjQgKzQ2LDI0IEBACiBwdWJsaWM6CiAJc3RhdGljIHZvaWQgRHJhd1BhdGgoY29uc3QgU2tQYXRoJiBzcmNQYXRoLCBTa0JsaXR0ZXIqIGJsaXR0ZXIsICBjb25zdCBTa1Jhc3RlckNsaXAmIHJlY3QsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCk7CiB9OwotRlhfQk9PTCBGeFNrRHJhd1RyZWF0QXNIYWlybGluZShjb25zdCBTa1BhaW50JiBwYWludCwgU2tTY2FsYXIqIGNvdmVyYWdlKSB7Citib29sIEZ4U2tEcmF3VHJlYXRBc0hhaXJsaW5lKGNvbnN0IFNrUGFpbnQmIHBhaW50LCBTa1NjYWxhciogY292ZXJhZ2UpIHsKIAlpZiAoU2tQYWludDo6a1N0cm9rZV9TdHlsZSAhPSBwYWludC5nZXRTdHlsZSgpKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlGWFNZU19hc3NlcnQoY292ZXJhZ2UpOwogCVNrU2NhbGFyIHN0cm9rZVdpZHRoID0gcGFpbnQuZ2V0U3Ryb2tlV2lkdGgoKTsKIAlpZiAoMCA9PSBzdHJva2VXaWR0aCkgewogCQkqY292ZXJhZ2UgPSBTS19TY2FsYXIxOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCS8vIGlmIHdlIGdldCBoZXJlLCB3ZSBuZWVkIHRvIHRyeSB0byBmYWtlIGEgdGhpY2stc3Ryb2tlIHdpdGggYSBtb2R1bGF0ZWQKIAkvLyBoYWlybGluZQogCWlmICghcGFpbnQuaXNBbnRpQWxpYXMoKSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKHN0cm9rZVdpZHRoIDw9IFNLX1NjYWxhcjEpIHsKIAkJKmNvdmVyYWdlID0gc3Ryb2tlV2lkdGg7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBTdXBlckJsaXR0ZXJfc2tpYTo6RHJhd1BhdGgoY29uc3QgU2tQYXRoJiBzcmNQYXRoLCBTa0JsaXR0ZXIqIGJsaXR0ZXIsIGNvbnN0IFNrUmFzdGVyQ2xpcCYgcmVjdCwgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50KQpAQCAtMTY3LDcgKzE2Nyw3IEBACiBzdGF0aWMgdm9pZCBTa1Jhc3Rlcml6ZVN0cm9rZShTa1BhaW50JiBzcGFpbnQsIFNrUGF0aCogZHN0UGF0aERhdGEsIFNrUGF0aCYgcGF0aF9kYXRhLAogCQkJCQkgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAJCQkJCSBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBGWF9GSVhGTE9BVCBzY2FsZSA9IEZJWDhfT05FLAotCQkJCQkgRlhfQk9PTCBiU3Ryb2tlQWRqdXN0ID0gRkFMU0UsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCisJCQkJCSBib29sIGJTdHJva2VBZGp1c3QgPSBmYWxzZSwgYm9vbCBiVGV4dE1vZGUgPSBmYWxzZSkKIHsKIAlTa1BhaW50OjpDYXAgY2FwOwogCXN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewpAQCAtMjAzLDcgKzIwMyw3IEBACiAJCXN0cm9rZXIuc2V0Sm9pbihqb2luKTsKIAkJc3Ryb2tlci5zZXRNaXRlckxpbWl0KHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwogCQlzdHJva2VyLnNldFdpZHRoKHdpZHRoKTsKLQkJc3Ryb2tlci5zZXREb0ZpbGwoRkFMU0UpOworCQlzdHJva2VyLnNldERvRmlsbChmYWxzZSk7CiAJCXN0cm9rZXIuc3Ryb2tlUGF0aChwYXRoX2RhdGEsIGRzdFBhdGhEYXRhKTsKIAkJU2tNYXRyaXggc21hdHJpeDsKIAkJc21hdHJpeC5zZXRBbGwocE9iamVjdDJEZXZpY2UtPmEsIHBPYmplY3QyRGV2aWNlLT5jLCBwT2JqZWN0MkRldmljZS0+ZSwgcE9iamVjdDJEZXZpY2UtPmIsIHBPYmplY3QyRGV2aWNlLT5kLCBwT2JqZWN0MkRldmljZS0+ZiwgMCwgMCwgMSk7CkBAIC0yMzUsNyArMjM1LDcgQEAKIAl9CiB9CiAKLUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDRlhfU2tpYURldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCitDRlhfU2tpYURldmljZURyaXZlcjo6Q0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIGJvb2wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBib29sIGJHcm91cEtub2Nrb3V0KQogewogCW1fcEFnZ0RyaXZlciA9IG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CiB9CkBAIC0yNDMsNyArMjQzLDcgQEAKIHsKICAgICBkZWxldGUgbV9wQWdnRHJpdmVyOwogfQotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCitib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKIAkJQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRklYRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKIAkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CkBAIC0yNTksNyArMjU5LDcgQEAKIAltX3BBZ2dEcml2ZXItPlNhdmVTdGF0ZSgpOwogfQogCi12b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQordm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCkKIHsKIAltX3BBZ2dEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKIH0KQEAgLTI5NCw3ICsyOTQsNyBAQAogCW1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YoY2xpcF9ib3guZkxlZnQsIGNsaXBfYm94LmZUb3AsIG1hc2spOwogCiB9Ci1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwogCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCiAJCQkJCQlpbnQgZmlsbF9tb2RlCS8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUKIAkJCQkJCSkKQEAgLTMwOCw3ICszMDgsNyBAQAogCQkJcmVjdGYuSW50ZXJzZWN0KENGWF9GbG9hdFJlY3QoMCwgMCwgKEZYX0ZJWEZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIChGWF9GSVhGTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwogCQkJRlhfUkVDVCByZWN0ID0gcmVjdGYuR2V0T3V0dGVyUmVjdCgpOwogCQkJbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOwotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KIAlDU2tpYV9QYXRoRGF0YSBwYXRoX2RhdGE7CkBAIC0zMTgsMTUgKzMxOCwxNSBAQAogCiAJU2tQYWludCBzcGFpbnQ7CiAJc3BhaW50LnNldENvbG9yKDB4ZmZmZmZmZmYpOwotCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7CisJc3BhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKIAlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwogCiAJU2V0Q2xpcE1hc2socGF0aF9kYXRhLm1fUGF0aERhdGEsICZzcGFpbnQpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCitib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwogCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCiAJCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCS8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcwogCQkJCQkpCkBAIC0zNDIsMzYgKzM0MiwzNiBAQAogCVNrUGFpbnQgc3BhaW50OwogCXNwYWludC5zZXRDb2xvcigweGZmZmZmZmZmKTsKIAlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7Ci0Jc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKKwlzcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwogCiAJU2tQYXRoIGRzdF9wYXRoOwotCVNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgMCk7CisJU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIDEsIGZhbHNlLCAwKTsKIAlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwogCVNldENsaXBNYXNrKGRzdF9wYXRoLCAmc3BhaW50KTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgYm9vbCBiRnVsbENvdmVyLCBib29sIGJHcm91cEtub2Nrb3V0LAogCQkJCQkJCQkJCQkgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPlJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgY29sb3IsIGJGdWxsQ292ZXIsIGJHcm91cEtub2Nrb3V0LGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplclNraWEoU2tQYXRoJiBza1BhdGgsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCwgU2tJUmVjdCYgcmVjdCwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiRmlsbCkKK2Jvb2wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCisJCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkZpbGwpCiB7CiAJQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0P21fcEFnZ0RyaXZlci0+R2V0QmFja0Ryb3AoKTpOVUxMOwogCUNGWF9Ta2lhUmVuZGVyZXIgcmVuZGVyOwogCWlmICghcmVuZGVyLkluaXQobV9wQWdnRHJpdmVyLT5tX3BCaXRtYXAsIHB0LCBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24sIGNvbG9yLCBiRnVsbENvdmVyLCBtX3BBZ2dEcml2ZXItPm1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJU2tSYXN0ZXJDbGlwIHJhc3RlckNsaXAocmVjdCk7CiAJU3VwZXJCbGl0dGVyX3NraWE6OkRyYXdQYXRoKHNrUGF0aCwgKFNrQmxpdHRlciopJnJlbmRlciwgIHJhc3RlckNsaXAsIG9yaWdQYWludCk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIAogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCitib29sCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCiAJCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KIAkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCS8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcwogCQkJCQkJRlhfRFdPUkQgZmlsbF9jb2xvciwJCQkvLyBmaWxsIGNvbG9yCkBAIC0zODEsNyArMzgxLDcgQEAKIAkJCQkJCXZvaWQqIHBJY2NUcmFuc2Zvcm0KIAkJCQkJCSkKIHsKLQlpZiAoR2V0QnVmZmVyKCkgPT0gTlVMTCkgcmV0dXJuIFRSVUU7CisJaWYgKEdldEJ1ZmZlcigpID09IE5VTEwpIHJldHVybiB0cnVlOwogCUZPWElUX0RFQlVHMSgiQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdQYXRoOiBlbnRlcmluZyIpOwogCVNrSVJlY3QgcmVjdDsKIAlyZWN0LnNldCgwLCAwLCBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7CkBAIC0zOTYsMTEgKzM5NiwxMSBAQAogCQlwYXRoX2RhdGEubV9QYXRoRGF0YS5zZXRGaWxsVHlwZSgoZmlsbF9tb2RlJjMpID09IEZYRklMTF9XSU5ESU5HPyBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlOlNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUpOwogCiAJCVNrUGFpbnQgc3BhaW50OwotCQlzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworCQlzcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwogCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwogCQlzcGFpbnQuc2V0Q29sb3IoZmlsbF9jb2xvcik7Ci0JCWlmICghUmVuZGVyUmFzdGVyaXplclNraWEocGF0aF9kYXRhLm1fUGF0aERhdGEsIHNwYWludCwgcmVjdCwgZmlsbF9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKQotCQkJcmV0dXJuIEZBTFNFOworCQlpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBzcGFpbnQsIHJlY3QsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIGZhbHNlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwpAQCAtNDI3LDQ4ICs0MjcsNDggQEAKIAkJU2tQYWludCBzcGFpbnQ7CiAJCXNwYWludC5zZXRDb2xvcihzdHJva2VfY29sb3IpOwogCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7Ci0JCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7CisJCXNwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CiAJCVNrUGF0aCBkc3RfcGF0aDsKLQkJU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIDApOworCQlTa1Jhc3Rlcml6ZVN0cm9rZShzcGFpbnQsICZkc3RfcGF0aCwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwgbWF0cml4MS5hLCBmYWxzZSwgMCk7CiAJCXNwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7CiAJCWludCBmaWxsX2ZsYWcgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpPDw4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKIAotCQlpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKGRzdF9wYXRoLCBzcGFpbnQsIHJlY3QsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgRkFMU0UsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSwgRkFMU0UpKQotCQkJcmV0dXJuIEZBTFNFOworCQlpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKGRzdF9wYXRoLCBzcGFpbnQsIHJlY3QsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgZmFsc2UsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSwgZmFsc2UpKQorCQkJcmV0dXJuIGZhbHNlOwogCiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCitib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAogCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+U2V0UGl4ZWwoeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+RmlsbFJlY3QocFJlY3QsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQorYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKIHsKIAlyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRDbGlwQm94KHBSZWN0KTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkRFZGdlKQorYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGJvb2wgYkRFZGdlKQogewogCXJldHVybiBtX3BBZ2dEcml2ZXItPkdldERJQml0cyhwQml0bWFwLCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0sIGJERWRnZSk7CiB9CiAKLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAJCQkJCQkJCQkgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKIAlyZXR1cm4gbV9wQWdnRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgYXJnYiwgcFNyY1JlY3QsIGxlZnQsIHRvcCwgYmxlbmRfdHlwZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9CiAKLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBhcmdiLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAJCQkJCQkJaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKIAkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCQkJCQkJCWFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAorYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgYXJnYiwKIAkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKIAkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJCQkJCQlwTWF0cml4LCByZW5kZXJfZmxhZ3MsIGhhbmRsZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9CiAKLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKHZvaWQqIHBIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQorYm9vbAlDRlhfU2tpYURldmljZURyaXZlcjo6Q29udGludWVESUJpdHModm9pZCogcEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAJcmV0dXJuIG1fcEFnZ0RyaXZlci0+Q29udGludWVESUJpdHMocEhhbmRsZSwgcFBhdXNlKTsKIH0KQEAgLTQ5NywzMSArNDk3LDMxIEBACiAKIENGWF9Ta2lhRGV2aWNlOjpDRlhfU2tpYURldmljZSgpCiB7Ci0JbV9iT3duZWRCaXRtYXAgPSBGQUxTRTsKKwltX2JPd25lZEJpdG1hcCA9IGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQorYm9vbCBDRlhfU2tpYURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBib29sIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgYm9vbCBiR3JvdXBLbm9ja291dCkKIHsKIAlpZiAocEJpdG1hcCA9PSBOVUxMKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlTZXRCaXRtYXAocEJpdG1hcCk7CiAJQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKIAlTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cywgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKQorYm9vbCBDRlhfU2tpYURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpCiB7Ci0JbV9iT3duZWRCaXRtYXAgPSBUUlVFOworCW1fYk93bmVkQml0bWFwID0gdHJ1ZTsKIAlDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogCWlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKIAkJZGVsZXRlIHBCaXRtYXA7Ci0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAlTZXRCaXRtYXAocEJpdG1hcCk7Ci0JQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSAgbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBGQUxTRSwgcE9yaURldmljZSwgRkFMU0UpOworCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gIG5ldyBDRlhfU2tpYURldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgZmFsc2UsIHBPcmlEZXZpY2UsIGZhbHNlKTsKIAlTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiBDRlhfU2tpYURldmljZTo6fkNGWF9Ta2lhRGV2aWNlKCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKaW5kZXggYWI1MWU1MS4uNzI3ODY3MSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKKysrIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKQEAgLTksNyArOSw3IEBACiBjbGFzcyBDRlhfU2tpYURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCiB7CiBwdWJsaWM6Ci0JQ0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KTsKKwlDRlhfU2tpYURldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgYm9vbCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIGJvb2wgYkdyb3VwS25vY2tvdXQpOwogCXZpcnR1YWwgfkNGWF9Ta2lhRGV2aWNlRHJpdmVyKCk7CiAKIAkvKiogT3B0aW9ucyAqLwpAQCAtMTcsMjIgKzE3LDIyIEBACiAKIAkvKiogU2F2ZSBhbmQgcmVzdG9yZSBhbGwgZ3JhcGhpYyBzdGF0ZXMgKi8KIAl2aXJ0dWFsIHZvaWQJCVNhdmVTdGF0ZSgpOwotCXZpcnR1YWwgdm9pZAkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCk7CisJdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKTsKIAogCS8qKiBTZXQgY2xpcHBpbmcgcGF0aCB1c2luZyBmaWxsZWQgcmVnaW9uICovCi0JdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KKwl2aXJ0dWFsIGJvb2wJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwogCQkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgogCQkJCQkJCWludCBmaWxsX21vZGUJLy8gZmlsbCBtb2RlLCBXSU5ESU5HIG9yIEFMVEVSTkFURQogCQkJCQkJCSk7CiAKIAkvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgc3Ryb2tlZCByZWdpb24gKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCisJdmlydHVhbCBib29sCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwogCQkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgogCQkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUJLy8gZ3JhcGhpYyBzdGF0ZSwgZm9yIHBlbiBhdHRyaWJ1dGVzCiAJCQkJCQkJKTsKIAogCS8qKiBEcmF3IGEgcGF0aCAqLwotCXZpcnR1YWwgRlhfQk9PTAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisJdmlydHVhbCBib29sCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKIAkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogCQkJCQkJY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKIAkJCQkJCUZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC00Miw0NCArNDIsNDQgQEAKIAkJCQkJCXZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMCiAJCQkJCQkJKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKKwl2aXJ0dWFsIGJvb2wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCisJdmlydHVhbCBib29sCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwKIAkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCiAJLyoqIERyYXcgYSBzaW5nbGUgcGl4ZWwgKGRldmljZSBkZXBlbmRhbnQpIGxpbmUgKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCURyYXdDb3NtZXRpY0xpbmUoRlhfRklYRkxPQVQgeDEsIEZYX0ZJWEZMT0FUIHkxLCBGWF9GSVhGTE9BVCB4MiwgRlhfRklYRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAotCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkgeyByZXR1cm4gRkFMU0U7IH0KKwl2aXJ0dWFsIGJvb2wJCURyYXdDb3NtZXRpY0xpbmUoRlhfRklYRkxPQVQgeDEsIEZYX0ZJWEZMT0FUIHkxLCBGWF9GSVhGTE9BVCB4MiwgRlhfRklYRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAorCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkgeyByZXR1cm4gZmFsc2U7IH0KIAotCXZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CisJdmlydHVhbCBib29sCQlHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKIAogCS8qKiBMb2FkIGRldmljZSBidWZmZXIgaW50byBhIERJQiAqLwotCXZpcnR1YWwgRlhfQk9PTAkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKKwl2aXJ0dWFsIGJvb2wJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSk7CiAKIAl2aXJ0dWFsIENGWF9ESUJpdG1hcCogICBHZXRCYWNrRHJvcCgpIHsgcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QmFja0Ryb3AoKTsgfQogCi0JdmlydHVhbCBGWF9CT09MCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAorCXZpcnR1YWwgYm9vbAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKIAkJCQkJCWludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGJsZW5kX3R5cGUsCiAJCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKwl2aXJ0dWFsIGJvb2wJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKIAkJCQlpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0JdmlydHVhbCBGWF9CT09MCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKwl2aXJ0dWFsIGJvb2wJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAogCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotCXZpcnR1YWwgRlhfQk9PTAkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisJdmlydHVhbCBib29sCQlDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKIAl2aXJ0dWFsIHZvaWQJCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOwogCi0JdmlydHVhbCBGWF9CT09MICAgICBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKKwl2aXJ0dWFsIGJvb2wgICAgIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAogCQkJCQkJQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRklYRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKIAkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0JdmlydHVhbCBGWF9CT09MCQlSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCisJdmlydHVhbCBib29sCQlSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBib29sIGJGdWxsQ292ZXIsIGJvb2wgYkdyb3VwS25vY2tvdXQsCiAJCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotCXZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplclNraWEoU2tQYXRoJiBza1BhdGgsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCwgU2tJUmVjdCYgcmVjdCwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiRmlsbCA9IFRSVUUpOworCXZpcnR1YWwgYm9vbAkJUmVuZGVyUmFzdGVyaXplclNraWEoU2tQYXRoJiBza1BhdGgsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCwgU2tJUmVjdCYgcmVjdCwgRlhfRFdPUkQgY29sb3IsIGJvb2wgYkZ1bGxDb3ZlciwgYm9vbCBiR3JvdXBLbm9ja291dCwKKwkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgYm9vbCBiRmlsbCA9IHRydWUpOwogCXZvaWQJCQkJU2V0Q2xpcE1hc2socmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplcik7CiAJdm9pZAkJCQlTZXRDbGlwTWFzayhTa1BhdGgmIHNrUGF0aCwgU2tQYWludCogc3BhaW50KTsKIAl2aXJ0dWFsCXVpbnQ4X3QqCUdldEJ1ZmZlcigpIGNvbnN0IHtyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRCdWZmZXIoKTt9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oCmluZGV4IGRjMmEzMzguLjQ4OTYxNjEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oCkBAIC0zNSwxNSArMzUsMTUgQEAKICAgICB2b2lkCQkJTG9hZCgpOwogICAgIHZvaWQgICAgICAgICAgICBVbmxvYWQoKTsKIAotICAgIEZYX0JPT0wJCQlJc0F2YWlsYWJsZSgpCisgICAgYm9vbAkJCUlzQXZhaWxhYmxlKCkKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BEV3JpdGVGYWN0b3J5ICE9IE5VTEw7CiAgICAgfQogCiAgICAgdm9pZCoJCQlEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IHNpbXVsYXRpb25fc3R5bGUpOwotICAgIEZYX0JPT0wgICAgICAgICBEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBTcmMsIHZvaWQqKiByZW5kZXJUYXJnZXQpOworICAgIGJvb2wgICAgICAgICBEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBTcmMsIHZvaWQqKiByZW5kZXJUYXJnZXQpOwogICAgIHZvaWQgICAgICAgICAgICBEd0RlbGV0ZVJlbmRlcmluZ1RhcmdldCh2b2lkKiByZW5kZXJUYXJnZXQpOwotICAgIEZYX0JPT0wJCQlEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX1JFQ1QmIHN0cmluZ1JlY3QsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgYm9vbAkJCUR3UmVuZGluZ1N0cmluZyh2b2lkKiByZW5kZXJUYXJnZXQsIENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfUkVDVCYgc3RyaW5nUmVjdCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfQVJHQiB0ZXh0X2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2NvdW50LCB1bnNpZ25lZCBzaG9ydCogZ2x5cGhfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWCwgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwCmluZGV4IDE4YmNjNTkuLmU2NjY3YjEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAKQEAgLTI0LDE4ICsyNCwxOCBAQAogICAgIENXaW4zMkZvbnRJbmZvKCk7CiAgICAgfkNXaW4zMkZvbnRJbmZvKCk7CiAgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOwotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgRlhfQk9PTCYgYkV4YWN0KTsKKyAgICB2aXJ0dWFsCWJvb2wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcik7CisgICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBib29sIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBib29sJiBiRXhhY3QpOwogICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkKICAgICB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwgdWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKTsKICAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOwotICAgIEZYX0JPT0wJCQkJSXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZik7Ci0gICAgRlhfQk9PTAkJCQlJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKTsKKyAgICB2aXJ0dWFsCWJvb2wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgICAgdmlydHVhbCBib29sCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KTsKKyAgICBib29sCQkJCUlzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBICpwbGYpOworICAgIGJvb2wJCQkJSXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZik7CiAgICAgdm9pZAkJCQlBZGRJbnN0YWxsZWRGb250KGNvbnN0IExPR0ZPTlRBICpwbGYsIEZYX0RXT1JEIEZvbnRUeXBlKTsKICAgICB2b2lkCQkJCUdldEdCUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSk7CiAgICAgdm9pZAkJCQlHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpOwpAQCAtNTksMTAgKzU5LDEwIEBACiAgICAgZGVsZXRlIHRoaXM7CiB9CiAjZGVmaW5lIFRUX01BS0VfVEFHKHgxLCB4MiwgeDMsIHg0KSAoKChGWF9EV09SRCl4MTw8MjQpfCgoRlhfRFdPUkQpeDI8PDE2KXwoKEZYX0RXT1JEKXgzPDw4KXwoRlhfRFdPUkQpeDQpCi1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpJc09wZW5UeXBlRnJvbURpdihjb25zdCBMT0dGT05UQSAqcGxmKQorYm9vbCBDV2luMzJGb250SW5mbzo6SXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZikKIHsKICAgICBIRk9OVCBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdEEocGxmKTsKLSAgICBGWF9CT09MIHJldCA9IEZBTFNFOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CiAgICAgRlhfRFdPUkQgZm9udF9zaXplICA9IEdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKICAgICBpZiAoZm9udF9zaXplICE9IEdESV9FUlJPUiAmJiBmb250X3NpemUgPj0gc2l6ZW9mKEZYX0RXT1JEKSkgewogICAgICAgICBGWF9EV09SRCBsVmVyc2lvbiA9IDA7CkBAIC03NCwxNiArNzQsMTYgQEAKICAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygndCcsICd0JywgJ2MnLCAnZicpIHx8CiAgICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAncicsICd1JywgJ2UnKSB8fAogICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IDB4MDAwMjAwMDApIHsKLSAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIERlbGV0ZUZvbnQoaEZvbnQpOwogICAgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKQorYm9vbCBDV2luMzJGb250SW5mbzo6SXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZikKIHsKICAgICBIRk9OVCBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdEEocGxmKTsKLSAgICBGWF9CT09MIHJldCA9IEZBTFNFOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CiAgICAgRlhfRFdPUkQgZm9udF9zaXplICA9IEdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKICAgICBpZiAoZm9udF9zaXplICE9IEdESV9FUlJPUiAmJiBmb250X3NpemUgPj0gc2l6ZW9mKEZYX0RXT1JEKSkgewogICAgICAgICBGWF9EV09SRCBsVmVyc2lvbiA9IDA7CkBAIC05NSwxMCArOTUsMTAgQEAKICAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygndCcsICd0JywgJ2MnLCAnZicpIHx8CiAgICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAncicsICd1JywgJ2UnKSB8fAogICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IDB4MDAwMjAwMDApIHsKLSAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgICByZXQgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKDB4ODAsIDB4MDEsIDB4MDAsIDB4MDApIHx8CiAgICAgICAgICAgICAgICAgICAgKGxWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gVFRfTUFLRV9UQUcoJyUnLCAnIScsIDAsIDApKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBEZWxldGVGb250KGhGb250KTsKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgIHBGb250SW5mby0+QWRkSW5zdGFsbGVkRm9udChwbGYsIEZvbnRUeXBlKTsKICAgICByZXR1cm4gMTsKIH0KLUZYX0JPT0wgQ1dpbjMyRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKK2Jvb2wgQ1dpbjMyRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKIHsKICAgICBtX3BNYXBwZXIgPSBwTWFwcGVyOwogICAgIExPR0ZPTlRBIGxmOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgaWYgKHBNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCkpIHsKICAgICAgICAgcE1hcHBlci0+R2V0Rm9udEVudW1lcmF0b3IoKS0+RmluaXNoKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgY29uc3QgRlhfQ0hBUioJbV9wRmFjZU5hbWU7CkBAIC0xNjMsMjIgKzE2MywyMiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgY29uc3QgRlhfQ0hBUioJbV9wTmFtZTsKICAgICBjb25zdCBGWF9DSEFSKgltX3BXaW5OYW1lOwotICAgIEZYX0JPT0wJCW1fYkJvbGQ7Ci0gICAgRlhfQk9PTAkJbV9iSXRhbGljOworICAgIGJvb2wJCW1fYkJvbGQ7CisgICAgYm9vbAkJbV9iSXRhbGljOwogfQogQmFzZTE0U3Vic3RzW10gPSB7Ci0gICAgeyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgRkFMU0UsIEZBTFNFfSwKLSAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyIsIFRSVUUsIEZBTFNFfSwKLSAgICB7IkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllciBOZXciLCBUUlVFLCBUUlVFfSwKLSAgICB7IkNvdXJpZXItT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIEZBTFNFLCBUUlVFfSwKLSAgICB7IkhlbHZldGljYSIsICJBcmlhbCIsIEZBTFNFLCBGQUxTRX0sCi0gICAgeyJIZWx2ZXRpY2EtQm9sZCIsICJBcmlhbCIsIFRSVUUsIEZBTFNFfSwKLSAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJBcmlhbCIsIFRSVUUsIFRSVUV9LAotICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCAiQXJpYWwiLCBGQUxTRSwgVFJVRX0sCi0gICAgeyJUaW1lcy1Sb21hbiIsICJUaW1lcyBOZXcgUm9tYW4iLCBGQUxTRSwgRkFMU0V9LAotICAgIHsiVGltZXMtQm9sZCIsICJUaW1lcyBOZXcgUm9tYW4iLCBUUlVFLCBGQUxTRX0sCi0gICAgeyJUaW1lcy1Cb2xkSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIFRSVUUsIFRSVUV9LAotICAgIHsiVGltZXMtSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIEZBTFNFLCBUUlVFfSwKKyAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXciLCBmYWxzZSwgZmFsc2V9LAorICAgIHsiQ291cmllci1Cb2xkIiwgIkNvdXJpZXIgTmV3IiwgdHJ1ZSwgZmFsc2V9LAorICAgIHsiQ291cmllci1Cb2xkT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIHRydWUsIHRydWV9LAorICAgIHsiQ291cmllci1PYmxpcXVlIiwgIkNvdXJpZXIgTmV3IiwgZmFsc2UsIHRydWV9LAorICAgIHsiSGVsdmV0aWNhIiwgIkFyaWFsIiwgZmFsc2UsIGZhbHNlfSwKKyAgICB7IkhlbHZldGljYS1Cb2xkIiwgIkFyaWFsIiwgdHJ1ZSwgZmFsc2V9LAorICAgIHsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwgIkFyaWFsIiwgdHJ1ZSwgdHJ1ZX0sCisgICAgeyJIZWx2ZXRpY2EtT2JsaXF1ZSIsICJBcmlhbCIsIGZhbHNlLCB0cnVlfSwKKyAgICB7IlRpbWVzLVJvbWFuIiwgIlRpbWVzIE5ldyBSb21hbiIsIGZhbHNlLCBmYWxzZX0sCisgICAgeyJUaW1lcy1Cb2xkIiwgIlRpbWVzIE5ldyBSb21hbiIsIHRydWUsIGZhbHNlfSwKKyAgICB7IlRpbWVzLUJvbGRJdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIiwgdHJ1ZSwgdHJ1ZX0sCisgICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIiwgZmFsc2UsIHRydWV9LAogfTsKIENGWF9CeXRlU3RyaW5nIENXaW4zMkZvbnRJbmZvOjpGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKIHsKQEAgLTIxMiwxNyArMjEyLDE3IEBACiAgICAgICAgIHJldHVybiBGWFNZU19zdHJpY21wKChjb25zdCBGWF9DSEFSKilrZXksICgoX0ZvbnROYW1lTWFwKillbGVtZW50KS0+bV9wU3JjRm9udE5hbWUpOwogICAgIH0KIH0KLUZYX0JPT0wgX0dldFN1YkZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKQorYm9vbCBfR2V0U3ViRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCiB7CiAgICAgaW50IHNpemUgPSBzaXplb2YgZ19KcEZvbnROYW1lTWFwOwogICAgIHZvaWQqIHBGb250bmFtZU1hcCA9ICh2b2lkKilnX0pwRm9udE5hbWVNYXA7CiAgICAgX0ZvbnROYW1lTWFwKiBmb3VuZCA9IChfRm9udE5hbWVNYXAqKUZYU1lTX2JzZWFyY2gobmFtZS5jX3N0cigpLCBwRm9udG5hbWVNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLyBzaXplb2YgKF9Gb250TmFtZU1hcCksIHNpemVvZiAoX0ZvbnROYW1lTWFwKSwgY29tcGFyZVN0cmluZyk7CiAgICAgaWYgKGZvdW5kID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIG5hbWUgPSBmb3VuZC0+bV9wU3ViRm9udE5hbWU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIENXaW4zMkZvbnRJbmZvOjpHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpCiB7CkBAIC0yODUsNyArMjg1LDcgQEAKICAgICAgICAgZmFjZSA9ICJNUyBQTWluY2hvIjsKICAgICB9CiB9Ci12b2lkKiBDV2luMzJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKK3ZvaWQqIENXaW4zMkZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIGJvb2wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgYm9vbCYgYkV4YWN0KQogewogICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CiAgICAgaW50IGlCYXNlRm9udDsKQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgICAgICAgICAgZmFjZSA9IEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFdpbk5hbWU7CiAgICAgICAgICAgICB3ZWlnaHQgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JCb2xkID8gRldfQk9MRCA6IEZXX05PUk1BTDsKICAgICAgICAgICAgIGJJdGFsaWMgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JJdGFsaWM7Ci0gICAgICAgICAgICBiRXhhY3QgPSBUUlVFOworICAgICAgICAgICAgYkV4YWN0ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgaWYgKGNoYXJzZXQgPT0gQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsKQEAgLTM3MywyNiArMzczLDI2IEBACiAgICAgfQogICAgIHJldHVybiBzaXplOwogfQotRlhfQk9PTCBDV2luMzJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQorYm9vbCBDV2luMzJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQogewogICAgIGNoYXIgZmFjZWJ1ZlsxMDBdOwogICAgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOwogICAgIGludCByZXQgPSA6OkdldFRleHRGYWNlQShtX2hEQywgMTAwLCBmYWNlYnVmKTsKICAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOwogICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbmFtZSA9IGZhY2VidWY7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQorYm9vbCBDV2luMzJGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkKIHsKICAgICBURVhUTUVUUklDIHRtOwogICAgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOwogICAgIDo6R2V0VGV4dE1ldHJpY3MobV9oREMsICZ0bSk7CiAgICAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKICAgICBjaGFyc2V0ID0gdG0udG1DaGFyU2V0OwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogSUZYX1N5c3RlbUZvbnRJbmZvKiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoKQogewpAQCAtNDY2LDE2ICs0NjYsMTYgQEAKICAgICB9CiAgICAgcmV0dXJuICh2b2lkKiloQ2xpcFJnbjsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfUFJJTlRFUikgewotICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBwQml0bWFwMS0+RmxpcEltYWdlKEZBTFNFLCBUUlVFKTsKKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcEJpdG1hcDEtPkZsaXBJbWFnZShmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoKHBCaXRtYXAtPklzQ215a0ltYWdlKCkgfHwgcEljY1RyYW5zZm9ybSkgJiYKICAgICAgICAgICAgICAgICAhcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9SZ2IsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaW50IHdpZHRoID0gcFNyY1JlY3QtPldpZHRoKCksIGhlaWdodCA9IHBTcmNSZWN0LT5IZWlnaHQoKTsKICAgICAgICAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwMTsKICAgICAgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCiAgICAgICAgICAgICAgICAgKHBCaXRtYXAgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiLCBOVUxMLCBwSWNjVHJhbnNmb3JtKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CiAgICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CkBAIC01MDUsMTggKzUwNSwxOCBAQAogICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywgdm9pZCogcEljY1RyYW5zZm9ybSkKIHsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwMTsKICAgICBpZiAocEJpdG1hcCA9PSBOVUxMIHx8IGRlc3Rfd2lkdGggPT0gMCAgfHwgZGVzdF9oZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCiAgICAgICAgICAgICAhcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9SZ2IsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcCk7CiAgICAgaWYgKChpbnQ2NF90KWFicyhkZXN0X3dpZHRoKSAqIGFicyhkZXN0X2hlaWdodCkgPCAoaW50NjRfdClwQml0bWFwMS0+R2V0V2lkdGgoKSAqIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSAqIDQgfHwKQEAgLTUzOCwxNSArNTM4LDE1IEBACiAgICAgaWYgKGRlbCkgewogICAgICAgICBkZWxldGUgcFRvU3RyZWNoQml0bWFwOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYml0bWFwX2NvbG9yLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCB8fCBkZXN0X3dpZHRoID09IDAgIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIF9Db2xvcjJBcmdiKGJpdG1hcF9jb2xvciwgYml0bWFwX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKICAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpLCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKQEAgLTU5MiwxNiArNTkyLDE2IEBACiAgICAgU2VsZWN0T2JqZWN0KG1faERDLCBoT2xkKTsKICAgICBEZWxldGVPYmplY3QoaFBhdHRlcm4pOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBCT09MIENHZGlEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCiB7CiAgICAgcmV0dXJuIDo6R2V0Q2xpcEJveChtX2hEQywgKFJFQ1QqKXBSZWN0KTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcFJnbih2b2lkKiBoUmduKQorYm9vbCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwUmduKHZvaWQqIGhSZ24pCiB7CiAgICAgOjpTZWxlY3RDbGlwUmduKG1faERDLCAoSFJHTiloUmduKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHN0YXRpYyBIUEVOIF9DcmVhdGVQZW4oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgYXJnYikKIHsKQEAgLTc0OSwxMSArNzQ5LDExIEBACiAgICAgTW92ZVRvRXgobV9oREMsIEZYU1lTX3JvdW5kKHgxKSwgRlhTWVNfcm91bmQoeTEpLCBOVUxMKTsKICAgICBMaW5lVG8obV9oREMsIEZYU1lTX3JvdW5kKHgyKSwgRlhTWVNfcm91bmQoeTIpKTsKIH0KLXN0YXRpYyBGWF9CT09MIF9NYXRyaXhOb1NjYWxlZChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQorc3RhdGljIGJvb2wgX01hdHJpeE5vU2NhbGVkKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpCiB7CiAgICAgcmV0dXJuIHBNYXRyaXgtPkdldEEoKSA9PSAxLjBmICYmIHBNYXRyaXgtPkdldEIoKSA9PSAwICYmIHBNYXRyaXgtPkdldEMoKSA9PSAwICYmIHBNYXRyaXgtPkdldEQoKSA9PSAxLjBmOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC03NjUsNyArNzY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBfQ29sb3IyQXJnYihmaWxsX2NvbG9yLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKICAgICBfQ29sb3IyQXJnYihzdHJva2VfY29sb3IsIHN0cm9rZV9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CkBAIC03ODYsOSArNzg2LDkgQEAKICAgICB9CiAgICAgaW50IGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2NvbG9yKTsKICAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKLSAgICBGWF9CT09MIGJEcmF3QWxwaGEgPSAoZmlsbF9hbHBoYSA+IDAgJiYgZmlsbF9hbHBoYSA8IDI1NSkgfHwgKHN0cm9rZV9hbHBoYSA+IDAgJiYgc3Ryb2tlX2FscGhhIDwgMjU1ICYmIHBHcmFwaFN0YXRlKTsKKyAgICBib29sIGJEcmF3QWxwaGEgPSAoZmlsbF9hbHBoYSA+IDAgJiYgZmlsbF9hbHBoYSA8IDI1NSkgfHwgKHN0cm9rZV9hbHBoYSA+IDAgJiYgc3Ryb2tlX2FscGhhIDwgMjU1ICYmIHBHcmFwaFN0YXRlKTsKICAgICBpZiAoIXBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkgJiYgYkRyYXdBbHBoYSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKICAgICAgICAgaWYgKGJEcmF3QWxwaGEgfHwgKChtX0RldmljZUNsYXNzICE9IEZYRENfUFJJTlRFUiAmJiAhKGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpKSB8fCAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSkpIHsKQEAgLTc5Nyw3ICs3OTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSAmJgogICAgICAgICAgICAgICAgICAgICBwUGF0aERhdGEtPklzUmVjdCgpKSApIHsKICAgICAgICAgICAgICAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuRHJhd1BhdGgobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04NTIsMjkgKzg1MiwyOSBAQAogICAgICAgICBoQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaEJydXNoKTsKICAgICAgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQorYm9vbCBDR2RpRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgX0NvbG9yMkFyZ2IoZmlsbF9jb2xvciwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7CiAgICAgaW50IGFscGhhOwogICAgIEZYX0NPTE9SUkVGIHJnYjsKICAgICBBcmdiRGVjb2RlKGZpbGxfY29sb3IsIGFscGhhLCByZ2IpOwogICAgIGlmIChhbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBIQlJVU0ggaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaChyZ2IpOwogICAgIDo6RmlsbFJlY3QobV9oREMsIChSRUNUKilwUmVjdCwgaEJydXNoKTsKICAgICBEZWxldGVPYmplY3QoaEJydXNoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKICAgICAgICAgaW50IGZpbGxfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpAQCAtODg0LDE1ICs4ODQsMTUgQEAKICAgICAgICAgaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBNYXRyaXgsICZyZWN0ZikpIHsKICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKICAgICAgICAgICAgIEludGVyc2VjdENsaXBSZWN0KG1faERDLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIF9TZXRQYXRoVG9EQyhtX2hEQywgcFBhdGhEYXRhLCBwTWF0cml4KTsKICAgICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIGZpbGxfbW9kZSAmIDMpOwogICAgIFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorYm9vbCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpAQCAtOTAyLDIzICs5MDIsMjMgQEAKICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7CiAgICAgV2lkZW5QYXRoKG1faERDKTsKICAgICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIFdJTkRJTkcpOwotICAgIEZYX0JPT0wgcmV0ID0gU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOworICAgIGJvb2wgcmV0ID0gU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOwogICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwogICAgIERlbGV0ZU9iamVjdChoUGVuKTsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQJYmxlbmRfdHlwZSkKIHsKICAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIF9Db2xvcjJBcmdiKGNvbG9yLCBjb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7CiAgICAgaW50IGE7CiAgICAgRlhfQ09MT1JSRUYgcmdiOwogICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHJnYik7CiAgICAgaWYgKGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEhQRU4gaFBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgcmdiKTsKICAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKQEAgLTkyNiwxMiArOTI2LDEyIEBACiAgICAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7CiAgICAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7CiAgICAgRGVsZXRlT2JqZWN0KGhQZW4pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpEZWxldGVEZXZpY2VSZ24odm9pZCogcFJnbikKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6RGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pCiB7CiAgICAgRGVsZXRlT2JqZWN0KChIR0RJT0JKKXBSZ24pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogQ0dkaURpc3BsYXlEcml2ZXI6OkNHZGlEaXNwbGF5RHJpdmVyKEhEQyBoREMpIDogQ0dkaURldmljZURyaXZlcihoREMsIEZYRENfRElTUExBWSkKIHsKQEAgLTk0MCw5ICs5NDAsOSBAQAogICAgICAgICBtX1JlbmRlckNhcHMgfD0gRlhSQ19BTFBIQV9QQVRIIHwgRlhSQ19BTFBIQV9JTUFHRTsKICAgICB9CiB9Ci1GWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiREVkZ2UpCitib29sIENHZGlEaXNwbGF5RHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSwgYm9vbCBiREVkZ2UpCiB7Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgICBib29sIHJldCA9IGZhbHNlOwogICAgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CiAgICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwogICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAobV9oREMsIHdpZHRoLCBoZWlnaHQpOwpAQCAtOTY5LDcgKzk2OSw3IEBACiAgICAgICAgICAgICA6OkdldERJQml0cyhoRENNZW1vcnksIGhibXAsIDAsIGhlaWdodCwgYml0bWFwLkdldEJ1ZmZlcigpLCAmYm1pLCBESUJfUkdCX0NPTE9SUyk7CiAgICAgICAgICAgICByZXQgPSBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmYml0bWFwLCAwLCAwLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBCaXRtYXAtPkhhc0FscGhhKCkgJiYgcmV0KSB7CkBAIC05NzksMjIgKzk3OSwyMiBAQAogICAgIERlbGV0ZU9iamVjdChoRENNZW1vcnkpOwogICAgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCitib29sIENHZGlEaXNwbGF5RHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgQVNTRVJUKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKTsKICAgICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewogICAgICAgICBpbnQgd2lkdGggPSBwU291cmNlLT5HZXRXaWR0aCgpLCBoZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKICAgICAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBGWF9CT09MIGJHREkgPSBwU291cmNlLT5HZXRCUFAoKSA9PSAxICYmIGFscGhhID09IDI1NTsKKyAgICAgICAgYm9vbCBiR0RJID0gcFNvdXJjZS0+R2V0QlBQKCkgPT0gMSAmJiBhbHBoYSA9PSAyNTU7CiAgICAgICAgIGlmICghYkdESSkgewogICAgICAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CiAgICAgICAgICAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYjMyKSB8fAogICAgICAgICAgICAgICAgICFHZXRESUJpdHMoJmJhY2tncm91bmQsIGxlZnQsIHRvcCwgTlVMTCkgfHwKICAgICAgICAgICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBTb3VyY2UsIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgcmV0dXJuIFNldERJQml0cygmYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgMCwgTlVMTCk7CkBAIC0xMDA4LDggKzEwMDgsOCBAQAogICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwogICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSB8fAogICAgICAgICAgICAgIUdldERJQml0cygmYml0bWFwLCBsZWZ0LCB0b3AsIE5VTEwpIHx8Ci0gICAgICAgICAgICAhYml0bWFwLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICFiaXRtYXAuQ29tcG9zaXRlQml0bWFwKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBTb3VyY2UsIHBTcmNSZWN0LT5sZWZ0LCBwU3JjUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIGZhbHNlLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgIHJldHVybiBTZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgMCwgTlVMTCk7CkBAIC0xMDE5LDkgKzEwMTksOSBAQAogICAgIGlmIChwQml0bWFwKSB7CiAgICAgICAgIHJldHVybiBHRElfU2V0RElCaXRzKHBCaXRtYXAsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6VXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENHZGlEaXNwbGF5RHJpdmVyOjpVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgcmVuZGVyX2ZsYWdzLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CkBAIC0xMDM1LDE0ICsxMDM1LDE0IEBACiAgICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1kZXN0X2xlZnQsIC1kZXN0X3RvcCk7CiAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZW5kZXJfZmxhZ3MsICZiaXRtYXBfY2xpcCk7CiAgICAgaWYgKHBTdHJldGNoZWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcFN0cmV0Y2hlZC0+R2V0V2lkdGgoKSwgcFN0cmV0Y2hlZC0+R2V0SGVpZ2h0KCkpOwotICAgIEZYX0JPT0wgcmV0ID0gU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgYm9vbCByZXQgPSBTZXRESUJpdHMocFN0cmV0Y2hlZCwgY29sb3IsICZzcmNfcmVjdCwgcENsaXBSZWN0LT5sZWZ0LCBwQ2xpcFJlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKICAgICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCiB7CkBAIC0xMDYzLDE3ICsxMDYzLDE3IEBACiAgICAgICAgIGludCBjbGlwX3dpZHRoID0gY2xpcF9yZWN0LldpZHRoKCksIGNsaXBfaGVpZ2h0ID0gY2xpcF9yZWN0LkhlaWdodCgpOwogICAgICAgICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPSBwU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCAmY2xpcF9yZWN0KTsKICAgICAgICAgaWYgKHBTdHJldGNoZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBDRlhfRElCaXRtYXAgYmFja2dyb3VuZDsKICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZShjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgRlhESUJfUmdiMzIpIHx8CiAgICAgICAgICAgICAhR2V0RElCaXRzKCZiYWNrZ3JvdW5kLCBpbWFnZV9yZWN0LmxlZnQgKyBjbGlwX3JlY3QubGVmdCwgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wLCBOVUxMKSB8fAotICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCBjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgcFN0cmV0Y2hlZCwgY29sb3IsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBwU3RyZXRjaGVkLCBjb2xvciwgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBmYWxzZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQpOwotICAgICAgICBGWF9CT09MIHJldCA9IFNldERJQml0cygmYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBpbWFnZV9yZWN0LmxlZnQgKyBjbGlwX3JlY3QubGVmdCwgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOworICAgICAgICBib29sIHJldCA9IFNldERJQml0cygmYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBpbWFnZV9yZWN0LmxlZnQgKyBjbGlwX3JlY3QubGVmdCwgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwogICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMDgzLDcgKzEwODMsNyBAQAogICAgICAgICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwogICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKICAgICAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LlN0cmV0Y2hESUJpdHMobV9oREMsIHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwQ2xpcFJlY3QsIGZsYWdzKTsKICAgICAgICAgfQpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKICAgICBpZiAocEJpdG1hcCkgewogICAgICAgICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KICNkZWZpbmUgR0VUX1BTX0ZFQVRVUkVTRVRUSU5HICAgICAgICA0MTIxCiAjZGVmaW5lIEZFQVRVUkVTRVRUSU5HX1BTTEVWRUwgICAgICAgMgpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKICAgICByZXR1cm4gMjsKIH0KIGludCBDRlhfV2luZG93c0RldmljZTo6bV9wc0xldmVsID0gMjsKLUNGWF9XaW5kb3dzRGV2aWNlOjpDRlhfV2luZG93c0RldmljZShIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0LCBGWF9CT09MIGJGb3JjZVBTT3V0cHV0LCBpbnQgcHNMZXZlbCkKK0NGWF9XaW5kb3dzRGV2aWNlOjpDRlhfV2luZG93c0RldmljZShIREMgaERDLCBib29sIGJDbXlrT3V0cHV0LCBib29sIGJGb3JjZVBTT3V0cHV0LCBpbnQgcHNMZXZlbCkKIHsKICAgICBtX2JGb3JjZVBTT3V0cHV0ID0gYkZvcmNlUFNPdXRwdXQ7CiAgICAgbV9wc0xldmVsID0gcHNMZXZlbDsKQEAgLTExNTQsNyArMTE1NCw3IEBACiAgICAgfQogICAgIHJldHVybiAoSERDKXBSREQtPkdldFBsYXRmb3JtU3VyZmFjZSgpOwogfQotSUZYX1JlbmRlckRldmljZURyaXZlciogQ0ZYX1dpbmRvd3NEZXZpY2U6OkNyZWF0ZURyaXZlcihIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0KQorSUZYX1JlbmRlckRldmljZURyaXZlciogQ0ZYX1dpbmRvd3NEZXZpY2U6OkNyZWF0ZURyaXZlcihIREMgaERDLCBib29sIGJDbXlrT3V0cHV0KQogewogICAgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOwogICAgIGludCBvYmpfdHlwZSA9IDo6R2V0T2JqZWN0VHlwZShoREMpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCmluZGV4IDNkY2ZjZTQuLjYxMGM2OWUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RpYi5jcHAKQEAgLTQ5LDE5ICs0OSwxOSBAQAogICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGxlbik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLUNGWF9ESUJpdG1hcCogX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwgTFBWT0lEIHBEYXRhLCBGWF9CT09MIGJBbHBoYSkKK0NGWF9ESUJpdG1hcCogX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwgTFBWT0lEIHBEYXRhLCBib29sIGJBbHBoYSkKIHsKICAgICBpbnQgd2lkdGggPSBwYm1pLT5ibWlIZWFkZXIuYmlXaWR0aDsKICAgICBpbnQgaGVpZ2h0ID0gcGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0OwotICAgIEJPT0wgYkJvdHRvbVVwID0gVFJVRTsKKyAgICBCT09MIGJCb3R0b21VcCA9IHRydWU7CiAgICAgaWYgKGhlaWdodCA8IDApIHsKICAgICAgICAgaGVpZ2h0ID0gLWhlaWdodDsKLSAgICAgICAgYkJvdHRvbVVwID0gRkFMU0U7CisgICAgICAgIGJCb3R0b21VcCA9IGZhbHNlOwogICAgIH0KICAgICBpbnQgcGl0Y2ggPSAod2lkdGggKiBwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDMxKSAvIDMyICogNDsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwogICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBiQWxwaGEgPyAoRlhESUJfRm9ybWF0KShwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDB4MjAwKSA6IChGWERJQl9Gb3JtYXQpcGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQ7Ci0gICAgRlhfQk9PTCByZXQgPSBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICBib29sIHJldCA9IHBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwogICAgIGlmICghcmV0KSB7CiAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTkzLDcgKzkzLDcgQEAKIH0KIENGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSkKIHsKLSAgICByZXR1cm4gX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYocGJtaSwgcERhdGEsIEZBTFNFKTsKKyAgICByZXR1cm4gX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYocGJtaSwgcERhdGEsIGZhbHNlKTsKIH0KIEhCSVRNQVAJQ0ZYX1dpbmRvd3NESUI6OkdldEREQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSERDIGhEQykKIHsKQEAgLTE3NCw3ICsxNzQsNyBAQAogfQogQ0ZYX0RJQml0bWFwKiBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21EREIoSERDIGhEQywgSEJJVE1BUCBoQml0bWFwLCBGWF9EV09SRCogcFBhbGV0dGUsIEZYX0RXT1JEIHBhbHNpemUpCiB7Ci0gICAgRlhfQk9PTCBiQ3JlYXRlZERDID0gaERDID09IE5VTEw7CisgICAgYm9vbCBiQ3JlYXRlZERDID0gaERDID09IE5VTEw7CiAgICAgaWYgKGhEQyA9PSBOVUxMKSB7CiAgICAgICAgIGhEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2R3cml0ZS5jcHAgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2R3cml0ZS5jcHAKaW5kZXggNjVhMzVkOC4uODUzMzM0MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZHdyaXRlLmNwcApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgSURXcml0ZUZhY3RvcnkqIHBEd0ZhY3RvcnkgPSAoSURXcml0ZUZhY3RvcnkqKW1fcERXcml0ZUZhY3Rvcnk7CiAgICAgSURXcml0ZUZvbnRGaWxlKiBwRHdGb250RmlsZSA9IE5VTEw7CiAgICAgSURXcml0ZUZvbnRGYWNlKiBwRHdGb250RmFjZSA9IE5VTEw7Ci0gICAgQk9PTCBpc1N1cHBvcnRlZEZvbnRUeXBlID0gRkFMU0U7CisgICAgQk9PTCBpc1N1cHBvcnRlZEZvbnRUeXBlID0gZmFsc2U7CiAgICAgRFdSSVRFX0ZPTlRfRklMRV9UWVBFIGZvbnRGaWxlVHlwZTsKICAgICBEV1JJVEVfRk9OVF9GQUNFX1RZUEUgZm9udEZhY2VUeXBlOwogICAgIFVJTlQzMiBudW1iZXJPZkZhY2VzOwpAQCAtMTc0LDEwICsxNzQsMTAgQEAKICAgICBTYWZlUmVsZWFzZSgmcER3Rm9udEZpbGUpOwogICAgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBDRFdyaXRlRXh0OjpEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKiByZW5kZXJUYXJnZXQpCitib29sIENEV3JpdGVFeHQ6OkR3Q3JlYXRlUmVuZGVyaW5nVGFyZ2V0KENGWF9ESUJpdG1hcCogcEJpdG1hcCwgdm9pZCoqIHJlbmRlclRhcmdldCkKIHsKICAgICBpZiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPiBGWERJQl9BcmdiKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBJRFdyaXRlRmFjdG9yeSogcER3RmFjdG9yeSA9IChJRFdyaXRlRmFjdG9yeSopbV9wRFdyaXRlRmFjdG9yeTsKICAgICBJRFdyaXRlR2RpSW50ZXJvcCogcEdkaUludGVyb3AgPSBOVUxMOwpAQCAtMjEyLDE0ICsyMTIsMTQgQEAKICAgICBTYWZlUmVsZWFzZSgmcEdkaUludGVyb3ApOwogICAgIFNhZmVSZWxlYXNlKCZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKICAgICBTYWZlUmVsZWFzZSgmcFJlbmRlcmluZ1BhcmFtcyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiBmYWlsZWQ6CiAgICAgU2FmZVJlbGVhc2UoJnBHZGlJbnRlcm9wKTsKICAgICBTYWZlUmVsZWFzZSgmcEJpdG1hcFJlbmRlclRhcmdldCk7CiAgICAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXMpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MCUNEV3JpdGVFeHQ6OkR3UmVuZGluZ1N0cmluZyh2b2lkKiByZW5kZXJUYXJnZXQsIENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfUkVDVCYgc3RyaW5nUmVjdCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKK2Jvb2wJQ0RXcml0ZUV4dDo6RHdSZW5kaW5nU3RyaW5nKHZvaWQqIHJlbmRlclRhcmdldCwgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9SRUNUJiBzdHJpbmdSZWN0LCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9BUkdCIHRleHRfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfY291bnQsIHVuc2lnbmVkIHNob3J0KiBnbHlwaF9pbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5YLCBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblksCkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBnbHlwaF9hZHZhbmNlcykKIHsKICAgICBpZiAocmVuZGVyVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBDRHdHZGlUZXh0UmVuZGVyZXIqIHBUZXh0UmVuZGVyZXIgPSAoQ0R3R2RpVGV4dFJlbmRlcmVyKilyZW5kZXJUYXJnZXQ7CiAgICAgRFdSSVRFX01BVFJJWCB0cmFuc2Zvcm07CkBAIC0yNDcsNyArMjQ3LDcgQEAKICAgICBnbHlwaFJ1bi5nbHlwaEluZGljZXMgPSBnbHlwaF9pbmRpY2VzOwogICAgIGdseXBoUnVuLmdseXBoQWR2YW5jZXMgPSBnbHlwaF9hZHZhbmNlczsKICAgICBnbHlwaFJ1bi5nbHlwaE9mZnNldHMgPSAoRFdSSVRFX0dMWVBIX09GRlNFVCopZ2x5cGhfb2Zmc2V0czsKLSAgICBnbHlwaFJ1bi5pc1NpZGV3YXlzID0gRkFMU0U7CisgICAgZ2x5cGhSdW4uaXNTaWRld2F5cyA9IGZhbHNlOwogICAgIGdseXBoUnVuLmJpZGlMZXZlbCA9IDA7CiAgICAgaHIgPSBwVGV4dFJlbmRlcmVyLT5EcmF3R2x5cGhSdW4oCiAgICAgICAgICAgICAgc3RyaW5nUmVjdCwKQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgICAgICAgICAgICZnbHlwaFJ1biwKICAgICAgICAgICAgICBSR0IoRlhBUkdCX1IodGV4dF9jb2xvciksIEZYQVJHQl9HKHRleHRfY29sb3IpLCBGWEFSR0JfQih0ZXh0X2NvbG9yKSkKICAgICAgICAgICk7Ci0gICAgcmV0dXJuIFNVQ0NFRURFRChocikgPyBUUlVFIDogRkFMU0U7CisgICAgcmV0dXJuIFNVQ0NFRURFRChocikgPyB0cnVlIDogZmFsc2U7CiB9CiB2b2lkIENEV3JpdGVFeHQ6OkR3RGVsZXRlUmVuZGVyaW5nVGFyZ2V0KHZvaWQqIHJlbmRlclRhcmdldCkKIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwCmluZGV4IGQ3NmQ1MmUuLjk0ZmFjNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcApAQCAtMjc0LDEyICsyNzQsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBoYW5kbGUpCitib29sIENHZGlwbHVzRXh0OjpHZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBoYW5kbGUpCiB7CiAgICAgaWYgKG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4KSB7CiAgICAgICAgIHJldHVybiAoKEZ1bmNUeXBlX0dkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KW1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4KSgoSEFORExFKWhhbmRsZSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiBzdGF0aWMgR3BCcnVzaCogX0dkaXBDcmVhdGVCcnVzaChEV09SRCBhcmdiKQogewpAQCAtMjkxLDExICsyOTEsMTEgQEAKIHN0YXRpYyBDRlhfRElCaXRtYXAqIF9TdHJldGNoTW9ub1RvR3JheShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcFNvdXJjZSwgRlhfUkVDVCogcENsaXBSZWN0KQogewotICAgIEZYX0JPT0wgYkZsaXBYID0gZGVzdF93aWR0aCA8IDA7CisgICAgYm9vbCBiRmxpcFggPSBkZXN0X3dpZHRoIDwgMDsKICAgICBpZiAoYkZsaXBYKSB7CiAgICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKICAgICB9Ci0gICAgRlhfQk9PTCBiRmxpcFkgPSBkZXN0X2hlaWdodCA8IDA7CisgICAgYm9vbCBiRmxpcFkgPSBkZXN0X2hlaWdodCA8IDA7CiAgICAgaWYgKGJGbGlwWSkgewogICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKICAgICB9CkBAIC0zODIsNyArMzgyLDcgQEAKICAgICAgICAgaWYgKHNyY193aWR0aCAqIHNyY19oZWlnaHQgPiAxMDAwMCkgewogICAgICAgICAgICAgcFN0cmV0Y2hlZCA9IF9TdHJldGNoTW9ub1RvR3JheShkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcEJpdG1hcCwgJmltYWdlX2NsaXApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFN0cmV0Y2hlZCA9IHBCaXRtYXAtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgRkFMU0UsICZpbWFnZV9jbGlwKTsKKyAgICAgICAgICAgIHBTdHJldGNoZWQgPSBwQml0bWFwLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZhbHNlLCAmaW1hZ2VfY2xpcCk7CiAgICAgICAgIH0KICAgICAgICAgR3BCaXRtYXAqIGJpdG1hcDsKICAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoaW1hZ2VfY2xpcC5XaWR0aCgpLCBpbWFnZV9jbGlwLkhlaWdodCgpLApAQCAtNTM2LDcgKzUzNiw3IEBACiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgoR3BGb250Q29sbGVjdGlvbioqKSZwQ29sbGVjdGlvbik7CiB9Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgdm9pZCoqYml0bWFwKQorYm9vbCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCkKIHsKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIFBpeGVsRm9ybWF0IGZvcm1hdDsKQEAgLTU1MSw0MSArNTUxLDQxIEBACiAgICAgICAgICAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdDMyYnBwQVJHQjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRQaXRjaCgpLCBmb3JtYXQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAoR3BCaXRtYXAqKiliaXRtYXApOwogICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZyb21JbWFnZSh2b2lkKiBiaXRtYXAsIHZvaWQqKiBncmFwaGljcykKK2Jvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0SW1hZ2VHcmFwaGljc0NvbnRleHQpKChHcEJpdG1hcCopYml0bWFwLCAoR3BHcmFwaGljcyoqKWdyYXBoaWNzKTsKICAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUoY29uc3QgRlhfV0NIQVIqIG5hbWUsIHZvaWQqIHBGb250Q29sbGVjdGlvbiwgdm9pZCoqcEZhbWlseSkKK2Jvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUoY29uc3QgRlhfV0NIQVIqIG5hbWUsIHZvaWQqIHBGb250Q29sbGVjdGlvbiwgdm9pZCoqcEZhbWlseSkKIHsKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUpKChHRElQQ09OU1QgV0NIQVIgKiluYW1lLCAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAoR3BGb250RmFtaWx5KiopcEZhbWlseSk7CiAgICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZyb21GYW1pbHkodm9pZCogcEZhbWlseSwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlLCBpbnQgZmxhZywgdm9pZCoqIHBGb250KQorYm9vbCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tRmFtaWx5KHZvaWQqIHBGYW1pbHksIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSwgaW50IGZsYWcsIHZvaWQqKiBwRm9udCkKIHsKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVGb250KSgoR3BGb250RmFtaWx5KilwRmFtaWx5LCBmb250X3NpemUsIGZvbnRzdHlsZSwgVW5pdChmbGFnKSwgKEdwRm9udCoqKXBGb250KTsKICAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIHZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBHZXRGb250U2l6ZSh2b2lkICpwRm9udCwgRlhfRkxPQVQgKnNpemUpCiB7CkBAIC02MDgsMTYgKzYwOCwxNiBAQAogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KSgoR3BHcmFwaGljcyopZ3JhcGhpY3MsIChHcFVuaXQpdW5pdCk7CiB9Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwRHJhd0RyaXZlclN0cmluZyh2b2lkICpncmFwaGljcywgIHVuc2lnbmVkIHNob3J0ICp0ZXh0LCBpbnQgbGVuZ3RoLAorYm9vbCBDR2RpcGx1c0V4dDo6R2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwKICAgICAgICAgdm9pZCAqZm9udCwgdm9pZCogYnJ1c2gsIHZvaWQgKnBvc2l0aW9ucywgaW50IGZsYWdzLCBjb25zdCB2b2lkICptYXRyaXgpCiB7CiAgICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwRHJhd0RyaXZlclN0cmluZykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR0RJUENPTlNUIFVJTlQxNiAqKXRleHQsIChJTlQpbGVuZ3RoLCAoR0RJUENPTlNUIEdwRm9udCAqKWZvbnQsIChHRElQQ09OU1QgR3BCcnVzaCopYnJ1c2gsCiAgICAgICAgICAgICAgICAgICAgICAgKEdESVBDT05TVCBQb2ludEYgKilwb3NpdGlvbnMsIChJTlQpZmxhZ3MsIChHRElQQ09OU1QgR3BNYXRyaXggKiltYXRyaXgpOwogICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogdm9pZCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJydXNoKEZYX0RXT1JEIGZpbGxfYXJnYiwgdm9pZCoqIHBCcnVzaCkKIHsKQEAgLTY4NCw3ICs2ODQsNyBAQAogICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKSgoR3BHcmFwaGljcyopZ3JhcGhpY3MpOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6U3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENHZGlwbHVzRXh0OjpTdHJldGNoQml0TWFzayhIREMgaERDLCBCT09MIGJNb25vRGV2aWNlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IGZsYWdzKQogewogICAgIEFTU0VSVChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKTsKQEAgLTY5OSw5ICs2OTksOSBAQAogICAgIH0KICAgICBPdXRwdXRJbWFnZU1hc2socEdyYXBoaWNzLCBiTW9ub0RldmljZSwgcEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGFyZ2IsIHBDbGlwUmVjdCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6U3RyZXRjaERJQml0cyhIREMgaERDLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK2Jvb2wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IGZsYWdzKQogewogICAgIEdwR3JhcGhpY3MqIHBHcmFwaGljczsKQEAgLTcxOSw5ICs3MTksOSBAQAogICAgIE91dHB1dEltYWdlKHBHcmFwaGljcywgcEJpdG1hcCwgJnNyY19yZWN0LCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLXN0YXRpYyBHcFBlbiogX0dkaXBDcmVhdGVQZW4oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRFdPUkQgYXJnYiwgRlhfQk9PTCBiVGV4dE1vZGUgPSBGQUxTRSkKK3N0YXRpYyBHcFBlbiogX0dkaXBDcmVhdGVQZW4oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRFdPUkQgYXJnYiwgYm9vbCBiVGV4dE1vZGUgPSBmYWxzZSkKIHsKICAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICAgIEZYX0ZMT0FUIHdpZHRoID0gcEdyYXBoU3RhdGUgPyBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggOiAxLjBmOwpAQCAtNzM1LDcgKzczNSw3IEBACiAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBlbjEpKChBUkdCKWFyZ2IsIHdpZHRoLCBVbml0V29ybGQsICZwUGVuKTsKICAgICBMaW5lQ2FwIGxpbmVDYXA7CiAgICAgRGFzaENhcCBkYXNoQ2FwID0gRGFzaENhcEZsYXQ7Ci0gICAgRlhfQk9PTCBiRGFzaEV4dGVuZCA9IEZBTFNFOworICAgIGJvb2wgYkRhc2hFeHRlbmQgPSBmYWxzZTsKICAgICBzd2l0Y2gocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewogICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ6CiAgICAgICAgICAgICBsaW5lQ2FwID0gTGluZUNhcEZsYXQ7CkBAIC03NDMsMTEgKzc0MywxMSBAQAogICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOgogICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBSb3VuZDsKICAgICAgICAgICAgIGRhc2hDYXAgPSBEYXNoQ2FwUm91bmQ7Ci0gICAgICAgICAgICBiRGFzaEV4dGVuZCA9IFRSVUU7CisgICAgICAgICAgICBiRGFzaEV4dGVuZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBTcXVhcmU6CiAgICAgICAgICAgICBsaW5lQ2FwID0gTGluZUNhcFNxdWFyZTsKLSAgICAgICAgICAgIGJEYXNoRXh0ZW5kID0gVFJVRTsKKyAgICAgICAgICAgIGJEYXNoRXh0ZW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBDYWxsRnVuYyhHZGlwU2V0UGVuTGluZUNhcDE5NzgxOSkocFBlbiwgbGluZUNhcCwgbGluZUNhcCwgZGFzaENhcCk7CkBAIC04MzksMTAgKzgzOSwxMCBAQAogICAgICAgICBpZiAoZGlzdGFuY2Vfc3F1YXJlIDwgKDEuMGYgKiAyICsgMS4wZiAvIDQpKSB7CiAgICAgICAgICAgICB2MSA9IGk7CiAgICAgICAgICAgICB2MiA9IHBhaXIxOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQk9PTCBDR2RpcGx1c0V4dDo6RHJhd1BhdGgoSERDIGhEQywgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKQEAgLTg1NCw3ICs4NTQsNyBAQAogewogICAgIGludCBuUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7CiAgICAgaWYgKG5Qb2ludHMgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7CiAgICAgR3BHcmFwaGljcyogcEdyYXBoaWNzID0gTlVMTDsKQEAgLTg3MCw5ICs4NzAsOSBAQAogICAgIFBvaW50RiAqcG9pbnRzID0gRlhfQWxsb2MoUG9pbnRGLCBuUG9pbnRzKTsKICAgICBCWVRFICogdHlwZXMgID0gRlhfQWxsb2MoQllURSwgblBvaW50cyk7CiAgICAgaW50IG5TdWJQYXRoZXMgPSAwOwotICAgIEZYX0JPT0wgYlN1YkNsb3NlID0gRkFMU0U7CisgICAgYm9vbCBiU3ViQ2xvc2UgPSBmYWxzZTsKICAgICBpbnQgcG9zX3N1YmNsb3NlID0gMDsKLSAgICBGWF9CT09MIGJTbW9vdGggPSBGQUxTRTsKKyAgICBib29sIGJTbW9vdGggPSBmYWxzZTsKICAgICBpbnQgc3RhcnRwb2ludCA9IDA7CiAgICAgZm9yKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgewogICAgICAgICBwb2ludHNbaV0uWCA9IHBQb2ludHNbaV0ubV9Qb2ludFg7CkBAIC05MDAsNyArOTAwLDcgQEAKICAgICAgICAgaWYocG9pbnRfdHlwZSA9PSBGWFBUX01PVkVUTykgewogICAgICAgICAgICAgdHlwZXNbaV0gPSBQYXRoUG9pbnRUeXBlU3RhcnQ7CiAgICAgICAgICAgICBuU3ViUGF0aGVzICsrOwotICAgICAgICAgICAgYlN1YkNsb3NlID0gRkFMU0U7CisgICAgICAgICAgICBiU3ViQ2xvc2UgPSBmYWxzZTsKICAgICAgICAgICAgIHN0YXJ0cG9pbnQgPSBpOwogICAgICAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKICAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZUxpbmU7CkBAIC05MTAsMzEgKzkxMCwzMSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFiU21vb3RoICYmIHBvaW50c1tpXS5YICE9IHBvaW50c1tpIC0gMV0uWCAmJiBwb2ludHNbaV0uWSAhPSBwb2ludHNbaSAtIDFdLlkpIHsKLSAgICAgICAgICAgICAgICBiU21vb3RoID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiU21vb3RoID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pCXsKICAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZUJlemllcjsKLSAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOworICAgICAgICAgICAgYlNtb290aCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkgewogICAgICAgICAgICAgaWYgKGJTdWJDbG9zZSkgewogICAgICAgICAgICAgICAgIHR5cGVzW3Bvc19zdWJjbG9zZV0gJj0gflBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJTdWJDbG9zZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlN1YkNsb3NlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBvc19zdWJjbG9zZSA9IGk7CiAgICAgICAgICAgICB0eXBlc1tpXSB8PSBQYXRoUG9pbnRUeXBlQ2xvc2VTdWJwYXRoOwogICAgICAgICAgICAgaWYgKCFiU21vb3RoICYmIHBvaW50c1tpXS5YICE9IHBvaW50c1tzdGFydHBvaW50XS5YICYmIHBvaW50c1tpXS5ZICE9IHBvaW50c1tzdGFydHBvaW50XS5ZKSB7Ci0gICAgICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlNtb290aCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGZpbGxfbW9kZSAmIEZYRklMTF9OT1BBVEhTTU9PVEgpIHsKLSAgICAgICAgYlNtb290aCA9IEZBTFNFOworICAgICAgICBiU21vb3RoID0gZmFsc2U7CiAgICAgICAgIENhbGxGdW5jKEdkaXBTZXRTbW9vdGhpbmdNb2RlKShwR3JhcGhpY3MsIFNtb290aGluZ01vZGVOb25lKTsKICAgICB9IGVsc2UgaWYgKCEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikpIHsKICAgICAgICAgaWYgKCFiU21vb3RoICYmIChmaWxsX21vZGUgJiAzKSkgewotICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7CisgICAgICAgICAgICBiU21vb3RoID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoYlNtb290aCB8fCAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID4gMikpIHsKICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBTZXRTbW9vdGhpbmdNb2RlKShwR3JhcGhpY3MsIFNtb290aGluZ01vZGVBbnRpQWxpYXMpOwpAQCAtOTQ5LDcgKzk0OSw3IEBACiAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwRHJhd0xpbmVJKShwR3JhcGhpY3MsIHBQZW4sIEZYU1lTX3JvdW5kKHBvaW50c1t2MV0uWCksIEZYU1lTX3JvdW5kKHBvaW50c1t2MV0uWSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChwb2ludHNbdjJdLlgpLCBGWFNZU19yb3VuZChwb2ludHNbdjJdLlkpKTsKICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVQZW4pKHBQZW4pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBHcFBhdGgqIHBHcFBhdGggPSBOVUxMOwpAQCAtOTYxLDcgKzk2MSw3IEBACiAgICAgICAgIEZYX0ZyZWUocG9pbnRzKTsKICAgICAgICAgRlhfRnJlZSh0eXBlcyk7CiAgICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChuZXdfZmlsbF9tb2RlKSB7CiAgICAgICAgIEdwQnJ1c2gqIHBCcnVzaCA9IF9HZGlwQ3JlYXRlQnJ1c2goZmlsbF9hcmdiKTsKQEAgLTk5NCw3ICs5OTQsNyBAQAogICAgIEZYX0ZyZWUodHlwZXMpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVQYXRoKShwR3BQYXRoKTsKICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBjbGFzcyBHcFN0cmVhbSBmaW5hbCA6IHB1YmxpYyBJU3RyZWFtCiB7CkBAIC0xMjI5LDcgKzEyMjksNyBAQAogICAgIH0KICAgICBGWF9GcmVlKHBJbmZvKTsKIH0KLUNGWF9ESUJpdG1hcCogX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwgTFBWT0lEIHBEYXRhLCBGWF9CT09MIGJBbHBoYSk7CitDRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgYm9vbCBiQWxwaGEpOwogQ0ZYX0RJQml0bWFwKiBDR2RpcGx1c0V4dDo6TG9hZERJQml0bWFwKFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3MpCiB7CiAgICAgUFJFVklFVzNfRElCSVRNQVAqIHBJbmZvID0gOjpMb2FkRElCaXRtYXAoYXJncyk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfcHJpbnQuY3BwCmluZGV4IDg2ZGJmOWIuLjYzYzM4NDkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfcHJpbnQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfcHJpbnQuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiB7CiAgICAgbV9Ib3J6U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgSE9SWlNJWkUpOwogICAgIG1fVmVydFNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIFZFUlRTSVpFKTsKLSAgICBtX2JTdXBwb3J0Uk9QID0gVFJVRTsKKyAgICBtX2JTdXBwb3J0Uk9QID0gdHJ1ZTsKIH0KIGludCBDR2RpUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKIHsKQEAgLTMwLDcgKzMwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIENHZGlEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoY2Fwc19pZCk7CiB9Ci1GWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCitib29sIENHZGlQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CiAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKQEAgLTQxLDI4ICs0MSwyOCBAQAogICAgIEFTU0VSVChwU291cmNlICE9IE5VTEwgJiYgIXBTb3VyY2UtPklzQWxwaGFNYXNrKCkgJiYgcFNyY1JlY3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKTsKICAgICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIEdESV9TZXRESUJpdHMocEJpdG1hcCwgcFNyY1JlY3QsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCitib29sIENHZGlQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKIHsKICAgICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewogICAgICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CiAgICAgICAgIGlmIChwU291cmNlLT5HZXRCUFAoKSAhPSAxIHx8IGFscGhhICE9IDI1NSB8fCAhbV9iU3VwcG9ydFJPUCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXN0X3dpZHRoIDwgMCB8fCBkZXN0X2hlaWdodCA8IDApIHsKICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPSBwU291cmNlLT5GbGlwSW1hZ2UoZGVzdF93aWR0aCA8IDAsIGRlc3RfaGVpZ2h0IDwgMCk7CiAgICAgICAgICAgICBpZiAocEZsaXBwZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVzdF93aWR0aCA8IDApIHsKICAgICAgICAgICAgICAgICBkZXN0X2xlZnQgKz0gZGVzdF93aWR0aDsKQEAgLTcwLDI0ICs3MCwyNCBAQAogICAgICAgICAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewogICAgICAgICAgICAgICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfQk9PTCByZXQgPSBHRElfU3RyZXRjaEJpdE1hc2socEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGFicyhkZXN0X3dpZHRoKSwgYWJzKGRlc3RfaGVpZ2h0KSwgY29sb3IsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgICAgIGJvb2wgcmV0ID0gR0RJX1N0cmV0Y2hCaXRNYXNrKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGNvbG9yLCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgICAgICBkZWxldGUgcEZsaXBwZWQ7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKICAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBHRElfU3RyZXRjaEJpdE1hc2socEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGNvbG9yLCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiAgICAgfQogICAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoZGVzdF93aWR0aCA8IDAgfHwgZGVzdF9oZWlnaHQgPCAwKSB7CiAgICAgICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPSBwU291cmNlLT5GbGlwSW1hZ2UoZGVzdF93aWR0aCA8IDAsIGRlc3RfaGVpZ2h0IDwgMCk7CiAgICAgICAgIGlmIChwRmxpcHBlZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7CiAgICAgICAgICAgICBkZXN0X2xlZnQgKz0gZGVzdF93aWR0aDsKQEAgLTk1LDE0ICs5NSwxNCBAQAogICAgICAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICBkZXN0X3RvcCArPSBkZXN0X2hlaWdodDsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIHJldCA9IEdESV9TdHJldGNoRElCaXRzKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGZsYWdzLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYm9vbCByZXQgPSBHRElfU3RyZXRjaERJQml0cyhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBmbGFncywgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIGRlbGV0ZSBwRmxpcHBlZDsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CiAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7CiB9CkBAIC0xODksMTggKzE4OSwxOCBAQAogICAgIH0KICAgICByZXR1cm4gcFRlbXBCaXRtYXA7CiB9Ci1GWF9CT09MCUNHZGlQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKK2Jvb2wJQ0dkaVByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUgfHwgcFNvdXJjZS0+SGFzQWxwaGEoKSB8fCAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCAhbV9iU3VwcG9ydFJPUCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IHVuaXRfcmVjdCA9IHBNYXRyaXgtPkdldFVuaXRSZWN0KCk7CiAgICAgRlhfUkVDVCBmdWxsX3JlY3QgPSB1bml0X3JlY3QuR2V0T3V0dGVyUmVjdCgpOwogICAgIGlmIChGWFNZU19mYWJzKHBNYXRyaXgtPmIpIDwgMC41ZiAmJiBwTWF0cml4LT5hICE9IDAgJiYgRlhTWVNfZmFicyhwTWF0cml4LT5jKSA8IDAuNWYgJiYgcE1hdHJpeC0+ZCAhPSAwKSB7Ci0gICAgICAgIEZYX0JPT0wgYkZsaXBYID0gcE1hdHJpeC0+YSA8IDA7Ci0gICAgICAgIEZYX0JPT0wgYkZsaXBZID0gcE1hdHJpeC0+ZCA+IDA7CisgICAgICAgIGJvb2wgYkZsaXBYID0gcE1hdHJpeC0+YSA8IDA7CisgICAgICAgIGJvb2wgYkZsaXBZID0gcE1hdHJpeC0+ZCA+IDA7CiAgICAgICAgIHJldHVybiBTdHJldGNoRElCaXRzKHBTb3VyY2UsIGNvbG9yLCBiRmxpcFggPyBmdWxsX3JlY3QucmlnaHQgOiBmdWxsX3JlY3QubGVmdCwgYkZsaXBZID8gZnVsbF9yZWN0LmJvdHRvbSA6IGZ1bGxfcmVjdC50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGbGlwWCA/IC1mdWxsX3JlY3QuV2lkdGgoKSA6IGZ1bGxfcmVjdC5XaWR0aCgpLCBiRmxpcFkgPyAtZnVsbF9yZWN0LkhlaWdodCgpIDogZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKQEAgLTIwOCw5ICsyMDgsOSBAQAogICAgIGlmIChGWFNZU19mYWJzKHBNYXRyaXgtPmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKHBNYXRyaXgtPmQpIDwgMC41ZikgewogICAgICAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IHBTb3VyY2UtPlN3YXBYWShwTWF0cml4LT5jID4gMCwgcE1hdHJpeC0+YiA8IDApOwogICAgICAgICBpZiAocFRyYW5zZm9ybWVkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCisgICAgICAgIGJvb2wgcmV0ID0gU3RyZXRjaERJQml0cyhwVHJhbnNmb3JtZWQsIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwgZnVsbF9yZWN0LldpZHRoKCksIGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwogICAgICAgICBkZWxldGUgcFRyYW5zZm9ybWVkOwogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjE4LDIwICsyMTgsMjAgQEAKICAgICBpZiAocFNvdXJjZS0+R2V0QlBQKCkgPT0gMSkgewogICAgICAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IFRyYW5zZm9ybTFicHBCaXRtYXAocFNvdXJjZSwgcE1hdHJpeCk7CiAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBTYXZlU3RhdGUoKTsKICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAgICAgICAgIHBhdGguQXBwZW5kUmVjdCgwLCAwLCAxLjBmLCAxLjBmKTsKICAgICAgICAgU2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgcE1hdHJpeCwgV0lORElORyk7Ci0gICAgICAgIEZYX0JPT0wgcmV0ID0gU3RyZXRjaERJQml0cyhwVHJhbnNmb3JtZWQsIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwgZnVsbF9yZWN0LldpZHRoKCksIGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKKyAgICAgICAgYm9vbCByZXQgPSBTdHJldGNoRElCaXRzKHBUcmFuc2Zvcm1lZCwgY29sb3IsIGZ1bGxfcmVjdC5sZWZ0LCBmdWxsX3JlY3QudG9wLCBmdWxsX3JlY3QuV2lkdGgoKSwgZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CiAgICAgICAgIFJlc3RvcmVTdGF0ZSgpOwogICAgICAgICBkZWxldGUgcFRyYW5zZm9ybWVkOwogICAgICAgICBoYW5kbGUgPSBOVUxMOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogQ1BTT3V0cHV0OjpDUFNPdXRwdXQoSERDIGhEQykKIHsKQEAgLTI2NiwxNCArMjY2LDE0IEBACiBDUFNQcmludGVyRHJpdmVyOjpDUFNQcmludGVyRHJpdmVyKCkKIHsKICAgICBtX3BQU091dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ215a091dHB1dCA9IEZBTFNFOworICAgIG1fYkNteWtPdXRwdXQgPSBmYWxzZTsKIH0KIENQU1ByaW50ZXJEcml2ZXI6On5DUFNQcmludGVyRHJpdmVyKCkKIHsKICAgICBFbmRSZW5kZXJpbmcoKTsKICAgICBkZWxldGUgbV9wUFNPdXRwdXQ7CiB9Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkluaXQoSERDIGhEQywgaW50IHBzbGV2ZWwsIEZYX0JPT0wgYkNteWtPdXRwdXQpCitib29sIENQU1ByaW50ZXJEcml2ZXI6OkluaXQoSERDIGhEQywgaW50IHBzbGV2ZWwsIGJvb2wgYkNteWtPdXRwdXQpCiB7CiAgICAgbV9oREMgPSBoREM7CiAgICAgbV9Ib3J6U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgSE9SWlNJWkUpOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgOjpEZWxldGVPYmplY3QoaFJnbik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiBpbnQgQ1BTUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKIHsKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRSZW5kZXJpbmcoKQorYm9vbCBDUFNQcmludGVyRHJpdmVyOjpTdGFydFJlbmRlcmluZygpCiB7CiAgICAgcmV0dXJuIG1fUFNSZW5kZXJlci5TdGFydFJlbmRlcmluZygpOwogfQpAQCAtMzM5LDY5ICszMzksNjkgQEAKIHsKICAgICBtX1BTUmVuZGVyZXIuU2F2ZVN0YXRlKCk7CiB9Ci12b2lkIENQU1ByaW50ZXJEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpCit2b2lkIENQU1ByaW50ZXJEcml2ZXI6OlJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpCiB7CiAgICAgbV9QU1JlbmRlcmVyLlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKIH0KLUZYX0JPT0wJQ1BTUHJpbnRlckRyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCitib29sCUNQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICBpbnQgZmlsbF9tb2RlKQogewogICAgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIGZpbGxfbW9kZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2Jvb2wJQ1BTUHJpbnRlckRyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkKIHsKICAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KLUZYX0JPT0wJQ1BTUHJpbnRlckRyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCitib29sCUNQU1ByaW50ZXJEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgRlhfQVJHQiBmaWxsX2NvbG9yLCBGWF9BUkdCIHN0cm9rZV9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fUFNSZW5kZXJlci5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUgJiAzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKK2Jvb2wgQ1BTUHJpbnRlckRyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKIHsKICAgICAqcFJlY3QgPSBtX1BTUmVuZGVyZXIuR2V0Q2xpcEJveCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCitib29sIENQU1ByaW50ZXJEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fUFNSZW5kZXJlci5TZXRESUJpdHMocEJpdG1hcCwgY29sb3IsIGxlZnQsIHRvcCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKK2Jvb2wgQ1BTUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIG1fUFNSZW5kZXJlci5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGNvbG9yLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKK2Jvb2wJQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogewogICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaGFuZGxlID0gTlVMTDsKICAgICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdESUJpdHMocEJpdG1hcCwgY29sb3IsIHBNYXRyaXgsIHJlbmRlcl9mbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAorYm9vbAlDUFNQcmludGVyRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCiB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oIGIvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaAppbmRleCA1NjljNGY2Li5mOWI2YTYzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgKQEAgLTEzLDE1ICsxMywxNSBAQAogICAgIENHZGlwbHVzRXh0KCk7CiAgICAgfkNHZGlwbHVzRXh0KCk7CiAgICAgdm9pZAkJCUxvYWQoKTsKLSAgICBGWF9CT09MCQkJSXNBdmFpbGFibGUoKQorICAgIGJvb2wJCQlJc0F2YWlsYWJsZSgpCiAgICAgewogICAgICAgICByZXR1cm4gbV9oTW9kdWxlICE9IE5VTEw7CiAgICAgfQotICAgIEZYX0JPT0wJCQlTdHJldGNoQml0TWFzayhIREMgaERDLCBCT09MIGJNb25vRGV2aWNlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICBib29sCQkJU3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IGZsYWdzKTsKLSAgICBGWF9CT09MCQkJU3RyZXRjaERJQml0cyhIREMgaERDLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICBib29sCQkJU3RyZXRjaERJQml0cyhIREMgaERDLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncyk7Ci0gICAgRlhfQk9PTAkJCURyYXdQYXRoKEhEQyBoREMsIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGJvb2wJCQlEcmF3UGF0aChIREMgaERDLCBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfYXJnYiwKQEAgLTMxLDI2ICszMSwyNiBAQAogCiAgICAgdm9pZCoJCQlMb2FkTWVtRm9udCh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiAgICAgdm9pZAkJCURlbGV0ZU1lbUZvbnQodm9pZCogcEZvbnRDb2xsZWN0aW9uKTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUZyb21JbWFnZSh2b2lkKiBiaXRtYXAsIHZvaWQqKiBncmFwaGljcyk7CisgICAgYm9vbCAgICAgICAgIEdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwRGVsZXRlR3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcFNldFBhZ2VVbml0KHZvaWQqIGdyYXBoaWNzLCBGWF9EV09SRCB1bml0KTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcFNldFdvcmxkVHJhbnNmb3JtKHZvaWQqIGdyYXBoaWNzLCB2b2lkKiBwTWF0cml4KTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwgdm9pZCAqZm9udCwgdm9pZCogYnJ1c2gsIHZvaWQgKnBvc2l0aW9ucywgaW50IGZsYWdzLCBjb25zdCB2b2lkICptYXRyaXgpOworICAgIGJvb2wgICAgICAgICBHZGlwRHJhd0RyaXZlclN0cmluZyh2b2lkICpncmFwaGljcywgIHVuc2lnbmVkIHNob3J0ICp0ZXh0LCBpbnQgbGVuZ3RoLCB2b2lkICpmb250LCB2b2lkKiBicnVzaCwgdm9pZCAqcG9zaXRpb25zLCBpbnQgZmxhZ3MsIGNvbnN0IHZvaWQgKm1hdHJpeCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBDcmVhdGVCcnVzaChGWF9EV09SRCBmaWxsX2FyZ2IsIHZvaWQqKiBwQnJ1c2gpOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwRGVsZXRlQnJ1c2godm9pZCogcEJydXNoKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcENyZWF0ZU1hdHJpeChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCB2b2lkKiogbWF0cml4KTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZU1hdHJpeCh2b2lkKiBtYXRyaXgpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLCB2b2lkKiBwRm9udENvbGxlY3Rpb24sIHZvaWQqKnBGYW1pbHkpOworICAgIGJvb2wgICAgICAgICBHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLCB2b2lkKiBwRm9udENvbGxlY3Rpb24sIHZvaWQqKnBGYW1pbHkpOwogICAgIHZvaWQgICAgICAgICAgICBHZGlwRGVsZXRlRm9udEZhbWlseSh2b2lkKiBwRmFtaWx5KTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUZvbnRGcm9tRmFtaWx5KHZvaWQqIHBGYW1pbHksIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSwgaW50IGZsYWcsIHZvaWQqKiBwRm9udCk7CisgICAgYm9vbCAgICAgICAgIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpOwogICAgIHZvaWQqICAgICAgICAgICBHZGlwQ3JlYXRlRm9udEZyb21Db2xsZWN0aW9uKHZvaWQqIHBGb250Q29sbGVjdGlvbiwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgdm9pZCoqYml0bWFwKTsKKyAgICBib29sICAgICAgICAgR2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCk7CiAgICAgdm9pZCAgICAgICAgICAgIEdkaXBEaXNwb3NlSW1hZ2Uodm9pZCogYml0bWFwKTsKICAgICB2b2lkICAgICAgICAgICAgR2RpcEdldEZvbnRTaXplKHZvaWQgKnBGb250LCBGWF9GTE9BVCAqc2l6ZSk7CiAgICAgdm9pZCogICAgICAgICAgIEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KHZvaWQgKnBGb250ZGF0YSwgRlhfRFdPUkQgc2l6ZSwgdm9pZCogcGR2LCBGWF9EV09SRCogbnVtX2ZhY2UpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBoYW5kbGUpOworICAgIGJvb2wgICAgICAgICBHZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBoYW5kbGUpOwogICAgIHZvaWQqCQkJbV9GdW5jdGlvbnNbMTAwXTsKICAgICB2b2lkKiAgICAgICAgICAgbV9wR2RpQWRkRm9udE1lbVJlc291cmNlRXg7CiAgICAgdm9pZCogICAgICAgICAgIG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4OwpAQCAtNjMsNyArNjMsNyBAQAogY2xhc3MgQ1dpbjMyUGxhdGZvcm0KIHsKIHB1YmxpYzoKLSAgICBGWF9CT09MCQkJbV9iSGFsZlRvbmU7CisgICAgYm9vbAkJCW1fYkhhbGZUb25lOwogICAgIENHZGlwbHVzRXh0CQltX0dkaXBsdXNFeHQ7CiAgICAgQ0RXcml0ZUV4dCAgICAgIG1fRFdyaXRlRXh0OwogfTsKQEAgLTc1LDIyICs3NSwyMiBAQAogICAgIHsKICAgICAgICAgU2F2ZURDKG1faERDKTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkKKyAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCA9IGZhbHNlKQogICAgIHsKICAgICAgICAgUmVzdG9yZURDKG1faERDLCAtMSk7CiAgICAgICAgIGlmIChiS2VlcFNhdmVkKSB7CiAgICAgICAgICAgICBTYXZlREMobV9oREMpOwogICAgICAgICB9CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIHZpcnR1YWwgYm9vbAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCkBAIC0xMDAsMjYgKzEwMCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQJYmxlbmRfdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgIHZpcnR1YWwgYm9vbCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCisgICAgdmlydHVhbCBib29sCURyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0RXT1JEIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7CiAgICAgdmlydHVhbCB2b2lkKiBHZXRDbGlwUmduKCkgOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUmduKHZvaWQqIHBSZ24pIDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MIERlbGV0ZURldmljZVJnbih2b2lkKiBwUmduKTsKKyAgICB2aXJ0dWFsIGJvb2wgU2V0Q2xpcFJnbih2b2lkKiBwUmduKSA7CisgICAgdmlydHVhbCBib29sIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVEZXZpY2VSZ24odm9pZCogcFJnbik7CiAgICAgdmlydHVhbCB2b2lkCURyYXdMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKTsKICAgICB2aXJ0dWFsIHZvaWQqCUdldFBsYXRmb3JtU3VyZmFjZSgpCiAgICAgewogICAgICAgICByZXR1cm4gKHZvaWQqKW1faERDOwogICAgIH0KLSAgICBGWF9CT09MCQkJR0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwKKyAgICBib29sCQkJR0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICBGWF9CT09MCQkJR0RJX1N0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgYm9vbAkJCUdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgRlhfQk9PTAkJCUdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICBib29sCQkJR0RJX1N0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYml0bWFwX2NvbG9yLCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKICAgICBIREMJCQkJbV9oREM7CkBAIC0xMzMsMTkgKzEzMywxOSBAQAogcHVibGljOgogICAgIENHZGlEaXNwbGF5RHJpdmVyKEhEQyBoREMpOwogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCisgICAgdmlydHVhbCBib29sIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgYm9vbCBiREVkZ2UgPSBmYWxzZSk7CisgICAgdmlydHVhbCBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAorICAgIHZpcnR1YWwgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKKyAgICB2aXJ0dWFsIGJvb2wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIEZYX0JPT0wJCQlVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKKyAgICBib29sCQkJVXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCByZW5kZXJfZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiB9OwpAQCAtMTU1LDE2ICsxNTUsMTYgQEAKICAgICBDR2RpUHJpbnRlckRyaXZlcihIREMgaERDKTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKKyAgICB2aXJ0dWFsIGJvb2wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgdmlydHVhbCBib29sIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwogICAgIGludAkJCQltX0hvcnpTaXplLCBtX1ZlcnRTaXplOwotICAgIEZYX0JPT0wJCQltX2JTdXBwb3J0Uk9QOworICAgIGJvb2wJCQltX2JTdXBwb3J0Uk9QOwogfTsKIGNsYXNzIENQU091dHB1dCA6IHB1YmxpYyBJRlhfUFNPdXRwdXQKIHsKQEAgLTE4NCwyNyArMTg0LDI3IEBACiB7CiBwdWJsaWM6CiAgICAgQ1BTUHJpbnRlckRyaXZlcigpOwotICAgIEZYX0JPT0wJCQlJbml0KEhEQyBoREMsIGludCBwc19sZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCk7CisgICAgYm9vbAkJCUluaXQoSERDIGhEQywgaW50IHBzX2xldmVsLCBib29sIGJDbXlrT3V0cHV0KTsKICAgICB+Q1BTUHJpbnRlckRyaXZlcigpOwogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTCBJc1BTUHJpbnREcml2ZXIoKQorICAgIHZpcnR1YWwgYm9vbCBJc1BTUHJpbnREcml2ZXIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCk7CisgICAgdmlydHVhbCBib29sCVN0YXJ0UmVuZGVyaW5nKCk7CiAgICAgdmlydHVhbCB2b2lkCUVuZFJlbmRlcmluZygpOwogICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIGJvb2wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgdmlydHVhbCBib29sCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICB2aXJ0dWFsIGJvb2wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtMjE0LDE2ICsyMTQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAorICAgIHZpcnR1YWwgYm9vbCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKKyAgICB2aXJ0dWFsIGJvb2wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCisgICAgdmlydHVhbCBib29sIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAorICAgIHZpcnR1YWwgYm9vbAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCB2b2lkKiYgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKKyAgICB2aXJ0dWFsIGJvb2wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKICAgICB2aXJ0dWFsIHZvaWQqCUdldFBsYXRmb3JtU3VyZmFjZSgpCkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKICAgICB9CiAgICAgSERDCQkJCW1faERDOwotICAgIEZYX0JPT0wJCQltX2JDbXlrT3V0cHV0OworICAgIGJvb2wJCQltX2JDbXlrT3V0cHV0OwogICAgIGludAkJCQltX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOwogICAgIGludAkJCQltX0hvcnpTaXplLCBtX1ZlcnRTaXplOwogICAgIENQU091dHB1dCoJCW1fcFBTT3V0cHV0OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guaAppbmRleCAzZGVlYWU4Li42ODgwOTc3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guaApAQCAtMTcsMTEgKzE3LDExIEBACiAKIAl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogfTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaAppbmRleCBlNWM2NWMyLi45NTdmZGE0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaApAQCAtMzEsMTkgKzMxLDE5IEBACiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAgCXZpcnR1YWwgdm9pZAkJCQlHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKICAJdmlydHVhbCB2b2lkCQkJCVNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOworIAl2aXJ0dWFsIGJvb2wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIENQV0xfV25kKgkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25LZXlTdHJva2UoRlhfQk9PTCBiS2V5RG93biwgRlhfVUlOVCBuRmxhZyk7CisJdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSk7CisJdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKGJvb2wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpOwogCiBwdWJsaWM6CiAJdmlydHVhbCB2b2lkCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwpAQCAtNTMsOSArNTMsOSBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCk7CiAKIHB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCXZpcnR1YWwgYm9vbAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAogcHJpdmF0ZToKIAlDRlhfV2lkZVN0cmluZwkJCQlHZXRTZWxlY3RFeHBvcnRUZXh0KCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaAppbmRleCBmYzg1OGE4Li45ODk5NWMxIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgKQEAgLTM5LDIzICszOSwyMyBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCXZpcnR1YWwgYm9vbAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAogCXZpcnR1YWwgdm9pZAkJCQlEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAl2aXJ0dWFsIHZvaWQJCQkJRG9DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKQEAgLTcyLDE1ICs3MiwxNSBAQAogIAkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZmEpOwogIAl2aXJ0dWFsIHZvaWQJCQkJU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKICAJCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKLSAJdmlydHVhbCBGWF9CT09MCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorIAl2aXJ0dWFsIGJvb2wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCiAgCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldyk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBDUFdMX1duZCogCQkJUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpOworCXZpcnR1YWwgQ1BXTF9XbmQqIAkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiUmVzdG9yZVZhbHVlKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25LZXlTdHJva2UoYm9vbCBiS2V5RG93bik7CiAKIAlDUERGX01hdHJpeAkJCQkJR2V0Q3VyTWF0cml4KCk7CiAKQEAgLTk1LDE5ICs5NSwxOSBAQAogCXZvaWQJCQkJCQlTZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdyk7CiAJQ1BERl9SZWN0CQkJCQlHZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQlGWF9CT09MCQkJCQkJQ29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJYm9vbAkJCQkJCUNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JQ1BXTF9XbmQqCQkJCQlHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpOworCUNQV0xfV25kKgkJCQkJR2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiTmV3KTsKIAl2b2lkCQkJCQkJRGVzdHJveVBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZvaWQJCQkJCQlFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KTsKKwl2b2lkCQkJCQkJRXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiRGVzdHJveVBERldpbmRvdyk7CiAKIAl2aXJ0dWFsCVBXTF9DUkVBVEVQQVJBTQkJR2V0Q3JlYXRlUGFyYW0oKTsKIAl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpID0gMDsKIAl2aXJ0dWFsIENQREZfUmVjdAkJCUdldEZvY3VzQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQlGWF9CT09MCQkJCQkJSXNWYWxpZCgpIGNvbnN0OworCWJvb2wJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7CiAJQ1BERl9SZWN0CQkJCQlHZXRQREZXaW5kb3dSZWN0KCkgY29uc3Q7CiAKIAlDUERGU0RLX1BhZ2VWaWV3KgkJCUdldEN1clBhZ2VWaWV3KCk7CkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICBDUERGU0RLX1dpZGdldCogbV9wV2lkZ2V0OwogICAgIENQREZTREtfQW5ub3QqIG1fcEFubm90OwogCi0gICAgRlhfQk9PTCBtX2JWYWxpZDsKKyAgICBib29sIG1fYlZhbGlkOwogICAgIENGRkxfUGFnZVZpZXcyUERGV2luZG93IG1fTWFwczsKICAgICBDUERGX1BvaW50IG1fcHRPbGRQb3M7CiB9OwpAQCAtMTM3LDkgKzEzNyw5IEBACiAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LAogCQkJCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJCQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MpOwpAQCAtMTQ4LDggKzE0OCw4IEBACiAJCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQkJCQkJCQkJRlhfRFdPUkQgZHdGbGFncyk7CiBwcm90ZWN0ZWQ6Ci0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlSW47Ci0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJbV9iTW91c2VJbjsKKwlib29sCQkJCQkJbV9iTW91c2VEb3duOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfRk9STUZJTExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaAppbmRleCBlNTUzNzIzLi41MWIwMjc5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaApAQCAtMjAsNyArMjAsNyBAQAogCUNGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CiAJdmlydHVhbCB+Q0ZGTF9JRm9ybUZpbGxlcigpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCk7CiAJdmlydHVhbCBGWF9SRUNUCQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwKIAkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCkBAIC0zNCw0MSArMzQsNDEgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKIAogCXZpcnR1YWwgdm9pZAkJCQlRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLCBGWF9GTE9BVCBmUG9wdXBNaW4sRlhfRkxPQVQgZlBvcHVwTWF4LCBpbnQzMl90ICYgblJldCwgRlhfRkxPQVQgJiBmUG9wdXBSZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkJlZm9yZUtleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCisJdmlydHVhbCB2b2lkCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKGJvb2wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKIAkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAogCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkFmdGVyS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgOworCQkJCQkJCQkJCWJvb2wgYktleURvd24sIGJvb2wgJiBiUkMsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgdm9pZAkJCQlPbkFmdGVyS2V5U3Ryb2tlKGJvb2wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgYm9vbCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgOwogCi0JQ0ZGTF9Gb3JtRmlsbGVyKgkJCUdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9CT09MIGJSZWdpc3Rlcik7CisJQ0ZGTF9Gb3JtRmlsbGVyKgkJCUdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBib29sIGJSZWdpc3Rlcik7CiAJdm9pZAkJCQkJCVJlbW92ZUZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXN0YXRpYyBGWF9CT09MCQkJCUlzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQkJSXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQkJSXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCk7Ci0gCXN0YXRpYyBGWF9CT09MCQkJCUlzVmFsaWRBbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisJc3RhdGljIGJvb2wJCQkJSXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKwlzdGF0aWMgYm9vbAkJCQlJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKwlzdGF0aWMgYm9vbAkJCQlJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAJc3RhdGljIGJvb2wJCQkJSXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZvaWQJCQkJCQlPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUkMsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uVmFsaWRhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCXZvaWQJCQkJCQlPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiUkMsIGJvb2wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uVmFsaWRhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYlJDLCBib29sJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwogCi0Jdm9pZAkJCQkJCU9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uQnV0dG9uVXAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCxGWF9VSU5UIG5GbGFnKTsKKwl2b2lkCQkJCQkJT25DYWxjdWxhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2b2lkCQkJCQkJT25Gb3JtYXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2b2lkCQkJCQkJT25CdXR0b25VcChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiUmVzZXQsIGJvb2wmIGJFeGl0LEZYX1VJTlQgbkZsYWcpOwogCiBwcml2YXRlOgogICAgIHVzaW5nIENGRkxfV2lkZ2V0MkZpbGxlciA9IHN0ZDo6bWFwPENQREZTREtfQW5ub3QqLCBDRkZMX0Zvcm1GaWxsZXIqPjsKQEAgLTc3LDcgKzc3LDcgQEAKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKICAgICBDRkZMX1dpZGdldDJGaWxsZXIgbV9NYXBzOwotICAgIEZYX0JPT0wgbV9iTm90aWZ5aW5nOworICAgIGJvb2wgbV9iTm90aWZ5aW5nOwogfTsKIAogY2xhc3MgQ0ZGTF9Qcml2YXRlRGF0YQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmgKaW5kZXggNGMwODEzZi4uNTllM2Q2YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oCkBAIC0yMywxMCArMjMsMTAgQEAKICAgICB2aXJ0dWFsIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLAorICAgIHZpcnR1YWwgYm9vbCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpOwogCi0gICAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgICB2aXJ0dWFsIGJvb2wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogICAgIHZpcnR1YWwgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAgICAgdmlydHVhbCB2b2lkIEdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LApAQCAtNDAsOCArNDAsOCBAQAogICAgIHZpcnR1YWwgdm9pZCBSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogICAgIHZpcnR1YWwgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN0b3JlVmFsdWUpOwotICAgIHZpcnR1YWwgdm9pZCBPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duLCBGWF9EV09SRCBuRmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVzdG9yZVZhbHVlKTsKKyAgICB2aXJ0dWFsIHZvaWQgT25LZXlTdHJva2UoYm9vbCBiS2V5RG93biwgRlhfRFdPUkQgbkZsYWcpOwogCiBwcml2YXRlOgogICAgIENCQV9Gb250TWFwKiBtX3BGb250TWFwOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oCmluZGV4IDk2MWQ0YjcuLjhhOWMwNGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgKQEAgLTIwLDM1ICsyMCwzNSBAQAogCXZpcnR1YWwgfkNGRkxfTm90aWZ5KCk7CiAKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCQkJT25TZXRGb2N1cyhGWF9CT09MICYgYkV4aXQpOwotCUZYX0JPT0wJCQkJCQkJCQlPbk1vdXNlRW50ZXIoRlhfQk9PTCAmIGJFeGl0KTsKLQlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZURvd24oRlhfQk9PTCAmIGJFeGl0KTsKLQlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZVVwKEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VFeGl0KEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uS2lsbEZvY3VzKEZYX0JPT0wgJiBiRXhpdCk7CisJYm9vbAkJCQkJCQkJCU9uU2V0Rm9jdXMoYm9vbCAmIGJFeGl0KTsKKwlib29sCQkJCQkJCQkJT25Nb3VzZUVudGVyKGJvb2wgJiBiRXhpdCk7CisJYm9vbAkJCQkJCQkJCU9uTW91c2VEb3duKGJvb2wgJiBiRXhpdCk7CisJYm9vbAkJCQkJCQkJCU9uTW91c2VVcChib29sICYgYkV4aXQpOworCWJvb2wJCQkJCQkJCQlPbk1vdXNlRXhpdChib29sICYgYkV4aXQpOworCWJvb2wJCQkJCQkJCQlPbktpbGxGb2N1cyhib29sICYgYkV4aXQpOwogCi0JRlhfQk9PTAkJCQkJCQkJCU9uQ2FsY3VsYXRlKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uRm9ybWF0KGludCBpQ29tbWl0S2V5KTsKLQlGWF9CT09MCQkJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKLQkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKLQkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgJiBiUkMpOwotCUZYX0JPT0wJCQkJCQkJCQlPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLQkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKLQkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYldpbGxDb21taXQsIEZYX0JPT0wgYkZpZWxkRnVsbCwKLQkJCQkJCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgRlhfQk9PTCYgYlJDKTsKKwlib29sCQkJCQkJCQkJT25DYWxjdWxhdGUoKTsKKwlib29sCQkJCQkJCQkJT25Gb3JtYXQoaW50IGlDb21taXRLZXkpOworCWJvb2wJCQkJCQkJCQlPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLAorCQkJCQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIGJvb2wgYktleURvd24sIGJvb2wgYk1vZGlmaWVyLAorCQkJCQkJCQkJCQkgICBib29sIGJTaGlmdCwgYm9vbCAmIGJSQyk7CisJYm9vbAkJCQkJCQkJCU9uS2V5U3Ryb2tlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorCQkJCQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIGJvb2wgYktleURvd24sIGJvb2wgYk1vZGlmaWVyLAorCQkJCQkJCQkJCQkgICBib29sIGJTaGlmdCwgYm9vbCBiV2lsbENvbW1pdCwgYm9vbCBiRmllbGRGdWxsLAorCQkJCQkJCQkJCQkgICBpbnQmIG5TZWxTdGFydCwgaW50JiBuU2VsRW5kLCBib29sJiBiUkMpOwogCiAJdm9pZAkJCQkJCQkJCUJlZm9yZU5vdGlmeSgpOwogCXZvaWQJCQkJCQkJCQlBZnRlck5vdGlmeSgpOwotCUZYX0JPT0wJCQkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9uTm90aWZ5RmxhZyA+IDA7fQorCWJvb2wJCQkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9uTm90aWZ5RmxhZyA+IDA7fQogCiBwcml2YXRlOgotIAlGWF9CT09MCQkJCQkJCQkJRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCAmIGJFeGl0KTsKLSAJRlhfQk9PTAkJCQkJCQkJCUZpbmRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbik7Ci0gCUZYX0JPT0wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb24gYWFjdGlvbixDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOwotIAlGWF9CT09MCQkJCQkJCQkJRXhlY3V0ZUFjdGlvblRyZWUoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULCBDUERGX0FjdGlvbiAmIGFjdGlvbiwgRlhfQk9PTCYgYkV4aXQpOwotIAlGWF9CT09MCQkJCQkJCQkJRXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sRlhfQk9PTCYgYkV4aXQpOworIAlib29sCQkJCQkJCQkJRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgYm9vbCAmIGJFeGl0KTsKKyAJYm9vbAkJCQkJCQkJCUZpbmRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbik7CisgCWJvb2wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb24gYWFjdGlvbixDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOworIAlib29sCQkJCQkJCQkJRXhlY3V0ZUFjdGlvblRyZWUoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULCBDUERGX0FjdGlvbiAmIGFjdGlvbiwgYm9vbCYgYkV4aXQpOworIAlib29sCQkJCQkJCQkJRXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sYm9vbCYgYkV4aXQpOwogCi0JRlhfQk9PTAkJCQkJCQkJCW1fYkRvQWN0aW9uaW5nOworCWJvb2wJCQkJCQkJCQltX2JEb0FjdGlvbmluZzsKIAlpbnQzMl90CQkJCQkJCQltX25Ob3RpZnlGbGFnOwogfTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmgKaW5kZXggM2NmYWVmYi4uMjZkZTdhMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oCkBAIC0xNyw3ICsxNyw3IEBACiAKIAl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCAgQ1BERlNES19Bbm5vdCogcEFubm90LAogCQkJCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJCQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaAppbmRleCA0NjMzMmUwLi5lODU4NTMzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaApAQCAtMTYsMTAgKzE2LDEwIEBACiAJdmlydHVhbCB+Q0ZGTF9SYWRpb0J1dHRvbigpOwogCiAJdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLSAgCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgCXZpcnR1YWwgYm9vbAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaAppbmRleCAxMGJkNWMwLi4xMDViOTBjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oCkBAIC0zMiwyMSArMzIsMjEgQEAKIAl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCXZpcnR1YWwgYm9vbAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAJdmlydHVhbCB2b2lkCQkJCVNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKICAJdmlydHVhbCB2b2lkCQkJCUdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAgCQkJCQkJCQkJCQkJUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CiAgCXZpcnR1YWwgdm9pZAkJCQlTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKKyAJdmlydHVhbCBib29sCQkJCUlzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAogIAkJCQkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwogCXZpcnR1YWwgdm9pZAkJCQlTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIENQV0xfV25kKgkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKKwl2aXJ0dWFsIENQV0xfV25kKgkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiUmVzdG9yZVZhbHVlKTsKIAogcHVibGljOgogCXZpcnR1YWwgdm9pZAkJCQlPblNldEZvY3VzKENQV0xfV25kKiBwV25kKTsKQEAgLTU2LDkgKzU2LDkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpOwogCiBwdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJdmlydHVhbCBib29sCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKIHByaXZhdGU6CiAJQ0JBX0ZvbnRNYXAqCQkJCW1fcEZvbnRNYXA7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oCmluZGV4IGZlMDI1ZWMuLjhkZmM2NGUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oCkBAIC0xNyw3ICsxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCYgZlNpemUpOwogICAgIHN0YXRpYyBDUERGX1JlY3QgRGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiBjclJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCYgZlNpemUpOwotICAgIHN0YXRpYyBGWF9CT09MIFRyYWNlT2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgICBzdGF0aWMgYm9vbCBUcmFjZU9iamVjdChDUERGX09iamVjdCogcE9iaik7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oCmluZGV4IDM5ZWM0ZjQuLjdjNDFhMWQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgKQEAgLTIzLDE4ICsyMywxOCBAQAogY2xhc3MgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcgogewogcHVibGljOgotCUZYX0JPT0wJRG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAlEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAlEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAlEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAlEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCURvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIH07CiAKIGNsYXNzIENQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyCiB7CiBwdWJsaWM6Ci0JRlhfQk9PTAlEb0FjdGlvbl9SZW5kaXRpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1NvdW5kKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAlEb0FjdGlvbl9Nb3ZpZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJRG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAlEb0FjdGlvbl9Tb3VuZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJRG9BY3Rpb25fTW92aWUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIH07CiAKIGNsYXNzIENQREZTREtfQWN0aW9uSGFuZGxlcgpAQCAtNDQsMzEgKzQ0LDMxIEBACiAKIAl2b2lkIFNldE1lZGlhQWN0aW9uSGFuZGxlcihDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlciogcEhhbmRsZXIpOwogCi0JRlhfQk9PTAkJRG9BY3Rpb25fRG9jT3Blbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJCURvQWN0aW9uX0phdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLENGWF9XaWRlU3RyaW5nIGNzSlNOYW1lLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJCURvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJCURvQWN0aW9uX0RvY3VtZW50KGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCUZYX0JPT0wJCURvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpOwotCUZYX0JPT0wJCURvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKKwlib29sCQlEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAkJRG9BY3Rpb25fSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sQ0ZYX1dpZGVTdHJpbmcgY3NKU05hbWUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAkJRG9BY3Rpb25fUGFnZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisJYm9vbAkJRG9BY3Rpb25fRG9jdW1lbnQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJCURvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsgKnBCb29rTWFyaywgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJCURvQWN0aW9uX1NjcmVlbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJYm9vbAkJRG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworCWJvb2wJCURvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSk7CisJYm9vbAkJRG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpOwogCiBwcml2YXRlOgotCUZYX0JPT0wJCQkJRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZUZpZWxkQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZVNjcmVlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZTREtfQW5ub3QqIHBTY3JlZW4sIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlGWF9CT09MCQkJCUV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGX0Jvb2ttYXJrKiBwQm9va21hcmssIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlGWF9CT09MCQkJCUV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKKwlib29sCQkJCUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworCWJvb2wJCQkJRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKKwlib29sCQkJCUV4ZWN1dGVGaWVsZEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENGWF9QdHJMaXN0JiBsaXN0KTsKKwlib29sCQkJCUV4ZWN1dGVTY3JlZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGU0RLX0Fubm90KiBwU2NyZWVuLCBDRlhfUHRyTGlzdCYgbGlzdCk7CisJYm9vbAkJCQlFeGVjdXRlQm9va01hcmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLCBDRlhfUHRyTGlzdCYgbGlzdCk7CisJYm9vbAkJCQlFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7CiAKIAl2b2lkCQkJCURvQWN0aW9uX05vSnMoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAl2b2lkCQkJCVJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwogCXZvaWQJCQkJUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzU2NyaXB0TmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7CiAJdm9pZAkJCQlSdW5GaWVsZEphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwogCi0JRlhfQk9PTAkJCQlJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwotCUZYX0JPT0wJCQkJSXNWYWxpZERvY1ZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKwlib29sCQkJCUlzVmFsaWRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7CisJYm9vbAkJCQlJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCiAJdm9pZAkJCQlEb0FjdGlvbl9Hb1RvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwogCXZvaWQJCQkJRG9BY3Rpb25fR29Ub1IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYW5ub3RoYW5kbGVyLmgKaW5kZXggYjQ3MDU2OS4uNmYzYmVlNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYW5ub3RoYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYW5ub3RoYW5kbGVyLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoKSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKIAogCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpID0gMDsKQEAgLTQxLDcgKzQxLDcgQEAKIAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKIAogCiAJdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKQEAgLTY4LDI0ICs2OCwyNCBAQAogCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIAogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CiAvL2J5IHdqbS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0wIDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0wIDsKIAogCXZpcnR1YWwJdm9pZAkJCQlPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAJdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCBib29sCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIAogfTsKIApAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKCkgIHtyZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoIldpZGdldEhhbmRsZXIiKTt9CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisJdmlydHVhbCBib29sCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCiAJdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CiAKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpIDsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAogCiAJdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKQEAgLTEzNywyNSArMTM3LDI1IEBACiAJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgOwogCiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHtyZXR1cm4gRkFMU0U7fQorCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCXZpcnR1YWwgYm9vbAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7CisJdmlydHVhbCBib29sCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkge3JldHVybiBmYWxzZTt9CiAKIC8vYnkgd2ptLgotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwogCiAJdmlydHVhbAl2b2lkCQkJCU9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CiAJdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZvaWQJCQkJCQlTZXRGb3JtRmlsbGVyKENGRkxfSUZvcm1GaWxsZXIqIHBGaWxsZXIpe21fcEZvcm1GaWxsZXIgPSBwRmlsbGVyO30KIAlDRkZMX0lGb3JtRmlsbGVyKgkJCUdldEZvcm1GaWxsZXIoKSB7cmV0dXJuIG1fcEZvcm1GaWxsZXI7fQpAQCAtMTkwLDI5ICsxOTAsMjkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJQW5ub3RfT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzKTsKIAl2aXJ0dWFsIHZvaWQJCQkJQW5ub3RfT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9Pbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9Pbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBib29sCQkJCUFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKTsKKwl2aXJ0dWFsIGJvb2wJCQkJQW5ub3RfT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJQW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCXZpcnR1YWwgYm9vbAkJCQlBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAogcHJpdmF0ZToKIAlJUERGU0RLX0Fubm90SGFuZGxlcioJCQlHZXRBbm5vdEhhbmRsZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlKSBjb25zdDsKLQlDUERGU0RLX0Fubm90KgkJCQlHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX0JPT0wgYk5leHQpOworCUNQREZTREtfQW5ub3QqCQkJCUdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsYm9vbCBiTmV4dCk7CiBwcml2YXRlOgogCUNCQV9Bbm5vdEhhbmRsZXJBcnJheQkJbV9IYW5kbGVyczsKIAlDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCQltX21hcFR5cGUySGFuZGxlcjsKQEAgLTIyNCw4ICsyMjQsOCBAQAogY2xhc3MgQ1BERlNES19Bbm5vdEl0ZXJhdG9yCiB7CiBwdWJsaWM6Ci0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJldmVyc2UsCi0JCUZYX0JPT0wgYklnbm9yZVRvcG1vc3Q9RkFMU0UsRlhfQk9PTCBiQ2lyY2xlPUZBTFNFLENGWF9QdHJBcnJheSogcExpc3Q9TlVMTCk7CisgICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIGJvb2wgYlJldmVyc2UsCisJCWJvb2wgYklnbm9yZVRvcG1vc3Q9ZmFsc2UsYm9vbCBiQ2lyY2xlPWZhbHNlLENGWF9QdHJBcnJheSogcExpc3Q9TlVMTCk7CiAgICAgdmlydHVhbCB+Q1BERlNES19Bbm5vdEl0ZXJhdG9yKCkgeyB9CiAKIAl2aXJ0dWFsIENQREZTREtfQW5ub3QqCU5leHQgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KSA7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAl2aXJ0dWFsIENQREZTREtfQW5ub3QqCVByZXYoaW50JiBpbmRleCApIDsKIAl2aXJ0dWFsIGludCAgICAgICAgICAgICBDb3VudCgpe3JldHVybiBtX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7fQogCi0JdmlydHVhbCBGWF9CT09MICAgICAgICAgSW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsQ0ZYX1B0ckFycmF5KiBwTGlzdD1OVUxMKTsKKwl2aXJ0dWFsIGJvb2wgICAgICAgICBJbml0SXRlcmF0b3JBbm5vdExpc3QoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOwogCiAJdm9pZAkJCQkJSW5zZXJ0U29ydChDRlhfUHRyQXJyYXkgJmFycmF5TGlzdCwgQUlfQ09NUEFSRSBwQ29tcGFyZSk7CiAKQEAgLTI0NSw5ICsyNDUsOSBAQAogCUNQREZTREtfQW5ub3QqCVByZXZBbm5vdChpbnQmIGluZGV4ICkgOwogCiAJQ0ZYX1B0ckFycmF5CSAgICAgbV9wSXRlcmF0b3JBbm5vdExpc3Q7Ci0JRlhfQk9PTAkJCSAgICAgbV9iUmV2ZXJzZTsKLQlGWF9CT09MICAgICAgICAgICAgICBtX2JJZ25vcmVUb3Btb3N0OwotCUZYX0JPT0wgICAgICAgICAgICAgIG1fYkNpcmNsZTsKKwlib29sCQkJICAgICBtX2JSZXZlcnNlOworCWJvb2wgICAgICAgICAgICAgIG1fYklnbm9yZVRvcG1vc3Q7CisJYm9vbCAgICAgICAgICAgICAgbV9iQ2lyY2xlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19BTk5PVEhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKaW5kZXggZGNkMjk1ZC4uYjlmMWZjZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKQEAgLTM4LDEyICszOCwxMiBAQAogCiAJQ1BERlNES19EYXRlVGltZSYJb3BlcmF0b3IgPSAoY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwogCUNQREZTREtfRGF0ZVRpbWUmCW9wZXJhdG9yID0gKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yID09IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciAhPSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgPiAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgPj0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yIDwgKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yIDw9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJYm9vbAkJCQlvcGVyYXRvciA9PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworCWJvb2wJCQkJb3BlcmF0b3IgIT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKwlib29sCQkJCW9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKwlib29sCQkJCW9wZXJhdG9yID49IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJYm9vbAkJCQlvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisJYm9vbAkJCQlvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwogCQkJCQkJb3BlcmF0b3IgdGltZV90KCk7CiAKIAlDUERGU0RLX0RhdGVUaW1lJglGcm9tUERGRGF0ZVRpbWVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKTsKQEAgLTkyLDggKzkyLDggQEAKIAl2b2lkCQkJCQkJU2V0VGFiT3JkZXIoaW50IGlUYWJPcmRlcik7CiAKIAkvLyBTZWxlY3Rpb24KLQlGWF9CT09MCQkJCQkJSXNTZWxlY3RlZCgpOwotCXZvaWQJCQkJCQlTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCk7CisJYm9vbAkJCQkJCUlzU2VsZWN0ZWQoKTsKKwl2b2lkCQkJCQkJU2V0U2VsZWN0ZWQoYm9vbCBiU2VsZWN0ZWQpOwogCiAJQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0VHlwZSgpIGNvbnN0OwogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFN1YlR5cGUoKSBjb25zdDsKQEAgLTE0Niw5ICsxNDYsOSBAQAogCiAJdm9pZAkJCQkJCVNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKTsKIAl2b2lkCQkJCQkJUmVtb3ZlQ29sb3IoKTsKLQlGWF9CT09MCQkJCQkJR2V0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKwlib29sCQkJCQkJR2V0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQlJc1Zpc2libGUoKSBjb25zdDsKKwlib29sCQkJCQkJSXNWaXNpYmxlKCkgY29uc3Q7CiAJLy9hY3Rpb24KIAogCUNQREZfQWN0aW9uCQkJCQlHZXRBY3Rpb24oKSBjb25zdDsKQEAgLTE2Miw4ICsxNjIsOCBAQAogCXZpcnR1YWwgQ1BERl9BY3Rpb24JCQlHZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCk7CiAKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJSXNBcHBlYXJhbmNlVmFsaWQoKTsKLQlGWF9CT09MCQkJCQkJSXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CisJYm9vbAkJCQkJCUlzQXBwZWFyYW5jZVZhbGlkKCk7CisJYm9vbAkJCQkJCUlzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOwogCXZvaWQJCQkJCQlEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQlDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIAl2b2lkCQkJCQkJRHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLApAQCAtMTgxLDExICsxODEsMTEgQEAKIAogCiBwcml2YXRlOgotCUZYX0JPT0wgQ3JlYXRlRm9ybUZpbGxlcigpOworCWJvb2wgQ3JlYXRlRm9ybUZpbGxlcigpOwogcHJvdGVjdGVkOgogCUNQREZfQW5ub3QqCQkJbV9wQW5ub3Q7CiAJQ1BERlNES19QYWdlVmlldyoJbV9wUGFnZVZpZXc7Ci0JRlhfQk9PTAkJCQltX2JTZWxlY3RlZDsKKwlib29sCQkJCW1fYlNlbGVjdGVkOwogCWludAkJCQkJbV9uVGFiT3JkZXI7CiAKIH07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaAppbmRleCBlZGJkNWU0Li42Yjk3NGM1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmgKQEAgLTM1LDI4ICszNSwyOCBAQAogewogCV9QREZTREtfRmllbGRBY3Rpb24oKQogCXsKLQkJYk1vZGlmaWVyID0gRkFMU0U7Ci0JCWJTaGlmdCA9IEZBTFNFOworCQliTW9kaWZpZXIgPSBmYWxzZTsKKwkJYlNoaWZ0ID0gZmFsc2U7CiAJCW5Db21taXRLZXkgPSAwOwotCQliS2V5RG93biA9IEZBTFNFOworCQliS2V5RG93biA9IGZhbHNlOwogCQluU2VsRW5kID0gblNlbFN0YXJ0ID0gMDsKLQkJYldpbGxDb21taXQgPSBGQUxTRTsKLQkJYkZpZWxkRnVsbCA9IEZBTFNFOwotCQliUkMgPSBUUlVFOworCQliV2lsbENvbW1pdCA9IGZhbHNlOworCQliRmllbGRGdWxsID0gZmFsc2U7CisJCWJSQyA9IHRydWU7CiAJfQogCi0JRlhfQk9PTAkJCQkJYk1vZGlmaWVyOwkJLy9pbgotCUZYX0JPT0wJCQkJCWJTaGlmdDsJCQkvL2luCisJYm9vbAkJCQkJYk1vZGlmaWVyOwkJLy9pbgorCWJvb2wJCQkJCWJTaGlmdDsJCQkvL2luCiAJaW50CQkJCQkJbkNvbW1pdEtleTsJCS8vaW4KIAlDRlhfV2lkZVN0cmluZwkJCXNDaGFuZ2U7CQkvL2luW291dF0KIAlDRlhfV2lkZVN0cmluZwkJCXNDaGFuZ2VFeDsJCS8vaW4KLQlGWF9CT09MCQkJCQliS2V5RG93bjsJCS8vaW4KKwlib29sCQkJCQliS2V5RG93bjsJCS8vaW4KIAlpbnQJCQkJCQluU2VsRW5kOwkJLy9pbltvdXRdCiAJaW50CQkJCQkJblNlbFN0YXJ0OwkJLy9pbltvdXRdCiAJQ0ZYX1dpZGVTdHJpbmcJCQlzVmFsdWU7CQkJLy9pbltvdXRdCi0JRlhfQk9PTAkJCQkJYldpbGxDb21taXQ7CS8vaW4KLQlGWF9CT09MCQkJCQliRmllbGRGdWxsOwkJLy9pbgotCUZYX0JPT0wJCQkJCWJSQzsJCQkvL2luW291dF0KKwlib29sCQkJCQliV2lsbENvbW1pdDsJLy9pbgorCWJvb2wJCQkJCWJGaWVsZEZ1bGw7CQkvL2luCisJYm9vbAkJCQkJYlJDOwkJCS8vaW5bb3V0XQogfVBERlNES19GaWVsZEFjdGlvbjsKIGNsYXNzIENQREZTREtfV2lkZ2V0IDogcHVibGljIENQREZTREtfQW5ub3QKIHsKQEAgLTgwLDkgKzgwLDkgQEAKIAlpbnQJCQkJCQkJCUdldEZpZWxkRmxhZ3MoKSBjb25zdDsKIAlpbnQJCQkJCQkJCUdldFJvdGF0ZSgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUdldEJvcmRlckNvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKwlib29sCQkJCQkJCUdldEZpbGxDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OworCWJvb2wJCQkJCQkJR2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKwlib29sCQkJCQkJCUdldFRleHRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OwogCUZYX0ZMT0FUCQkJCQkJR2V0Rm9udFNpemUoKSBjb25zdDsKIAogCWludAkJCQkJCQkJR2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KSBjb25zdDsKQEAgLTkwLDkgKzkwLDkgQEAKIAlDRlhfV2lkZVN0cmluZwkJCQkJR2V0RGVmYXVsdFZhbHVlKCkgY29uc3Q7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldE9wdGlvbkxhYmVsKGludCBuSW5kZXgpIGNvbnN0OwogCWludAkJCQkJCQkJQ291bnRPcHRpb25zKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKIAlpbnQJCQkJCQkJCUdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKIAkvKgogCUJGX0FMSUdOX0xFRlQKIAlCRl9BTElHTl9NSURETApAQCAtMTAzLDIwICsxMDMsMjAgQEAKIAlDRlhfV2lkZVN0cmluZwkJCQkJR2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0OwogCiAvL1NldCBQcm9wZXJ0aWVzLgotCXZvaWQJCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQlTZXRDaGVjayhib29sIGJDaGVja2VkLCBib29sIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgYm9vbCBiTm90aWZ5KTsKIAl2b2lkCQkJCQkJCVNldERlZmF1bHRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlKTsKLQl2b2lkCQkJCQkJCVNldE9wdGlvblNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkpOwotCXZvaWQJCQkJCQkJQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCVNldE9wdGlvblNlbGVjdGlvbihpbnQgaW5kZXgsIGJvb2wgYlNlbGVjdGVkLCBib29sIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJQ2xlYXJTZWxlY3Rpb24oYm9vbCBiTm90aWZ5KTsKIAl2b2lkCQkJCQkJCVNldFRvcFZpc2libGVJbmRleChpbnQgaW5kZXgpOwogCi0Jdm9pZAkJCQkJCQlSZXNldEFwcGVhcmFuY2UoY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKLQl2b2lkCQkJCQkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisJdm9pZAkJCQkJCQlSZXNldEFwcGVhcmFuY2UoY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgYm9vbCBiVmFsdWVDaGFuZ2VkKTsKKwl2b2lkCQkJCQkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKGJvb2wgYlZhbHVlQ2hhbmdlZCk7CiAJdm9pZAkJCQkJCQlVcGRhdGVGaWVsZCgpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQlPbkZvcm1hdChGWF9CT09MJiBiRm9ybWF0ZWQpOworCUNGWF9XaWRlU3RyaW5nCQkJCQlPbkZvcm1hdChib29sJiBiRm9ybWF0ZWQpOwogCiAvL01lc3NhZ2UuCi0gCUZYX0JPT0wJCQkJCQkJT25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAorIAlib29sCQkJCQkJCU9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKIAkJCQkJCQkJCQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKIAlDUERGU0RLX0ludGVyRm9ybSoJCQkJR2V0SW50ZXJGb3JtKCkgY29uc3Qge3JldHVybiBtX3BJbnRlckZvcm07fQpAQCAtMTI4LDcgKzEyOCw3IEBACiAKIAl2b2lkCQkJCQkJCVNldEFwcE1vZGlmaWVkKCk7CiAJdm9pZAkJCQkJCQlDbGVhckFwcE1vZGlmaWVkKCk7Ci0JRlhfQk9PTAkJCQkJCQlJc0FwcE1vZGlmaWVkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0FwcE1vZGlmaWVkKCkgY29uc3Q7CiAKIAlpbnQzMl90CQkJCQkJR2V0QXBwZWFyYW5jZUFnZSgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRWYWx1ZUFnZSgpIGNvbnN0OwpAQCAtMTU1LDE0ICsxNTUsMTQgQEAKIAl2b2lkCQkJCQkJCUFkZEltYWdlVG9BcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLCBDUERGX1N0cmVhbSogcEltYWdlKTsKIAl2b2lkCQkJCQkJCVJlbW92ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOwogcHVibGljOgotCUZYX0JPT0wJCQkJCQkJSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CisJYm9vbAkJCQkJCQlJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKTsKIAl2b2lkCQkJCQkJCURyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAJCUNQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogcHVibGljOgotCUZYX0JPT0wJCQkJCQkJSGl0VGVzdChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOworCWJvb2wJCQkJCQkJSGl0VGVzdChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOwogcHJpdmF0ZToKIAlDUERGU0RLX0ludGVyRm9ybSoJCQkJbV9wSW50ZXJGb3JtOwotCUZYX0JPT0wJCQkJCQkJbV9iQXBwTW9kaWZpZWQ7CisJYm9vbAkJCQkJCQltX2JBcHBNb2RpZmllZDsKIAlpbnQzMl90CQkJCQkJbV9uQXBwQWdlOwogCWludDMyX3QJCQkJCQltX25WYWx1ZUFnZTsKIH07CkBAIC0xNzYsOSArMTc2LDkgQEAKIAlDUERGX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wSW50ZXJGb3JtOyB9CiAJQ1BERlNES19Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQogCi0JRlhfQk9PTAkJCQkJCQlIaWdobGlnaHRXaWRnZXRzKCk7CisJYm9vbAkJCQkJCQlIaWdobGlnaHRXaWRnZXRzKCk7CiAKLQlDUERGU0RLX1dpZGdldCoJCQkJCUdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYk5leHQpIGNvbnN0OworCUNQREZTREtfV2lkZ2V0KgkJCQkJR2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgYm9vbCBiTmV4dCkgY29uc3Q7CiAJQ1BERlNES19XaWRnZXQqCQkJCQlHZXRXaWRnZXQoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpIGNvbnN0OwogCXZvaWQJCQkJCQkJR2V0V2lkZ2V0cyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiB3aWRnZXRzKTsKIAl2b2lkCQkJCQkJCUdldFdpZGdldHMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1B0ckFycmF5JiB3aWRnZXRzKTsKQEAgLTE4NiwzMyArMTg2LDMzIEBACiAJdm9pZAkJCQkJCQlBZGRNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKIAl2b2lkCQkJCQkJCVJlbW92ZU1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7CiAKLQl2b2lkCQkJCQkJCUVuYWJsZUNhbGN1bGF0ZShGWF9CT09MIGJFbmFibGVkKTsKLQlGWF9CT09MCQkJCQkJCUlzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0OworCXZvaWQJCQkJCQkJRW5hYmxlQ2FsY3VsYXRlKGJvb2wgYkVuYWJsZWQpOworCWJvb2wJCQkJCQkJSXNDYWxjdWxhdGVFbmFibGVkKCkgY29uc3Q7CiAKICNpZmRlZiBfV0lOMzIKIAlDUERGX1N0cmVhbSoJCQkJCUxvYWRJbWFnZUZyb21GaWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZSk7CiAjZW5kaWYKIAotCXZvaWQJCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBGWF9CT09MJiBiUkMpOwotCXZvaWQJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQyk7CisJdm9pZAkJCQkJCQlPbktleVN0cm9rZUNvbW1pdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIGJvb2wmIGJSQyk7CisJdm9pZAkJCQkJCQlPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgYm9vbCYgYlJDKTsKIAl2b2lkCQkJCQkJCU9uQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gTlVMTCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCU9uRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBGWF9CT09MJiBiRm9ybWF0ZWQpOworCUNGWF9XaWRlU3RyaW5nCQkJCQlPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgYm9vbCYgYkZvcm1hdGVkKTsKIAotCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisJdm9pZAkJCQkJCQlSZXNldEZpZWxkQXBwZWFyYW5jZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgYm9vbCBiVmFsdWVDaGFuZ2VkKTsKIAl2b2lkCQkJCQkJCVVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKTsKIAotCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKLQlGWF9CT09MCQkJCQkJCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworCWJvb2wJCQkJCQkJRG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKwlib29sCQkJCQkJCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisJYm9vbAkJCQkJCQlEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisJYm9vbAkJCQkJCQlEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwogCiAJdm9pZAkJCQkJCQlHZXRGaWVsZEZyb21PYmplY3RzKGNvbnN0IENGWF9QdHJBcnJheSYgb2JqZWN0cywgQ0ZYX1B0ckFycmF5JiBmaWVsZHMpOwotCUZYX0JPT0wJCQkJCQkJSXNWYWxpZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7Ci0JRlhfQk9PTAkJCQkJCQlTdWJtaXRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRGVzdGluYXRpb24sIGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLAotCQlGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJVcmxFbmNvZGVkKTsKLQlGWF9CT09MCQkJCQkJCVN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgRlhfQk9PTCBiVXJsRW5jb2RlZCk7Ci0JRlhfQk9PTAkJCQkJCQlFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7Ci0JRlhfQk9PTAkJCQkJCQlFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKTsKKwlib29sCQkJCQkJCUlzVmFsaWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOworCWJvb2wJCQkJCQkJU3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKKwkJYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwgYm9vbCBiVXJsRW5jb2RlZCk7CisJYm9vbAkJCQkJCQlTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIGJvb2wgYlVybEVuY29kZWQpOworCWJvb2wJCQkJCQkJRXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOworCWJvb2wJCQkJCQkJRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRlbXBvcmFyeUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCk7CiAKIHByaXZhdGU6CkBAIC0yMjYsOCArMjI2LDggQEAKIAl2aXJ0dWFsIGludAkJCQkJCUJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSk7CiAJdmlydHVhbCBpbnQJCQkJCQlBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSk7CiAKLQlGWF9CT09MCQkJCQkJCUZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLCBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpOwotCUZYX0JPT0wJCQkJCQkJRkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpOworCWJvb2wJCQkJCQkJRkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSk7CisJYm9vbAkJCQkJCQlGREZUb1VSTEVuY29kZWREYXRhKHVpbnQ4X3QqJiBwQnVmLCBGWF9TVFJTSVpFJiBuQnVmU2l6ZSk7CiAJaW50CQkJCQkJCQlHZXRQYWdlSW5kZXhCeUFubm90RGljdChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlEb0ZERkJ1ZmZlcihDRlhfQnl0ZVN0cmluZyBzQnVmZmVyKTsKIApAQCAtMjM2LDExICsyMzYsMTEgQEAKICAgICBDUERGU0RLX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKICAgICBDUERGX0ludGVyRm9ybSogbV9wSW50ZXJGb3JtOwogICAgIENQREZTREtfV2lkZ2V0TWFwIG1fTWFwOwotICAgIEZYX0JPT0wgbV9iQ2FsY3VsYXRlOwotICAgIEZYX0JPT0wgbV9iQnVzeTsKKyAgICBib29sIG1fYkNhbGN1bGF0ZTsKKyAgICBib29sIG1fYkJ1c3k7CiAKIHB1YmxpYzoKLQlGWF9CT09MIElzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSk7CisJYm9vbCBJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpOwogCXZvaWQgICAgUmVtb3ZlQWxsSGlnaExpZ2h0KCk7CiAJdm9pZCAgICBTZXRIaWdobGlnaHRBbHBoYSh1aW50OF90IGFscGhhKSB7bV9pSGlnaGxpZ2h0QWxwaGEgPSBhbHBoYTt9CiAJdWludDhfdCBHZXRIaWdobGlnaHRBbHBoYSgpIHtyZXR1cm4gbV9pSGlnaGxpZ2h0QWxwaGE7fQpAQCAtMjQ5LDcgKzI0OSw3IEBACiBwcml2YXRlOgogCUZYX0NPTE9SUkVGIG1fYUhpZ2hsaWdodENvbG9yWzZdOwogCXVpbnQ4X3QgbV9pSGlnaGxpZ2h0QWxwaGE7Ci0JRlhfQk9PTAltX2JOZWVkSGlnaHRsaWdodFs2XTsKKwlib29sCW1fYk5lZWRIaWdodGxpZ2h0WzZdOwogfTsKIAogI2RlZmluZSBCQUlfU1RSVUNUVVJFCQkwCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oCmluZGV4IDI5YjI2NWEuLjQxNjA3OTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oCkBAIC00OSw3ICs0OSw3IEBACiAKIAl2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCXZpcnR1YWwgYm9vbAkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAJRlBERl9GSUxFQUNDRVNTCQltX0ZpbGVBY2Nlc3M7CkBAIC02MCw3ICs2MCw3IEBACiBGUERGX0JPT0wgRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfRFdPUkQgcG9saWN5KTsKIHZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZQREZfUEFHRSBwYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLCBpbnQgZmxhZ3MsIEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLCBib29sIGJOZWVkVG9SZXN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFX0FkYXB0ZXIqIHBhdXNlKTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19ERUZJTkVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKaW5kZXggZDU3MTM4Yi4uMWNlNTdjNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKQEAgLTkyLDI0ICs5MiwyNCBAQAogICAgICAgICAgICAgbV9wSW5mby0+RkZJX09uQ2hhbmdlKG1fcEluZm8pOwogICAgIH0KIAotICAgIEZYX0JPT0wgRkZJX0lzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorICAgIGJvb2wgRkZJX0lzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfU2hpZnRLZXkpICE9IDA7CiAgICAgfQogCi0gICAgRlhfQk9PTCBGRklfSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKKyAgICBib29sIEZGSV9Jc0NUUkxLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfQ29udHJvbEtleSkgIT0gMDsKICAgICB9CiAKLSAgICBGWF9CT09MIEZGSV9Jc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0CisgICAgYm9vbCBGRklfSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfQWx0S2V5KSAhPSAwOwogICAgIH0KIAotICAgIEZYX0JPT0wgRkZJX0lzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykgY29uc3QKKyAgICBib29sIEZGSV9Jc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpbnQgSlNfYXBwQWxlcnQoY29uc3QgRlhfV0NIQVIqIE1zZywgY29uc3QgRlhfV0NIQVIqIFRpdGxlLCBGWF9VSU5UIFR5cGUsIEZYX1VJTlQgSWNvbik7CkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICAgICAgICAgIG1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24obV9wSW5mbywgbmFtZWRBY3Rpb24pOwogICAgIH0KIAotICAgIHZvaWQgRkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKHZvaWQqIGZpZWxkLEZQREZfV0lERVNUUklORyBmb2N1c1RleHQsIEZQREZfRFdPUkQgblRleHRMZW4sIEZYX0JPT0wgYkZvY3VzKQorICAgIHZvaWQgRkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKHZvaWQqIGZpZWxkLEZQREZfV0lERVNUUklORyBmb2N1c1RleHQsIEZQREZfRFdPUkQgblRleHRMZW4sIGJvb2wgYkZvY3VzKQogICAgIHsKICAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldFRleHRGaWVsZEZvY3VzKQogICAgICAgICAgICAgbV9wSW5mby0+RkZJX1NldFRleHRGaWVsZEZvY3VzKG1fcEluZm8sIGZvY3VzVGV4dCwgblRleHRMZW4sIGJGb2N1cyk7CkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgICAgIG1fcEluZm8tPkZGSV9Eb0dvVG9BY3Rpb24obV9wSW5mbywgblBhZ2VJbmRleCwgem9vbU1vZGUsIGZQb3NBcnJheSwgc2l6ZU9mQXJyYXkpOwogICAgIH0KIAotICAgIEZYX0JPT0wgSXNKU0luaXRpYXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybTsgfQorICAgIGJvb2wgSXNKU0luaXRpYXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybTsgfQogICAgIHZvaWQgU2V0U0RLRG9jdW1lbnQoQ1BERlNES19Eb2N1bWVudCogcEZYRG9jKSB7IG1fcFNES0RvYyA9IHBGWERvYzsgfQogICAgIENQREZTREtfRG9jdW1lbnQqIEdldFNES0RvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wU0RLRG9jOyB9CiAgICAgQ1BERl9Eb2N1bWVudCogR2V0UERGRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BQREZEb2M7IH0KQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgIENQREZTREtfSW50ZXJGb3JtKiAgICAgIEdldEludGVyRm9ybSgpIDsKICAgICBDUERGX0RvY3VtZW50KiAgICAgICAgICBHZXREb2N1bWVudCgpIHtyZXR1cm4gbV9wRG9jO30KIAotICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIEZYX0JPT0wgUmVOZXcgPSBUUlVFKTsKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiAgICAgICBHZXRQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlLCBib29sIFJlTmV3ID0gdHJ1ZSk7CiAgICAgQ1BERlNES19QYWdlVmlldyogICAgICAgR2V0UGFnZVZpZXcoaW50IG5JbmRleCk7CiAgICAgQ1BERlNES19QYWdlVmlldyogICAgICAgR2V0Q3VycmVudFZpZXcoKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBSZU1vdmVQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlKTsKQEAgLTIzNywyNSArMjM3LDI1IEBACiAKICAgICBJRlhKU19SdW50aW1lICogICAgICAgICBHZXRKc1J1bnRpbWUoKTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIFNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnID0gMCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApOworICAgIGJvb2wgICAgICAgICAgICAgICAgIFNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnID0gMCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgRXh0cmFjdFBhZ2VzKGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyckV4dHJhUGFnZXMsIENQREZfRG9jdW1lbnQqIHBEc3REb2MpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEluc2VydFBhZ2VzKGludCBuSW5zZXJ0QXQsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsIGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyclNyY1BhZ2VzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBSZXBsYWNlUGFnZXMoaW50IG5QYWdlLCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgRXh0cmFjdFBhZ2VzKGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyckV4dHJhUGFnZXMsIENQREZfRG9jdW1lbnQqIHBEc3REb2MpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIEluc2VydFBhZ2VzKGludCBuSW5zZXJ0QXQsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsIGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyclNyY1BhZ2VzKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBSZXBsYWNlUGFnZXMoaW50IG5QYWdlLCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7CiAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBPbkNsb3NlRG9jdW1lbnQoKTsKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VDb3VudCgpIHtyZXR1cm4gbV9wRG9jLT5HZXRQYWdlQ291bnQoKTt9Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBHZXRDaGFuZ2VNYXJrKCkge3JldHVybiBtX2JDaGFuZ2VNYXNrO30KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBTZXRDaGFuZ2VNYXJrKCkge21fYkNoYW5nZU1hc2sgPSBUUlVFO30KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBDbGVhckNoYW5nZU1hcmsoKSB7bV9iQ2hhbmdlTWFzaz0gRkFMU0U7fQorICAgIGJvb2wgICAgICAgICAgICAgICAgIEdldFBlcm1pc3Npb25zKGludCBuRmxhZyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgR2V0Q2hhbmdlTWFyaygpIHtyZXR1cm4gbV9iQ2hhbmdlTWFzazt9CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgU2V0Q2hhbmdlTWFyaygpIHttX2JDaGFuZ2VNYXNrID0gdHJ1ZTt9CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQ2xlYXJDaGFuZ2VNYXJrKCkge21fYkNoYW5nZU1hc2s9IGZhbHNlO30KICAgICBDRlhfV2lkZVN0cmluZyAgICAgICAgICBHZXRQYXRoKCkgOwogICAgIENQREZfUGFnZSogICAgICAgICAgICAgIEdldFBhZ2UoaW50IG5JbmRleCk7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCAqICAgR2V0RW52KCkge3JldHVybiBtX3BFbnY7IH0KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBQcm9jSmF2YXNjcmlwdEZ1bigpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIFByb2NPcGVuQWN0aW9uKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgUHJvY09wZW5BY3Rpb24oKTsKICAgICBDUERGX09DQ29udGV4dCogICAgICAgICBHZXRPQ0NvbnRleHQoKTsKIHByaXZhdGU6CiAgICAgc3RkOjptYXA8Q1BERl9QYWdlKiwgQ1BERlNES19QYWdlVmlldyo+IG1fcGFnZU1hcDsKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgIENQREZTREtfQW5ub3QqIG1fcEZvY3VzQW5ub3Q7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogbV9wRW52OwogICAgIENQREZfT0NDb250ZXh0KiBtX3BPY2NvbnRlbnQ7Ci0gICAgRlhfQk9PTCBtX2JDaGFuZ2VNYXNrOworICAgIGJvb2wgbV9iQ2hhbmdlTWFzazsKIH07CiBjbGFzcyBDUERGU0RLX1BhZ2VWaWV3IGZpbmFsCiB7CkBAIC0yNzgsMjggKzI3OCwyOCBAQAogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0RlhXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7CiAgICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBHZXRGb2N1c0Fubm90KCkgOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfVUlOVCBuRmxhZyA9IDApIHttX3BTREtEb2MtPlNldEZvY3VzQW5ub3QocFNES0Fubm90LCBuRmxhZyk7fQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApIHtyZXR1cm4gbV9wU0RLRG9jLT5LaWxsRm9jdXNBbm5vdChuRmxhZyk7fQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApIHtyZXR1cm4gbV9wU0RLRG9jLT5LaWxsRm9jdXNBbm5vdChuRmxhZyk7fQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpOwogCiAgICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBBZGRBbm5vdChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCk7CiAgICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBBZGRBbm5vdChjb25zdCBGWF9DSEFSKiBscFN1YlR5cGUsQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwogICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoQ1BERl9Bbm5vdCAqIHBQREZBbm5vdCk7Ci0gICAgICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50QW5ub3RzKCk7CiAgICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBHZXRBbm5vdChpbnQgbkluZGV4KTsKICAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEdldEFubm90QnlEaWN0KENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKICAgICBDUERGX1BhZ2UqICAgICAgICAgICAgICAgICAgICAgIEdldFBERlBhZ2UoKXtyZXR1cm4gbV9wYWdlO30KICAgICBDUERGX0RvY3VtZW50KiAgICAgICAgICAgICAgICAgIEdldFBERkRvY3VtZW50KCk7CiAgICAgQ1BERlNES19Eb2N1bWVudCogICAgICAgICAgICAgICBHZXRTREtEb2N1bWVudCgpIHtyZXR1cm4gbV9wU0RLRG9jO30KLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbkNoYXIoaW50IG5DaGFyLCBGWF9VSU5UIG5GbGFnKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbktleURvd24oaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIE9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpOworICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgT25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNWYWxpZEFubm90KHZvaWQqIHApOworICAgIGJvb2wgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgaW50IG5GbGFnKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBPbk1vdXNlV2hlZWwoZG91YmxlIGRlbHRhWCwgZG91YmxlIGRlbHRhWSxjb25zdCBDUERGX1BvaW50JiBwb2ludCwgaW50IG5GbGFnKTsKKyAgICBib29sICAgICAgICAgICAgICAgICBJc1ZhbGlkQW5ub3Qodm9pZCogcCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudE1hdHJpeChDUERGX01hdHJpeCYgbWF0cml4KSB7bWF0cml4ID0gbV9jdXJNYXRyaXg7fQogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVJlY3RzKENGWF9SZWN0QXJyYXkmIHJlY3RzKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KTsKQEAgLTMwOCwxMSArMzA4LDExIEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgR2V0UGFnZUluZGV4KCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRlhBbm5vdHMoKTsKIAotICAgICAgICB2b2lkIFNldFZhbGlkKEZYX0JPT0wgYlZhbGlkKSB7bV9iVmFsaWQgPSBiVmFsaWQ7fQotICAgICAgICBGWF9CT09MIElzVmFsaWQoKSB7cmV0dXJuIG1fYlZhbGlkO30KLSAgICAgICAgdm9pZCBTZXRMb2NrKEZYX0JPT0wgYkxvY2tlZCkge21fYkxvY2tlZD0gYkxvY2tlZDt9Ci0gICAgICAgIEZYX0JPT0wgSXNMb2NrZWQoKSB7cmV0dXJuIG1fYkxvY2tlZDt9Ci0gICAgICAgIHZvaWQgVGFrZU92ZXJQYWdlKCkge21fYlRha2VPdmVyUGFnZSA9IFRSVUU7fQorICAgICAgICB2b2lkIFNldFZhbGlkKGJvb2wgYlZhbGlkKSB7bV9iVmFsaWQgPSBiVmFsaWQ7fQorICAgICAgICBib29sIElzVmFsaWQoKSB7cmV0dXJuIG1fYlZhbGlkO30KKyAgICAgICAgdm9pZCBTZXRMb2NrKGJvb2wgYkxvY2tlZCkge21fYkxvY2tlZD0gYkxvY2tlZDt9CisgICAgICAgIGJvb2wgSXNMb2NrZWQoKSB7cmV0dXJuIG1fYkxvY2tlZDt9CisgICAgICAgIHZvaWQgVGFrZU92ZXJQYWdlKCkge21fYlRha2VPdmVyUGFnZSA9IHRydWU7fQogcHJpdmF0ZToKICAgICB2b2lkIFBhZ2VWaWV3X09uSGlnaGxpZ2h0Rm9ybUZpZWxkcyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAgICAgICAgIENQREZfTWF0cml4IG1fY3VyTWF0cml4OwpAQCAtMzIyLDEyICszMjIsMTIgQEAKICAgICBDRlhfUHRyQXJyYXkgIG1fZnhBbm5vdEFycmF5OwogICAgIENQREZTREtfRG9jdW1lbnQqIG1fcFNES0RvYzsKICAgICBDUERGU0RLX1dpZGdldCogbV9DYXB0dXJlV2lkZ2V0OwotICAgIEZYX0JPT0wgbV9iRW50ZXJXaWRnZXQ7Ci0gICAgRlhfQk9PTCBtX2JFeGl0V2lkZ2V0OwotICAgIEZYX0JPT0wgbV9iT25XaWRnZXQ7Ci0gICAgRlhfQk9PTCBtX2JWYWxpZDsKLSAgICAgICAgRlhfQk9PTCBtX2JMb2NrZWQ7Ci0gICAgICAgIEZYX0JPT0wgbV9iVGFrZU92ZXJQYWdlOworICAgIGJvb2wgbV9iRW50ZXJXaWRnZXQ7CisgICAgYm9vbCBtX2JFeGl0V2lkZ2V0OworICAgIGJvb2wgbV9iT25XaWRnZXQ7CisgICAgYm9vbCBtX2JWYWxpZDsKKyAgICAgICAgYm9vbCBtX2JMb2NrZWQ7CisgICAgICAgIGJvb2wgbV9iVGFrZU92ZXJQYWdlOwogfTsKIAogCkBAIC0zNDAsMTQgKzM0MCwxNCBAQAogCiAgICAgdHlwZWRlZiBpbnQgKCpMUF9DT01QQVJFKShUWVBFIHAxLCBUWVBFIHAyKTsKIAotICAgIHZvaWQgU29ydChMUF9DT01QQVJFIHBDb21wYXJlLCBGWF9CT09MIGJBc2NlbnQgPSBUUlVFKQorICAgIHZvaWQgU29ydChMUF9DT01QQVJFIHBDb21wYXJlLCBib29sIGJBc2NlbnQgPSB0cnVlKQogICAgIHsKICAgICAgICAgaW50IG5TaXplID0gdGhpcy0+R2V0U2l6ZSgpOwogICAgICAgICBRdWlja1NvcnQoMCwgblNpemUgLTEsIGJBc2NlbnQsIHBDb21wYXJlKTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsIEZYX1VJTlQgblN0b3BQb3MsIEZYX0JPT0wgYkFzY2VuZCwgTFBfQ09NUEFSRSBwQ29tcGFyZSkKKyAgICB2b2lkIFF1aWNrU29ydChGWF9VSU5UIG5TdGFydFBvcywgRlhfVUlOVCBuU3RvcFBvcywgYm9vbCBiQXNjZW5kLCBMUF9DT01QQVJFIHBDb21wYXJlKQogICAgIHsKICAgICAgICAgaWYgKG5TdGFydFBvcyA+PSBuU3RvcFBvcykgcmV0dXJuOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgKaW5kZXggYjJiYzE2My4uODk0NWQxOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaApAQCAtMzQsNyArMzQsNyBAQAogewogcHVibGljOgogCUlGU0RLX1BBVVNFX0FkYXB0ZXIoSUZTREtfUEFVU0UqIElQYXVzZSApOwotCUZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKTsKKwlib29sIE5lZWRUb1BhdXNlTm93KCk7CiAKIHByaXZhdGU6CiAJSUZTREtfUEFVU0UqIG1fSVBhdXNlOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmgKaW5kZXggYmY1OWU0NS4uMzAxNjhkNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhfc3lzdGVtaGFuZGxlci5oCkBAIC00NywxMCArNDcsMTAgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJSW52YWxpZGF0ZVJlY3QoRlhfSFdORCBoV25kLCBGWF9SRUNUIHJlY3QpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQJCQkJT3V0cHV0U2VsZWN0ZWRSZWN0KHZvaWQqIHBGb3JtRmlsbGVyLCBDUERGX1JlY3QmcmVjdCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSA9IDA7CisJdmlydHVhbCBib29sCQkJCUlzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSA9IDA7CiAKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQlHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSA9IDA7CisJdmlydHVhbCBib29sCQkJCVNldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQlDbGllbnRUb1NjcmVlbihGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJU2NyZWVuVG9DbGllbnQoRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSA9IDA7CkBAIC02NiwyMyArNjYsMjMgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJU2V0Q3Vyc29yKGludDMyX3QgbkN1cnNvclR5cGUpID0gMDsKIAogCXZpcnR1YWwgRlhfSE1FTlUJCQlDcmVhdGVQb3B1cE1lbnUoKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JRE5ld0l0ZW0sIENGWF9XaWRlU3RyaW5nIHN0cmluZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlFbmFibGVNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSURJdGVtLCBGWF9CT09MIGJFbmFibGVkKSA9IDA7CisJdmlydHVhbCBib29sCQkJCUFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JRE5ld0l0ZW0sIENGWF9XaWRlU3RyaW5nIHN0cmluZykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlFbmFibGVNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSURJdGVtLCBib29sIGJFbmFibGVkKSA9IDA7CiAJdmlydHVhbCBpbnQzMl90CQkJVHJhY2tQb3B1cE1lbnUoRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9IV05EIGhQYXJlbnQpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJRGVzdHJveU1lbnUoRlhfSE1FTlUgaE1lbnUpID0gMDsKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpID0gMDsKIAl2aXJ0dWFsIENQREZfRm9udCoJCQlBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLCB1aW50OF90IG5DaGFyc2V0KSA9IDA7CiAKIAl2aXJ0dWFsIGludDMyX3QJCQlTZXRUaW1lcihpbnQzMl90IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJS2lsbFRpbWVyKGludDMyX3QgbklEKSA9IDA7CiAKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0NUUkxLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOworCXZpcnR1YWwgYm9vbAkJCQlJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKIAl2aXJ0dWFsCUZYX1NZU1RFTVRJTUUJCUdldExvY2FsVGltZSgpID0gMDsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmggYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaAppbmRleCBiZjQ2ZTkxLi40NWQyNjQ2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaApAQCAtOTMsNyArOTMsNyBAQAogCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiB2ZXJ0aWNhbCBzY3JvbGxiYXIuCiAJdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpID0gMDsKIAkvL3NldCB0aGUgY2FyZXQgaW5mb3JtYXRpb24uCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgPSAwOwogCS8vaWYgdGhlIGNhcmV0IHBvc2l0aW9uIGlzIGNoYW5nZWQgLHNlbmQgdGhlIGluZm9ybWF0aW9uIG9mIGN1cnJlbnQgcG9zdGlvbiB0byB1c2VyLgogCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzICYgc2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgd29yZFByb3BzKSA9IDA7CiAJLy9pZiB0aGUgdGV4dCBhcmVhIGlzIGNoYW5nZWQsIHNlbmQgdGhlIGluZm9ybWF0aW9uIHRvIHVzZXIuCkBAIC0xMzEsMjUgKzEzMSwyNSBAQAogCXZpcnR1YWwgfklGWF9FZGl0X0l0ZXJhdG9yKCkgIHt9CiBwdWJsaWM6CiAJLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IHdvcmQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRXb3JkKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlOZXh0V29yZCgpID0gMDsKIAkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgbGluZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dExpbmUoKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCU5leHRMaW5lKCkgPSAwOwogCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCBzZWN0aW9uLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0U2VjdGlvbigpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CiAKIAkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIHdvcmQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZXb3JkKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2V29yZCgpID0gMDsKIAkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIGxpbmUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZMaW5lKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2TGluZSgpID0gMDsKIAkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZTZWN0aW9uKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlQcmV2U2VjdGlvbigpID0gMDsKIAogCS8vZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdCA9IDA7CiAJLy9nZXQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0ID0gMDsKIAkvL2dldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOwogCS8vc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpID0gMDsKIAkvL3NldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KQEAgLTE5NSw2OSArMTk1LDY5IEBACiAJdmlydHVhbCB2b2lkCQkJCQkJCUluaXRpYWxpemUoKSA9IDA7CiAKIAkvL3NldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBzY3JvbGwgb3JpZ2luCiAJdmlydHVhbCB2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpID0gMDsKIAogCS8vc2V0IHRoZSBob3Jpem9udGFsIHRleHQgYWxpZ25tZW50IGluIHRleHQgYm94LCBuRm9ybWF0ICgwOmxlZnQgMTptaWRkbGUgMjpyaWdodCkuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0ID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAJLy9zZXQgdGhlIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50IGluIHRleHQgYm94LCBuRm9ybWF0ICgwOnRvcCAxOmNlbnRlciAyOmJvdHRvbSkuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0ID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAJLy9pZiB0aGUgdGV4dCBpcyBzaG93biBpbiBzZWNyZXQgLCBzZXQgYSBjaGFyYWN0ZXIgZm9yIHN1YnN0aXR1dGUuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgPSAnKicsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBtYXhpbWFsIGNvdW50IG9mIHdvcmRzIG9mIHRoZSB0ZXh0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL2lmIHNldCB0aGUgY291bnQgb2YgY2hhckFycmF5ICwgdGhlbiBhbGwgd29yZHMgaXMgc2hvd24gaW4gZXF1YWwgc3BhY2UuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBzcGFjZSBvZiB0d28gY2hhcmFjdGVycy4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UgPSAwLjBmLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UgPSAwLjBmLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgaG9yaXpvbnRhbCBzY2FsZSBvZiBhbGwgY2hhcmFjdGVycy4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBsZWFkaW5nIG9mIGFsbCBsaW5lcwotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vaWYgc2V0LCBDUkxGIGlzIGFsbG93ZWQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TXVsdGlMaW5lKGJvb2wgYk11bHRpTGluZSA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vaWYgc2V0LCBhbGwgd29yZHMgYXV0byBmaXQgdGhlIHdpZHRoIG9mIHRoZSBib3VuZGluZyBib3guCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAkvL2lmIHNldCwgYSBmb250IHNpemUgaXMgY2FsY3VsYXRlZCB0byBmdWxsIGZpdCB0aGUgYm91bmRpbmcgYm94LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvRm9udFNpemUoYm9vbCBiQXV0byA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vaXMgc2V0LCB0aGUgdGV4dCBpcyBhbGxvd2VkIHRvIHNjcm9sbC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b1Njcm9sbChGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9TY3JvbGwoYm9vbCBiQXV0byA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBmb250IHNpemUgb2YgYWxsIHdvcmRzLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYlBhaW50ID0gdHJ1ZSkgPSAwOwogCS8vdGhlIHRleHQgaXMgYWxsb3dlZCB0byBhdXRvLXNjcm9sbCwgYWxsb3cgdGhlIHRleHQgb3ZlcmZsb3c/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkID0gRkFMU0UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0T3ZlcmZsb3coYm9vbCBiQWxsb3dlZCA9IGZhbHNlLCBib29sIGJQYWludCA9IHRydWUpID0gMDsKIAogCS8vcXVlcnkgaWYgdGhlIGVkaXQgaXMgcmljaGVkaXQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdCA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdCA9IDA7CiAJLy9zZXQgdGhlIGVkaXQgaXMgcmljaGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0ID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCVNldFJpY2hUZXh0KGJvb2wgYlJpY2hUZXh0ID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKSA9IDA7CiAJLy9zZXQgdGhlIGZvbnRzaXplIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOwogCS8vc2V0IHRoZSBmb250aW5kZXggb2Ygc2VsZWN0ZWQgdGV4dCwgdXNlciBjYW4gY2hhbmdlIHRoZSBmb250IG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hGb250SW5kZXgoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hGb250SW5kZXgoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiAJLy9zZXQgdGhlIHRleHRjb2xvciBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKSA9IDA7CiAJLy9zZXQgdGhlIHRleHQgc2NyaXB0IHR5cGUgb2Ygc2VsZWN0ZWQgdGV4dC4gKDA6bm9ybWFsIDE6c3VwZXJzY3JpcHQgMjpzdWJzY3JpcHQpCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRTY3JpcHQoaW50MzJfdCBuU2NyaXB0VHlwZSkgPSAwOwogCS8vc2V0IHRoZSBib2xkIGZvbnQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQgPSBUUlVFKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0Qm9sZChib29sIGJCb2xkID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBpdGFsaWMgZm9udCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMgPSBUUlVFKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0SXRhbGljKGJvb2wgYkl0YWxpYyA9IHRydWUpID0gMDsKIAkvL3NldCB0aGUgdW5kZXJsaW5lIHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRVbmRlcmxpbmUoYm9vbCBiVW5kZXJsaW5lID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBjcm9zc291dCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0ID0gVFJVRSkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KGJvb2wgYkNyb3Nzb3V0ID0gdHJ1ZSkgPSAwOwogCS8vc2V0IHRoZSBjaGFyc3BhY2Ugb2Ygc2VsZWN0ZWQgdGV4dCwgaW4gdXNlciBjb29yZGluYXRlLgotCXZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7CisJdmlydHVhbAlib29sCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpID0gMDsKIAkvL3NldCB0aGUgaG9yaXpvbnRhbCBzY2FsZSBvZiBzZWxlY3RlZCB0ZXh0LCBkZWZhdWx0IHZhbHVlIGlzIDEwMC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOwogCS8vc2V0IHRoZSBsZWFkaW5nIG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJU2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpID0gMDsKIAkvL3NldCB0aGUgaW5kZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgPSAwOwogCS8vc2V0IHRoZSBhbGlnbm1lbnQgb2Ygc2VsZWN0ZWQgc2VjdGlvbiwgbkFsaWdubWVudCgwOmxlZnQgMTptaWRkbGUgMjpyaWdodCkKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCkgPSAwOwogCiAJLy9zZXQgdGhlIHNlbGVjdGVkIHJhbmdlIG9mIHRleHQuCiAJLy9pZiBuU3RhcnRDaGFyID09IDAgYW5kIG5FbmRDaGFyID09IC0xLCBzZWxlY3QgYWxsIHRoZSB0ZXh0LgpAQCAtMjc2LDcgKzI3Niw3IEBACiAJLy9nZXQgdGhlIHRleHQgY29uZW50CiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0ID0gMDsKIAkvL3F1ZXJ5IGlmIGFueSB0ZXh0IGlzIHNlbGVjdGVkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3QgPSAwOwogCS8vZ2V0IHRoZSBzY3JvbGwgb3JpZ2luCiAJdmlydHVhbCBDUERGX1BvaW50CQkJCQkJR2V0U2Nyb2xsUG9zKCkgY29uc3QgPSAwOwogCS8vZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYXJlYS4KQEAgLTI5MSw0NCArMjkxLDQ0IEBACiAJdmlydHVhbCBDUFZUX1dvcmRSYW5nZQkJCQkJR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3QgPSAwOwogCiAJLy9zZW5kIHRoZSBtb3VzZWRvd24gbWVzc2FnZSB0byBlZGl0IGZvciByZXNwb25zZS4KLQkvL2lmIFNoaWZ0IGtleSBpcyBob2xkLCBiU2hpZnQgaXMgVFJVRSwgaXMgQ3RybCBrZXkgaXMgaG9sZCwgYkN0cmwgaXMgVFJVRS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQkvL3NlbmQgdGhlIG1vdXNlbW92ZSBtZXNzYWdlIHRvIGVkaXQgd2hlbiBtb3VzZSBkb3duIGlzIFRSVUUuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJLy9pZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIHRydWUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIHRydWUuCisJdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJLy9zZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyB0cnVlLgorCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCS8vc2VuZCB0aGUgVVAga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCS8vc2VuZCB0aGUgRE9XTiBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCS8vc2VuZCB0aGUgTEVGVCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0xFRlQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCS8vc2VuZCB0aGUgUklHSFQga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfUklHSFQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCS8vc2VuZCB0aGUgSE9NRSBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0hPTUUoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCS8vc2VuZCB0aGUgRU5EIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19FTkQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOwogCiAJLy9wdXQgdGV4dCBpbnRvIGVkaXQuCiAJdmlydHVhbCB2b2lkCQkJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAogCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKIAkvL2luc2VydCBhIHdvcmQgaW50byB0aGUgZWRpdC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAJLy9pbnNlcnQgYSByZXR1cm4gaW50byB0aGUgZWRpdC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKIAkvL2luc2VydCB0ZXh0IGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAogCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKIAkvL2RvIGJhY2tzcGFjZSBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUJhY2tzcGFjZSgpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJQmFja3NwYWNlKCkgPSAwOwogCS8vZG8gZGVsZXRlIG9wZXJhdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJRGVsZXRlKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlEZWxldGUoKSA9IDA7CiAJLy9kZWxldGUgdGhlIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUNsZWFyKCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlDbGVhcigpID0gMDsKIAogCS8vZG8gUmVkbyBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVJlZG8oKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCVJlZG8oKSA9IDA7CiAJLy9kbyBVbmRvIG9wZXJhdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJVW5kbygpID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJVW5kbygpID0gMDsKIAkvL21vdmUgY2FyZXQKIAl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuUG9zKSA9IDA7CiAKQEAgLTMzNiwxOCArMzM2LDE4IEBACiAJdmlydHVhbCB2b2lkCQkJCQkJCVBhaW50KCkgPSAwOwogCiAJLy9hbGxvdyB0byByZWZyZXNoIHNjcmVlbj8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCkgPSAwOwogCiAJdmlydHVhbCB2b2lkCQkJCQkJCVJlZnJlc2hXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKSA9IDA7CiAKIAkvL2FsbG93IHVuZG8vcmVkbz8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlVW5kbyhGWF9CT09MIGJVbmRvKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZVVuZG8oYm9vbCBiVW5kbykgPSAwOwogCiAJLy9hbGxvdyBub3RpZnk/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSkgPSAwOwogCiAJLy9hbGxvdyBvcHIgbm90aWZ5PwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVPcHJOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZU9wck5vdGlmeShib29sIGJOb3RpZnkpID0gMDsKIAogCS8vbWFwIHdvcmQgcGxhY2UgdG8gd29yZCBpbmRleC4KIAl2aXJ0dWFsIGludDMyX3QJCQkJCQlXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CkBAIC0zODIsMTEgKzM4MiwxMSBAQAogCS8vZ2V0IHRoZSBsYXRpbiB3b3JkcyBvZiBzcGVjaWZpZWQgcmFuZ2UKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkgY29uc3QgPSAwOwogCS8vaXMgdGhlIHRleHQgZnVsbCBpbiBib3VuZGluZyBib3gKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2FuVW5kbygpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2FuUmVkbygpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJQ2FuVW5kbygpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJQ2FuUmVkbygpIGNvbnN0ID0gMDsKIAkvL2lmIHRoZSBjb250ZW50IGlzIGNoYW5nZWQgYWZ0ZXIgc2V0dGV4dD8KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0ID0gMDsKIAkvL2dldCB0aGUgdG90YWwgd29yZHMgaW4gZWRpdAogCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldFRvdGFsV29yZHMoKSBjb25zdCA9IDA7CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogCiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlID0gTlVMTCwKLQkJCQkJCQkJCQkJCQlGWF9CT09MIGJDb250aW51b3VzID0gVFJVRSwgRlhfV09SRCBTdWJXb3JkID0gMCk7CisJCQkJCQkJCQkJCQkJYm9vbCBiQ29udGludW91cyA9IHRydWUsIEZYX1dPUkQgU3ViV29yZCA9IDApOwogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwpOwogCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBJRlhfRWRpdCogcEVkaXQsIEZYX0NPTE9SUkVGIGNyVGV4dEZpbGwsIEZYX0NPTE9SUkVGIGNyVGV4dFN0cm9rZSwKIAkJCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwgdm9pZCogcEZGTERhdGEpOwpAQCAtNDUxLDEyICs0NTEsMTIgQEAKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Rm9udFNpemUoKSBjb25zdCA9IDA7CiAJdmlydHVhbCBJRlhfRWRpdCoJCQkJCQlHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOwogCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldENvdW50KCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOwogCXZpcnR1YWwgRlhfRkxPQVQJCQkJCQlHZXRGaXJzdEhlaWdodCgpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc011bHRpcGxlU2VsKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aXBsZVNlbChib29sIGJNdWx0aXBsZSkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlJc011bHRpcGxlU2VsKCkgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgPSAwOwogCXZpcnR1YWwgaW50MzJfdAkJCQkJCUZpbmROZXh0KGludDMyX3QgbkluZGV4LEZYX1dDSEFSIG5DaGFyKSBjb25zdCA9IDA7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgPSAwOwpAQCAtNDc3LDE2ICs0NzcsMTYgQEAKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3QgPSAwOwogCiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVksoaW50MzJfdCBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1VQKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19ET1dOKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19MRUZUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19SSUdIVChib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfSE9NRShib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkgPSAwOworCXZpcnR1YWwgYm9vbAkJCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhcixib29sIGJTaGlmdCxib29sIGJDdHJsKSA9IDA7CiAKIHByb3RlY3RlZDoKICAgICAgICAgfklGWF9MaXN0KCkgeyB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaAppbmRleCA3YTI3NDJmLi5mNzI4ZDg3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgKQEAgLTY4LDI3ICs2OCwyNyBAQAogCXsKIAl9CiAKLQlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCWJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZsaW5lcmVjdCwgc2l6ZW9mKENGWF9FZGl0X0xpbmVSZWN0KSkgIT0gMDsKIAl9CiAKLQlGWF9CT09MIElzU2FtZUhlaWdodChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCWJvb2wgSXNTYW1lSGVpZ2h0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybygobV9yY0xpbmUudG9wIC0gbV9yY0xpbmUuYm90dG9tKSAtIChsaW5lcmVjdC5tX3JjTGluZS50b3AgLWxpbmVyZWN0Lm1fcmNMaW5lLmJvdHRvbSkpOwogCX0KIAotCUZYX0JPT0wgSXNTYW1lVG9wKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CisJYm9vbCBJc1NhbWVUb3AoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKIAl7CiAJCXJldHVybiBGWF9FRElUX0lzRmxvYXRaZXJvKG1fcmNMaW5lLnRvcCAtIGxpbmVyZWN0Lm1fcmNMaW5lLnRvcCk7CiAJfQogCi0JRlhfQk9PTCBJc1NhbWVMZWZ0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CisJYm9vbCBJc1NhbWVMZWZ0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS5sZWZ0IC0gbGluZXJlY3QubV9yY0xpbmUubGVmdCk7CiAJfQogCi0JRlhfQk9PTCBJc1NhbWVSaWdodChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCAmIGxpbmVyZWN0KSBjb25zdAorCWJvb2wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKIAl7CiAJCXJldHVybiBGWF9FRElUX0lzRmxvYXRaZXJvKG1fcmNMaW5lLnJpZ2h0IC0gbGluZXJlY3QubV9yY0xpbmUucmlnaHQpOwogCX0KQEAgLTI2NywxMiArMjY3LDEyIEBACiAJCUVuZFBvcyA9IGVuZDsKIAl9CiAKLQlGWF9CT09MIElzRXhpc3QoKSBjb25zdAorCWJvb2wgSXNFeGlzdCgpIGNvbnN0CiAJewogCQlyZXR1cm4gQmVnaW5Qb3MgIT0gRW5kUG9zOwogCX0KIAotCUZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpIGNvbnN0CisJYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikgY29uc3QKIAl7CiAJCXJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOwogCX0KQEAgLTI5MywxMCArMjkzLDEwIEBACiAKIAl2b2lkCQkJCQkJCQkJQWRkSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcEl0ZW0pOwogCi0JRlhfQk9PTAkJCQkJCQkJCUNhblVuZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJQ2FuUmVkbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlJc01vZGlmaWVkKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzV29ya2luZygpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7CisJYm9vbAkJCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKKwlib29sCQkJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlJc1dvcmtpbmcoKSBjb25zdDsKIAogCXZvaWQJCQkJCQkJCQlSZXNldCgpOwogCkBAIC0zMTYsMjYgKzMxNiwyNiBAQAogCiAJaW50MzJfdAkJCQkJCQkJbV9uQ3VyVW5kb1BvczsKIAlpbnQzMl90CQkJCQkJCQltX25CdWZTaXplOwotCUZYX0JPT0wJCQkJCQkJCQltX2JNb2RpZmllZDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iVmlyZ2luOwotCUZYX0JPT0wJCQkJCQkJCQltX2JXb3JraW5nOworCWJvb2wJCQkJCQkJCQltX2JNb2RpZmllZDsKKwlib29sCQkJCQkJCQkJbV9iVmlyZ2luOworCWJvb2wJCQkJCQkJCQltX2JXb3JraW5nOwogfTsKIAogY2xhc3MgQ0ZYX0VkaXRfVW5kb0l0ZW0gOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0KIHsKIHB1YmxpYzoKLQlDRlhfRWRpdF9VbmRvSXRlbSgpIDogbV9iRmlyc3QoVFJVRSksIG1fYkxhc3QoVFJVRSkge30KKwlDRlhfRWRpdF9VbmRvSXRlbSgpIDogbV9iRmlyc3QodHJ1ZSksIG1fYkxhc3QodHJ1ZSkge30KIAogCUNGWF9XaWRlU3RyaW5nIEdldFVuZG9UaXRsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEwiIjsgfQogCi0Jdm9pZAkJCQkJCQkJCVNldEZpcnN0KEZYX0JPT0wgYkZpcnN0KXttX2JGaXJzdCA9IGJGaXJzdDt9Ci0JRlhfQk9PTAkJCQkJCQkJCUlzRmlyc3QoKXtyZXR1cm4gbV9iRmlyc3Q7fQotCXZvaWQJCQkJCQkJCQlTZXRMYXN0KEZYX0JPT0wgYkxhc3Qpe21fYkxhc3QgPSBiTGFzdDt9Ci0JRlhfQk9PTAkJCQkJCQkJCUlzTGFzdCgpe3JldHVybiBtX2JMYXN0O30KKwl2b2lkCQkJCQkJCQkJU2V0Rmlyc3QoYm9vbCBiRmlyc3Qpe21fYkZpcnN0ID0gYkZpcnN0O30KKwlib29sCQkJCQkJCQkJSXNGaXJzdCgpe3JldHVybiBtX2JGaXJzdDt9CisJdm9pZAkJCQkJCQkJCVNldExhc3QoYm9vbCBiTGFzdCl7bV9iTGFzdCA9IGJMYXN0O30KKwlib29sCQkJCQkJCQkJSXNMYXN0KCl7cmV0dXJuIG1fYkxhc3Q7fQogCiBwcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCQltX2JGaXJzdDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTGFzdDsKKwlib29sCQkJCQkJCQkJbV9iRmlyc3Q7CisJYm9vbAkJCQkJCQkJCW1fYkxhc3Q7CiB9OwogCiBjbGFzcyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtCkBAIC00MjQsNyArNDI0LDcgQEAKIHB1YmxpYzoKIAlDRlhFVV9EZWxldGUoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCiAJCQkJCQlGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwKLQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgJiBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBXb3JkUHJvcHMsIEZYX0JPT0wgYlNlY0VuZCk7CisJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBib29sIGJTZWNFbmQpOwogCXZpcnR1YWwgfkNGWEVVX0RlbGV0ZSgpOwogCiAJdm9pZAkJCQkJCVJlZG8oKTsKQEAgLTQzOSw3ICs0MzksNyBAQAogCWludDMyX3QJCQkJCW1fbkNoYXJzZXQ7CiAJQ1BWVF9TZWNQcm9wcwkJCQltX1NlY1Byb3BzOwogCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOwotCUZYX0JPT0wJCQkJCQltX2JTZWNFbmQ7CisJYm9vbAkJCQkJCW1fYlNlY0VuZDsKIH07CiAKIGNsYXNzIENGWEVVX0NsZWFyIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtCkBAIC01NzUsNjEgKzU3NSw2MSBAQAogCUlGWF9FZGl0X0ZvbnRNYXAqCQkJCQkJR2V0Rm9udE1hcCgpOwogCiAJdm9pZAkJCQkJCQkJCUluaXRpYWxpemUoKTsKLQl2b2lkCQkJCQkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBib29sIGJQYWludCA9IHRydWUpOwogCXZvaWQJCQkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKIAotCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgPSAnKicsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UgPSAwLjBmLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQgPSBGQUxTRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKwl2b2lkCQkJCQkJCQkJU2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQgPSAwLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDAsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRNdWx0aUxpbmUoYm9vbCBiTXVsdGlMaW5lID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihib29sIGJBdXRvID0gdHJ1ZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRBdXRvU2Nyb2xsKGJvb2wgYkF1dG8gPSB0cnVlLCBib29sIGJQYWludCA9IHRydWUpOworCXZvaWQJCQkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJdm9pZAkJCQkJCQkJCVNldFRleHRPdmVyZmxvdyhib29sIGJBbGxvd2VkID0gZmFsc2UsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CiAKLQlGWF9CT09MCQkJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCQlTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcik7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCA9IFRSVUUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KTsKKwlib29sCQkJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0OworCXZvaWQJCQkJCQkJCQlTZXRSaWNoVGV4dChib29sIGJSaWNoVGV4dCA9IHRydWUsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcik7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dEJvbGQoYm9vbCBiQm9sZCA9IHRydWUpOworCWJvb2wJCQkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhib29sIGJJdGFsaWMgPSB0cnVlKTsKKwlib29sCQkJCQkJCQkJU2V0UmljaFRleHRVbmRlcmxpbmUoYm9vbCBiVW5kZXJsaW5lID0gdHJ1ZSk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0Q3Jvc3NvdXQoYm9vbCBiQ3Jvc3NvdXQgPSB0cnVlKTsKKwlib29sCQkJCQkJCQkJU2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKTsKKwlib29sCQkJCQkJCQkJU2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KTsKKwlib29sCQkJCQkJCQkJU2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KTsKIAotCXZvaWQJCQkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPblZLX1VQKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQkJCU9uVktfTEVGVChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19SSUdIVChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCQkJT25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJCQlPblZLX0VORChib29sIGJTaGlmdCxib29sIGJDdHJsKTsKIAogCXZvaWQJCQkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKIAkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKLQlGWF9CT09MCQkJCQkJCQkJQmFja3NwYWNlKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCURlbGV0ZSgpOwotCUZYX0JPT0wJCQkJCQkJCQlDbGVhcigpOwotCUZYX0JPT0wJCQkJCQkJCQlFbXB0eSgpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisJYm9vbAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOworCWJvb2wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7CisJYm9vbAkJCQkJCQkJCUJhY2tzcGFjZSgpOworCWJvb2wJCQkJCQkJCQlEZWxldGUoKTsKKwlib29sCQkJCQkJCQkJQ2xlYXIoKTsKKwlib29sCQkJCQkJCQkJRW1wdHkoKTsKKwlib29sCQkJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAogCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotCUZYX0JPT0wJCQkJCQkJCQlSZWRvKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVVuZG8oKTsKKwlib29sCQkJCQkJCQkJUmVkbygpOworCWJvb2wJCQkJCQkJCQlVbmRvKCk7CiAJQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJRG9JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwKIAkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyk7CiAJaW50MzJfdAkJCQkJCQkJR2V0Q2hhclNldEZyb21Vbmljb2RlKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCk7CkBAIC02NjYsNyArNjY2LDcgQEAKIAl2b2lkCQkJCQkJCQkJU2VsZWN0QWxsKCk7CiAJdm9pZAkJCQkJCQkJCVNlbGVjdE5vbmUoKTsKIAl2b2lkCQkJCQkJCQkJU2V0U2VsKGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4sY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpOwotCUZYX0JPT0wJCQkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKIAogCXZvaWQJCQkJCQkJCQlSZWFycmFuZ2VBbGwoKTsKIAl2b2lkCQkJCQkJCQkJUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHJhbmdlKTsKQEAgLTY3NywyMyArNjc3LDIzIEBACiAJdm9pZAkJCQkJCQkJCVNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwogCXZvaWQJCQkJCQkJCQlTZXRTY3JvbGxMaW1pdCgpOwogCXZvaWQJCQkJCQkJCQlTZXRDb250ZW50Q2hhbmdlZCgpOwotCXZvaWQJCQkJCQkJCQlFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KTsKKwl2b2lkCQkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSk7CiAKIAl2b2lkCQkJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCxpbnQzMl90IGNoYXJzZXQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlCYWNrc3BhY2UoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlEZWxldGUoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlDbGVhcihGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLAorCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKwlib29sCQkJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKwlib29sCQkJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKwlib29sCQkJCQkJCQkJQmFja3NwYWNlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKwlib29sCQkJCQkJCQkJRGVsZXRlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKwlib29sCQkJCQkJCQkJQ2xlYXIoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpOworCWJvb2wJCQkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCisJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisJYm9vbAkJCQkJCQkJCVNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKIAkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKLQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgRlhfQk9PTCBiQWRkVW5kbyk7CisJYm9vbAkJCQkJCQkJCVNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCisJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIGJvb2wgYkFkZFVuZG8pOworCWJvb2wJCQkJCQkJCQlTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKKwkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgYm9vbCBiQWRkVW5kbyk7CiAJdm9pZAkJCQkJCQkJCVBhaW50U2V0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cik7CiAJdm9pZAkJCQkJCQkJCVBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3KTsKIApAQCAtNzAyLDcgKzcwMiw3IEBACiAJaW5saW5lIENQREZfUmVjdAkJCQkJCVZUVG9FZGl0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0OwogCWlubGluZSBDUERGX1JlY3QJCQkJCQlFZGl0VG9WVChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsKIAotCXZvaWQJCQkJCQkJCQlFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpOworCXZvaWQJCQkJCQkJCQlFbmFibGVSZWZyZXNoKGJvb2wgYlJlZnJlc2gpOwogCXZvaWQJCQkJCQkJCQlSZWZyZXNoKFJFRlJFU0hfUExBTl9FIGVQbGFuLGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlMSA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UyID0gTlVMTCk7CiAJdm9pZAkJCQkJCQkJCVJlZnJlc2hQdXNoTGluZVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpOwogCXZvaWQJCQkJCQkJCQlSZWZyZXNoUHVzaFJhbmRvbVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IpOwpAQCAtNzIwLDE0ICs3MjAsMTQgQEAKIAlDUFZUX1dvcmRSYW5nZQkJCQkJCQlDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMik7CiAJQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJRW5hYmxlVW5kbyhGWF9CT09MIGJVbmRvKTsKLQl2b2lkCQkJCQkJCQkJRW5hYmxlT3ByTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQkJCUVuYWJsZVVuZG8oYm9vbCBiVW5kbyk7CisJdm9pZAkJCQkJCQkJCUVuYWJsZU9wck5vdGlmeShib29sIGJOb3RpZnkpOwogCi0JRlhfQk9PTAkJCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJSXNUZXh0T3ZlcmZsb3coKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKwlib29sCQkJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlJc1RleHRPdmVyZmxvdygpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7CisJYm9vbAkJCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKKwlib29sCQkJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwogCiAJdm9pZAkJCQkJCQkJCUJlZ2luR3JvdXBVbmRvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpOwogCXZvaWQJCQkJCQkJCQlFbmRHcm91cFVuZG8oKTsKQEAgLTc1MSwxOSArNzUxLDE5IEBACiAKIAlDUERGX1BvaW50CQkJCQkJCQltX3B0U2Nyb2xsUG9zOwogCUNQREZfUG9pbnQJCQkJCQkJCW1fcHRSZWZyZXNoU2Nyb2xsUG9zOwotCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVTY3JvbGw7CisJYm9vbAkJCQkJCQkJCW1fYkVuYWJsZVNjcm9sbDsKIAlJRlhfRWRpdF9JdGVyYXRvciAqCQkJCQkJbV9wSXRlcmF0b3I7CiAJQ0ZYX0VkaXRfUmVmcmVzaAkJCQkJCW1fUmVmcmVzaDsKIAlDUERGX1BvaW50CQkJCQkJCQltX3B0Q2FyZXQ7CiAJQ0ZYX0VkaXRfVW5kbwkJCQkJCQltX1VuZG87CiAJaW50MzJfdAkJCQkJCQkJbV9uQWxpZ25tZW50OwotCUZYX0JPT0wJCQkJCQkJCQltX2JOb3RpZnlGbGFnOwotCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVPdmVyZmxvdzsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlUmVmcmVzaDsKKwlib29sCQkJCQkJCQkJbV9iTm90aWZ5RmxhZzsKKwlib29sCQkJCQkJCQkJbV9iRW5hYmxlT3ZlcmZsb3c7CisJYm9vbAkJCQkJCQkJCW1fYkVuYWJsZVJlZnJlc2g7CiAJQ1BERl9SZWN0CQkJCQkJCQltX3JjT2xkQ29udGVudDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlVW5kbzsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJCQltX2JPcHJOb3RpZnk7CisJYm9vbAkJCQkJCQkJCW1fYkVuYWJsZVVuZG87CisJYm9vbAkJCQkJCQkJCW1fYk5vdGlmeTsKKwlib29sCQkJCQkJCQkJbV9iT3ByTm90aWZ5OwogCUNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0qCQkJCQltX3BHcm91cFVuZG9JdGVtOwogfTsKIApAQCAtNzc1LDE2ICs3NzUsMTYgQEAKIAlDRlhfRWRpdF9JdGVyYXRvcihDRlhfRWRpdCAqIHBFZGl0LElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcFZUSXRlcmF0b3IpOwogCXZpcnR1YWwgfkNGWF9FZGl0X0l0ZXJhdG9yKCk7CiAKLQlGWF9CT09MCQkJCQkJCQkJTmV4dFdvcmQoKTsKLQlGWF9CT09MCQkJCQkJCQkJTmV4dExpbmUoKTsKLQlGWF9CT09MCQkJCQkJCQkJTmV4dFNlY3Rpb24oKTsKLQlGWF9CT09MCQkJCQkJCQkJUHJldldvcmQoKTsKLQlGWF9CT09MCQkJCQkJCQkJUHJldkxpbmUoKTsKLQlGWF9CT09MCQkJCQkJCQkJUHJldlNlY3Rpb24oKTsKKwlib29sCQkJCQkJCQkJTmV4dFdvcmQoKTsKKwlib29sCQkJCQkJCQkJTmV4dExpbmUoKTsKKwlib29sCQkJCQkJCQkJTmV4dFNlY3Rpb24oKTsKKwlib29sCQkJCQkJCQkJUHJldldvcmQoKTsKKwlib29sCQkJCQkJCQkJUHJldkxpbmUoKTsKKwlib29sCQkJCQkJCQkJUHJldlNlY3Rpb24oKTsKIAotCUZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OworCWJvb2wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OworCWJvb2wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OwogCXZvaWQJCQkJCQkJCQlTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpOwogCXZvaWQJCQkJCQkJCQlTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKIAljb25zdCBDUFZUX1dvcmRQbGFjZSAmCQkJCQlHZXRBdCgpIGNvbnN0OwpAQCAtODA4LDcgKzgwOCw3IEBACiAJaW50MzJfdAkJCQkJR2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKIAlpbnQzMl90CQkJCQlHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpOwogCWludDMyX3QJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKTsKLQlGWF9CT09MCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKKwlib29sCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKIAogcHJpdmF0ZToKIAlJRlhfRWRpdF9Gb250TWFwKgkJCW1fcEZvbnRNYXA7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaAppbmRleCBmZTc1YjBmLi4wN2VkYjQ2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgKQEAgLTMxLDcgKzMxLDcgQEAKIAkJeSA9IDAuMGY7CiAJfQogCi0JRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9TaXplICYgc2l6ZSkgY29uc3QKKwlib29sIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1NpemUgJiBzaXplKSBjb25zdAogCXsKIAkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmc2l6ZSwgc2l6ZW9mKENMU1RfU2l6ZSkpICE9IDA7CiAJfQpAQCAtODEsMTIgKzgxLDEyIEBACiAJCXJldHVybiAqdGhpczsKIAl9CiAKLQlGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAorCWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZyZWN0LCBzaXplb2YoQ0xTVF9SZWN0KSkgPT0gMDsKIAl9CiAKLQlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAorCWJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0CiAJewogCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZyZWN0LCBzaXplb2YoQ0xTVF9SZWN0KSkgIT0gMDsKIAl9CkBAIC0xNjIsMjIgKzE2MiwyMiBAQAogCiBwdWJsaWM6CiAJdm9pZAkJCQkJCQlTZXRSZWN0KGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpOwotCXZvaWQJCQkJCQkJU2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKTsKLQl2b2lkCQkJCQkJCVNldENhcmV0KEZYX0JPT0wgYkNhcmV0KTsKKwl2b2lkCQkJCQkJCVNldFNlbGVjdChib29sIGJTZWxlY3RlZCk7CisJdm9pZAkJCQkJCQlTZXRDYXJldChib29sIGJDYXJldCk7CiAJdm9pZAkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0KTsKIAl2b2lkCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKIAogCUNMU1RfUmVjdAkJCQkJCUdldFJlY3QoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQ2FyZXQoKSBjb25zdDsKKwlib29sCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKKwlib29sCQkJCQkJCUlzQ2FyZXQoKSBjb25zdDsKIAlGWF9GTE9BVAkJCQkJCUdldEl0ZW1IZWlnaHQoKSBjb25zdDsKIAlGWF9XT1JECQkJCQkJCUdldEZpcnN0Q2hhcigpIGNvbnN0OwogCiBwcml2YXRlOgogCUlGWF9FZGl0KgkJCQkJCW1fcEVkaXQ7Ci0JRlhfQk9PTAkJCQkJCQltX2JTZWxlY3RlZDsKLQlGWF9CT09MCQkJCQkJCW1fYkNhcmV0OworCWJvb2wJCQkJCQkJbV9iU2VsZWN0ZWQ7CisJYm9vbAkJCQkJCQltX2JDYXJldDsKIAlDTFNUX1JlY3QJCQkJCQltX3JjTGlzdEl0ZW07CiB9OwogCkBAIC0yMDksNyArMjA5LDcgQEAKIHRlbXBsYXRlPGNsYXNzIFRZUEU+IGNsYXNzIENMU1RfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPgogewogcHVibGljOgotCUZYX0JPT0wgSXNFbXB0eSgpIHsgcmV0dXJuIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkgPD0gMDsgfQorCWJvb2wgSXNFbXB0eSgpIHsgcmV0dXJuIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkgPD0gMDsgfQogCVRZUEUgR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsgcmV0dXJuIE5VTEw7fQogCXZvaWQgUmVtb3ZlQXQoaW50MzJfdCBuSW5kZXgpe2lmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6UmVtb3ZlQXQobkluZGV4KTt9CiB9OwpAQCAtMjMwLDEyICsyMzAsMTIgQEAKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CiAJdmlydHVhbCBJRlhfRWRpdCoJCQkJR2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwogCXZpcnR1YWwgaW50MzJfdAkJCQlHZXRDb3VudCgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworCXZpcnR1YWwgYm9vbAkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwogCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0Rmlyc3RIZWlnaHQoKSBjb25zdDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJU2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworCXZpcnR1YWwgdm9pZAkJCQkJU2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpOworCXZpcnR1YWwgYm9vbAkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OworCXZpcnR1YWwgYm9vbAkJCQkJSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCXZpcnR1YWwgaW50MzJfdAkJCQlGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7CiAKIHByb3RlY3RlZDoKQEAgLTI0Nyw4ICsyNDcsOCBAQAogCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEl0ZW1SZWN0KGludDMyX3QgbkluZGV4KSBjb25zdDsKIAlDRlhfV2lkZVN0cmluZwkJCQkJR2V0SXRlbVRleHQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOwotCXZvaWQJCQkJCQkJU2V0SXRlbUNhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpOworCXZvaWQJCQkJCQkJU2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKKwl2b2lkCQkJCQkJCVNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYkNhcmV0KTsKIAogCXZpcnR1YWwgaW50MzJfdAkJCQlHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKIAlpbnQzMl90CQkJCQkJR2V0Rmlyc3RTZWxlY3RlZCgpIGNvbnN0OwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJQ0xTVF9BcnJheVRlbXBsYXRlPENGWF9MaXN0SXRlbSo+CW1fYUxpc3RJdGVtczsKIAlGWF9GTE9BVAkJCQkJCQltX2ZGb250U2l6ZTsKIAlJRlhfRWRpdF9Gb250TWFwKgkJCQkJbV9wRm9udE1hcDsKLQlGWF9CT09MCQkJCQkJCQltX2JNdWx0aXBsZTsKKwlib29sCQkJCQkJCQltX2JNdWx0aXBsZTsKIH07CiAKIHN0cnVjdCBDUExTVF9TZWxlY3RfSXRlbQpAQCAtMjg1LDcgKzI4NSw3IEBACiAJdm9pZAkJCQkJCQlBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpOwogCXZvaWQJCQkJCQkJU3ViKGludDMyX3Qgbkl0ZW1JbmRleCk7CiAJdm9pZAkJCQkJCQlTdWIoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpOwotCUZYX0JPT0wJCQkJCQkJSXNFeGlzdChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNFeGlzdChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlGaW5kKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldENvdW50KCkgY29uc3Q7CiAJaW50MzJfdAkJCQkJCUdldEl0ZW1JbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7CkBAIC0zMDYsMTYgKzMwNiwxNiBAQAogcHVibGljOgogCXZvaWQJCQkJCQkJU2V0Tm90aWZ5KElGWF9MaXN0X05vdGlmeSAqIHBOb3RpZnkpOwogCi0Jdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0JRlhfQk9PTAkJCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwl2b2lkCQkJCQkJCU9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPblZLX0xFRlQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19IT01FKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOworCXZvaWQJCQkJCQkJT25WS19FTkQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCk7CisJdm9pZAkJCQkJCQlPblZLKGludDMyX3Qgbkl0ZW1JbmRleCxib29sIGJTaGlmdCxib29sIGJDdHJsKTsKKwlib29sCQkJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpOwogCiAJdmlydHVhbCBDUERGX1BvaW50CQkJCUluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKIAl2aXJ0dWFsIENQREZfUG9pbnQJCQkJT3V0VG9Jbihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwpAQCAtMzQxLDIzICszNDEsMjMgQEAKIAlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0OwogCiBwcml2YXRlOgotCXZvaWQJCQkJCQkJU2V0TXVsdGlwbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7CisJdm9pZAkJCQkJCQlTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKIAl2b2lkCQkJCQkJCVNldFNpbmdsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwogCXZvaWQJCQkJCQkJSW52YWxpZGF0ZUl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KTsKIAl2b2lkCQkJCQkJCVNlbGVjdEl0ZW1zKCk7Ci0JRlhfQk9PTAkJCQkJCQlJc0l0ZW1WaXNpYmxlKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0l0ZW1WaXNpYmxlKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlTZXRTY3JvbGxJbmZvKCk7CiAJdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKIAl2aXJ0dWFsIHZvaWQJCQkJCVJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpOwogCiBwcml2YXRlOgogCUlGWF9MaXN0X05vdGlmeSoJCQkJbV9wTm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJbV9iTm90aWZ5RmxhZzsKKwlib29sCQkJCQkJCW1fYk5vdGlmeUZsYWc7CiAJQ1BERl9Qb2ludAkJCQkJCW1fcHRTY3JvbGxQb3M7CiAJQ1BMU1RfU2VsZWN0CQkJCQltX2FTZWxJdGVtczsJLy9mb3IgbXVsdGlwbGUKIAlpbnQzMl90CQkJCQkJbV9uU2VsSXRlbTsJCS8vZm9yIHNpbmdsZQogCWludDMyX3QJCQkJCQltX25Gb290SW5kZXg7CS8vZm9yIG11bHRpcGxlCi0JRlhfQk9PTAkJCQkJCQltX2JDdHJsU2VsOwkJLy9mb3IgbXVsdGlwbGUKKwlib29sCQkJCQkJCW1fYkN0cmxTZWw7CQkvL2ZvciBtdWx0aXBsZQogCWludDMyX3QJCQkJCQltX25DYXJldEluZGV4OwkvL2ZvciBtdWx0aXBsZQogfTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgKaW5kZXggNmI0MDA2OS4uZDA5NTk0NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oCkBAIC0xNiwxNCArMTYsMTQgQEAKIAl2aXJ0dWFsIH5QcmludFBhcmFtc09iaigpe30KIAogcHVibGljOgotCUZYX0JPT0wgYlVJOworCWJvb2wgYlVJOwogCWludCBuU3RhcnQ7CiAJaW50IG5FbmQ7Ci0JRlhfQk9PTCBiU2lsZW50OwotCUZYX0JPT0wgYlNocmlua1RvRml0OwotCUZYX0JPT0wgYlByaW50QXNJbWFnZTsKLQlGWF9CT09MIGJSZXZlcnNlOwotCUZYX0JPT0wgYkFubm90YXRpb25zOworCWJvb2wgYlNpbGVudDsKKwlib29sIGJTaHJpbmtUb0ZpdDsKKwlib29sIGJQcmludEFzSW1hZ2U7CisJYm9vbCBiUmV2ZXJzZTsKKwlib29sIGJBbm5vdGF0aW9uczsKIH07CiAKIGNsYXNzIENKU19QcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfT2JqZWN0CkBAIC04NSw4NCArODUsODQgQEAKIAl2aXJ0dWFsIH5Eb2N1bWVudCgpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTAlBREJFKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlhdXRob3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWJhc2VVUkwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWJvb2ttYXJrUm9vdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlDb2xsYWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNyZWF0aW9uRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY3JlYXRvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWRpcnR5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlkb2N1bWVudEZpbGVOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWljb25zKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlpbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlrZXl3b3JkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbGF5b3V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbW9kRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltb3VzZVkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW51bUZpZWxkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbnVtUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXBhZ2VOdW0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXBhZ2VXaW5kb3dSZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwYXRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJc3ViamVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJdGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXpvb20oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlBREJFKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlhdXRob3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWJhc2VVUkwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWJvb2ttYXJrUm9vdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJY2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlDb2xsYWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWNyZWF0aW9uRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJY3JlYXRvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWRpcnR5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlkb2N1bWVudEZpbGVOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWljb25zKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlpbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlrZXl3b3JkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbGF5b3V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAltZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbW9kRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAltb3VzZVkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCW51bUZpZWxkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJbnVtUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXBhZ2VOdW0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXBhZ2VXaW5kb3dSZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlwYXRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJc3ViamVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJdGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXpvb20oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLQlGWF9CT09MIGFkZEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYWRkRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlhZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNhbGN1bGF0ZU5vdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRlbGV0ZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZXhwb3J0QXNGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlleHBvcnRBc1hGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBleHRyYWN0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEFubm90cyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEFubm90M0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0T0NHcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldFBhZ2VCb3goSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRQYWdlTnVtV29yZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWltcG9ydEFuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW1wb3J0VGV4dERhdGEoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXNhdmVBcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXN1Ym1pdEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcmVtb3ZlSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGFkZEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJYWRkRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlhZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJYWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWNhbGN1bGF0ZU5vdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJY3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGRlbGV0ZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZXhwb3J0QXNGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlleHBvcnRBc1hGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBleHRyYWN0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldEFubm90cyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldEFubm90M0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJZ2V0T0NHcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldFBhZ2VCb3goSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlnZXRQYWdlTnVtV29yZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCWltcG9ydEFuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJaW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJaW1wb3J0VGV4dERhdGEoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBpbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCW1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAlyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXNhdmVBcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCXN1Ym1pdEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAltYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJcmVtb3ZlSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogcHVibGljOgogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2hEb2MoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CiAJQ1BERlNES19Eb2N1bWVudCogICAgICAgICAgICAgICAgICAgICAgIEdldFJlYWRlckRvYygpOwotCXN0YXRpYyBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RmlsZU5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZpbGVOYW1lKTsKLQlzdGF0aWMgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZvbGRlck5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvbGRlck5hbWUpOworCXN0YXRpYyBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RmlsZU5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZpbGVOYW1lKTsKKwlzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZvbGRlck5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvbGRlck5hbWUpOwogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGREZWxheURhdGEoQ0pTX0RlbGF5RGF0YSogcERhdGEpOwogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb0ZpZWxkRGVsYXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGVsYXlBbm5vdERhdGEoQ0pTX0Fubm90T2JqICpwRGF0YSk7CkBAIC0xNzYsMTMgKzE3NiwxMyBAQAogCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCk7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50V29yZHMoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaik7CiAJQ0ZYX1dpZGVTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwgaW50IG5Xb3JkSW5kZXgpOwotCUZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJQYXJhbXMoSlNPYmplY3QgKnBPYmosQ0pTX0Fubm90T2JqJiBhbm5vdG9iaik7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlclBhcmFtcyhKU09iamVjdCAqcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKTsKIAogCXY4OjpJc29sYXRlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lzb2xhdGU7CiAJSWNvblRyZWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEljb25UcmVlOwogCUNQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudDsKIAlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jd0Jhc2VVUkw7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRlbGF5OworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JEZWxheTsKIAlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfRGVsYXlEYXRhKj4gICAgICAgbV9EZWxheURhdGE7CiAJQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0Fubm90T2JqKj4gICAgICAgIG1fRGVsYXlBbm5vdERhdGE7CiB9OwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJQ0pTX0RvY3VtZW50KEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwogCXZpcnR1YWwgfkNKU19Eb2N1bWVudCgpe307CiAKLQl2aXJ0dWFsIEZYX0JPT0wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKKwl2aXJ0dWFsIGJvb2wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKIAogCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX0RvY3VtZW50KTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgKaW5kZXggNzBkMWQzOS4uMmE2YmE3ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oCkBAIC0xMDMsODUgKzEwMyw4NSBAQAogCUZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCk7CiAJdmlydHVhbCB+RmllbGQodm9pZCk7CiAKLSAgICBGWF9CT09MIGFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgYm9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkFsaWduWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uQWxpZ25ZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25GaXRCb3VuZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25TY2FsZUhvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgYnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjYWxjT3JkZXJJbmRleChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjb21iKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjb21taXRPblNlbENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRvTm90U2Nyb2xsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkaXNwbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGZpbGVTZWxlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGZpbGxDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaGlkZGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGxpbmVXaWR0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbXVsdGlsaW5lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBtdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIHBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHBhc3N3b3JkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwcmludChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmFkaW9zSW5Vbmlzb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCByZXF1aXJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmljaFRleHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcm90YXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHN0cm9rZUNvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdGV4dENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0ZXh0Rm9udChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdGV4dFNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHVzZXJOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgYm9vbCBhbGlnbm1lbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBib29sIGJvcmRlclN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25Qb3NpdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBib29sIGJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY2FsY09yZGVySW5kZXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGNoYXJMaW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY29tbWl0T25TZWxDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGN1cnJlbnRWYWx1ZUluZGljZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgICBib29sIGRlZmF1bHRTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZGVmYXVsdFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIGJvb2wgZG9jKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBlZGl0YWJsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZXhwb3J0VmFsdWVzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGhpZGRlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIGJvb2wgaGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgbXVsdGlwbGVTZWxlY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG51bUl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgICAgYm9vbCBwYWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJhZGlvc0luVW5pc29uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByZWFkb25seShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICAgIGJvb2wgcmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzdHJva2VDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdGV4dEZvbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB1c2VyTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHZhbHVlQXNTdHJpbmcoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi0JRlhfQk9PTCBicm93c2VGb3JGaWxlVG9TdWJtaXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uR2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkltcG9ydEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNsZWFySXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaW5zZXJ0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNldEFjdGlvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNldEZvY3VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZUdldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZUluZm8oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVTZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBicm93c2VGb3JGaWxlVG9TdWJtaXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYnV0dG9uR2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJ1dHRvbkltcG9ydEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgYnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGNsZWFySXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgZ2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBnZXRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBnZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgaW5zZXJ0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgaXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgaXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNldEFjdGlvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNldEZvY3VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNpZ25hdHVyZUdldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNpZ25hdHVyZUluZm8oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzaWduYXR1cmVTZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKIAlzdGF0aWMgdm9pZCBTZXRBbGlnbm1lbnQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKQEAgLTIyNSw5ICsyMjUsOSBAQAogCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUsIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpOwogcHVibGljOgogCXN0YXRpYyB2b2lkCQkJCQkJCVVwZGF0ZUZvcm1GaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAotCQkJCQkJCQkJCQlGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKTsKKwkJCQkJCQkJCQkJYm9vbCBiQ2hhbmdlTWFyaywgYm9vbCBiUmVzZXRBUCwgYm9vbCBiUmVmcmVzaCk7CiAJc3RhdGljIHZvaWQJCQkJCQkJVXBkYXRlRm9ybUNvbnRyb2woQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wsCi0JCQkJCQkJCQkJCUZYX0JPT0wgYkNoYW5nZU1hcmssIEZYX0JPT0wgYlJlc2V0QVAsIEZYX0JPT0wgYlJlZnJlc2gpOworCQkJCQkJCQkJCQlib29sIGJDaGFuZ2VNYXJrLCBib29sIGJSZXNldEFQLCBib29sIGJSZWZyZXNoKTsKIAogCXN0YXRpYyBDUERGU0RLX1dpZGdldCoJCQkJCUdldFdpZGdldChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7CiAJc3RhdGljIHZvaWQJCQkJCQkJR2V0Rm9ybUZpZWxkcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiBGaWVsZHNBcnJheSk7CkBAIC0yMzUsMTQgKzIzNSwxNCBAQAogCXN0YXRpYyB2b2lkCQkJCQkJCURvRGVsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDSlNfRGVsYXlEYXRhKiBwRGF0YSk7CiAKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCQlBdHRhY2hGaWVsZChEb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpOwotCXZvaWQJCQkJCQkJCVNldERlbGF5KEZYX0JPT0wgYkRlbGF5KTsKKwlib29sCQkJCQkJCQlBdHRhY2hGaWVsZChEb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpOworCXZvaWQJCQkJCQkJCVNldERlbGF5KGJvb2wgYkRlbGF5KTsKIAl2b2lkCQkJCQkJCQlTZXRJc29sYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKSB7bV9pc29sYXRlID0gaXNvbGF0ZTt9CiBwcm90ZWN0ZWQ6CiAJdm9pZAkJCQkJCQkJUGFyc2VGaWVsZE5hbWUoY29uc3Qgc3RkOjp3c3RyaW5nICZzdHJGaWVsZE5hbWVQYXJzZWQsc3RkOjp3c3RyaW5nICZzdHJGaWVsZE5hbWUsaW50ICYgaUNvbnRyb2xObyk7CiAJdm9pZAkJCQkJCQkJR2V0Rm9ybUZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUsIENGWF9QdHJBcnJheSYgRmllbGRzQXJyYXkpOwogCUNQREZfRm9ybUNvbnRyb2wqIAkJCQkJR2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpOwotCUZYX0JPT0wJCQkJCQkJCVZhbHVlSXNPY2N1cihDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCk7CisJYm9vbAkJCQkJCQkJVmFsdWVJc09jY3VyKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKTsKIAogCXZvaWQJCQkJCQkJCUFkZERlbGF5X0ludChlbnVtIEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKTsKIAl2b2lkCQkJCQkJCQlBZGREZWxheV9Cb29sKGVudW0gRklFTERfUFJPUCBwcm9wLGJvb2wgYik7CkBAIC0yNTksOSArMjU5LDkgQEAKIAlDUERGU0RLX0RvY3VtZW50KgkJCQkJbV9wRG9jdW1lbnQ7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQltX0ZpZWxkTmFtZTsKIAlpbnQJCQkJCQkJCQltX25Gb3JtQ29udHJvbEluZGV4OwotCUZYX0JPT0wJCQkJCQkJCW1fYkNhblNldDsKKwlib29sCQkJCQkJCQltX2JDYW5TZXQ7CiAKLQlGWF9CT09MCQkJCQkJCQltX2JEZWxheTsKKwlib29sCQkJCQkJCQltX2JEZWxheTsKIAl2ODo6SXNvbGF0ZSoJCQkJCQkJbV9pc29sYXRlOwogfTsKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAJQ0pTX0ZpZWxkKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwogCXZpcnR1YWwgfkNKU19GaWVsZCh2b2lkKXt9OwogCi0JdmlydHVhbCBGWF9CT09MCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CisJdmlydHVhbCBib29sCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CiAKIAlERUNMQVJFX0pTX0NMQVNTKENKU19GaWVsZCk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oCmluZGV4IDc4M2IyNDkuLjM3ZTEyZGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaApAQCAtMTksOCArMTksOCBAQAogewogcHVibGljOgogICAgICAgICB2aXJ0dWFsIH5JRlhKU19Db250ZXh0KCkgeyB9Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKSA9IDA7CisJdmlydHVhbCBib29sCQkJCUNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKKwl2aXJ0dWFsIGJvb2wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKSA9IDA7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJT25BcHBfSW5pdCgpID0gMDsKIApAQCAtMzYsMzIgKzM2LDMyIEBACiAJdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQlPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sIGJXaWxsQ29tbWl0KSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJCUZYX0JPT0wgS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwgRlhfQk9PTCBiU2hpZnQsCi0JCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0LAotCQkJCQkJCQkJRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MICZiUmMpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sCi0JCQkJCQkJCQlGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykgPSAwOworCQkJCQkJCQkJYm9vbCBLZXlEb3duLCBib29sIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBib29sIGJTaGlmdCwKKwkJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQsCisJCQkJCQkJCQlib29sIGJGaWVsZEZ1bGwsIGJvb2wgJmJSYykgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwKKwkJCQkJCQkJCWJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQlPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7CkBAIC03MSw3ICs3MSw3IEBACiAJdmlydHVhbCB2b2lkCQkJCU9uQ29uc29sZV9FeGVjKCkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQlPbkV4dGVybmFsX0V4ZWMoKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJRW5hYmxlTWVzc2FnZUJveChGWF9CT09MIGJFbmFibGUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJRW5hYmxlTWVzc2FnZUJveChib29sIGJFbmFibGUpID0gMDsKIH07CiAKIGNsYXNzIElGWEpTX1J1bnRpbWUKQEAgLTk0LDcgKzk0LDcgQEAKIGNsYXNzIENKU19SdW50aW1lRmFjdG9yeQogewogcHVibGljOgotCUNKU19SdW50aW1lRmFjdG9yeSgpOm1fYkluaXQoRkFMU0UpLG1fblJlZigwKSxtX3BHbG9iYWxEYXRhKE5VTEwpLG1fbkdsb2JhbERhdGFDb3VudCgwKSB7fQorCUNKU19SdW50aW1lRmFjdG9yeSgpOm1fYkluaXQoZmFsc2UpLG1fblJlZigwKSxtX3BHbG9iYWxEYXRhKE5VTEwpLG1fbkdsb2JhbERhdGFDb3VudCgwKSB7fQogCX5DSlNfUnVudGltZUZhY3RvcnkoKTsKIAlJRlhKU19SdW50aW1lKgkJCQkJTmV3SlNSdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwogCXZvaWQJCQkJCQkJRGVsZXRlSlNSdW50aW1lKElGWEpTX1J1bnRpbWUqIHBSdW50aW1lKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCUNKU19HbG9iYWxEYXRhKgkJCQkJTmV3R2xvYmFsRGF0YShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKIAl2b2lkCQkJCQkJCVJlbGVhc2VHbG9iYWxEYXRhKCk7CiBwcml2YXRlOgotCUZYX0JPT0wgbV9iSW5pdDsKKwlib29sIG1fYkluaXQ7CiAJaW50IG1fblJlZjsKIAlDSlNfR2xvYmFsRGF0YSoJCQkJCW1fcEdsb2JhbERhdGE7CiAJaW50MzJfdAkJCQkJCW1fbkdsb2JhbERhdGFDb3VudDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaAppbmRleCAwMjk4MDA1Li4zNjdkYjdiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JY29uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oCkBAIC0xNCw3ICsxNCw3IEBACiBwdWJsaWM6CiAJSWNvbihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwogCXZpcnR1YWwgfkljb24oKTsKLQlGWF9CT09MIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAl2b2lkCQkJCVNldFN0cmVhbShDUERGX1N0cmVhbSogcEljb25TdHJlYW0pOwogCUNQREZfU3RyZWFtKgkJR2V0U3RyZWFtKCk7CiAJdm9pZAkJCQlTZXRJY29uTmFtZShDRlhfV2lkZVN0cmluZyBuYW1lKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaAppbmRleCAyZTJjZjM3Li43OWQwMWEwIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oCkBAIC0yMSw4ICsyMSw4IEBACiAJdmlydHVhbCB+Q0pTX0NvbnRleHQoKTsKIAogcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQlDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKwl2aXJ0dWFsIGJvb2wJCQkJQ29tcGlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7CisJdmlydHVhbCBib29sCQkJCVJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7CiAKIHB1YmxpYzoKIAl2aXJ0dWFsIHZvaWQJCQkJT25BcHBfSW5pdCgpOwpAQCAtMzksMzIgKzM5LDMyIEBACiAJdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpOworCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCk7CiAJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAotCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKLQkJCQkJCQkJCUZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCAmYlJjKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sCi0JCQkJCQkJCQlGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7CisJCQkJCQkJCQlib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBib29sIGJTaGlmdCwKKwkJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQsCisJCQkJCQkJCQlib29sIGJGaWVsZEZ1bGwsIGJvb2wgJmJSYyk7CisJdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLAorCQkJCQkJCQkJYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKIAogCXZpcnR1YWwgdm9pZAkJCQlPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CkBAIC03NCwxNCArNzQsMTQgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJT25Db25zb2xlX0V4ZWMoKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25FeHRlcm5hbF9FeGVjKCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJRW5hYmxlTWVzc2FnZUJveChGWF9CT09MIGJFbmFibGUpIHttX2JNc2dCb3hFbmFibGUgPSBiRW5hYmxlO30KLQlGWF9CT09MCQkJCQkJSXNNc2dCb3hFbmFibGVkKCkgY29uc3Qge3JldHVybiBtX2JNc2dCb3hFbmFibGU7fQorCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KGJvb2wgYkVuYWJsZSkge21fYk1zZ0JveEVuYWJsZSA9IGJFbmFibGU7fQorCWJvb2wJCQkJCQlJc01zZ0JveEVuYWJsZWQoKSBjb25zdCB7cmV0dXJuIG1fYk1zZ0JveEVuYWJsZTt9CiAKIHB1YmxpYzoKIAlDUERGRG9jX0Vudmlyb25tZW50KgkJCUdldFJlYWRlckFwcCgpOwogCUNKU19SdW50aW1lKgkJCQlHZXRKU1J1bnRpbWUoKXtyZXR1cm4gbV9wUnVudGltZTt9CiAKLQlGWF9CT09MCQkJCQkJRG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7CisJYm9vbAkJCQkJCURvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOwogCiAJQ0pTX0V2ZW50SGFuZGxlcioJCQlHZXRFdmVudEhhbmRsZXIoKXtyZXR1cm4gbV9wRXZlbnRIYW5kbGVyO307CiAJQ1BERlNES19Eb2N1bWVudCoJCQlHZXRSZWFkZXJEb2N1bWVudCgpOwpAQCAtOTAsOCArOTAsOCBAQAogCUNKU19SdW50aW1lKgkJCQltX3BSdW50aW1lOwogCUNKU19FdmVudEhhbmRsZXIqCQkJbV9wRXZlbnRIYW5kbGVyOwogCi0JRlhfQk9PTAkJCQkJCW1fYkJ1c3k7Ci0JRlhfQk9PTAkJCQkJCW1fYk1zZ0JveEVuYWJsZTsKKwlib29sCQkJCQkJbV9iQnVzeTsKKwlib29sCQkJCQkJbV9iTXNnQm94RW5hYmxlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19DT05URVhUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oCmluZGV4IGYxYjM2YmYuLjA4N2Y0ODkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oCkBAIC01MSw3ICs1MSw3IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUFJPUCBDQUxMQkFDSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi10ZW1wbGF0ZSA8Y2xhc3MgQywgRlhfQk9PTCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Cit0ZW1wbGF0ZSA8Y2xhc3MgQywgYm9vbCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+CiB2b2lkIEpTUHJvcEdldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCkBAIC03NCw3ICs3NCw3IEBACiAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoKHY4OjpMb2NhbDx2ODo6VmFsdWU+KXZhbHVlKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIEMsIEZYX0JPT0wgKEM6OipNKShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpPgordGVtcGxhdGUgPGNsYXNzIEMsIGJvb2wgKEM6OipNKShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpPgogdm9pZCBKU1Byb3BTZXR0ZXIoY29uc3QgY2hhciogcHJvcF9uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LApAQCAtMTEzLDcgKzExMyw3IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRCBDQUxMQkFDSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLXRlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Cit0ZW1wbGF0ZSA8Y2xhc3MgQywgYm9vbCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpPgogdm9pZCBKU01ldGhvZChjb25zdCBjaGFyKiBtZXRob2RfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewpAQCAtMjQwLDcgKzI0MCw3IEBACiAgIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKICAgQ0pTX09iamVjdCogcEpTT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDSlNfT2JqZWN0Kj4oSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKSk7CiAgIEFsdCogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWx0Kj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgRlhfQk9PTCBiUmV0ID0gcE9iai0+UXVlcnlQcm9wZXJ0eShwcm9wbmFtZS5jX3N0cigpKTsKKyAgYm9vbCBiUmV0ID0gcE9iai0+UXVlcnlQcm9wZXJ0eShwcm9wbmFtZS5jX3N0cigpKTsKICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChiUmV0ID8gNCA6IDApOwogfQogCkBAIC0zODIsNyArMzgyLDcgQEAKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHTE9CQUwgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi10ZW1wbGF0ZSA8RlhfQk9PTCAoKkYpKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpPgordGVtcGxhdGUgPGJvb2wgKCpGKShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KIHZvaWQgSlNHbG9iYWxGdW5jKGNvbnN0IGNoYXIgKmZ1bmNfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewogICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaAppbmRleCA2MmFmYjgyLi45OTc3NDYyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaApAQCAtNzksMzIgKzc5LDMyIEBACiAJdm9pZAkJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAl2b2lkCQkJCQlPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAotCXZvaWQJCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpOwotCXZvaWQJCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpOworCXZvaWQJCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpOworCXZvaWQJCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQpOwogCXZvaWQJCQkJCU9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJRlhfQk9PTCBLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBGWF9CT09MIGJTaGlmdCwKLQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKLQkJCQkJCQkJRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MICZiUmMpOwotCXZvaWQJCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLAotCQkJCQkJCQlGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7CisJCQkJCQkJCWJvb2wgS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwgYm9vbCBiU2hpZnQsCisJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wgYldpbGxDb21taXQsCisJCQkJCQkJCWJvb2wgYkZpZWxkRnVsbCwgYm9vbCAmYlJjKTsKKwl2b2lkCQkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgYm9vbCBiS2V5RG93biwKKwkJCQkJCQkJYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpOwogCi0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKLQl2b2lkCQkJCQlPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7CisJdm9pZAkJCQkJT25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7CisJdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOworCXZvaWQJCQkJCU9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOworCXZvaWQJCQkJCU9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKKwl2b2lkCQkJCQlPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKwl2b2lkCQkJCQlPbkZpZWxkX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7CiAKLQl2b2lkCQkJCQlPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKwl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisJdm9pZAkJCQkJT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworCXZvaWQJCQkJCU9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKIAogCXZvaWQJCQkJCU9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOwogCXZvaWQJCQkJCU9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwpAQCAtMTE3LDI1ICsxMTcsMjUgQEAKIHB1YmxpYzoKICAgICB2b2lkCQkJCQlJbml0aWFsKEpTX0VWRU5UX1QgdHlwZSk7CiAJdm9pZAkJCQkJRGVzdHJveSgpOwotCUZYX0JPT0wJCQkJCUlzVmFsaWQoKTsKKwlib29sCQkJCQlJc1ZhbGlkKCk7CiAKIAogCUNGWF9XaWRlU3RyaW5nJgkJCUNoYW5nZSgpOwogCUNGWF9XaWRlU3RyaW5nCQkJQ2hhbmdlRXgoKTsKIAlpbnQJCQkJCQlDb21taXRLZXkoKTsKLQlGWF9CT09MCQkJCQlGaWVsZEZ1bGwoKTsKLQlGWF9CT09MCQkJCQlLZXlEb3duKCk7Ci0JRlhfQk9PTAkJCQkJTW9kaWZpZXIoKTsKKwlib29sCQkJCQlGaWVsZEZ1bGwoKTsKKwlib29sCQkJCQlLZXlEb3duKCk7CisJYm9vbAkJCQkJTW9kaWZpZXIoKTsKIAljb25zdCBGWF9XQ0hBUioJCQkJTmFtZSgpOwogCWNvbnN0IEZYX1dDSEFSKgkJCQlUeXBlKCk7Ci0JRlhfQk9PTCYJCQkJUmMoKTsKKwlib29sJgkJCQlSYygpOwogCWludCYJCQkJCVNlbEVuZCgpOwogCWludCYJCQkJCVNlbFN0YXJ0KCk7Ci0JRlhfQk9PTAkJCQkJU2hpZnQoKTsKKwlib29sCQkJCQlTaGlmdCgpOwogCUZpZWxkKgkJCQkJU291cmNlKCk7CiAJRmllbGQqCQkJCQlUYXJnZXRfRmllbGQoKTsKIAlDRlhfV2lkZVN0cmluZyYJCQlWYWx1ZSgpOwotCUZYX0JPT0wJCQkJCVdpbGxDb21taXQoKTsKKwlib29sCQkJCQlXaWxsQ29tbWl0KCk7CiAJQ0ZYX1dpZGVTdHJpbmcJCQlUYXJnZXROYW1lKCk7CiAKIAlKU19FVkVOVF9UCQkJCUV2ZW50VHlwZSgpIHtyZXR1cm4gbV9lRXZlbnRUeXBlO307CkBAIC0xNDMsNyArMTQzLDcgQEAKIHB1YmxpYzoKIAlDSlNfQ29udGV4dCoJCQltX3BKU0NvbnRleHQ7CiAJSlNfRVZFTlRfVAkJCQltX2VFdmVudFR5cGU7Ci0JRlhfQk9PTAkJCQkJbV9iVmFsaWQ7CisJYm9vbAkJCQkJbV9iVmFsaWQ7CiAKIAlDRlhfV2lkZVN0cmluZwkJCW1fc3RyVGFyZ2V0TmFtZTsKIAlDRlhfV2lkZVN0cmluZwkJCW1fc3RyU291cmNlTmFtZTsKQEAgLTE1MSwxOCArMTUxLDE4IEBACiAJQ0ZYX1dpZGVTdHJpbmcJCQltX1dpZGVTdHJDaGFuZ2VEdTsKIAlDRlhfV2lkZVN0cmluZwkJCW1fV2lkZVN0ckNoYW5nZUV4OwogCWludAkJCQkJCW1fbkNvbW1pdEtleTsKLQlGWF9CT09MCQkJCQltX2JLZXlEb3duOwotCUZYX0JPT0wJCQkJCW1fYk1vZGlmaWVyOwotCUZYX0JPT0wJCQkJCW1fYlNoaWZ0OworCWJvb2wJCQkJCW1fYktleURvd247CisJYm9vbAkJCQkJbV9iTW9kaWZpZXI7CisJYm9vbAkJCQkJbV9iU2hpZnQ7CiAJaW50KgkJCQkJbV9wSVNlbEVuZDsKIAlpbnQJCQkJCQltX25TZWxFbmREdTsKIAlpbnQqCQkJCQltX3BJU2VsU3RhcnQ7CiAJaW50CQkJCQkJbV9uU2VsU3RhcnREdTsKLQlGWF9CT09MCQkJCQltX2JXaWxsQ29tbWl0OworCWJvb2wJCQkJCW1fYldpbGxDb21taXQ7CiAJQ0ZYX1dpZGVTdHJpbmcqCQkJbV9wVmFsdWU7Ci0JRlhfQk9PTAkJCQkJbV9iRmllbGRGdWxsOwotCUZYX0JPT0wqCQkJCW1fcGJSYzsKLQlGWF9CT09MCQkJCQltX2JSY0R1OworCWJvb2wJCQkJCW1fYkZpZWxkRnVsbDsKKwlib29sKgkJCQltX3BiUmM7CisJYm9vbAkJCQkJbV9iUmNEdTsKIAogCUNQREZTREtfRG9jdW1lbnQqCQltX3BTb3VyY2VEb2M7CiAJQ1BERl9Cb29rbWFyayoJCQltX3BUYXJnZXRCb29rTWFyazsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaAppbmRleCBiMzYzN2I5Li45ODdkZTk1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oCkBAIC01Niw3ICs1Niw3IEBACiAJdmlydHVhbCB+Q0pTX0dsb2JhbERhdGFfRWxlbWVudCgpe30KIAogCUNKU19LZXlWYWx1ZQkJCWRhdGE7Ci0JRlhfQk9PTAkJCQkJYlBlcnNpc3RlbnQ7CisJYm9vbAkJCQkJYlBlcnNpc3RlbnQ7CiB9OwogCiBjbGFzcyBDSlNfR2xvYmFsRGF0YQpAQCAtNzIsOCArNzIsOCBAQAogCXZvaWQJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOwogCXZvaWQJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlTnVsbChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSk7CiAKLQlGWF9CT09MCQkJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIEZYX0JPT0wgYlBlcnNpc3RlbnQpOwotCUZYX0JPT0wJCQkJCQkJCURlbGV0ZUdsb2JhbFZhcmlhYmxlKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKKwlib29sCQkJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGJvb2wgYlBlcnNpc3RlbnQpOworCWJvb2wJCQkJCQkJCURlbGV0ZUdsb2JhbFZhcmlhYmxlKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKIAogCWludDMyX3QJCQkJCQkJR2V0U2l6ZSgpIGNvbnN0OwogCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqCQkJCUdldEF0KGludCBpbmRleCkgY29uc3Q7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oCmluZGV4IDM4OThkMTguLmY4ZWM5MGUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oCkBAIC00OCwxMSArNDgsMTEgQEAKIAl2b2lkCQkJCQkJTWFrZVdlYWsoKTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zZSgpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzVHlwZShjb25zdCBGWF9DSEFSKiBzQ2xhc3NOYW1lKXtyZXR1cm4gVFJVRTt9OworCXZpcnR1YWwgYm9vbAkJCQlJc1R5cGUoY29uc3QgRlhfQ0hBUiogc0NsYXNzTmFtZSl7cmV0dXJuIHRydWU7fTsKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKXtyZXR1cm4gIiI7fTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2Mpe3JldHVybiBUUlVFO307Ci0JdmlydHVhbCBGWF9CT09MCQkJCUV4aXRJbnN0YW5jZSgpe3JldHVybiBUUlVFO307CisJdmlydHVhbCBib29sCQkJCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyl7cmV0dXJuIHRydWU7fTsKKwl2aXJ0dWFsIGJvb2wJCQkJRXhpdEluc3RhbmNlKCl7cmV0dXJuIHRydWU7fTsKIAogCW9wZXJhdG9yCQkJCQlKU0ZYT2JqZWN0ICgpIHtyZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcobV9wSXNvbGF0ZSwgbV9wT2JqZWN0KTt9CiAJb3BlcmF0b3IJCQkJCUNKU19FbWJlZE9iaiogKCl7cmV0dXJuIG1fcEVtYmVkT2JqO307CkBAIC0xNzIsNyArMTcyLDcgQEAKIAlDSlNfVGltZXIoQ0pTX0VtYmVkT2JqICogcE9iaixDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKToKIAkJbV9uVGltZXJJRCgwKSwKIAkJbV9wRW1iZWRPYmoocE9iaiksCi0JCW1fYlByb2Nlc3NpbmcoRkFMU0UpLAorCQltX2JQcm9jZXNzaW5nKGZhbHNlKSwKIAkJbV9kd1N0YXJ0VGltZSgwKSwKIAkJbV9kd1RpbWVPdXQoMCksCiAJCW1fZHdFbGFwc2UoMCksCkBAIC0yNjUsOSArMjY1LDkgQEAKIAkJewogCQkJaWYgKCFwVGltZXItPm1fYlByb2Nlc3NpbmcpCiAJCQl7Ci0JCQkJcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gVFJVRTsKKwkJCQlwVGltZXItPm1fYlByb2Nlc3NpbmcgPSB0cnVlOwogCQkJCWlmIChwVGltZXItPm1fcEVtYmVkT2JqKSBwVGltZXItPm1fcEVtYmVkT2JqLT5UaW1lclByb2MocFRpbWVyKTsKLQkJCQlwVGltZXItPm1fYlByb2Nlc3NpbmcgPSBGQUxTRTsKKwkJCQlwVGltZXItPm1fYlByb2Nlc3NpbmcgPSBmYWxzZTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKQEAgLTI3OSw3ICsyNzksNyBAQAogcHJpdmF0ZToKIAlGWF9VSU5UCQkJCQkJCW1fblRpbWVySUQ7CiAJQ0pTX0VtYmVkT2JqKgkJCQkJbV9wRW1iZWRPYmo7Ci0JRlhfQk9PTAkJCQkJCQltX2JQcm9jZXNzaW5nOworCWJvb2wJCQkJCQkJbV9iUHJvY2Vzc2luZzsKIAogCS8vZGF0YQogCUZYX0RXT1JECQkJCQkJCW1fZHdTdGFydFRpbWU7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgKaW5kZXggOGZkZmE4Yi4uYjlhZDZlZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaApAQCAtNDQsMTUgKzQ0LDE1IEBACiAKIAlDUERGRG9jX0Vudmlyb25tZW50ICoJCQkJCQkJR2V0UmVhZGVyQXBwKCl7cmV0dXJuIG1fcEFwcDt9CiAKLQlGWF9CT09MCQkJCQkJCQkJSW5pdEpTT2JqZWN0cygpOworCWJvb2wJCQkJCQkJCQlJbml0SlNPYmplY3RzKCk7CiAKLQlGWF9CT09MCQkJCQkJCQkJQWRkRXZlbnRUb0xvb3AoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUYXJnZXROYW1lLCBKU19FVkVOVF9UIGVFdmVudFR5cGUpOworCWJvb2wJCQkJCQkJCQlBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSk7CiAJdm9pZAkJCQkJCQkJCVJlbW92ZUV2ZW50SW5Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKTsKIAl2b2lkCQkJCQkJCQkJUmVtb3ZlRXZlbnRzSW5Mb29wKENKU19GaWVsZEV2ZW50KiBwU3RhcnQpOwogCi0Jdm9pZAkJCQkJCQkJCUJlZ2luQmxvY2soKXttX2JCbG9ja2luZyA9IFRSVUU7fQotCXZvaWQJCQkJCQkJCQlFbmRCbG9jaygpe21fYkJsb2NraW5nID0gRkFMU0U7fQotCUZYX0JPT0wJCQkJCQkJCQlJc0Jsb2NraW5nKCl7cmV0dXJuIG1fYkJsb2NraW5nO30KKwl2b2lkCQkJCQkJCQkJQmVnaW5CbG9jaygpe21fYkJsb2NraW5nID0gdHJ1ZTt9CisJdm9pZAkJCQkJCQkJCUVuZEJsb2NrKCl7bV9iQmxvY2tpbmcgPSBmYWxzZTt9CisJYm9vbAkJCQkJCQkJCUlzQmxvY2tpbmcoKXtyZXR1cm4gbV9iQmxvY2tpbmc7fQogCiAJb3BlcmF0b3IJCQkJCQkJCUlKU19SdW50aW1lKigpIHtyZXR1cm4gKElKU19SdW50aW1lKiltX2lzb2xhdGU7fQogCXY4OjpJc29sYXRlKgkJCQkJCQkJR2V0SXNvbGF0ZSgpe3JldHVybiBtX2lzb2xhdGU7fTsKQEAgLTYzLDcgKzYzLDcgQEAKIAlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfQ29udGV4dCo+CQltX0NvbnRleHRBcnJheTsKIAlDUERGRG9jX0Vudmlyb25tZW50KgkJCQkJCQltX3BBcHA7CiAJQ1BERlNES19Eb2N1bWVudCoJCQkJCQltX3BEb2N1bWVudDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iQmxvY2tpbmc7CisJYm9vbAkJCQkJCQkJCW1fYkJsb2NraW5nOwogCUNKU19GaWVsZEV2ZW50KgkJCQkJCQltX3BGaWVsZEV2ZW50UGF0aDsKIAogCXY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaAppbmRleCA2MTg2ODE3Li4wMzVjZWYwIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgKQEAgLTYzLDEyICs2MywxMiBAQAogCXZvaWQgb3BlcmF0b3IgPSAoY29uc3QgRlhfQ0hBUiogcFN0cik7CiAJdm9pZCBvcGVyYXRvciA9IChDSlNfVmFsdWUgdmFsdWUpOwogCi0JRlhfQk9PTCBJc0FycmF5T2JqZWN0KCkgY29uc3Q7Ci0JRlhfQk9PTAlJc0RhdGVPYmplY3QoKSBjb25zdDsKKwlib29sIElzQXJyYXlPYmplY3QoKSBjb25zdDsKKwlib29sCUlzRGF0ZU9iamVjdCgpIGNvbnN0OwogCUZYSlNWQUxVRVRZUEUgR2V0VHlwZSgpIGNvbnN0OwogCi0JRlhfQk9PTCBDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJikgY29uc3Q7Ci0JRlhfQk9PTCBDb252ZXJ0VG9EYXRlKENKU19EYXRlICYpIGNvbnN0OworCWJvb2wgQ29udmVydFRvQXJyYXkoQ0pTX0FycmF5ICYpIGNvbnN0OworCWJvb2wgQ29udmVydFRvRGF0ZShDSlNfRGF0ZSAmKSBjb25zdDsKIAogCXY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkge3JldHVybiBtX2lzb2xhdGU7fQogcHJvdGVjdGVkOgpAQCAtOTUsOCArOTUsOCBAQAogCUNKU19Qcm9wVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUpOwogCX5DSlNfUHJvcFZhbHVlKCk7CiBwdWJsaWM6Ci0JRlhfQk9PTCBJc1NldHRpbmcoKTsKLQlGWF9CT09MIElzR2V0dGluZygpOworCWJvb2wgSXNTZXR0aW5nKCk7CisJYm9vbCBJc0dldHRpbmcoKTsKIAl2b2lkIG9wZXJhdG9yPDwoaW50KTsKIAl2b2lkIG9wZXJhdG9yPj4oaW50JikgY29uc3Q7CiAJdm9pZCBvcGVyYXRvcjw8KGJvb2wpOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJdm9pZCBTdGFydFNldHRpbmcoKTsKIAl2b2lkIFN0YXJ0R2V0dGluZygpOwogcHJpdmF0ZToKLQlGWF9CT09MIG1fYklzU2V0dGluZzsKKwlib29sIG1fYklzU2V0dGluZzsKIH07CiAKIGNsYXNzIENKU19BcnJheQpAQCAtMTM1LDcgKzEzNSw3IEBACiAJdm9pZCBHZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LENKU19WYWx1ZSAmdmFsdWUpOwogCXZvaWQgU2V0RWxlbWVudCh1bnNpZ25lZCBpbmRleCxDSlNfVmFsdWUgdmFsdWUpOwogICAgIGludCBHZXRMZW5ndGgoKTsKLQlGWF9CT09MIElzQXR0YWNoZWQoKTsKKwlib29sIElzQXR0YWNoZWQoKTsKIAlvcGVyYXRvciB2ODo6TG9jYWw8djg6OkFycmF5PigpOwogCiAJdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSB7cmV0dXJuIG1faXNvbGF0ZTt9CkBAIC0xNzksNyArMTc5LDcgQEAKIAogCXN0YXRpYyBkb3VibGUJTWFrZURhdGUoaW50IHllYXIsIGludCBtb24sIGludCBtZGF5LGludCBob3VyLCBpbnQgbWluLCBpbnQgc2VjLGludCBtcyk7CiAKLQlGWF9CT09MCUlzVmFsaWREYXRlKCk7CisJYm9vbAlJc1ZhbGlkRGF0ZSgpOwogCiBwcm90ZWN0ZWQ6CiAJdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wRGF0ZTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaAppbmRleCBjZmY5ZTExLi43ZmNhMzYzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oCkBAIC0xNiwyOCArMTYsMjggQEAKIAl2aXJ0dWFsIH5DSlNfUHVibGljTWV0aG9kcyh2b2lkKXt9OwogCiBwdWJsaWM6Ci0Jc3RhdGljIEZYX0JPT0wgQUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlBlcmNlbnRfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRkRhdGVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOyAvLwotCXN0YXRpYyBGWF9CT09MIEFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlRpbWVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsvLwotCXN0YXRpYyBGWF9CT09MIEFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGUGFyc2VEYXRlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRk51bWJlcl9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRkRhdGVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZEYXRlX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7IC8vCisJc3RhdGljIGJvb2wgQUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlNwZWNpYWxfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOy8vCisJc3RhdGljIGJvb2wgQUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGU2ltcGxlX0NhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCXN0YXRpYyBib29sIEFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJc3RhdGljIGJvb2wgQUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlzdGF0aWMgYm9vbCBBRkV4dHJhY3ROdW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCiBwdWJsaWM6CiAJSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZOdW1iZXJfRm9ybWF0KTsKQEAgLTY4LDEzICs2OCwxMyBAQAogcHVibGljOgogCXN0YXRpYyBpbnQJCQkJUGFyc2VTdHJpbmdJbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgc3RyaW5nLGludCBuU3RhcnQsaW50ICYgblNraXAsIGludCBuTWF4U3RlcCk7CiAJc3RhdGljIENGWF9XaWRlU3RyaW5nCVBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsIGludCBuU3RhcnQsIGludCYgblNraXApOwotCXN0YXRpYyBkb3VibGUJCQlNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSxjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KTsKKwlzdGF0aWMgZG91YmxlCQkJTWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQsIGJvb2wmIGJXcm9uZ0Zvcm1hdCk7CiAJc3RhdGljIENGWF9XaWRlU3RyaW5nCU1ha2VGb3JtYXREYXRlKGRvdWJsZSBkRGF0ZSxjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCk7CisJc3RhdGljIGJvb2wJCQlDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBib29sICYgYkRvdCk7CiAJc3RhdGljIGRvdWJsZQkJCVBhcnNlU3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlKTsKLQlzdGF0aWMgZG91YmxlCQkJUGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCk7CisJc3RhdGljIGRvdWJsZQkJCVBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBib29sJiBiV3JvbmdGb3JtYXQpOwogCXN0YXRpYyBkb3VibGUgICAgICAgICAgIE1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpOwotCXN0YXRpYyBkb3VibGUJCQlQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUyk7CisJc3RhdGljIGRvdWJsZQkJCVBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgYm9vbCYgYkFsbERpZ2l0cywgYm9vbCYgYkRvdCwgYm9vbCYgYlNpZ24sIGJvb2wmIGJLWEpTKTsKIAogcHVibGljOgogCXN0YXRpYyBDRlhfV2lkZVN0cmluZwlTdHJMVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cik7CkBAIC04NSwxNiArODUsMTYgQEAKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJU3RyUlRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cik7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCVN0clRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cik7CiAKLQlzdGF0aWMgRlhfQk9PTAkJCUlzTnVtYmVyKGNvbnN0IEZYX0NIQVIqIHN0cmluZyk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKTsKKwlzdGF0aWMgYm9vbAkJCUlzTnVtYmVyKGNvbnN0IEZYX0NIQVIqIHN0cmluZyk7CisJc3RhdGljIGJvb2wJCQlJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKTsKIAotCXN0YXRpYyBGWF9CT09MCQkJSXNEaWdpdChjaGFyIGNoKTsKLQlzdGF0aWMgRlhfQk9PTAkJCUlzRGlnaXQod2NoYXJfdCBjaCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlJc0FscGhhYmV0aWMod2NoYXJfdCBjaCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKTsKKwlzdGF0aWMgYm9vbAkJCUlzRGlnaXQoY2hhciBjaCk7CisJc3RhdGljIGJvb2wJCQlJc0RpZ2l0KHdjaGFyX3QgY2gpOworCXN0YXRpYyBib29sCQkJSXNBbHBoYWJldGljKHdjaGFyX3QgY2gpOworCXN0YXRpYyBib29sCQkJSXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCk7CiAKLQlzdGF0aWMgRlhfQk9PTAkJCW1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzayk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlpc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCk7CisJc3RhdGljIGJvb2wJCQltYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2Usd2NoYXJfdCBjX01hc2spOworCXN0YXRpYyBib29sCQkJaXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpOwogCiAJc3RhdGljIGRvdWJsZQkJCUFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sIGRvdWJsZSBkVmFsdWUxLCBkb3VibGUgZFZhbHVlMik7CiAJc3RhdGljIENKU19BcnJheQkJQUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19WYWx1ZSB2YWwpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvYXBwLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaAppbmRleCBhYzkwZTYyLi5mZmQ3ZWRiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaApAQCAtMTEwLDQxICsxMTAsNDEgQEAKIAl2aXJ0dWFsIH5hcHAoKTsKIAogcHVibGljOgotCUZYX0JPT0wJCQkJCQlhY3RpdmVEb2NzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZnVsbHNjcmVlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlsYW5ndWFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQltZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXZpZXdlclR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJdmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJYWN0aXZlRG9jcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQljYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJZm9ybXNWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWZzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWZ1bGxzY3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJbGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJcGxhdGZvcm0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJcnVudGltZUhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQl2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXZpZXdlclZhcmlhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQl2aWV3ZXJWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIAotCUZYX0JPT0wJCQkJCQlhbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJYmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJYnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQljbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQljbGVhclRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWV4ZWNNZW51SXRlbShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZ29CYWNrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWxhdW5jaFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbWFpbE1zZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbmV3RkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQluZXdEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW9wZW5GREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXBvcFVwTWVudUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlwb3BVcE1lbnUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJc2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJYWxlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWJlZXAoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWJyb3dzZUZvckRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJY2xlYXJJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJY2xlYXJUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlleGVjRGlhbG9nKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWZpbmRDb21wb25lbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCWdvQmFjayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJZ29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCW1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCW5ld0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJbmV3RG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlvcGVuRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJcG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wJCQkJCQlyZXNwb25zZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sCQkJCQkJc2V0SW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXNldFRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHByaXZhdGU6CiAvLwlGWF9EV09SRAkJCQkJQXBwR2V0VGlja0NvdW50KCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaAppbmRleCBkZjg2M2I1Li5hYjdiYmFlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgKQEAgLTE2LDIxICsxNiwyMSBAQAogCWNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCk7CiAJdmlydHVhbCB+Y29sb3Iodm9pZCk7CiAKLQlGWF9CT09MIGJsYWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBibHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjeWFuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBka0dyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBsdEdyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG1hZ2VudGEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdHJhbnNwYXJlbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHdoaXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB5ZWxsb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGJsYWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBibHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjeWFuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBka0dyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGdyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGdyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBsdEdyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG1hZ2VudGEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdHJhbnNwYXJlbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHdoaXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCB5ZWxsb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAotCUZYX0JPT0wgY29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCiBwdWJsaWM6CiAJc3RhdGljIHZvaWQJCUNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIENKU19BcnJheSYgYXJyYXkpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29uc29sZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29uc29sZS5oCmluZGV4IDBjYmMyOTEuLjQyNGYwZTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmgKQEAgLTE2LDEwICsxNiwxMCBAQAogCXZpcnR1YWwgfmNvbnNvbGUodm9pZCk7CiAKIHB1YmxpYzoKLQlGWF9CT09MIGNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHByaW50bG4oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaG93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY2xlYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiB9OwogCiBjbGFzcyBDSlNfQ29uc29sZSA6IHB1YmxpYyBDSlNfT2JqZWN0CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9ldmVudC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaAppbmRleCA5MWEzOGJhLi5lOTgwYTk2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9ldmVudC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmgKQEAgLTE2LDI2ICsxNiwyNiBAQAogCXZpcnR1YWwgfmV2ZW50KHZvaWQpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTCBjaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wga2V5RG93bihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbW9kaWZpZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2VsRW5kKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZWxTdGFydChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2hpZnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0YXJnZXROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgd2lsbENvbW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgY29tbWl0S2V5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBmaWVsZEZ1bGwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIGtleURvd24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIG1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByYyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcmljaENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcmljaENoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCByaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNlbEVuZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHNoaWZ0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHRhcmdldChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdGFyZ2V0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgdmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKwlib29sIHdpbGxDb21taXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAogfTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZ2xvYmFsLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaAppbmRleCA4M2UwN2Y2Li40YzZjY2Q5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaApAQCAtMTksMTAgKzE5LDEwIEBACiAJewogCQluVHlwZSA9IDA7CiAJCWREYXRhID0gMDsKLQkJYkRhdGEgPSBGQUxTRTsKKwkJYkRhdGEgPSBmYWxzZTsKIAkJc0RhdGEgPSAiIjsKLQkJYlBlcnNpc3RlbnQgPSBGQUxTRTsKLQkJYkRlbGV0ZWQgPSBGQUxTRTsKKwkJYlBlcnNpc3RlbnQgPSBmYWxzZTsKKwkJYkRlbGV0ZWQgPSBmYWxzZTsKIAl9CiAKIAl+anNfZ2xvYmFsX2RhdGEoKQpAQCAtNDUsMTIgKzQ1LDEyIEBACiAJdmlydHVhbCB+Z2xvYmFsX2FsdGVybmF0ZSgpOwogCiBwdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCXNldFBlcnNpc3RlbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbAkJCQkJCXNldFBlcnNpc3RlbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJUXVlcnlQcm9wZXJ0eShjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUpOwotCUZYX0JPT0wJCQkJCQlEb1Byb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsIENKU19Qcm9wVmFsdWUgJiB2cCwgQ0ZYX1dpZGVTdHJpbmcgJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyAmIHNFcnJvcik7CisJYm9vbAkJCQkJCVF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKTsKKwlib29sCQkJCQkJRG9Qcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDSlNfUHJvcFZhbHVlICYgdnAsIENGWF9XaWRlU3RyaW5nICYgc0Vycm9yKTsKKwlib29sCQkJCQkJRGVsUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzRXJyb3IpOwogCiAJdm9pZAkJCQkJCUluaXRpYWwoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CiAKQEAgLTU4LDcgKzU4LDcgQEAKIAl2b2lkCQkJCQkJVXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpOwogCXZvaWQJCQkJCQlDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwogCXZvaWQJCQkJCQlEZXN0cm95R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKLQlGWF9CT09MCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVzKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBpbnQgblR5cGUsCisJYm9vbAkJCQkJCVNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgaW50IG5UeXBlLAogCQkJCQkJCQkJZG91YmxlIGREYXRhLCBib29sIGJEYXRhLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEsIEpTT2JqZWN0IHBEYXRhLCBib29sIGJEZWZhdWx0UGVyc2lzdGVudCk7CiAKIAl2b2lkCQkJCQkJT2JqZWN0VG9BcnJheSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKQEAgLTc4LDcgKzc4LDcgQEAKIAlDSlNfR2xvYmFsKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwogCXZpcnR1YWwgfkNKU19HbG9iYWwodm9pZCl7fTsKIAotCXZpcnR1YWwgRlhfQk9PTAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOworCXZpcnR1YWwgYm9vbAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOwogCiAJREVDTEFSRV9TUEVDSUFMX0pTX0NMQVNTKENKU19HbG9iYWwpOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXBvcnQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oCmluZGV4IDU2Zjc0MmMuLmU1NDU4MzMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oCkBAIC0xNiw4ICsxNiw4IEBACiAJdmlydHVhbCB+UmVwb3J0KCk7CiAKIHB1YmxpYzoKLQlGWF9CT09MIHNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB3cml0ZVRleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBzYXZlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgd3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogfTsKIAogY2xhc3MgQ0pTX1JlcG9ydCA6IHB1YmxpYyBDSlNfT2JqZWN0CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgKaW5kZXggY2E0ZGIzNC4uYTJkNjc0OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaApAQCAtMTgsMTEgKzE4LDExIEBACiAJdmlydHVhbCB+dXRpbCh2b2lkKTsKIAogcHVibGljOgotCUZYX0JPT0wgcHJpbnRkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcHJpbnRmKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBieXRlVG9DaGFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcHJpbnRkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcHJpbnRmKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgcHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCWJvb2wgc2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisJYm9vbCBieXRlVG9DaGFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCiBwdWJsaWM6CiAJc3RhdGljIHZvaWQJCXByaW50ZChjb25zdCBzdGQ6OndzdHJpbmcgJmNGb3JtYXQsQ0pTX0RhdGUgRGF0ZSxib29sIGJYRkFQaWN0dXJlLCBzdGQ6OndzdHJpbmcgJmNQdXJwb3NlKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKaW5kZXggMmJmMmVlYS4uMzIyYjlkNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKQEAgLTE3LDExICsxNywxMSBAQAogCiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CiAJdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiBwcm90ZWN0ZWQ6Ci0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJbV9iTW91c2VEb3duOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9CVVRUT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oCmluZGV4IDY4MzhiYzQuLjQyNzQzNjUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaApAQCAtMTIsMTEgKzEyLDExIEBACiBzdHJ1Y3QgUFdMX0NBUkVUX0lORk8KIHsKIHB1YmxpYzoKLQlQV0xfQ0FSRVRfSU5GTygpIDogYlZpc2libGUoRkFMU0UpLCBwdEhlYWQoMCwwKSwgcHRGb290KDAsMCkKKwlQV0xfQ0FSRVRfSU5GTygpIDogYlZpc2libGUoZmFsc2UpLCBwdEhlYWQoMCwwKSwgcHRGb290KDAsMCkKIAl7CiAJfQogCi0JRlhfQk9PTAkJCQkJCWJWaXNpYmxlOworCWJvb2wJCQkJCQliVmlzaWJsZTsKIAlDUERGX1BvaW50CQkJCQlwdEhlYWQ7CiAJQ1BERl9Qb2ludAkJCQkJcHRGb290OwogfTsKQEAgLTMyLDkgKzMyLDkgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CiAJdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAl2aXJ0dWFsIHZvaWQJCQkJSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0ICogcFJlY3QgPSBOVUxMKTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKSB7fQorCXZpcnR1YWwgdm9pZAkJCQlTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpIHt9CiAJdmlydHVhbAl2b2lkCQkJCVRpbWVyUHJvYygpOwotCXZvaWQJCQkJCQlTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KTsKKwl2b2lkCQkJCQkJU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCk7CiAJQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCk7CiAJdm9pZAkJCQkJCVNldEludmFsaWRSZWN0KENQREZfUmVjdCByYykge21fcmNJbnZhbGlkID0gcmM7fQogCkBAIC00Miw3ICs0Miw3IEBACiAJdm9pZAkJCQkJCUdldENhcmV0QXBwKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0sY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KTsKIAlDUERGX1JlY3QJCQkJCUdldENhcmV0UmVjdCgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCW1fYkZsYXNoOworCWJvb2wJCQkJCQltX2JGbGFzaDsKIAlDUERGX1BvaW50CQkJCQltX3B0SGVhZDsKIAlDUERGX1BvaW50CQkJCQltX3B0Rm9vdDsKIAlGWF9GTE9BVAkJCQkJbV9mV2lkdGg7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaAppbmRleCAzZjg2MDRmLi4yMWQ0ZTRhIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgKQEAgLTI1LDEwICsyNSwxMCBAQAogCXZpcnR1YWwgfkNQV0xfQ0JMaXN0Qm94KCl7fTsKIAogcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKLQlGWF9CT09MCQkJCU9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCUZYX0JPT0wJCQkJT25DaGFyV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisJYm9vbAkJCQlPbktleURvd25XaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKwlib29sCQkJCU9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwogfTsKIAogI2RlZmluZSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRICQkxMwpAQCAtNDMsOCArNDMsOCBAQAogCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKIAl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAogfTsKIApAQCAtNTgsOCArNTgsOCBAQAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZAkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZpcnR1YWwgdm9pZAkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIApAQCAtNzEsNyArNzEsNyBAQAogCXZpcnR1YWwgdm9pZAkJCQlTZXRGb2N1cygpOwogCXZpcnR1YWwgdm9pZAkJCQlLaWxsRm9jdXMoKTsKIAotCUZYX0JPT0wJCQkJCQlJc01vZGlmaWVkKCkgY29uc3Q7CisJYm9vbAkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKIAogcHVibGljOgogCXZvaWQJCQkJCQlTZXRGaWxsZXJOb3RpZnkoSVBXTF9GaWxsZXJfTm90aWZ5KiBwTm90aWZ5KTsKQEAgLTg3LDcgKzg3LDcgQEAKIAl2b2lkCQkJCQkJR2V0RWRpdFNlbChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyICkgY29uc3Q7CiAJdm9pZAkJCQkJCUNsZWFyKCk7CiAJdm9pZAkJCQkJCVNlbGVjdEFsbCgpOwotCUZYX0JPT0wJCQkJCQlJc1BvcHVwKCkgY29uc3Q7CisJYm9vbAkJCQkJCUlzUG9wdXAoKSBjb25zdDsKIAogCXZvaWQJCQkJCQlTZXRTZWxlY3RUZXh0KCk7CiAKQEAgLTk2LDE0ICs5NiwxNCBAQAogCXZvaWQJCQkJCQlDcmVhdGVCdXR0b24oY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwogCXZvaWQJCQkJCQlDcmVhdGVMaXN0Qm94KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAotCXZvaWQJCQkJCQlTZXRQb3B1cChGWF9CT09MIGJQb3B1cCk7CisJdm9pZAkJCQkJCVNldFBvcHVwKGJvb2wgYlBvcHVwKTsKIAogcHJpdmF0ZToKIAlDUFdMX0NCRWRpdCoJCQkJbV9wRWRpdDsKIAlDUFdMX0NCQnV0dG9uKgkJCQltX3BCdXR0b247CiAJQ1BXTF9DQkxpc3RCb3gqCQkJCW1fcExpc3Q7CiAKLQlGWF9CT09MCQkJCQkJbV9iUG9wdXA7CisJYm9vbAkJCQkJCW1fYlBvcHVwOwogCUNQREZfUmVjdAkJCQkJbV9yY09sZFdpbmRvdzsKIAlpbnQzMl90CQkJCQltX25Qb3B1cFdoZXJlOwogCWludDMyX3QJCQkJCW1fblNlbGVjdEl0ZW07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgKaW5kZXggOTcxNDdhOS4uNTBlMWViZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaApAQCAtMjEsMTEgKzIxLDExIEBACiAgICAgICAgIHZpcnR1YWwgfklQV0xfRmlsbGVyX05vdGlmeSgpIHsgfQogCXZpcnR1YWwgdm9pZAkJCQkJUXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfRkxPQVQgZlBvcHVwTWluLEZYX0ZMT0FUIGZQb3B1cE1heCwKIAkJCQkJCQkJCQlpbnQzMl90ICYgblJldCwgRlhfRkxPQVQgJiBmUG9wdXBSZXQpID0gMDsgLy9uUmV0OiAoMDpib3R0b20gMTp0b3ApCi0JdmlydHVhbCB2b2lkCQkJCQlPbkJlZm9yZUtleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCisJdmlydHVhbCB2b2lkCQkJCQlPbkJlZm9yZUtleVN0cm9rZShib29sIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIGludDMyX3QgbktleUNvZGUsCiAJCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKIAkJCQkJCQkJCQlpbnQgblNlbFN0YXJ0LCBpbnQgblNlbEVuZCwKLQkJCQkJCQkJCQlGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYlJDLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkFmdGVyS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgPSAwOworCQkJCQkJCQkJCWJvb2wgYktleURvd24sIGJvb2wgJiBiUkMsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCU9uQWZ0ZXJLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiB9OwogCiBjbGFzcyBQV0xfQ0xBU1MgQ1BXTF9FZGl0IDogcHVibGljIENQV0xfRWRpdEN0cmwsIHB1YmxpYyBJRlhfRWRpdF9PcHJOb3RpZnkKQEAgLTQ0LDM1ICs0NCwzNSBAQAogCXZpcnR1YWwgdm9pZAkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CiAJdmlydHVhbCB2b2lkCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRGb2N1c1JlY3QoKSBjb25zdDsKIAogcHVibGljOgotCXZvaWQJCQkJCQkJU2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCA9IFBFQUhfTEVGVCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsJLy8wOmxlZnQgMTpyaWdodCAyOm1pZGRsZQotCXZvaWQJCQkJCQkJU2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCA9IFBFQVZfVE9QLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwkvLzA6dG9wIDE6Ym90dG9tIDI6Y2VudGVyCisJdm9pZAkJCQkJCQlTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0ID0gUEVBSF9MRUZULCBib29sIGJQYWludCA9IHRydWUpOwkvLzA6bGVmdCAxOnJpZ2h0IDI6bWlkZGxlCisJdm9pZAkJCQkJCQlTZXRBbGlnbkZvcm1hdFYoUFdMX0VESVRfQUxJR05GT1JNQVRfViBuRm9ybWF0ID0gUEVBVl9UT1AsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CS8vMDp0b3AgMTpib3R0b20gMjpjZW50ZXIKIAogCXZvaWQJCQkJCQkJU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSk7CiAJdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKTsKIAotCXZvaWQJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworCXZvaWQJCQkJCQkJU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSwgYm9vbCBiUGFpbnQgPSB0cnVlKTsKKwl2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlLCBib29sIGJQYWludCA9IHRydWUpOwogCi0Jdm9pZAkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisJdm9pZAkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIGJvb2wgYlBhaW50ID0gdHJ1ZSk7CiAKLQl2b2lkCQkJCQkJCUVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCk7CisJdm9pZAkJCQkJCQlFbmFibGVTcGVsbENoZWNrKGJvb2wgYkVuYWJsZWQpOwogCi0JRlhfQk9PTAkJCQkJCQlDYW5TZWxlY3RBbGwoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkNsZWFyKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlDYW5Db3B5KCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlDYW5DdXQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhblBhc3RlKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlDYW5TZWxlY3RBbGwoKSBjb25zdDsKKwlib29sCQkJCQkJCUNhbkNsZWFyKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlDYW5Db3B5KCkgY29uc3Q7CisJYm9vbAkJCQkJCQlDYW5DdXQoKSBjb25zdDsKKwlib29sCQkJCQkJCUNhblBhc3RlKCkgY29uc3Q7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCUNvcHlUZXh0KCk7CiAJdmlydHVhbCB2b2lkCQkJCQlQYXN0ZVRleHQoKTsKQEAgLTg1LDcgKzg1LDcgQEAKIAlDRlhfQnl0ZVN0cmluZwkJCQkJR2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3Q7CiAJQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0OwogCiAJc3RhdGljIEZYX0ZMT0FUCQkJCQlHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ1BERl9SZWN0JiByY1BsYXRlLCBpbnQzMl90IG5DaGFyQXJyYXkpOwogCkBAIC0xMTIsOCArMTEyLDggQEAKIAogcHJpdmF0ZToKIAlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKLQlGWF9CT09MCQkJCQkJCUlzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQJCQkJCVNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpOworCWJvb2wJCQkJCQkJSXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0OwogCXZvaWQJCQkJCQkJU2V0UGFyYW1CeUZsYWcoKTsKIAogCUZYX0ZMT0FUCQkJCQkJR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKGludDMyX3QgbkNoYXJBcnJheSk7CkBAIC0xMjMsMTUgKzEyMywxNSBAQAogCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKIAlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwogCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRBcmFiaWNXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9CT09MIGJMYXRpbiwgRlhfQk9PTCBiQXJhYmljKSBjb25zdDsKKwlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiTGF0aW4sIGJvb2wgYkFyYWJpYykgY29uc3Q7CiAKIAl2b2lkCQkJCQkJCUFqdXN0QXJhYmljV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKTsKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCUlzUHJvY2VlZHRvT25DaGFyKEZYX1dPUkQgbktleUNvZGUsIEZYX0RXT1JEIG5GbGFnKTsKKwlib29sCQkJCQkJCUlzUHJvY2VlZHRvT25DaGFyKEZYX1dPUkQgbktleUNvZGUsIEZYX0RXT1JEIG5GbGFnKTsKIHByaXZhdGU6CiAJSVBXTF9GaWxsZXJfTm90aWZ5KgkJCQltX3BGaWxsZXJOb3RpZnk7CiAJSVBXTF9TcGVsbENoZWNrKgkJCQltX3BTcGVsbENoZWNrOwotCUZYX0JPT0wJCQkJCQkJbV9iRm9jdXM7CisJYm9vbAkJCQkJCQltX2JGb2N1czsKIAlDUERGX1JlY3QJCQkJCQltX3JjT2xkV2luZG93OwogcHVibGljOgogCXZvaWQJCQkJCQkJQXR0YWNoRkZMRGF0YSh2b2lkKiBwRGF0YSkge21fcEZvcm1GaWxsZXIgPSBwRGF0YTt9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaAppbmRleCA5YjA4OGIxLi5lNTEyM2ZkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgKQEAgLTY4LDExICs2OCwxMSBAQAogCXZpcnR1YWwgdm9pZAkJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwogCXZpcnR1YWwgdm9pZAkJCQkJT25DcmVhdGVkKCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCXZpcnR1YWwgdm9pZAkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKQEAgLTg5LDcgKzg5LDcgQEAKIAogCUNQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlHZXRDYXJldFBvcyhpbnQzMl90JiB4LCBpbnQzMl90JiB5KSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKwlib29sCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKIAogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3Q7CiAJdm9pZAkJCQkJCQlTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLGludDMyX3QgbkVuZENoYXIpOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIAl2b2lkCQkJCQkJCVBhaW50KCk7CiAKLQl2b2lkCQkJCQkJCUVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCk7CisJdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKGJvb2wgYlJlZnJlc2gpOwogCUNQREZfUG9pbnQJCQkJCQlHZXRTY3JvbGxQb3MoKSBjb25zdDsKIAl2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKQEAgLTEyMCwzMCArMTIwLDMwIEBACiAJQ1BERl9Gb250ICoJCQkJCQlHZXRDYXJldEZvbnQoKSBjb25zdDsKIAlGWF9GTE9BVAkJCQkJCUdldENhcmV0Rm9udFNpemUoKSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuUmVkbygpIGNvbnN0OworCWJvb2wJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OworCWJvb2wJCQkJCQkJQ2FuUmVkbygpIGNvbnN0OwogCXZvaWQJCQkJCQkJUmVkbygpOwogCXZvaWQJCQkJCQkJVW5kbygpOwogCiAJdm9pZAkJCQkJCQlTZXRSZWFkeVRvSW5wdXQoKTsKIHByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCVNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpOworCXZpcnR1YWwgdm9pZAkJCQkJU2hvd1ZTY3JvbGxCYXIoYm9vbCBiU2hvdyk7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUluc2VydFJldHVybigpOwogCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKIAogCXZpcnR1YWwgdm9pZAkJCQkJU2V0Q3Vyc29yKCk7Ci0JRlhfQk9PTAkJCQkJCQlJc1duZEhvclYoKTsKKwlib29sCQkJCQkJCUlzV25kSG9yVigpOwogCiAJdm9pZAkJCQkJCQlEZWxldGUoKTsKIAl2b2lkCQkJCQkJCUJhY2tzcGFjZSgpOwogCiBwcm90ZWN0ZWQ6CiAJdm9pZAkJCQkJCQlHZXRDYXJldEluZm8oQ1BERl9Qb2ludCAmIHB0SGVhZCwgQ1BERl9Qb2ludCAmIHB0Rm9vdCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KTsKKwl2b2lkCQkJCQkJCVNldENhcmV0KGJvb2wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpOwogCi0Jdm9pZAkJCQkJCQlTZXRFZGl0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSk7CisJdm9pZAkJCQkJCQlTZXRFZGl0Q2FyZXQoYm9vbCBiVmlzaWJsZSk7CiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LApAQCAtMTU0LDcgKzE1NCw3IEBACiAJCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCk7CiAJdmlydHVhbCB2b2lkCQkJCQlJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KXt9CiAJdmlydHVhbCB2b2lkCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOworCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CiAJdmlydHVhbCB2b2lkCQkJCQlJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzICYgc2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgd29yZFByb3BzKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUlPbkNvbnRlbnRDaGFuZ2UoY29uc3QgQ1BERl9SZWN0JiByY0NvbnRlbnQpOwogCXZpcnR1YWwgdm9pZAkJCQkJSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0ICogcFJlY3QpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiBwcm90ZWN0ZWQ6CiAJSUZYX0VkaXQqCQkJCQkJbV9wRWRpdDsKIAlDUFdMX0NhcmV0KgkJCQkJCW1fcEVkaXRDYXJldDsKLQlGWF9CT09MCQkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJCW1fYk1vdXNlRG93bjsKIAlJUFdMX0VkaXRfTm90aWZ5KgkJCQltX3BFZGl0Tm90aWZ5OwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oCmluZGV4IGQzMmNjOTMuLmU0YmJiZjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmgKQEAgLTg1LDcgKzg1LDcgQEAKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCQlHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KTsKIAogCUNQREZfRm9udCoJCQkJCQkJCQlBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCB1aW50OF90IG5DaGFyc2V0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCQkJCQkJSXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CisJc3RhdGljIGJvb2wJCQkJCQkJCUlzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwogCUNQREZfRm9udCoJCQkJCQkJCQlBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CiAJQ1BERl9Gb250KgkJCQkJCQkJCUFkZFN5c3RlbUZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKIAkJCQkJCQkJCQkJCQl1aW50OF90IG5DaGFyc2V0KTsKQEAgLTkzLDEyICs5MywxMiBAQAogcHJvdGVjdGVkOgogCXZpcnR1YWwgQ1BERl9Gb250KgkJCQkJCQlGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCBpbnQzMl90IG5DaGFyc2V0KTsKIAl2aXJ0dWFsIHZvaWQJCQkJCQkJCUFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcyk7Ci0JRlhfQk9PTAkJCQkJCQkJCQlLbm93V29yZChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCk7CisJYm9vbAkJCQkJCQkJCQlLbm93V29yZChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCk7CiAKIAl2aXJ0dWFsIENQREZfRG9jdW1lbnQqCQkJCQkJR2V0RG9jdW1lbnQoKTsKIAogCXZvaWQJCQkJCQkJCQkJRW1wdHkoKTsKLQlpbnQzMl90CQkJCQkJCQkJR2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQsIEZYX0JPT0wgYkZpbmQpOworCWludDMyX3QJCQkJCQkJCQlHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgYm9vbCBiRmluZCk7CiAJaW50MzJfdAkJCQkJCQkJCUdldFBXTEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOwogCWludDMyX3QJCQkJCQkJCQlBZGRGb250RGF0YShDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaAppbmRleCA0NGE1YzBjLi5iNjMzMWI2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oCkBAIC00Niw5ICs0Niw5IEBACiAJdmlydHVhbCB2b2lkCQkJCQlHZXRJbWFnZU9mZnNldChGWF9GTE9BVCAmIHgsRlhfRkxPQVQgJiB5KTsKIAogCWludDMyX3QJCQkJCQlHZXRTY2FsZU1ldGhvZCgpOwotCUZYX0JPT0wJCQkJCQkJSXNQcm9wb3J0aW9uYWxTY2FsZSgpOworCWJvb2wJCQkJCQkJSXNQcm9wb3J0aW9uYWxTY2FsZSgpOwogCXZvaWQJCQkJCQkJR2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUICYgZkxlZnQsIEZYX0ZMT0FUICYgZkJvdHRvbSk7Ci0JRlhfQk9PTAkJCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7CisJYm9vbAkJCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7CiAKIAl2b2lkCQkJCQkJCVNldEljb25GaXQoQ1BERl9JY29uRml0ICogcEljb25GaXQpe21fcEljb25GaXQgPSBwSWNvbkZpdDt9OwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuaAppbmRleCAyZjZiMzIzLi4zYzcxZTU3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmgKQEAgLTM0LDggKzM0LDggQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAJdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwogCi0Jdm9pZAkJCQkJCQkJU2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKTsKLQlGWF9CT09MCQkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CisJdm9pZAkJCQkJCQkJU2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKTsKKwlib29sCQkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7CiAJdm9pZAkJCQkJCQkJU2V0RGF0YSh2b2lkKiBwRGF0YSk7CiAJdm9pZAkJCQkJCQkJU2V0SWNvbihpbnQzMl90IG5JY29uSW5kZXgpOwogCXZvaWQJCQkJCQkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CkBAIC01Miw3ICs1Miw3IEBACiBwcml2YXRlOgogCWludDMyX3QJCQkJCQkJbV9uSWNvbkluZGV4OwogCXZvaWQqCQkJCQkJCQltX3BEYXRhOwotCUZYX0JPT0wJCQkJCQkJCW1fYlNlbGVjdGVkOworCWJvb2wJCQkJCQkJCW1fYlNlbGVjdGVkOwogCUNQV0xfTGFiZWwqCQkJCQkJCW1fcFRleHQ7CiAJQ1BXTF9Db2xvcgkJCQkJCQltX2NySWNvbjsKIH07CkBAIC02Niw3ICs2Niw3IEBACiAJdm9pZAkJCQkJCQkJU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKIAlpbnQzMl90CQkJCQkJCUdldFNlbGVjdCgpIGNvbnN0OwogCXZvaWQJCQkJCQkJCVNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7CisJdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KGJvb2wgYk5vdGlmeSk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSk7CiAJdm9pZAkJCQkJCQkJU2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LCBpbnQzMl90IG5JY29uSW5kZXgpOwogCXZvaWQJCQkJCQkJCVNldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKQEAgLTc3LDIwICs3NywyMCBAQAogCiBwcm90ZWN0ZWQ6CiAJdmlydHVhbCB2b2lkCQkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKIHByaXZhdGU6CiAJQ1BXTF9JY29uTGlzdF9JdGVtKgkJCQkJR2V0TGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKLQl2b2lkCQkJCQkJCQlTZWxlY3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0KTsKKwl2b2lkCQkJCQkJCQlTZWxlY3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0KTsKIAlpbnQzMl90CQkJCQkJCUZpbmRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JRlhfQk9PTAkJCQkJCQkJbV9uU2VsZWN0SW5kZXg7CisJYm9vbAkJCQkJCQkJbV9uU2VsZWN0SW5kZXg7CiAJSVBXTF9JY29uTGlzdF9Ob3RpZnkqCQkJCW1fcE5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCQltX2JFbmFibGVOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iTW91c2VEb3duOworCWJvb2wJCQkJCQkJCW1fYkVuYWJsZU5vdGlmeTsKKwlib29sCQkJCQkJCQltX2JNb3VzZURvd247CiAJaW50MzJfdAkJCQkJCQltX25MaXN0Q291bnQ7CiB9OwogCkBAIC0xMDAsMTMgKzEwMCwxMyBAQAogCUNQV0xfSWNvbkxpc3QoaW50MzJfdCBuTGlzdENvdW50KTsKIAl2aXJ0dWFsIH5DUFdMX0ljb25MaXN0KCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZvaWQJCQkJCQkJCVNldFNlbGVjdChpbnQzMl90IG5JbmRleCk7CiAJdm9pZAkJCQkJCQkJU2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCk7CiAJaW50MzJfdAkJCQkJCQlHZXRTZWxlY3QoKSBjb25zdDsKIAl2b2lkCQkJCQkJCQlTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOworCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpOwogCXZvaWQJCQkJCQkJCVNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOwogCXZvaWQJCQkJCQkJCVNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KTsKIAl2b2lkCQkJCQkJCQlTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKaW5kZXggOTdhNDUyOS4uNDNkNjBhMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaApAQCAtMjksNyArMjksNyBAQAogCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApOwogCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCl7fQogCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7Ci0Jdm9pZAkJCQkJCQlJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKwl2b2lkCQkJCQkJCUlPblNldENhcmV0KGJvb2wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOwogCXZvaWQJCQkJCQkJSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyAmIHNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIHdvcmRQcm9wcyk7CiAJdm9pZAkJCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCk7CiAKQEAgLTQ5LDEyICs0OSwxMiBAQAogCXZpcnR1YWwgdm9pZAkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CiAJdmlydHVhbCB2b2lkCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCUtpbGxGb2N1cygpOwogCiAJdmlydHVhbCB2b2lkCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKQEAgLTY0LDcgKzY0LDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAJdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJFeGl0ICwgRlhfRFdPUkQgbkZsYWcpOworCXZvaWQJCQkJCQkJT25Ob3RpZnlTZWxDaGFuZ2VkKGJvb2wgYktleURvd24sIGJvb2wgJiBiRXhpdCAsIEZYX0RXT1JEIG5GbGFnKTsKIAogCXZvaWQJCQkJCQkJQWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOwogCXZvaWQJCQkJCQkJU2V0VG9wVmlzaWJsZUluZGV4KGludDMyX3Qgbkl0ZW1JbmRleCk7CkBAIC03MywxMyArNzMsMTMgQEAKIAl2b2lkCQkJCQkJCVJlc2V0KCk7CiAJdm9pZAkJCQkJCQlTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKIAl2b2lkCQkJCQkJCVNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlTZXRIb3ZlclNlbChGWF9CT09MIGJIb3ZlclNlbCk7CisJdm9pZAkJCQkJCQlTZXRIb3ZlclNlbChib29sIGJIb3ZlclNlbCk7CiAKIAlpbnQzMl90CQkJCQkJR2V0Q291bnQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKKwlib29sCQkJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKIAlpbnQzMl90CQkJCQkJR2V0Q2FyZXRJbmRleCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRDdXJTZWwoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKIAlpbnQzMl90CQkJCQkJRmluZE5leHQoaW50MzJfdCBuSW5kZXgsRlhfV0NIQVIgbkNoYXIpIGNvbnN0OwogCUNQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7CkBAIC05MSw4ICs5MSw4IEBACiBwcm90ZWN0ZWQ6CiAJSUZYX0xpc3QqCQkJCQkJbV9wTGlzdDsKIAlDUFdMX0xpc3RfTm90aWZ5KgkJCQltX3BMaXN0Tm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJbV9iTW91c2VEb3duOwotCUZYX0JPT0wJCQkJCQkJbV9iSG92ZXJTZWw7CisJYm9vbAkJCQkJCQltX2JNb3VzZURvd247CisJYm9vbAkJCQkJCQltX2JIb3ZlclNlbDsKIAlJUFdMX0ZpbGxlcl9Ob3RpZnkqCQkJCW1fcEZpbGxlck5vdGlmeTsKIHB1YmxpYzoKIAl2b2lkCQkJCQkJCUF0dGFjaEZGTERhdGEodm9pZCogcERhdGEpIHttX3BGb3JtRmlsbGVyID0gcERhdGE7fQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmgKaW5kZXggYzEwN2EwYy4uM2JlZWUxOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oCkBAIC0zNSw3ICszNSw3IEBACiAJdmlydHVhbCB2b2lkCQkJCQkJRHJhd0NoaWxkQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAogcHJpdmF0ZToKLQl2b2lkCQkJCQkJCQlSZXNldEFsbChGWF9CT09MIGJNb3ZlLGludDMyX3QgblN0YXJ0KTsKKwl2b2lkCQkJCQkJCQlSZXNldEFsbChib29sIGJNb3ZlLGludDMyX3QgblN0YXJ0KTsKIAogCUNQREZfUmVjdAkJCQkJCQltX3JjQ29udGVudDsKIAlDUERGX1BvaW50CQkJCQkJCW1fcHRTY3JvbGw7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmgKaW5kZXggYTYwZWJhMy4uYjFlNjFjNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTm90ZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaApAQCAtMzMsOCArMzMsOCBAQAogcHVibGljOgogCXZpcnR1YWwgfklQV0xfTm90ZU5vdGlmeSgpIHsgfQogCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZU1vdmUoY29uc3QgRlhfUkVDVCYgcnRXaW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVTaG93KEZYX0JPT0wgYlNob3cpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVBY3RpdmF0ZShGWF9CT09MIGJBY3RpdmUpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVTaG93KGJvb2wgYlNob3cpID0gMDsKKwl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVBY3RpdmF0ZShib29sIGJBY3RpdmUpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVDbG9zZSgpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlPbkl0ZW1DcmVhdGUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlPbkl0ZW1EZWxldGUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKQEAgLTEwNywxMSArMTA3LDExIEBACiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiBwcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJCQltX2JNb3VzZURvd247CiB9OwogCiBjbGFzcyBDUFdMX05vdGVfTEJCb3ggOiBwdWJsaWMgQ1BXTF9XbmQKQEAgLTE0MCw3ICsxNDAsNyBAQAogCUNQV0xfTm90ZV9FZGl0KCk7CiAJdmlydHVhbCB+Q1BXTF9Ob3RlX0VkaXQoKTsKIAotCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGUpIHttX2JFbmFibGVOb3RpZnkgPSBiRW5hYmxlO30KKwl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoYm9vbCBiRW5hYmxlKSB7bV9iRW5hYmxlTm90aWZ5ID0gYkVuYWJsZTt9CiAJdmlydHVhbCBGWF9GTE9BVAkJCQkJR2V0SXRlbUhlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCk7CiAJRlhfRkxPQVQJCQkJCQkJR2V0SXRlbUxlZnRNYXJnaW4oKTsKIAlGWF9GTE9BVAkJCQkJCQlHZXRJdGVtUmlnaHRNYXJnaW4oKTsKQEAgLTE1NCw5ICsxNTQsOSBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCU9uS2lsbEZvY3VzKCk7CiAKIHByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCQkJbV9iRW5hYmxlTm90aWZ5OworCWJvb2wJCQkJCQkJCW1fYkVuYWJsZU5vdGlmeTsKIAlGWF9GTE9BVAkJCQkJCQltX2ZPbGRJdGVtSGVpZ2h0OwotCUZYX0JPT0wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOworCWJvb2wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOwogCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZE1pbjsKIAlGWF9GTE9BVAkJCQkJCQltX2ZPbGRNYXg7CiB9OwpAQCAtMTg4LDkgKzE4OCw5IEBACiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJCQlTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCk7CisJdm9pZAkJCQkJCQkJU2V0RWRpdEZvY3VzKGJvb2wgYkxhc3QpOwogCUNQV0xfRWRpdCoJCQkJCQkJR2V0RWRpdCgpIGNvbnN0OwogCiBwdWJsaWM6CkBAIC0yMDMsOCArMjAzLDggQEAKIAlJUFdMX05vdGVJdGVtKgkJCQkJCUdldFN1Ykl0ZW1zKGludDMyX3QgaW5kZXgpIGNvbnN0OwogCiAJdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKTsKLQl2b2lkCQkJCQkJCQlFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCk7CisJdm9pZAkJCQkJCQkJRW5hYmxlUmVhZChib29sIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVNb2RpZnkoYm9vbCBiRW5hYmxlZCk7CiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAl2aXJ0dWFsIGludDMyX3QJCQkJCUNvdW50U3ViSXRlbXMoKSBjb25zdDsKIAl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFN1Ykl0ZW1zKGludDMyX3QgaW5kZXgpIGNvbnN0OwogCXZpcnR1YWwgdm9pZAkJCQkJCURlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRGb2N1cygpe1NldE5vdGVGb2N1cyhGQUxTRSk7fQorCXZpcnR1YWwgdm9pZAkJCQkJCVNldEZvY3VzKCl7U2V0Tm90ZUZvY3VzKGZhbHNlKTt9CiAKIAl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFBhcmVudEl0ZW0oKSBjb25zdDsKIAl2aXJ0dWFsIHZvaWQqCQkJCQkJR2V0UHJpdmF0ZURhdGEoKSBjb25zdDsKQEAgLTI0MCwxOSArMjQwLDE5IEBACiAJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRDb250ZW50cygpIGNvbnN0OwogCXZpcnR1YWwgRlhfU1lTVEVNVElNRQkJCQlHZXREYXRlVGltZSgpIGNvbnN0OwogCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0U3ViamVjdE5hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7IHJldHVybiBGQUxTRTt9CisJdmlydHVhbCBib29sCQkJCQkJSXNUb3BJdGVtKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7fQogCXZpcnR1YWwgQ1BXTF9FZGl0KgkJCQkJR2V0RWRpdCgpIGNvbnN0OwogCiBwdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwogCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0SGl0Tm90ZUl0ZW0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0Rm9jdXNlZE5vdGVJdGVtKCkgY29uc3Q7CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZXNldFN1YmplY3ROYW1lKGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKTsKLQl2b2lkCQkJCQkJCQlFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCk7CisJdm9pZAkJCQkJCQkJRW5hYmxlUmVhZChib29sIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVNb2RpZnkoYm9vbCBiRW5hYmxlZCk7CiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAlDUFdMX05vdGVJdGVtKgkJCQkJCUNyZWF0ZU5vdGVJdGVtKCk7CiAJQ1BXTF9Ob3RlSXRlbSoJCQkJCQlHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJU2V0Tm90ZUZvY3VzKEZYX0JPT0wgYkxhc3QpOworCXZvaWQJCQkJCQkJCVNldE5vdGVGb2N1cyhib29sIGJMYXN0KTsKIAl2b2lkCQkJCQkJCQlPbkNvbnRlbnRzVmFsaWRhdGUoKTsKIAogCXZvaWQJCQkJCQkJCU9uQ3JlYXRlTm90ZUl0ZW0oKTsKQEAgLTI4OSw4ICsyODksOCBAQAogCUNGWF9XaWRlU3RyaW5nCQkJCQkJbV9zQXV0aG9yOwogCiAJRlhfRkxPQVQJCQkJCQkJbV9mT2xkSXRlbUhlaWdodDsKLQlGWF9CT09MCQkJCQkJCQltX2JTaXplQ2hhbmdlZDsKLQlGWF9CT09MCQkJCQkJCQltX2JBbGxvd01vZGlmeTsKKwlib29sCQkJCQkJCQltX2JTaXplQ2hhbmdlZDsKKwlib29sCQkJCQkJCQltX2JBbGxvd01vZGlmeTsKIH07CiAKIGNsYXNzIFBXTF9DTEFTUyBDUFdMX05vdGUgOiBwdWJsaWMgQ1BXTF9Ob3RlSXRlbQpAQCAtMzA1LDE3ICszMDUsMTcgQEAKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldEF1dGhvck5hbWUoKSBjb25zdDsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCQlSZXNldFN1YmplY3ROYW1lKGludDMyX3Qgbkl0ZW1JbmRleCl7fQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCUlzVG9wSXRlbSgpIGNvbnN0IHtyZXR1cm4gVFJVRTt9CisJdmlydHVhbCBib29sCQkJCQkJSXNUb3BJdGVtKCkgY29uc3Qge3JldHVybiB0cnVlO30KIAl2aXJ0dWFsIGNvbnN0IENQV0xfTm90ZSoJCQlHZXROb3RlKCkgY29uc3Q7CiAJdmlydHVhbCBJUFdMX05vdGVOb3RpZnkqCQkJR2V0Tm90ZU5vdGlmeSgpIGNvbnN0OwogCiBwdWJsaWM6CiAJSVBXTF9Ob3RlSXRlbSoJCQkJCQlSZXBseSgpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoYm9vbCBiRW5hYmxlZCk7CiAJdm9pZAkJCQkJCQkJU2V0SWNvblR5cGUoaW50MzJfdCBuVHlwZSk7CiAJdm9pZAkJCQkJCQkJU2V0T3B0aW9uc1RleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKKwl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKGJvb2wgYkVuYWJsZWQpOworCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShib29sIGJFbmFibGVkKTsKIAogCUNGWF9XaWRlU3RyaW5nCQkJCQkJR2V0UmVwbHlTdHJpbmcoKSBjb25zdDsKIAl2b2lkCQkJCQkJCQlTZXRSZXBseVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKQEAgLTMyNiw5ICszMjYsOSBAQAogCUlQb3B1cF9Ob3RlKgkJCQkJCUdldFBvcHVwTm90ZSgpIGNvbnN0IHtyZXR1cm4gbV9wUG9wdXBOb3RlO30KIAogcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAogcHJvdGVjdGVkOgogCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKQEAgLTMzNiw5ICszMzYsOSBAQAogCiAJdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKLQlGWF9CT09MCQkJCQkJCQlSZXNldFNjcm9sbEJhcigpOworCWJvb2wJCQkJCQkJCVJlc2V0U2Nyb2xsQmFyKCk7CiAJdm9pZAkJCQkJCQkJUmVQb3NOb3RlQ2hpbGRyZW4oKTsKLQlGWF9CT09MCQkJCQkJCQlTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCk7CisJYm9vbAkJCQkJCQkJU2Nyb2xsQmFyU2hvdWxkVmlzaWJsZSgpOwogCiBwcml2YXRlOgogCUNQV0xfTGFiZWwqCQkJCQkJCW1fcEF1dGhvcjsKQEAgLTM0OSwxMCArMzQ5LDEwIEBACiAJQ1BXTF9TY3JvbGxCYXIqCQkJCQkJbV9wQ29udGVudHNCYXI7CiAJQ1BXTF9Ob3RlX09wdGlvbnMqCQkJCQltX3BPcHRpb25zOwogCUlQV0xfTm90ZU5vdGlmeSoJCQkJCW1fcE5vdGVOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iUmVzaXppbmc7CisJYm9vbAkJCQkJCQkJbV9iUmVzaXppbmc7CiAJUFdMX1NDUk9MTF9JTkZPCQkJCQkJbV9PbGRTY3JvbGxJbmZvOwogCUNQREZfUmVjdAkJCQkJCQltX3JjQ2FwdGlvbjsKLQlGWF9CT09MCQkJCQkJCQltX2JFbmFsYmxlTm90aWZ5OworCWJvb2wJCQkJCQkJCW1fYkVuYWxibGVOb3RpZnk7CiAJSVBvcHVwX05vdGUqCQkJCQkJbV9wUG9wdXBOb3RlOwogCUNGWF9XaWRlU3RyaW5nCQkJCQkJbV9zUmVwbHlTdHJpbmc7CiB9OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaAppbmRleCAwMzkwMjIyLi40NzM1OTIyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaApAQCAtNDksMTUgKzQ5LDE1IEBACiAJdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKIAl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CiAJdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKIHByb3RlY3RlZDoKIAlQV0xfU0NST0xMQkFSX1RZUEUJCQltX2VTY3JvbGxCYXJUeXBlOwogCVBXTF9TQkJVVFRPTl9UWVBFCQkJbV9lU0JCdXR0b25UeXBlOwogCi0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKKwlib29sCQkJCQkJbV9iTW91c2VEb3duOwogfTsKIAogc3RydWN0IFBXTF9GTE9BVFJBTkdFCkBAIC02Nyw3ICs2Nyw3IEBACiAJUFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCk7CiAJdm9pZCBEZWZhdWx0KCk7CiAJdm9pZCBTZXQoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCk7Ci0JRlhfQk9PTAlJbihGWF9GTE9BVCB4KSBjb25zdDsKKwlib29sCUluKEZYX0ZMT0FUIHgpIGNvbnN0OwogCUZYX0ZMT0FUIEdldFdpZHRoKCkgY29uc3Q7CiAKIAlGWF9GTE9BVCBmTWluLGZNYXg7CkBAIC04Myw3ICs4Myw3IEBACiAJdm9pZCBTZXRDbGllbnRXaWR0aChGWF9GTE9BVCB3aWR0aCk7CiAJdm9pZCBTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCk7CiAJdm9pZCBTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApOwotCUZYX0JPT0wgU2V0UG9zKEZYX0ZMT0FUIHBvcyk7CisJYm9vbCBTZXRQb3MoRlhfRkxPQVQgcG9zKTsKIAogCXZvaWQgQWRkU21hbGwoKTsKIAl2b2lkIFN1YlNtYWxsKCk7CkBAIC0xMTAsOCArMTEwLDggQEAKIAl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CiAJdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAJdmlydHVhbCB2b2lkCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwogCiAJdmlydHVhbCB2b2lkCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKQEAgLTExOSwxMiArMTE5LDEyIEBACiAJRlhfRkxPQVQJCQkJCUdldFNjcm9sbEJhcldpZHRoKCkgY29uc3Q7CiAJUFdMX1NDUk9MTEJBUl9UWVBFCQkJR2V0U2Nyb2xsQmFyVHlwZSgpIGNvbnN0IHtyZXR1cm4gbV9zYlR5cGU7fTsKIAotCXZvaWQJCQkJCQlTZXROb3RpZnlGb3JldmVyKEZYX0JPT0wgYkZvcmV2ZXIpIHttX2JOb3RpZnlGb3JldmVyID0gYkZvcmV2ZXI7fQorCXZvaWQJCQkJCQlTZXROb3RpZnlGb3JldmVyKGJvb2wgYkZvcmV2ZXIpIHttX2JOb3RpZnlGb3JldmVyID0gYkZvcmV2ZXI7fQogCiBwcm90ZWN0ZWQ6CiAJdm9pZAkJCQkJCVNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIGZNaW4sRlhfRkxPQVQgZk1heCxGWF9GTE9BVCBmQ2xpZW50V2lkdGgpOwogCXZvaWQJCQkJCQlTZXRTY3JvbGxQb3MoRlhfRkxPQVQgZlBvcyk7Ci0Jdm9pZAkJCQkJCU1vdmVQb3NCdXR0b24oRlhfQk9PTCBiUmVmcmVzaCk7CisJdm9pZAkJCQkJCU1vdmVQb3NCdXR0b24oYm9vbCBiUmVmcmVzaCk7CiAJdm9pZAkJCQkJCVNldFNjcm9sbFN0ZXAoRlhfRkxPQVQgZkJpZ1N0ZXAsRlhfRkxPQVQgZlNtYWxsU3RlcCk7CiAJdm9pZAkJCQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCUNQREZfUmVjdAkJCQkJR2V0U2Nyb2xsQXJlYSgpIGNvbnN0OwpAQCAtMTU2LDkgKzE1Niw5IEBACiAJQ1BXTF9TQkJ1dHRvbioJCQkJbV9wTWF4QnV0dG9uOwogCUNQV0xfU0JCdXR0b24qCQkJCW1fcFBvc0J1dHRvbjsKIAlQV0xfU0NST0xMX1BSSVZBVEVEQVRBCQltX3NEYXRhOwotCUZYX0JPT0wJCQkJCQltX2JNb3VzZURvd247Ci0JRlhfQk9PTAkJCQkJCW1fYk1pbk9yTWF4OwotCUZYX0JPT0wJCQkJCQltX2JOb3RpZnlGb3JldmVyOworCWJvb2wJCQkJCQltX2JNb3VzZURvd247CisJYm9vbAkJCQkJCW1fYk1pbk9yTWF4OworCWJvb2wJCQkJCQltX2JOb3RpZnlGb3JldmVyOwogCUZYX0ZMT0FUCQkJCQltX25PbGRQb3M7CiAJRlhfRkxPQVQJCQkJCW1fZk9sZFBvc0J1dHRvbjsKIH07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oCmluZGV4IGM5NDUyNzcuLmM1NTU3ZDYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oCkBAIC00Myw5ICs0Myw5IEBACiAJdm9pZAkJCQkJCQkJU2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKTsKIAl2b2lkCQkJCQkJCQlTZXRJbWFnZVN0cmVhbShDUERGX1N0cmVhbSAqIHBTdHJlYW0sIGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKTsKIAotCXZvaWQJCQkJCQkJCVNldFRleHRGbGFnKEZYX0JPT0wgYlRleHRFeGlzdCk7Ci0Jdm9pZAkJCQkJCQkJU2V0SW1hZ2VGbGFnKEZYX0JPT0wgYkltYWdlRXhpc3QpOwotCXZvaWQJCQkJCQkJCVNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpOworCXZvaWQJCQkJCQkJCVNldFRleHRGbGFnKGJvb2wgYlRleHRFeGlzdCk7CisJdm9pZAkJCQkJCQkJU2V0SW1hZ2VGbGFnKGJvb2wgYkltYWdlRXhpc3QpOworCXZvaWQJCQkJCQkJCVNldEZveGl0RmxhZyhib29sIGJGbGFnRXhpc3QpOwogCiBwcm90ZWN0ZWQ6CiAJdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwpAQCAtNTksOSArNTksOSBAQAogCUNQV0xfTGFiZWwqCQkJCQkJCW1fcERlc2NyaXB0aW9uOwogCUNQV0xfU2lnbmF0dXJlX0ltYWdlKgkJCQltX3BJbWFnZTsKIAotCUZYX0JPT0wJCQkJCQkJCW1fYlRleHRFeGlzdDsKLQlGWF9CT09MCQkJCQkJCQltX2JJbWFnZUV4aXN0OwotCUZYX0JPT0wJCQkJCQkJCW1fYkZsYWdFeGlzdDsKKwlib29sCQkJCQkJCQltX2JUZXh0RXhpc3Q7CisJYm9vbAkJCQkJCQkJbV9iSW1hZ2VFeGlzdDsKKwlib29sCQkJCQkJCQltX2JGbGFnRXhpc3Q7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1NJR05BVFVSRV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oCmluZGV4IGY2NjU5ZGYuLjE0ZTU3NmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgKQEAgLTI2LDE0ICsyNiwxNCBAQAogCXZpcnR1YWwgfkNQV0xfQ2hlY2tCb3goKTsKIAogCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOwotCUZYX0JPT0wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKKwl2b2lkCQkJCQkJU2V0Q2hlY2soYm9vbCBiQ2hlY2spOworCWJvb2wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKIAogcHJpdmF0ZToKLQlGWF9CT09MCQkJCQkJbV9iQ2hlY2tlZDsKKwlib29sCQkJCQkJbV9iQ2hlY2tlZDsKIH07CiAKIGNsYXNzIFBXTF9DTEFTUyBDUFdMX1JhZGlvQnV0dG9uIDogcHVibGljIENQV0xfQnV0dG9uCkBAIC00MywxNCArNDMsMTQgQEAKIAl2aXJ0dWFsIH5DUFdMX1JhZGlvQnV0dG9uKCk7CiAKIAl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwogCi0Jdm9pZAkJCQkJCVNldENoZWNrKEZYX0JPT0wgYkNoZWNrKTsKLQlGWF9CT09MCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7CisJdm9pZAkJCQkJCVNldENoZWNrKGJvb2wgYkNoZWNrKTsKKwlib29sCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCW1fYkNoZWNrZWQ7CisJYm9vbAkJCQkJCW1fYkNoZWNrZWQ7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1NQRUNJQUxCVVRUT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oCmluZGV4IDJkYTBmNDIuLmYxZTM0YzkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaApAQCAtMTA5LDggKzEwOSw4IEBACiBwdWJsaWM6CiAJc3RhdGljIENQREZfUmVjdAkJCQkJCUluZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSk7CiAJc3RhdGljIENQREZfUmVjdAkJCQkJCURlZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSk7Ci0Jc3RhdGljIEZYX0JPT0wJCQkJCQkJSW50ZXJzZWN0UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QxLCBjb25zdCBDUERGX1JlY3QmIHJlY3QyKTsKLQlzdGF0aWMgRlhfQk9PTAkJCQkJCQlDb250YWluc1JlY3QoY29uc3QgQ1BERl9SZWN0JiByY1BhcmVudCwgY29uc3QgQ1BERl9SZWN0JiByY0NoaWxkKTsKKwlzdGF0aWMgYm9vbAkJCQkJCQlJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpOworCXN0YXRpYyBib29sCQkJCQkJCUNvbnRhaW5zUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUGFyZW50LCBjb25zdCBDUERGX1JlY3QmIHJjQ2hpbGQpOwogCXN0YXRpYyBDUERGX1JlY3QJCQkJCQlTY2FsZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsRlhfRkxPQVQgZlNjYWxlKTsKIAlzdGF0aWMgQ1BWVF9Xb3JkUmFuZ2UJCQkJCU92ZXJsYXBXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMSwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMik7CiAJc3RhdGljIENQREZfUmVjdAkJCQkJCUdldENlbnRlclNxdWFyZShjb25zdCBDUERGX1JlY3QgJiByZWN0KTsKQEAgLTEyMCwxMCArMTIwLDEwIEBACiAJc3RhdGljIENQREZfUmVjdAkJCQkJCU9mZnNldFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpOwogCXN0YXRpYyBDUERGX1BvaW50CQkJCQkJT2Zmc2V0UG9pbnQoY29uc3QgIENQREZfUG9pbnQgJiBwb2ludCxGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpOwogCXN0YXRpYyBGWF9DT0xPUlJFRgkJCQkJCVBXTENvbG9yVG9GWENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLCBpbnQzMl90IG5UcmFuc3BhcmFuY3kgPSAyNTUpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCUlzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKwlzdGF0aWMgYm9vbAkJCQkJCQlJc0JsYWNrT3JXaGl0ZShjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CiAJc3RhdGljIENQV0xfQ29sb3IJCQkJCQlHZXRSZXZlcnNlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwogCi0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRDb2xvckFwcFN0cmVhbShjb25zdCBDUFdMX0NvbG9yICYgY29sb3IsY29uc3QgRlhfQk9PTCAmIGJGaWxsT3JTdHJva2UgPSBUUlVFKTsKKwlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSA9IHRydWUpOwogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0Qm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKIAkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BXTF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCiAJCQkJCQkJCQkJCQlpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BXTF9EYXNoICYgZGFzaCk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7CiAKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEVkaXRBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlID0gTlVMTCwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cyA9IFRSVUUsIEZYX1dPUkQgU3ViV29yZCA9IDApOworCQkJCQkJCQkJCQkJCQlib29sIGJDb250aW51b3VzID0gdHJ1ZSwgRlhfV09SRCBTdWJXb3JkID0gMCk7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRFZGl0U2VsQXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LAogCQkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSA9IE5VTEwpOwogCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U3BlbGxDaGVja0FwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2ssCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgPSBOVUxMKTsKIAlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFRleHRBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCwKIAkJCQkJCQkJCQkJCQkJY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzVGV4dCwgaW50MzJfdCBuQWxpZ25tZW50SCwgaW50MzJfdCBuQWxpZ25tZW50ViwKLQkJCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJNdWx0aUxpbmUsIEZYX0JPT0wgYkF1dG9SZXR1cm4sIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOworCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYk11bHRpTGluZSwgYm9vbCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7CiAJc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXREcm9wQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCk7CiAKIAlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0ZpbGxSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RmlsbEFyZWEoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9Qb2ludCogcFB0cywgaW50MzJfdCBuQ291bnQsIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcik7CiAJc3RhdGljIHZvaWQJCQkJCQkJCURyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiVmVydGljYWwsIEZYX0JPT0wgYkhvcml6b250YWwsIENQREZfUmVjdCByZWN0LAorCQkJCQkJCQkJCQkJCQlib29sIGJWZXJ0aWNhbCwgYm9vbCBiSG9yaXpvbnRhbCwgQ1BERl9SZWN0IHJlY3QsCiAJCQkJCQkJCQkJCQkJCWludDMyX3QgblRyYW5zcGFyYW5jeSwgaW50MzJfdCBuU3RhcnRHcmF5LCBpbnQzMl90IG5FbmRHcmF5KTsKIAlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0VkaXRTcGVsbENoZWNrKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwKIAkJCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaAppbmRleCBjNWI2Y2E0Li4zYjFkMjk5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaApAQCAtMTM3LDcgKzEzNyw3IEBACiAJRlhfRkxPQVQJCQkJCWZDb2xvcjEsZkNvbG9yMixmQ29sb3IzLGZDb2xvcjQ7CiB9OwogCi1pbmxpbmUgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ1BXTF9Db2xvciAmYzEsIGNvbnN0IENQV0xfQ29sb3IgJmMyKQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IENQV0xfQ29sb3IgJmMxLCBjb25zdCBDUFdMX0NvbG9yICZjMikKIHsKIAlyZXR1cm4gYzEubkNvbG9yVHlwZSA9PSBjMi5uQ29sb3JUeXBlICYmCiAJCWMxLmZDb2xvcjEgLSBjMi5mQ29sb3IxIDwgMC4wMDAxICYmIGMxLmZDb2xvcjEgLSBjMi5mQ29sb3IxID4gLTAuMDAwMSAmJgpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCWMxLmZDb2xvcjQgLSBjMi5mQ29sb3I0IDwgMC4wMDAxICYmIGMxLmZDb2xvcjQgLSBjMi5mQ29sb3I0ID4gLTAuMDAwMTsKIH0KIAotaW5saW5lIEZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENQV0xfQ29sb3IgJmMxLCBjb25zdCBDUFdMX0NvbG9yICZjMikKK2lubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBDUFdMX0NvbG9yICZjMSwgY29uc3QgQ1BXTF9Db2xvciAmYzIpCiB7CiAJcmV0dXJuICFvcGVyYXRvciA9PSAoYzEsIGMyKTsKIH0KQEAgLTE3Myw3ICsxNzMsNyBAQAogewogcHVibGljOgogICAgICAgICB2aXJ0dWFsIH5JUFdMX1NwZWxsQ2hlY2soKSB7IH0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2hlY2tXb3JkKGNvbnN0IEZYX0NIQVIqIHNXb3JkKSA9IDA7CisJdmlydHVhbCBib29sCQkJCQkJCUNoZWNrV29yZChjb25zdCBGWF9DSEFSKiBzV29yZCkgPSAwOwogCXZpcnR1YWwgdm9pZAkJCQkJCQlTdWdnZXN0V29yZHMoY29uc3QgRlhfQ0hBUiogc1dvcmQsIENGWF9CeXRlU3RyaW5nQXJyYXkgJiBzU3VnZ2VzdCkgPSAwOwogfTsKIApAQCAtMjk4LDI1ICsyOTgsMjUgQEAKIAl2b2lkCQkJCQkJCUNyZWF0ZShjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CiAJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwogCXZvaWQJCQkJCQkJRGVzdHJveSgpOwotCXZvaWQJCQkJCQkJTW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldyxGWF9CT09MIGJSZXNldCxGWF9CT09MIGJSZWZyZXNoKTsKKwl2b2lkCQkJCQkJCU1vdmUoY29uc3QgQ1BERl9SZWN0ICYgcmNOZXcsYm9vbCBiUmVzZXQsYm9vbCBiUmVmcmVzaCk7CiAJdmlydHVhbCB2b2lkCQkJCQlJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QqIHBSZWN0ID0gTlVMTCk7CiAKIAl2b2lkCQkJCQkJCUdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVTdHJpbmcgJiBzQXBwU3RyZWFtKTsKIAl2b2lkCQkJCQkJCURyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlVcChGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25NQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25NQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTUJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25SQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbktleVVwKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1CdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1CdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25NQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPblJCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgYm9vbAkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBib29sCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIGJvb2wJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCiAJdmlydHVhbCB2b2lkCQkJCQlTZXRGb2N1cygpOwogCXZpcnR1YWwgdm9pZAkJCQkJS2lsbEZvY3VzKCk7CkBAIC0zMjYsNyArMzI2LDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOwogCXZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dENvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcik7CiAJdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0U3Ryb2tlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFZpc2libGUoRlhfQk9PTCBiVmlzaWJsZSk7CisJdmlydHVhbCB2b2lkCQkJCQlTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpOwogCiAJdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Rm9jdXNSZWN0KCkgY29uc3Q7CiAJdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJhY2tncm91bmRDb2xvcigpIGNvbnN0OwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJvcmRlckxlZnRUb3BDb2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3Q7CiAJdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0OwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQlJc01vZGlmaWVkKCkgY29uc3Qge3JldHVybiBGQUxTRTt9CisJdmlydHVhbCBib29sCQkJCQlJc01vZGlmaWVkKCkgY29uc3Qge3JldHVybiBmYWxzZTt9CiAKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAKQEAgLTM1Niw4ICszNTYsOCBAQAogCUNQREZfUmVjdAkJCQkJCUdldENsaWVudENlbnRlclNxdWFyZSgpIGNvbnN0OwogCUNQREZfUmVjdAkJCQkJCUdldFdpbmRvd0NlbnRlclNxdWFyZSgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRCb3JkZXJXaWR0aCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNWaXNpYmxlKCkgY29uc3Qge3JldHVybiBtX2JWaXNpYmxlO30KLQlGWF9CT09MCQkJCQkJCUhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFncykgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1Zpc2libGUoKSBjb25zdCB7cmV0dXJuIG1fYlZpc2libGU7fQorCWJvb2wJCQkJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdDsKIAl2b2lkCQkJCQkJCUFkZEZsYWcoRlhfRFdPUkQgZHdGbGFncyk7CiAJdm9pZAkJCQkJCQlSZW1vdmVGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpOwogCUNQREZfUmVjdAkJCQkJCUdldENsaXBSZWN0KCkgY29uc3Q7CkBAIC0zNjYsMTMgKzM2NiwxMyBAQAogCUNQV0xfRGFzaAkJCQkJCUdldEJvcmRlckRhc2goKSBjb25zdDsKIAl2b2lkKgkJCQkJCQlHZXRBdHRhY2hlZERhdGEoKSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQkJV25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2xpZW50SGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNDYXB0dXJlTW91c2UoKSBjb25zdDsKKwlib29sCQkJCQkJCVduZEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKKwlib29sCQkJCQkJCUNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKKwlib29sCQkJCQkJCUlzQ2FwdHVyZU1vdXNlKCkgY29uc3Q7CiAKIAljb25zdCBDUFdMX1duZCoJCQkJCUdldEZvY3VzZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzRm9jdXNlZCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNSZWFkT25seSgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNGb2N1c2VkKCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1JlYWRPbmx5KCkgY29uc3Q7CiAJQ1BXTF9TY3JvbGxCYXIqCQkJCQlHZXRWU2Nyb2xsQmFyKCkgY29uc3Q7CiAKIAlJRlhfRWRpdF9Gb250TWFwKgkJCQlHZXRGb250TWFwKCkgY29uc3Q7CkBAIC0zOTgsOCArMzk4LDggQEAKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEl0ZW1MZWZ0TWFyZ2luKCkge3JldHVybiAwO30KIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEl0ZW1SaWdodE1hcmdpbigpIHtyZXR1cm4gMDt9CiAKLQl2b2lkCQkJCQkJCUVuYWJsZVdpbmRvdyhGWF9CT09MIGJFbmFibGUpOwotCUZYX0JPT0wJCQkJCQkJSXNFbmFibGVkKCk7CisJdm9pZAkJCQkJCQlFbmFibGVXaW5kb3coYm9vbCBiRW5hYmxlKTsKKwlib29sCQkJCQkJCUlzRW5hYmxlZCgpOwogCXZpcnR1YWwgdm9pZAkJCQkJU2V0Q3Vyc29yKCk7CiAKIHByb3RlY3RlZDoKQEAgLTQyMiwxMSArNDIyLDExIEBACiAJdmlydHVhbCB2b2lkCQkJCQlPbkVuYWJsZWQoKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uRGlzYWJsZWQoKTsKIAotCXZvaWQJCQkJCQkJU2V0Tm90aWZ5RmxhZyhGWF9CT09MIGJOb3RpZnlpbmcgPSBUUlVFKXttX2JOb3RpZnlpbmcgPSBiTm90aWZ5aW5nO307CisJdm9pZAkJCQkJCQlTZXROb3RpZnlGbGFnKGJvb2wgYk5vdGlmeWluZyA9IHRydWUpe21fYk5vdGlmeWluZyA9IGJOb3RpZnlpbmc7fTsKIAotCUZYX0JPT0wJCQkJCQkJSXNWYWxpZCgpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNWYWxpZCgpIGNvbnN0OwogCVBXTF9DUkVBVEVQQVJBTQkJCQkJR2V0Q3JlYXRpb25QYXJhbSgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fYk5vdGlmeWluZzt9CisJYm9vbAkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9iTm90aWZ5aW5nO30KIAogCXZvaWQJCQkJCQkJSW52YWxpZGF0ZVJlY3RNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjT2xkLCBjb25zdCBDUERGX1JlY3QgJiByY05ldyk7CiAKQEAgLTQzNCwxNCArNDM0LDE0IEBACiAJRlhfUkVDVAkJCQkJCQlQV0x0b1duZChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsKIAlGWF9IV05ECQkJCQkJCUdldEF0dGFjaGVkSFduZCgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdDsKKwlib29sCQkJCQkJCUlzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0OwogCWNvbnN0IENQV0xfV25kKgkJCQkJR2V0Um9vdFduZCgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzU0hJRlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNDVFJMcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisJYm9vbAkJCQkJCQlJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisJYm9vbAkJCQkJCQlJc0FMVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OworCWJvb2wJCQkJCQkJSXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKIAogcHJpdmF0ZToKIAl2b2lkCQkJCQkJCUFkZENoaWxkKENQV0xfV25kICogcFduZCk7CkBAIC00NjcsMTAgKzQ2NywxMCBAQAogCUNQREZfUmVjdAkJCQkJCW1fcmNXaW5kb3c7CiAJQ1BERl9SZWN0CQkJCQkJbV9yY0NsaXA7CiAKLQlGWF9CT09MCQkJCQkJCW1fYkNyZWF0ZWQ7Ci0JRlhfQk9PTAkJCQkJCQltX2JWaXNpYmxlOwotCUZYX0JPT0wJCQkJCQkJbV9iTm90aWZ5aW5nOwotCUZYX0JPT0wJCQkJCQkJbV9iRW5hYmxlZDsKKwlib29sCQkJCQkJCW1fYkNyZWF0ZWQ7CisJYm9vbAkJCQkJCQltX2JWaXNpYmxlOworCWJvb2wJCQkJCQkJbV9iTm90aWZ5aW5nOworCWJvb2wJCQkJCQkJbV9iRW5hYmxlZDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfV05EX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAKaW5kZXggNjk5YTdlNC4uNjU3MGIzZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcApAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAlDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybURpY3QgPSBOVUxMOwogCi0JRlhfQk9PTCBiV2lkZ2V0ID0gKG1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpOworCWJvb2wgYldpZGdldCA9IChtX3BBbm5vdERpY3QtPkdldFN0cmluZygiU3VidHlwZSIpID09ICJXaWRnZXQiKTsKIAogCWlmIChiV2lkZ2V0KQogCXsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcAppbmRleCA1NWQyZDQ1Li43MmZmNTc1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwCkBAIC0zMSwxOCArMzEsMTggQEAKIAlyZXR1cm4gcFduZDsKIH0KIAotRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wJQ0ZGTF9DaGVja0JveDo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAJc3dpdGNoIChuS2V5Q29kZSkKIAl7CiAJY2FzZSBGV0xfVktFWV9SZXR1cm46CiAJY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5RG93bihwQW5ub3QsIG5LZXlDb2RlLCBuRmxhZ3MpOwogCX0KIH0KLUZYX0JPT0wJQ0ZGTF9DaGVja0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitib29sCUNGRkxfQ2hlY2tCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogCXN3aXRjaCAobkNoYXIpCiAJewpAQCAtNTUsNTcgKzU1LDU3IEBACiAJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CiAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0JCQlGWF9CT09MIGJSZXNldCA9IEZBTFNFOwotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCQkJYm9vbCBiUmVzZXQgPSBmYWxzZTsKKwkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKIAogCQkJcElGb3JtRmlsbGVyLT5PbkJ1dHRvblVwKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LG5GbGFncyk7CiAKLQkJCWlmIChiUmVzZXQpIHJldHVybiBUUlVFOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKKwkJCWlmIChiUmVzZXQpIHJldHVybiB0cnVlOworCQkJaWYgKGJFeGl0KSByZXR1cm4gdHJ1ZTsKIAogCQkJQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIAotCQkJaWYgKENQV0xfQ2hlY2tCb3ggKiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorCQkJaWYgKENQV0xfQ2hlY2tCb3ggKiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogCQkJCXBXbmQtPlNldENoZWNrKCFwV25kLT5Jc0NoZWNrZWQoKSk7CiAKIAkJCUNvbW1pdERhdGEocFBhZ2VWaWV3LG5GbGFncyk7Ci0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiAJfQogfQogCi1GWF9CT09MIENGRkxfQ2hlY2tCb3g6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfQ2hlY2tCb3g6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAJQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKIAogCWlmIChJc1ZhbGlkKCkpCiAJewotCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisJCWlmIChDUFdMX0NoZWNrQm94ICogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKIAkJewogCQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKIAkJCXBXbmQtPlNldENoZWNrKCFwV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7CiAJCS8vCXBXbmQtPlNldENoZWNrKCFwV25kLT5Jc0NoZWNrZWQoKSk7CiAJCX0KIAotCQlpZiAoIUNvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZ3MpKSByZXR1cm4gRkFMU0U7CisJCWlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpIHJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKK2Jvb2wJQ0ZGTF9DaGVja0JveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAKIAlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0JaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorCWlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKIAl7CiAJCXJldHVybiBwV25kLT5Jc0NoZWNrZWQoKSAhPSBtX3BXaWRnZXQtPklzQ2hlY2tlZCgpOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9DaGVja0JveDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQpAQCAtMTEzLDEwICsxMTMsMTAgQEAKIAogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisJaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCXsKIAotCQlGWF9CT09MIGJOZXdDaGVja2VkID0gcFduZC0+SXNDaGVja2VkKCk7CisJCWJvb2wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKIAogCiAJCWlmIChiTmV3Q2hlY2tlZCkKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQkJfQogCQl9CiAKLQkJbV9wV2lkZ2V0LT5TZXRDaGVjayhiTmV3Q2hlY2tlZCwgRkFMU0UpOworCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBmYWxzZSk7CiAJCW1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKIAkJU2V0Q2hhbmdlTWFyaygpOwogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcAppbmRleCA4NDFiNDVlLi5kNmQ0ZDNkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCkBAIC03OCwxNiArNzgsMTYgQEAKIH0KIAogCi1GWF9CT09MIENGRkxfQ29tYm9Cb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorYm9vbCBDRkZMX0NvbWJvQm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAotRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKK2Jvb2wgQ0ZGTF9Db21ib0JveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7Ci0gICAgQ1BXTF9Db21ib0JveCogcFduZCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgQ1BXTF9Db21ib0JveCogcFduZCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CiAgICAgaWYgKCFwV25kKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludDMyX3QgbkN1clNlbCA9IHBXbmQtPkdldFNlbGVjdCgpOwogICAgIGlmICghKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpKQpAQCAtMTAzLDI4ICsxMDMsMjggQEAKIHsKICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX0NvbWJvQm94KiBwV25kID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHBXbmQtPkdldFRleHQoKTsKICAgICAgICAgaW50MzJfdCBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7CiAKICAgICAgICAgLy9tYW50aXM6MDAwNDE1NwotICAgICAgICBGWF9CT09MIGJTZXRWYWx1ZSA9IFRSVUU7CisgICAgICAgIGJvb2wgYlNldFZhbHVlID0gdHJ1ZTsKIAogICAgICAgICBpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRURJVCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG5DdXJTZWwgPj0gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoc3dUZXh0ICE9IG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCkpCi0gICAgICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYlNldFZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYlNldFZhbHVlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJTZXRWYWx1ZSA9IEZBTFNFOworICAgICAgICAgICAgYlNldFZhbHVlID0gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc09sZFZhbHVlOwogCkBAIC0xMzIsMTUgKzEzMiwxNSBAQAogICAgICAgICBpZiAoYlNldFZhbHVlKQogICAgICAgICB7CiAgICAgICAgICAgICBzT2xkVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7Ci0gICAgICAgICAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHN3VGV4dCwgRkFMU0UpOworICAgICAgICAgICAgbV9wV2lkZ2V0LT5TZXRWYWx1ZShzd1RleHQsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIG1fcFdpZGdldC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKLSAgICAgICAgICAgIG1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKG5DdXJTZWwsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICAgIG1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKG5DdXJTZWwsIHRydWUsIGZhbHNlKTsKICAgICAgICAgfQogCi0gICAgICAgIG1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UoVFJVRSk7CisgICAgICAgIG1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UodHJ1ZSk7CiAgICAgICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKICAgICAgICAgU2V0Q2hhbmdlTWFyaygpOwogCkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpCiAgICAgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KQogICAgICAgICAgICAgewpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKICAgICAgICAgICAgIHsKQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgIHN3aXRjaCAodHlwZSkKICAgICB7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLSAgICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCiAgICAgICAgICAgICB7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCitib29sIENGRkxfQ29tYm9Cb3g6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykKIHsKICAgICBzd2l0Y2ggKHR5cGUpCkBAIC0yMjksMTQgKzIyOSwxNCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfQ29tYm9Cb3g6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgbV9TdGF0ZS5uSW5kZXggPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOwogCkBAIC0yNTIsNyArMjUyLDcgQEAKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogICAgIHsKICAgICAgICAgaWYgKG1fU3RhdGUubkluZGV4ID49IDApCiAgICAgICAgICAgICBwQ29tYm9Cb3gtPlNldFNlbGVjdChtX1N0YXRlLm5JbmRleCk7CkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICB9CiB9CiAKLUNQV0xfV25kKiBDRkZMX0NvbWJvQm94OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKK0NQV0xfV25kKiBDRkZMX0NvbWJvQm94OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYlJlc3RvcmVWYWx1ZSkKIHsKICAgICBpZiAoYlJlc3RvcmVWYWx1ZSkKICAgICAgICAgU2F2ZVN0YXRlKHBQYWdlVmlldyk7CkBAIC0yNzksMTcgKzI3OSwxNyBAQAogICAgIGlmIChiUmVzdG9yZVZhbHVlKQogICAgIHsKICAgICAgICAgUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0gICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSk7CiAKICAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAKICAgICByZXR1cm4gcFJldDsKIH0KIAotdm9pZCBDRkZMX0NvbWJvQm94OjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duLCBGWF9VSU5UIG5GbGFnKQordm9pZCBDRkZMX0NvbWJvQm94OjpPbktleVN0cm9rZShib29sIGJLZXlEb3duLCBGWF9VSU5UIG5GbGFnKQogewogICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICAgICAgaWYgKENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZykpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgIG1fYlZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgbV9iVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMyOCw3ICszMjgsNyBAQAogICAgICAgICBpbnQgbkNoYXJhY3RlcnMgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVVRGVGV4dCA9IHdzVGV4dC5VVEYxNkxFX0VuY29kZSgpOwogICAgICAgICB1bnNpZ25lZCBzaG9ydCogcEJ1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCopYnNVVEZUZXh0LmNfc3RyKCk7Ci0gICAgICAgIG1fcEFwcC0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHBCdWZmZXIsIG5DaGFyYWN0ZXJzLCBUUlVFKTsKKyAgICAgICAgbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwgbkNoYXJhY3RlcnMsIHRydWUpOwogCiAgICAgICAgIHBFZGl0LT5TZXRFZGl0Tm90aWZ5KHRoaXMpOwogICAgIH0KQEAgLTMzOSwyNSArMzM5LDI1IEBACiAgICAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKIH0KIAotRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9Db21ib0JveDo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAgICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9Db21ib0JveDo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKICAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sIENGRkxfQ29tYm9Cb3g6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKICAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDRkZMX0NvbWJvQm94OjpPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCkKQEAgLTM3MSw3ICszNzEsNyBAQAogCiAgICAgaW50IG5FeHBvcnQgPSAtMTsKICAgICBDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwotICAgIGlmIChDUFdMX0NvbWJvQm94ICogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9Db21ib0JveCAqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBuRXhwb3J0ID0gcENvbWJvQm94LT5HZXRTZWxlY3QoKTsKICAgICB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwCmluZGV4IDE4MTFjYjAuLjM0YWExN2MgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiBDRkZMX0Zvcm1GaWxsZXI6OkNGRkxfRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCiAgICAgOiBtX3BBcHAocEFwcCksCiAgICAgICBtX3BBbm5vdChwQW5ub3QpLAotICAgICAgbV9iVmFsaWQoRkFMU0UpLAorICAgICAgbV9iVmFsaWQoZmFsc2UpLAogICAgICAgbV9wdE9sZFBvcygwLDApCiB7CiAgICAgbV9wV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KikgcEFubm90OwpAQCAtNDAsMTUgKzQwLDE1IEBACiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdykKIHsKLSAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKLSAgICAgICAgcFduZC0+TW92ZShDUERGX1JlY3QocmNXaW5kb3cpLCBUUlVFLCBGQUxTRSk7CisgICAgICAgIHBXbmQtPk1vdmUoQ1BERl9SZWN0KHJjV2luZG93KSwgdHJ1ZSwgZmFsc2UpOwogICAgIH0KIH0KIAogQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7Ci0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kLT5HZXRXaW5kb3dSZWN0KCk7CiAgICAgfQpAQCAtNjMsNyArNjMsNyBAQAogCiAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBtX3BXaWRnZXQtPkdldFJlY3QoKTsKIAotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBDUERGX1JlY3QgcmNXaW5kb3cgPSBwV25kLT5HZXRXaW5kb3dSZWN0KCk7CiAgICAgICAgIHJjQW5ub3QgPSBQV0x0b0ZGTChyY1dpbmRvdyk7CkBAIC04Niw3ICs4Niw3IEBACiB7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIENQREZfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7CiAgICAgICAgIG10LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKQEAgLTEzMSwxNTMgKzEzMSwxNTMgQEAKICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogICAgIHsKLSAgICAgICAgbV9iVmFsaWQgPSBUUlVFOworICAgICAgICBtX2JWYWxpZCA9IHRydWU7CiAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOwogICAgICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiAKICAgICAgICAgaWYoIXJlY3QuQ29udGFpbnMoKGludClwb2ludC54LCAoaW50KXBvaW50LnkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHJldHVybiBwV25kLT5PbkxCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBGWF9SRUNUIHJjRkZMID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOwogICAgICAgICBJbnZhbGlkYXRlUmVjdChyY0ZGTC5sZWZ0LCByY0ZGTC50b3AsIHJjRkZMLnJpZ2h0LCByY0ZGTC5ib3R0b20pOwogICAgICAgICBwV25kLT5PbkxCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBXbmQtPk9uTEJ1dHRvbkRibENsayhXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBpZiAoKG1fcHRPbGRQb3MueCAhPSBwb2ludC54KSB8fCAobV9wdE9sZFBvcy55ICE9IHBvaW50LnkpKQogICAgIHsKICAgICAgICAgbV9wdE9sZFBvcyA9IHBvaW50OwogICAgIH0KIAotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBXbmQtPk9uTW91c2VNb3ZlKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotICAgIGlmICghSXNWYWxpZCgpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAgICAgewogICAgICAgICByZXR1cm4gcFduZC0+T25Nb3VzZVdoZWVsKHpEZWx0YSwgV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogICAgIHsKICAgICAgICAgcFduZC0+T25SQnV0dG9uRG93bihXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBwV25kLT5PblJCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQogewogICAgIGlmIChJc1ZhbGlkKCkpCiAgICAgewogICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBwV25kLT5PbktleURvd24obktleUNvZGUsbkZsYWdzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICBpZiAoSXNWYWxpZCgpKQogICAgIHsKICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKICAgICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgICAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgICAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gcFduZC0+T25DaGFyKG5DaGFyLG5GbGFncyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpCitib29sIENGRkxfRm9ybUZpbGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpCiB7CiAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwogICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBtX3BBcHAtPkdldFNES0RvY3VtZW50KCk7CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcERvYy0+R2V0UGFnZVZpZXcocFBhZ2UpOwotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQogICAgICAgICBwV25kLT5TZXRGb2N1cygpOwogCi0gICAgbV9iVmFsaWQgPSBUUlVFOworICAgIG1fYlZhbGlkID0gdHJ1ZTsKICAgICBGWF9SRUNUIHJjUmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOwogICAgIEludmFsaWRhdGVSZWN0KHJjUmVjdC5sZWZ0LCByY1JlY3QudG9wLCByY1JlY3QucmlnaHQsIHJjUmVjdC5ib3R0b20pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKIHsKICAgICBpZiAoIUlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKICAgICBDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWcpOwogCi0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgcFduZC0+S2lsbEZvY3VzKCk7CiAKICAgICBzd2l0Y2ggKG1fcFdpZGdldC0+R2V0RmllbGRUeXBlKCkpCkBAIC0yODUsMTYgKzI4NSwxNiBAQAogICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CiAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CiAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0gICAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIFRSVUUpOworICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCB0cnVlKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgRXNjYXBlRmlsbGVyKHBQYWdlVmlldywgRkFMU0UpOworICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBmYWxzZSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzVmFsaWQoKSBjb25zdAorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6OklzVmFsaWQoKSBjb25zdAogewogICAgIHJldHVybiBtX2JWYWxpZDsKIH0KQEAgLTM3MCw3ICszNzAsNyBAQAogICAgIHJldHVybiBjcDsKIH0KIAotQ1BXTF9XbmQqIENGRkxfRm9ybUZpbGxlcjo6R2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiTmV3KQorQ1BXTF9XbmQqIENGRkxfRm9ybUZpbGxlcjo6R2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiTmV3KQogewogICAgIEFTU0VSVChwUGFnZVZpZXcpOwogCkBAIC00OTksNyArNDk5LDcgQEAKIAogQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBDUERGX1JlY3QgcmNGb2N1cyA9IEZGTHRvV25kKHBQYWdlVmlldywgUFdMdG9GRkwocFduZC0+R2V0Rm9jdXNSZWN0KCkpKTsKICAgICAgICAgQ1BERl9SZWN0IHJjUGFnZSA9IHBQYWdlVmlldy0+R2V0UERGUGFnZSgpLT5HZXRQYWdlQkJveCgpOwpAQCAtNTYxLDQ0ICs1NjEsNDQgQEAKICAgICByZXR1cm4gcmVjdDsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6OkNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKQogewogICAgIGlmIChJc0RhdGFDaGFuZ2VkKHBQYWdlVmlldykpCiAgICAgewotICAgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7Ci0gICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiUkMgPSB0cnVlOworICAgICAgICBib29sIGJFeGl0ID0gZmFsc2U7CiAgICAgICAgIENGRkxfSUZvcm1GaWxsZXIqIHBJRm9ybUZpbGxlciA9IG1fcEFwcC0+R2V0SUZvcm1GaWxsZXIoKTsKICAgICAgICAgcElGb3JtRmlsbGVyLT5PbktleVN0cm9rZUNvbW1pdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJDLCBiRXhpdCwgbkZsYWcpOwogICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBpZiAoIWJSQykKICAgICAgICAgewotICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBwSUZvcm1GaWxsZXItPk9uVmFsaWRhdGUobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSQywgYkV4aXQsIG5GbGFnKTsKICAgICAgICAgaWYgKGJFeGl0KQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgaWYgKCFiUkMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBSZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgU2F2ZURhdGEocFBhZ2VWaWV3KTsKICAgICAgICAgcElGb3JtRmlsbGVyLT5PbkNhbGN1bGF0ZShtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsbkZsYWcpOwogICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIHBJRm9ybUZpbGxlci0+T25Gb3JtYXQobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJFeGl0LG5GbGFnKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKK2Jvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQpAQCAtNjIxLDEwICs2MjEsMTAgQEAKIHsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKQEAgLTYzNSw5ICs2MzUsOSBAQAogewogfQogCi1DUFdMX1duZCogIENGRkxfRm9ybUZpbGxlcjo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpCitDUFdMX1duZCogIENGRkxfRm9ybUZpbGxlcjo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJSZXN0b3JlVmFsdWUpCiB7Ci0gICAgcmV0dXJuIEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgICByZXR1cm4gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwogfQogCiB2b2lkIENGRkxfRm9ybUZpbGxlcjo6VGltZXJQcm9jKCkKQEAgLTY1MCwxMyArNjUwLDEzIEBACiAgICAgcmV0dXJuIG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25LZXlTdHJva2UoRlhfQk9PTCBiS2V5RG93bikKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleVN0cm9rZShib29sIGJLZXlEb3duKQogewogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6RXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiRGVzdHJveVBERldpbmRvdykKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJEZXN0cm95UERGV2luZG93KQogewotICAgIG1fYlZhbGlkID0gRkFMU0U7CisgICAgbV9iVmFsaWQgPSBmYWxzZTsKIAogICAgIEZYX1JFQ1QgcmNSZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBtX3BXaWRnZXQpOwogICAgIEludmFsaWRhdGVSZWN0KHJjUmVjdC5sZWZ0LCByY1JlY3QudG9wLCByY1JlY3QucmlnaHQsIHJjUmVjdC5ib3R0b20pOwpAQCAtNjY1LDE5ICs2NjUsMTkgQEAKICAgICAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbCBDRkZMX0Zvcm1GaWxsZXI6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfRm9ybUZpbGxlcjo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKQEAgLTcwMiw4ICs3MDIsOCBAQAogCiBDRkZMX0J1dHRvbjo6Q0ZGTF9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCkgOgogICAgIENGRkxfRm9ybUZpbGxlcihwQXBwLCBwV2lkZ2V0KSwKLSAgICBtX2JNb3VzZUluKEZBTFNFKSwKLSAgICBtX2JNb3VzZURvd24oRkFMU0UpCisgICAgbV9iTW91c2VJbihmYWxzZSksCisgICAgbV9iTW91c2VEb3duKGZhbHNlKQogewogfQogCkBAIC03MTMsMTQgKzcxMywxNCBAQAogCiB2b2lkIENGRkxfQnV0dG9uOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0gICAgbV9iTW91c2VJbiA9IFRSVUU7CisgICAgbV9iTW91c2VJbiA9IHRydWU7CiAgICAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwogfQogCiB2b2lkIENGRkxfQnV0dG9uOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKLSAgICBtX2JNb3VzZUluID0gRkFMU0U7CisgICAgbV9iTW91c2VJbiA9IGZhbHNlOwogCiAgICAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwpAQCAtNzI4LDM5ICs3MjgsMzkgQEAKICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogfQogCi1GWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfQnV0dG9uOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKICAgICBpZighcmNBbm5vdC5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBtX2JNb3VzZURvd24gPSBUUlVFOwotICAgIG1fYlZhbGlkID0gVFJVRTsKKyAgICBtX2JNb3VzZURvd24gPSB0cnVlOworICAgIG1fYlZhbGlkID0gdHJ1ZTsKICAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdC0+R2V0UmVjdCgpOwogICAgIGlmKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIG1fYk1vdXNlRG93biA9IEZBTFNFOworICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwogICAgIG1fcFdpZGdldC0+R2V0UERGUGFnZSgpOwogCiAKICAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CiAgICAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfQnV0dG9uOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0J1dHRvbjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ0ZGTF9CdXR0b246Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcAppbmRleCA3Y2U4MTFlLi45MjJkOGMwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAKIENGRkxfSUZvcm1GaWxsZXI6OkNGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOgogICAgIG1fcEFwcChwQXBwKSwKLSAgICBtX2JOb3RpZnlpbmcoRkFMU0UpCisgICAgbV9iTm90aWZ5aW5nKGZhbHNlKQogewogfQogCkBAIC0zMywxNyArMzMsMTcgQEAKICAgICBtX01hcHMuY2xlYXIoKTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDUERGU0RLX0Fubm90KiBwQW5ub3QsIENQREZfUG9pbnQgcG9pbnQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6OkFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCkKIHsKICAgICBDUERGX1JlY3QgcmMgPSBwQW5ub3QtPkdldFJlY3QoKTsKICAgICBpZihyYy5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIEZYX1JFQ1QgQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CiAKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwpAQCAtNjUsNyArNjUsNyBAQAogCiAgICAgaWYgKElzVmlzaWJsZShwV2lkZ2V0KSkKICAgICB7Ci0gICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocEZvcm1GaWxsZXItPklzVmFsaWQoKSkKICAgICAgICAgICAgIHsKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgICAgICAgICAgcEZvcm1GaWxsZXItPk9uRHJhd0RlYWN0aXZlKHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7CkBAIC0xMTAsNyArMTEwLDcgQEAKIAogdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBGb3JtRmlsbGVyLT5PbkNyZWF0ZShwQW5ub3QpOwogICAgIH0KQEAgLTExOCw3ICsxMTgsNyBAQAogCiB2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBGb3JtRmlsbGVyLT5PbkxvYWQocEFubm90KTsKICAgICB9CkBAIC0xMjYsNyArMTI2LDcgQEAKIAogdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHBGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOwogICAgIH0KQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAKICAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogCkBAIC0xNTgsMTMgKzE1OCwxMyBAQAogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlciwgZmEsIHBQYWdlVmlldyApOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKIAogICAgICAgICAgICAgLy9pZiAoICFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpICkgcmV0dXJuOwogCiAgICAgICAgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCisgICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIHBXaWRnZXQtPkdldFZhbHVlQWdlKCkgPT0gblZhbHVlQWdlKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIFRSVUUpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIHRydWUpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uTW91c2VFbnRlcihwUGFnZVZpZXcsIHBBbm5vdCk7CiAgICAgfQpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwogICAgICAgICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CkBAIC0yMDIsMTMgKzIwMiwxMyBAQAogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwogCiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0LCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAKICAgICAgICAgICAgIC8vaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpKSByZXR1cm47CiAKICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKKyAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIxNiwxMyArMjE2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcEZvcm1GaWxsZXItPk9uTW91c2VFeGl0KHBQYWdlVmlldywgcEFubm90KTsKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgIGlmIChBbm5vdF9IaXRUZXN0KHBQYWdlVmlldywgcEFubm90LCBwb2ludCkgJiYgcFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24pKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKICAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogICAgICAgICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwpAQCAtMjQ1LDEzICsyNDUsMTMgQEAKICAgICAgICAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWdzKTsKICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFncyk7CiAgICAgICAgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSkgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkpIHJldHVybiB0cnVlOwogCiAgICAgICAgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCisgICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTksMTUgKzI1OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKQEAgLTI4NiwyNCArMjg2LDI0IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICAgIGJvb2wgYlJldCA9IGZhbHNlOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIGJSZXQgPSBwRm9ybUZpbGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAogICAgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSA9PSBwQW5ub3QpCiAgICAgewotICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0gICAgICAgIEZYX0JPT0wgYlJlc2V0ID0gRkFMU0U7CisgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBiUmVzZXQgPSBmYWxzZTsKICAgICAgICAgT25CdXR0b25VcChwV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsbkZsYWdzKTsKLSAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKKyAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGJSZXQ7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CdXR0b25VcChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LEZYX1VJTlQgbkZsYWcpCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQnV0dG9uVXAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYlJlc2V0LCBib29sJiBiRXhpdCxGWF9VSU5UIG5GbGFnKQogewogICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCkBAIC0zMTEsNyArMzExLDcgQEAKICAgICB7CiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXApKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKQEAgLTMyNiwxMjIgKzMyNiwxMjIgQEAKICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKIAogICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXAsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwV2lkZ2V0KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCisgICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBiUmVzZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJSZXNldCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRibENsayhwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAogICAgIC8vY2hhbmdlIGN1cnNvcgotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIFRSVUUpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIHRydWUpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5Pbk1vdXNlTW92ZShwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTW91c2VXaGVlbChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCB6RGVsdGEsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSkpCiAgICAgewogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uUkJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCiB7CiAgICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKICAgICBpZiAobkNoYXIgPT0gRldMX1ZLRVlfVGFiKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQorYm9vbCBDRkZMX0lGb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQogewogICAgIGlmICghcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKQEAgLTQ1MCw3ICs0NTAsNyBAQAogICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkdldEZvY3VzKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAgICAgICAgICAgICBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CiAKICAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwpAQCAtNDYzLDE1ICs0NjMsMTUgQEAKICAgICAgICAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwogCi0gICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBUUlVFKTsKLSAgICAgICAgICAgIGlmKCFwRm9ybUZpbGxlcikgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgdHJ1ZSk7CisgICAgICAgICAgICBpZighcEZvcm1GaWxsZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpHZXRGb2N1cywgZmEpOwogICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQorICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDc5LDE4ICs0NzksMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIFRSVUUpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIHRydWUpKQogICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uU2V0Rm9jdXMocEFubm90LCBuRmxhZyk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZykKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCiB7Ci0gICAgaWYoIXBBbm5vdCkgcmV0dXJuIEZBTFNFOworICAgIGlmKCFwQW5ub3QpIHJldHVybiBmYWxzZTsKICAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKSkKICAgICB7CiAgICAgICAgIGlmIChwRm9ybUZpbGxlci0+T25LaWxsRm9jdXMocEFubm90LCBuRmxhZykpCiAgICAgICAgIHsKQEAgLTQ5OSw3ICs0OTksNyBAQAogICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwogCiAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7CkBAIC01MTIsMjQgKzUxMiwyNCBAQAogICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSk7CiAKICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc1Zpc2libGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpCitib29sIENGRkxfSUZvcm1GaWxsZXI6OklzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKIHsKICAgICByZXR1cm4gcFdpZGdldC0+SXNWaXNpYmxlKCk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKIHsKICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIApAQCAtNTM4LDEyICs1MzgsMTIgQEAKICAgICByZXR1cm4gKG5GaWVsZEZsYWdzICYgRklFTERGTEFHX1JFQURPTkxZKSA9PSBGSUVMREZMQUdfUkVBRE9OTFk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCkKIHsKICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIAogICAgIGlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIGVsc2UKICAgICB7CiAgICAgICAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CkBAIC01NTcsMTAgKzU1NywxMCBAQAogICAgICAgICAgICAgICAgIChkd1Blcm1pc3Npb25zJkZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8CiAgICAgICAgICAgICAoZHdQZXJtaXNzaW9ucyZGUERGUEVSTV9NT0RJRlkpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotQ0ZGTF9Gb3JtRmlsbGVyKiBDRkZMX0lGb3JtRmlsbGVyOjpHZXRGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfQk9PTCBiUmVnaXN0ZXIpCitDRkZMX0Zvcm1GaWxsZXIqIENGRkxfSUZvcm1GaWxsZXI6OkdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBib29sIGJSZWdpc3RlcikKIHsKICAgICBhdXRvIGl0ID0gbV9NYXBzLmZpbmQocEFubm90KTsKICAgICBpZiAoaXQgIT0gbV9NYXBzLmVuZCgpKQpAQCAtNjY2LDcgKzY2Niw3IEBACiAgICAgfQogCiAgICAgRlhfRkxPQVQgZkZhY3RIZWlnaHQgPSAwOwotICAgIEZYX0JPT0wgYkJvdHRvbSA9IFRSVUU7CisgICAgYm9vbCBiQm90dG9tID0gdHJ1ZTsKICAgICBGWF9GTE9BVCBmTWF4TGlzdEJveEhlaWdodCA9IDA7CiAgICAgaWYgKGZQb3B1cE1heCA+IEZGTF9NQVhMSVNUQk9YSEVJR0hUKQogICAgIHsKQEAgLTY4NSwyNiArNjg1LDI2IEBACiAgICAgaWYgKGZCb3R0b20gPiBmTWF4TGlzdEJveEhlaWdodCkKICAgICB7CiAgICAgICAgIGZGYWN0SGVpZ2h0ID0gZk1heExpc3RCb3hIZWlnaHQ7Ci0gICAgICAgIGJCb3R0b20gPSBUUlVFOworICAgICAgICBiQm90dG9tID0gdHJ1ZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKGZUb3AgPiBmTWF4TGlzdEJveEhlaWdodCkKICAgICAgICAgewogICAgICAgICAgICAgZkZhY3RIZWlnaHQgPSBmTWF4TGlzdEJveEhlaWdodDsKLSAgICAgICAgICAgIGJCb3R0b20gPSBGQUxTRTsKKyAgICAgICAgICAgIGJCb3R0b20gPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChmVG9wID4gZkJvdHRvbSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmRmFjdEhlaWdodCA9IGZUb3A7Ci0gICAgICAgICAgICAgICAgYkJvdHRvbSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJCb3R0b20gPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmRmFjdEhlaWdodCA9IGZCb3R0b207Ci0gICAgICAgICAgICAgICAgYkJvdHRvbSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkJvdHRvbSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03MTMsMTQgKzcxMywxNCBAQAogICAgIGZQb3B1cFJldCA9IGZGYWN0SGVpZ2h0OwogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiUkMsIGJvb2wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBpZiAoIW1fYk5vdGlmeWluZykKICAgICB7CiAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwogICAgICAgICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwogCiAgICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwpAQCAtNzI4LDExICs3MjgsMTEgQEAKICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKICAgICAgICAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwogICAgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwotICAgICAgICAgICAgZmEuYldpbGxDb21taXQgPSBUUlVFOwotICAgICAgICAgICAgZmEuYktleURvd24gPSBUUlVFOwotICAgICAgICAgICAgZmEuYlJDID0gVFJVRTsKKyAgICAgICAgICAgIGZhLmJXaWxsQ29tbWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZhLmJLZXlEb3duID0gdHJ1ZTsKKyAgICAgICAgICAgIGZhLmJSQyA9IHRydWU7CiAKLSAgICAgICAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKTsKKyAgICAgICAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKTsKICAgICAgICAgICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAogICAgICAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOwpAQCAtNzQ0LDE5ICs3NDQsMTkgQEAKICAgICAgICAgICAgIGJSQyA9IGZhLmJSQzsKIC8vICAgICAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywgcFdpZGdldCk7CiAKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25WYWxpZGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUkMsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25WYWxpZGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sJiBiUkMsIGJvb2wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBpZiAoIW1fYk5vdGlmeWluZykKICAgICB7CiAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OlZhbGlkYXRlKSkKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAgICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKICAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CkBAIC03NjgsMTAgKzc2OCwxMCBAQAogICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwogICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0gICAgICAgICAgICBmYS5iS2V5RG93biA9IFRSVUU7Ci0gICAgICAgICAgICBmYS5iUkMgPSBUUlVFOworICAgICAgICAgICAgZmEuYktleURvd24gPSB0cnVlOworICAgICAgICAgICAgZmEuYlJDID0gdHJ1ZTsKIAotICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpOworICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpOwogICAgICAgICAgICAgQVNTRVJUKHBGb3JtRmlsbGVyICE9IE5VTEwpOwogCiAgICAgICAgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhKTsKQEAgLTc4MywxMiArNzgzLDEyIEBACiAgICAgICAgICAgICBiUkMgPSBmYS5iUkM7CiAvLyAgICAgICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwogCi0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DYWxjdWxhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKQEAgLTgwNiwxMSArODA2LDExIEBACiAKIC8vICAgICAgYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwV2lkZ2V0KTsKIAotICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Gb3JtYXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIGlmICghbV9iTm90aWZ5aW5nKQogICAgIHsKQEAgLTgyNCw3ICs4MjQsNyBAQAogICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICAgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiRm9ybWF0ZWQgPSBmYWxzZTsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcEludGVyRm9ybS0+T25Gb3JtYXQocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIGJGb3JtYXRlZCk7CiAKIC8vICAgICAgYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwV2lkZ2V0KTsKQEAgLTgzMywxNSArODMzLDE1IEBACiAKICAgICAgICAgaWYgKGJGb3JtYXRlZCkKICAgICAgICAgewotICAgICAgICAgICAgcEludGVyRm9ybS0+UmVzZXRGaWVsZEFwcGVhcmFuY2UocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHNWYWx1ZS5jX3N0cigpLCBUUlVFKTsKKyAgICAgICAgICAgIHBJbnRlckZvcm0tPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBzVmFsdWUuY19zdHIoKSwgdHJ1ZSk7CiAgICAgICAgICAgICBwSW50ZXJGb3JtLT5VcGRhdGVGaWVsZChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgfQogfQogCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OklzVmFsaWRBbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKK2Jvb2wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQogewogCiAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKQEAgLTg1MCwyNiArODUwLDI2IEBACiAgICAgaWYocFBhZ2VWaWV3KQogICAgICAgICByZXR1cm4gcFBhZ2VWaWV3LT5Jc1ZhbGlkQW5ub3QocEFubm90LT5HZXRQREZBbm5vdCgpKTsKICAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2UoYm9vbCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBpbnQzMl90IG5LZXlDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZWxTdGFydCwgaW50IG5TZWxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJSQywgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLCBib29sICYgYlJDLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CiAgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOwogICAgIEFTU0VSVChwRGF0YS0+cFdpZGdldCAhPSBOVUxMKTsKIAotICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBEYXRhLT5wV2lkZ2V0LCBGQUxTRSk7CisgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIGZhbHNlKTsKICAgICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CiAKICAgICBpZiAoIW1fYk5vdGlmeWluZykKICAgICB7CiAgICAgICAgIGlmIChwRGF0YS0+cFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwogICAgICAgICAgICAgaW50IG5BZ2UgPSBwRGF0YS0+cFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwogICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogCkBAIC04ODIsOCArODgyLDggQEAKICAgICAgICAgICAgIGZhLnNDaGFuZ2UgPSBzdHJDaGFuZ2U7CiAgICAgICAgICAgICBmYS5zQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsKICAgICAgICAgICAgIGZhLmJLZXlEb3duID0gYktleURvd247Ci0gICAgICAgICAgICBmYS5iV2lsbENvbW1pdCA9IEZBTFNFOwotICAgICAgICAgICAgZmEuYlJDID0gVFJVRTsKKyAgICAgICAgICAgIGZhLmJXaWxsQ29tbWl0ID0gZmFsc2U7CisgICAgICAgICAgICBmYS5iUkMgPSB0cnVlOwogICAgICAgICAgICAgZmEublNlbFN0YXJ0ID0gblNlbFN0YXJ0OwogICAgICAgICAgICAgZmEublNlbEVuZCA9IG5TZWxFbmQ7CiAKQEAgLTg5NSw4ICs4OTUsOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBEYXRhLT5wUGFnZVZpZXcsIHBEYXRhLT5wV2lkZ2V0KSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTkwNCw0OCArOTA0LDQ4IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDUFdMX1duZCogcFduZCA9IHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwRGF0YS0+cFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcERhdGEtPnBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICAgICAgICAgICAgICBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGZhLmJSQykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5TZXRBY3Rpb25EYXRhKHBEYXRhLT5wUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJSQyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBiUkMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc3RvcmVTdGF0ZShwRGF0YS0+cFBhZ2VWaWV3KTsKLSAgICAgICAgICAgICAgICAgICAgYlJDID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJSQyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSAhPSBwRGF0YS0+cFdpZGdldCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5Db21taXREYXRhKHBEYXRhLT5wUGFnZVZpZXcsbkZsYWcpOwotICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocERhdGEtPnBQYWdlVmlldywgcERhdGEtPnBXaWRnZXQpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCAgICBDRkZMX0lGb3JtRmlsbGVyOjpPbkFmdGVyS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCAmIGJFeGl0LEZYX0RXT1JEIG5GbGFnKQordm9pZCAgICBDRkZMX0lGb3JtRmlsbGVyOjpPbkFmdGVyS2V5U3Ryb2tlKGJvb2wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgYm9vbCAmIGJFeGl0LEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CiAgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOwogICAgIEFTU0VSVChwRGF0YS0+cFdpZGdldCAhPSBOVUxMKTsKIAotICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBEYXRhLT5wV2lkZ2V0LCBGQUxTRSk7CisgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIGZhbHNlKTsKICAgICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CiAKICAgICBpZiAoIWJFZGl0T3JMaXN0KQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcAppbmRleCBjMTA1Y2ZjLi5lZjExM2RhIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcApAQCAtNzMsNyArNzMsNyBAQAogCXsKIAkJbV9PcmlnaW5TZWxlY3Rpb25zLmNsZWFyKCk7CiAKLQkJRlhfQk9PTCBiU2V0Q2FyZXQgPSBGQUxTRTsKKwkJYm9vbCBiU2V0Q2FyZXQgPSBmYWxzZTsKIAkJZm9yIChpbnQzMl90IGk9MCxzej1tX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpPHN6OyBpKyspCiAJCXsKIAkJCWlmIChtX3BXaWRnZXQtPklzT3B0aW9uU2VsZWN0ZWQoaSkpCkBAIC04MSw3ICs4MSw3IEBACiAJCQkJaWYgKCFiU2V0Q2FyZXQpCiAJCQkJewogCQkJCQlwV25kLT5TZXRDYXJldChpKTsKLQkJCQkJYlNldENhcmV0ID0gVFJVRTsKKwkJCQkJYlNldENhcmV0ID0gdHJ1ZTsKIAkJCQl9CiAJCQkJcFduZC0+U2VsZWN0KGkpOwogCQkJCW1fT3JpZ2luU2VsZWN0aW9ucy5pbnNlcnQoaSk7CkBAIC0xMDYsMjMgKzEwNiwyMyBAQAogfQogCiAKLUZYX0JPT0wJQ0ZGTF9MaXN0Qm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKK2Jvb2wJQ0ZGTF9MaXN0Qm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKIAlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAotRlhfQk9PTCBDRkZMX0xpc3RCb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbCBDRkZMX0xpc3RCb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotICAgIENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKICAgICBpZiAoIXBMaXN0Qm94KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkgewogICAgICAgICBpbnQgblNlbENvdW50ID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBMaXN0Qm94LT5HZXRDb3VudCgpOyBpIDwgc3o7ICsraSkgewogICAgICAgICAgICAgaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkgewogICAgICAgICAgICAgICAgIGlmIChtX09yaWdpblNlbGVjdGlvbnMuY291bnQoaSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgICAgICAgICAgblNlbENvdW50Kys7CiAgICAgICAgICAgICB9CkBAIC0xMzcsNyArMTM3LDcgQEAKIHsKIAlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0JaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisJaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAJewogCQlDRlhfSW50QXJyYXkgYU9sZFNlbGVjdCwgYU5ld1NlbGVjdDsKIApAQCAtMTU0LDcgKzE1NCw3IEBACiAKIAkJaW50MzJfdCBuTmV3VG9wSW5kZXggPSBwTGlzdEJveC0+R2V0VG9wVmlzaWJsZUluZGV4KCk7CiAKLQkJbV9wV2lkZ2V0LT5DbGVhclNlbGVjdGlvbihGQUxTRSk7CisJCW1fcFdpZGdldC0+Q2xlYXJTZWxlY3Rpb24oZmFsc2UpOwogCiAJCWlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKIAkJewpAQCAtMTYyLDE5ICsxNjIsMTkgQEAKIAkJCXsKIAkJCQlpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKQogCQkJCXsKLQkJCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24oaSwgVFJVRSwgRkFMU0UpOworCQkJCQltX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihpLCB0cnVlLCBmYWxzZSk7CiAJCQkJCWFOZXdTZWxlY3QuQWRkKGkpOwogCQkJCX0KIAkJCX0KIAkJfQogCQllbHNlCiAJCXsKLQkJCW1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKHBMaXN0Qm94LT5HZXRDdXJTZWwoKSwgVFJVRSwgRkFMU0UpOworCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24ocExpc3RCb3gtPkdldEN1clNlbCgpLCB0cnVlLCBmYWxzZSk7CiAJCQlhTmV3U2VsZWN0LkFkZChwTGlzdEJveC0+R2V0Q3VyU2VsKCkpOwogCQl9CiAKIAkJbV9wV2lkZ2V0LT5TZXRUb3BWaXNpYmxlSW5kZXgobk5ld1RvcEluZGV4KTsKLQkJbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKKwkJbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZSh0cnVlKTsKIAkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCQlTZXRDaGFuZ2VNYXJrKCk7CiAJfQpAQCAtMTkyLDcgKzE5Miw3IEBACiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwkJCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCQkJewogCQkJCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAJCQkJaW50MzJfdCBuQ3VyU2VsID0gcExpc3RCb3gtPkdldEN1clNlbCgpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiB7CiAJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCXsKIAkJZm9yIChpbnQzMl90IGk9MCxzej1wTGlzdEJveC0+R2V0Q291bnQoKTsgaTxzejsgaSsrKQogCQl7CkBAIC0yNDQsMTQgKzI0NCwxNCBAQAogCiB2b2lkIENGRkxfTGlzdEJveDo6UmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKLQlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKIAl7CiAJCWZvciAoaW50IGk9MCxzej1tX1N0YXRlLkdldFNpemUoKTsgaTxzejsgaSsrKQogCQkJcExpc3RCb3gtPlNlbGVjdChtX1N0YXRlW2ldKTsKIAl9CiB9CiAKLUNQV0xfV25kKiBDRkZMX0xpc3RCb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKQorQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJSZXN0b3JlVmFsdWUpCiB7CiAJaWYgKGJSZXN0b3JlVmFsdWUpCiAJCVNhdmVTdGF0ZShwUGFnZVZpZXcpOwpAQCAtMjYzLDE3ICsyNjMsMTcgQEAKIAlpZiAoYlJlc3RvcmVWYWx1ZSkKIAl7CiAJCVJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOwotCQlwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworCQlwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwogCX0KIAllbHNlCi0JCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKTsKKwkJcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpOwogCiAJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogCiAJcmV0dXJuIHBSZXQ7CiB9CiAKLXZvaWQgQ0ZGTF9MaXN0Qm94OjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duLCBGWF9EV09SRCBuRmxhZykKK3ZvaWQgQ0ZGTF9MaXN0Qm94OjpPbktleVN0cm9rZShib29sIGJLZXlEb3duLCBGWF9EV09SRCBuRmxhZykKIHsKIAlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCkBAIC0yODksNyArMjg5LDcgQEAKIAkJCWlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWcpKQogCQkJewogCQkJCURlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQkJCQltX2JWYWxpZCA9IEZBTFNFOworCQkJCW1fYlZhbGlkID0gZmFsc2U7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcAppbmRleCA1OGEyMjAyLi5mZGM0YmNmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKIC8vI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ4MDApCiAKIENGRkxfTm90aWZ5OjpDRkZMX05vdGlmeShDRkZMX0Zvcm1GaWxsZXIgKiBwRm9ybUZpbGxlcikgOgotCW1fYkRvQWN0aW9uaW5nKEZBTFNFKSwKKwltX2JEb0FjdGlvbmluZyhmYWxzZSksCiAJbV9uTm90aWZ5RmxhZygwKQogewogCUFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKQEAgLTM2LDExNiArMzYsMTE2IEBACiAJbV9uTm90aWZ5RmxhZyAtLTsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZVVwKEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VVcChib29sICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6QnV0dG9uVXAsIGJFeGl0KTsKKwlib29sIGJSZXQgPSBmYWxzZTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25VcCwgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VEb3duKEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VEb3duKGJvb2wgJiBiRXhpdCkKIHsKIAlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25Eb3duLCBiRXhpdCk7CisJYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6QnV0dG9uRG93biwgYkV4aXQpOwogCUFmdGVyTm90aWZ5KCk7CiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFbnRlcihGWF9CT09MICYgYkV4aXQpCitib29sIENGRkxfTm90aWZ5OjpPbk1vdXNlRW50ZXIoYm9vbCAmIGJFeGl0KQogewogCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkN1cnNvckVudGVyLCBiRXhpdCk7CisJYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRW50ZXIsIGJFeGl0KTsKIAlBZnRlck5vdGlmeSgpOwogCXJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlRXhpdChGWF9CT09MICYgYkV4aXQpCitib29sIENGRkxfTm90aWZ5OjpPbk1vdXNlRXhpdChib29sICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRXhpdCwgYkV4aXQpOworCWJvb2wgYlJldCA9IGZhbHNlOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkN1cnNvckV4aXQsIGJFeGl0KTsKIAlBZnRlck5vdGlmeSgpOwogCXJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPblNldEZvY3VzKEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uU2V0Rm9jdXMoYm9vbCAmIGJFeGl0KQogewogCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkdldEZvY3VzLCBiRXhpdCk7CisJYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6R2V0Rm9jdXMsIGJFeGl0KTsKIAlBZnRlck5vdGlmeSgpOwogCXJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbktpbGxGb2N1cyhGWF9CT09MICYgYkV4aXQpCitib29sIENGRkxfTm90aWZ5OjpPbktpbGxGb2N1cyhib29sICYgYkV4aXQpCiB7CiAJQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6TG9zZUZvY3VzLCBiRXhpdCk7CisJYm9vbCBiUmV0ID0gZmFsc2U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6TG9zZUZvY3VzLCBiRXhpdCk7CiAJQWZ0ZXJOb3RpZnkoKTsKIAlyZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25DYWxjdWxhdGUoKQorYm9vbCBDRkZMX05vdGlmeTo6T25DYWxjdWxhdGUoKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbkZvcm1hdChpbnQgaUNvbW1pdEtleSkKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uRm9ybWF0KGludCBpQ29tbWl0S2V5KQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLAotCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJXaWxsQ29tbWl0LCBGWF9CT09MIGJGaWVsZEZ1bGwsCi0JCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgRlhfQk9PTCYgYlJDKQorYm9vbCBDRkZMX05vdGlmeTo6T25LZXlTdHJva2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGludCBuQ29tbWl0S2V5LCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwKKwkJCQkJCQkgICBib29sIGJTaGlmdCwgYm9vbCBiV2lsbENvbW1pdCwgYm9vbCBiRmllbGRGdWxsLAorCQkJCQkJCSAgIGludCYgblNlbFN0YXJ0LCBpbnQmIG5TZWxFbmQsIGJvb2wmIGJSQykKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKLQkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCi0JCQkJCQkJCQkgICBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCAmIGJSQykKK2Jvb2wgQ0ZGTF9Ob3RpZnk6Ok9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsCisJCQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIGJvb2wgYktleURvd24sIGJvb2wgYk1vZGlmaWVyLAorCQkJCQkJCQkJICAgYm9vbCBiU2hpZnQsIGJvb2wgJiBiUkMpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkRvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wgJiBiRXhpdCkKK2Jvb2wJQ0ZGTF9Ob3RpZnk6OkRvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIGJvb2wgJiBiRXhpdCkKIHsKICAgICBpZiAobV9iRG9BY3Rpb25pbmcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9BY3Rpb24gYWN0aW9uOwogICAgIGlmICghRmluZEFBY3Rpb24oZUFBVCwgYWN0aW9uKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBtX2JEb0FjdGlvbmluZyA9IFRSVUU7CisgICAgbV9iRG9BY3Rpb25pbmcgPSB0cnVlOwogICAgIEV4ZWN1dGVBY3Rpb25UcmVlKGVBQVQsYWN0aW9uLGJFeGl0KTsKLSAgICBtX2JEb0FjdGlvbmluZyA9IEZBTFNFOwotICAgIHJldHVybiBUUlVFOworICAgIG1fYkRvQWN0aW9uaW5nID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbiwgRlhfQk9PTCYgYkV4aXQpCitib29sCUNGRkxfTm90aWZ5OjpFeGVjdXRlQWN0aW9uVHJlZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sIGJvb2wmIGJFeGl0KQogewotCWlmICghRXhlY3V0ZUFjdGlvbihlQUFULGFjdGlvbixiRXhpdCkpIHJldHVybiBGQUxTRTsKLQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOworCWlmICghRXhlY3V0ZUFjdGlvbihlQUFULGFjdGlvbixiRXhpdCkpIHJldHVybiBmYWxzZTsKKwlpZiAoYkV4aXQpIHJldHVybiB0cnVlOwogCiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUFjdGlvblRyZWUoZUFBVCxzdWJhY3Rpb24sYkV4aXQpKSByZXR1cm4gRkFMU0U7CisJCWlmICghRXhlY3V0ZUFjdGlvblRyZWUoZUFBVCxzdWJhY3Rpb24sYkV4aXQpKSByZXR1cm4gZmFsc2U7CiAJCWlmIChiRXhpdCkgYnJlYWs7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIAotRlhfQk9PTAlDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQorYm9vbAlDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6OkZpbmRBQWN0aW9uKENQREZfQUFjdGlvbiBhYWN0aW9uLENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbikKK2Jvb2wgQ0ZGTF9Ob3RpZnk6OkZpbmRBQWN0aW9uKENQREZfQUFjdGlvbiBhYWN0aW9uLENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbikKIHsKIAlDUERGX0FjdGlvbiBNeUFjdGlvbjsKIApAQCAtMTU0LDIwICsxNTQsMjAgQEAKIAkJTXlBY3Rpb24gPSBhYWN0aW9uLkdldEFjdGlvbihlQUFUKTsKIAl9CiAJZWxzZQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCiAJaWYgKE15QWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6VW5rbm93bikKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlhY3Rpb24gPSBNeUFjdGlvbjsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNGRkxfTm90aWZ5OjpFeGVjdXRlQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbixGWF9CT09MJiBiRXhpdCkKK2Jvb2wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLGJvb2wmIGJFeGl0KQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAvLyNwcmFnbWEgd2FybmluZyhkZWZhdWx0OiA0ODAwKQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwCmluZGV4IGE1ZGY0ODguLjQ0ZTRlZDAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwCkBAIC0yOCw3ICsyOCw3IEBACiB9CiAKIAotRlhfQk9PTAlDRkZMX1B1c2hCdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorYm9vbAlDRkZMX1B1c2hCdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQogewogCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwCmluZGV4IDFmNzNlOGMuLmU3YjMzNDggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAKQEAgLTMxLDE5ICszMSwxOSBAQAogCXJldHVybiBwV25kOwogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKQorYm9vbAlDRkZMX1JhZGlvQnV0dG9uOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKIHsKIAlzd2l0Y2ggKG5LZXlDb2RlKQogCXsKIAljYXNlIEZXTF9WS0VZX1JldHVybjoKIAljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CiAJfQogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQorYm9vbAlDRkZMX1JhZGlvQnV0dG9uOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKIAlzd2l0Y2ggKG5DaGFyKQogCXsKQEAgLTU2LDYxICs1Niw2MSBAQAogCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogCQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotCQkJRlhfQk9PTCBiUmVzZXQgPSBGQUxTRTsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKwkJCWJvb2wgYlJlc2V0ID0gZmFsc2U7CisJCQlib29sIGJFeGl0ID0gZmFsc2U7CiAKIAkJCXBJRm9ybUZpbGxlci0+T25CdXR0b25VcChtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCxuRmxhZ3MpOwogCi0JCQlpZiAoYlJlc2V0KSByZXR1cm4gVFJVRTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuIFRSVUU7CisJCQlpZiAoYlJlc2V0KSByZXR1cm4gdHJ1ZTsKKwkJCWlmIChiRXhpdCkgcmV0dXJuIHRydWU7CiAKIAkJCUNGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiAKLQkJCWlmIChDUFdMX1JhZGlvQnV0dG9uICogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLQkJCQlwV25kLT5TZXRDaGVjayhUUlVFKTsKKwkJCWlmIChDUFdMX1JhZGlvQnV0dG9uICogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKKwkJCQlwV25kLT5TZXRDaGVjayh0cnVlKTsKIAkJCUNvbW1pdERhdGEocFBhZ2VWaWV3LG5GbGFncyk7Ci0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiAJfQogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sCUNGRkxfUmFkaW9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAJQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKIAogCWlmIChJc1ZhbGlkKCkpCiAJewotCQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiAqIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0JCQlwV25kLT5TZXRDaGVjayhUUlVFKTsKKwkJaWYgKENQV0xfUmFkaW9CdXR0b24gKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQorCQkJcFduZC0+U2V0Q2hlY2sodHJ1ZSk7CiAKLQkJaWYgKCFDb21taXREYXRhKHBQYWdlVmlldyxuRmxhZ3MpKSByZXR1cm4gRkFMU0U7CisJCWlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKSkgcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbAlDRkZMX1JhZGlvQnV0dG9uOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKIAlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0JaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorCWlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKIAl7CiAJCXJldHVybiBwV25kLT5Jc0NoZWNrZWQoKSAhPSBtX3BXaWRnZXQtPklzQ2hlY2tlZCgpOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9SYWRpb0J1dHRvbjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisJaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogCXsKIAotCQlGWF9CT09MIGJOZXdDaGVja2VkID0gcFduZC0+SXNDaGVja2VkKCk7CisJCWJvb2wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKIAogCQlpZiAoYk5ld0NoZWNrZWQpCiAJCXsKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJfQogCQl9CiAKLQkJbV9wV2lkZ2V0LT5TZXRDaGVjayhiTmV3Q2hlY2tlZCwgRkFMU0UpOworCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBmYWxzZSk7CiAJCW1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKIAkJU2V0Q2hhbmdlTWFyaygpOwogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCmluZGV4IGE0Yjg3MjYuLmE4Njk1ZjQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcApAQCAtMTI5LDcgKzEyOSw3IEBACiB9CiAKIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCitib29sIENGRkxfVGV4dEZpZWxkOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKIHsKICAgICBzd2l0Y2ggKG5DaGFyKQogICAgIHsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAgICAgICAgICAgICBpZiAobV9iVmFsaWQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgICAgICAgICAgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpCiAgICAgICAgICAgICAgICAgICAgIHBXbmQtPlNldEZvY3VzKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCkBAIC0xNTIsOSArMTUyLDkgQEAKICAgICAgICAgICAgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTE2MiwzNSArMTYyLDM1IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CiAgICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotICAgICAgICAgICAgRXNjYXBlRmlsbGVyKHBQYWdlVmlldyxUUlVFKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgRXNjYXBlRmlsbGVyKHBQYWdlVmlldyx0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorYm9vbCBDRkZMX1RleHRGaWVsZDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCiB7CiAgICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9FZGl0ICogcEVkaXQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHJldHVybiBwRWRpdC0+R2V0VGV4dCgpICE9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgIHsKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc09sZFZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzTmV3VmFsdWUgPSBwV25kLT5HZXRUZXh0KCk7CiAKLSAgICAgICAgbV9wV2lkZ2V0LT5TZXRWYWx1ZShzTmV3VmFsdWUsIEZBTFNFKTsKLSAgICAgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKKyAgICAgICAgbV9wV2lkZ2V0LT5TZXRWYWx1ZShzTmV3VmFsdWUsIGZhbHNlKTsKKyAgICAgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZSh0cnVlKTsKICAgICAgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwogICAgICAgICBTZXRDaGFuZ2VNYXJrKCk7CiAgICAgfQpAQCAtMjAyLDcgKzIwMiw3IEBACiAgICAgc3dpdGNoICh0eXBlKQogICAgIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBmYS5iRmllbGRGdWxsID0gcFduZC0+SXNUZXh0RnVsbCgpOwogCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6Ci0gICAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZhLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKICAgICAgICAgfQpAQCAtMjM3LDcgKzIzNyw3IEBACiAgICAgc3dpdGNoICh0eXBlKQogICAgIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgICBpZiAoQ1BXTF9FZGl0ICogcEVkaXQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCisgICAgICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKICAgICAgICAgewogICAgICAgICAgICAgcEVkaXQtPlNldEZvY3VzKCk7CiAgICAgICAgICAgICBwRWRpdC0+U2V0U2VsKGZhLm5TZWxTdGFydCwgZmEublNlbEVuZCk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIH0KIAogCi1GWF9CT09MIENGRkxfVGV4dEZpZWxkOjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKK2Jvb2wgQ0ZGTF9UZXh0RmllbGQ6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykKIHsKICAgICBzd2l0Y2ggKHR5cGUpCkBAIC0yNjIsMTQgKzI2MiwxNCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfVGV4dEZpZWxkOjpTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgewogICAgICAgICBwV25kLT5HZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7CiAgICAgICAgIG1fU3RhdGUuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwpAQCAtMjgwLDE0ICsyODAsMTQgQEAKIHsKICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKICAgICB7CiAgICAgICAgIHBXbmQtPlNldFRleHQobV9TdGF0ZS5zVmFsdWUuY19zdHIoKSk7CiAgICAgICAgIHBXbmQtPlNldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKICAgICB9CiB9CiAKLUNQV0xfV25kKiBDRkZMX1RleHRGaWVsZDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpCitDUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiUmVzdG9yZVZhbHVlKQogewogICAgIGlmIChiUmVzdG9yZVZhbHVlKQogICAgICAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKQEAgLTI5OSwxMCArMjk5LDEwIEBACiAgICAgaWYgKGJSZXN0b3JlVmFsdWUpCiAgICAgewogICAgICAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CisgICAgICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKTsKIAogICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKIApAQCAtMzI2LDcgKzMyNiw3IEBACiAgICAgICAgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7CiAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKLSAgICAgICAgbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwgbkNoYXJhY3RlcnMsIFRSVUUpOworICAgICAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLCBuQ2hhcmFjdGVycywgdHJ1ZSk7CiAKICAgICAgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7CiAgICAgICAgIC8vcFVuZG8tPkJlZ2luRWRpdChwRG9jdW1lbnQpOwpAQCAtMzM4LDE5ICszMzgsMTkgQEAKIAogfQogCi1GWF9CT09MIENGRkxfVGV4dEZpZWxkOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9UZXh0RmllbGQ6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sIENGRkxfVGV4dEZpZWxkOjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wgQ0ZGTF9UZXh0RmllbGQ6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGRkxfVGV4dEZpZWxkOjpPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcAppbmRleCA4ZDJkNzZkLi4wZTUwMjJjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9VdGlscy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwCkBAIC00MSw5ICs0MSw5IEBACiAJcmV0dXJuIGNyTmV3OwogfQogCi1GWF9CT09MIENGRkxfVXRpbHM6OlRyYWNlT2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKQorYm9vbCBDRkZMX1V0aWxzOjpUcmFjZU9iamVjdChDUERGX09iamVjdCogcE9iaikKIHsKLQlpZiAoIXBPYmopIHJldHVybiBGQUxTRTsKKwlpZiAoIXBPYmopIHJldHVybiBmYWxzZTsKIAogCUZYX0RXT1JECWR3T2JqTnVtID0gcE9iai0+R2V0T2JqTnVtKCk7CiAJc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpCkBAIC03MSw3ICs3MSw3IEBACiAgCQkJCS8vVFJBQ0UoY3NLZXkgKyAiXG4iKTsKIAkJCQlpZiAoIXBFbGVtZW50KSBicmVhazsKIAkJCQlUcmFjZU9iamVjdChwRWxlbWVudCk7Ci0JCQl9d2hpbGUgKFRSVUUpOworCQkJfXdoaWxlICh0cnVlKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTA3LDggKzEwNyw4IEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCWlmIChkd09iak51bSA9PSAwKSByZXR1cm4gRkFMU0U7CisJaWYgKGR3T2JqTnVtID09IDApIHJldHVybiBmYWxzZTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAKaW5kZXggYjI2ZDJhZi4uODVlYmE1NSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcApAQCAtMjEsNyArMjEsNyBAQAogCQltX3BmaWxlQXZhaWwgPSBwZmlsZUF2YWlsOwogCX0KIAotCXZpcnR1YWwgRlhfQk9PTAkJCUlzRGF0YUF2YWlsKCBGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpCisJdmlydHVhbCBib29sCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkKIAl7CiAJCXJldHVybiBtX3BmaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fcGZpbGVBdmFpbCwgb2Zmc2V0LCBzaXplKTsKIAl9CkBAIC00OCw3ICs0OCw3IEBACiAJCXJldHVybiBtX3BGaWxlQWNjZXNzLT5tX0ZpbGVMZW47CiAJfQogCi0JdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKwl2aXJ0dWFsIGJvb2wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQogCXsKIAkJcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fR2V0QmxvY2sobV9wRmlsZUFjY2Vzcy0+bV9QYXJhbSwgb2Zmc2V0LCAodWludDhfdCopYnVmZmVyLCBzaXplKTsKIAl9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAKaW5kZXggMGQ4ZGI0MS4uNzQxMzQ3NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcApAQCAtMTQsNyArMTQsNyBAQAogewogcHVibGljOgogICAgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcihVTlNVUFBPUlRfSU5GTyogdW5zcF9pbmZvKXsgbV91bnNwX2luZm8gPSB1bnNwX2luZm87fQotLy8gIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKTsKKy8vICBib29sIE5lZWRUb1BhdXNlTm93KCk7CiAgICAgdm9pZCBSZXBvcnRFcnJvcihpbnQgbkVycm9yVHlwZSk7CiAKIHByaXZhdGU6CkBAIC0zNSwyNSArMzUsMjUgQEAKICAgICBkZWxldGUgcEFkYXB0ZXI7CiB9CiAKLUZYX0JPT0wgRlBERl9VblN1cHBvcnRFcnJvcihpbnQgbkVycm9yKQorYm9vbCBGUERGX1VuU3VwcG9ydEVycm9yKGludCBuRXJyb3IpCiB7CiAgICAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyICogcEFkYXB0ZXIgPSAoQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyICopQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQcml2YXRlRGF0YSgodm9pZCAqKUZQREZTREtfVU5TVVBQT1JUX0NBTEwpOwogCiAgICAgaWYoIXBBZGFwdGVyKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBwQWRhcHRlci0+UmVwb3J0RXJyb3IobkVycm9yKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pCiB7CiAgICAgaWYgKCF1bnNwX2luZm8gfHwgdW5zcF9pbmZvLT52ZXJzaW9uIT0xKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIgKiBwQWRhcHRlciA9IG5ldyBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIodW5zcF9pbmZvKTsKIAogICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQgKilGUERGU0RLX1VOU1VQUE9SVF9DQUxMLHBBZGFwdGVyLCAmRnJlZVVuc3VwcG9ydEluZm8pOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ2hlY2tVblN1cHBvcnRBbm5vdChDUERGX0RvY3VtZW50ICogcERvYywgQ1BERl9Bbm5vdCogcFBERkFubm90KQpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIH0KIAotRlhfQk9PTCBDaGVja1NoYXJlZEZvcm0oQ1hNTF9FbGVtZW50ICogcEVsZW1lbnQsIENGWF9CeXRlU3RyaW5nIGNiTmFtZSkKK2Jvb2wgQ2hlY2tTaGFyZWRGb3JtKENYTUxfRWxlbWVudCAqIHBFbGVtZW50LCBDRlhfQnl0ZVN0cmluZyBjYk5hbWUpCiB7CiAgICAgaW50IGNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cnMoKTsKICAgICBpbnQgaT0wOwpAQCAtMTQzLDEwICsxNDMsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ1hNTF9FbGVtZW50ICogcENoaWxkID0gcEVsZW1lbnQtPkdldEVsZW1lbnQoaSk7CiAgICAgICAgICAgICBpZihDaGVja1NoYXJlZEZvcm0ocENoaWxkLCBjYk5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ2hlY2tVblN1cHBvcnRFcnJvcihDUERGX0RvY3VtZW50ICogcERvYywgRlhfRFdPUkQgZXJyX2NvZGUpCkBAIC0yMDYsNyArMjA2LDcgQEAKICAgICAgICAgQ2hlY2tTaGFyZWRGb3JtKHBFbGVtZW50LCAid29ya2Zsb3dUeXBlIik7CiAKICAgICAvLyBYRkEgRm9ybXMKLSAgICBDUERGX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocERvYyxGQUxTRSk7CisgICAgQ1BERl9JbnRlckZvcm0gKiBwSW50ZXJGb3JtID0gbmV3IENQREZfSW50ZXJGb3JtKHBEb2MsZmFsc2UpOwogICAgIGlmIChwSW50ZXJGb3JtLT5IYXNYRkFGb3JtKCkpCiAgICAgewogICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfWEZBRk9STSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9mbGF0dGVuLmNwcAppbmRleCA5ODhkN2Y0Li4zZGJiMGExIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAKQEAgLTEzLDE3ICsxMywxNyBAQAogZW51bSBGUERGX1RZUEUgeyBNQVgsIE1JTiB9OwogZW51bSBGUERGX1ZBTFVFIHsgVE9QLCBMRUZULCBSSUdIVCwgQk9UVE9NIH07CiAKLUZYX0JPT0wgSXNWYWxpYWJsZVJlY3QoQ1BERl9SZWN0IHJlY3QsIENQREZfUmVjdCByY1BhZ2UpCitib29sIElzVmFsaWFibGVSZWN0KENQREZfUmVjdCByZWN0LCBDUERGX1JlY3QgcmNQYWdlKQogewogCWlmICggcmVjdC5sZWZ0IC0gcmVjdC5yaWdodCA+IDAuMDAwMDAxZiB8fAogCQkgcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IDAuMDAwMDAxZikKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAocmVjdC5sZWZ0ID09IDAuMGYgJiYKIAkJcmVjdC50b3AgPT0gMC4wZiAmJgogCQlyZWN0LnJpZ2h0ID09IDAuMGYgJiYKIAkJcmVjdC5ib3R0b20gPT0gMC4wZikKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoIXJjUGFnZS5Jc0VtcHR5KCkpCiAJewpAQCAtMzEsMTcgKzMxLDE3IEBACiAJCQlyZWN0LnJpZ2h0IC0gcmNQYWdlLnJpZ2h0ID4gMTAuMDAwMDAxZiB8fAogCQkJcmVjdC50b3AgLSByY1BhZ2UudG9wID4gMTAuMDAwMDAxZiB8fAogCQkJcmVjdC5ib3R0b20gLSByY1BhZ2UuYm90dG9tIDwgLTEwLjAwMDAwMWYpCi0JCQlyZXR1cm4gRkFMU0U7CisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIAotRlhfQk9PTCBHZXRDb250ZW50c1JlY3QoIENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX1JlY3RBcnJheSAqIHBSZWN0QXJyYXkgKQorYm9vbCBHZXRDb250ZW50c1JlY3QoIENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX1JlY3RBcnJheSAqIHBSZWN0QXJyYXkgKQogewogCUNQREZfUGFnZSogcFBERlBhZ2UgPSBuZXcgQ1BERl9QYWdlOwotCXBQREZQYWdlLT5Mb2FkKCBwRG9jLCBwRGljdCwgRkFMU0UgKTsKKwlwUERGUGFnZS0+TG9hZCggcERvYywgcERpY3QsIGZhbHNlICk7CiAJcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOwogCiAJRlhfUE9TSVRJT04gcG9zID0gcFBERlBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKQEAgLTY0LDcgKzY0LDcgQEAKIAl9CiAKIAlkZWxldGUgcFBERlBhZ2U7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIApAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkJCUNGWF9CeXRlU3RyaW5nIHNTdHJlYW07CiAJCQlzU3RyZWFtLkZvcm1hdCgicSAxIDAgMCAxIDAgMCBjbSAvJXMgRG8gUSIsIGtleS5jX3N0cigpKTsKLQkJCXBOZXdDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKKwkJCXBOZXdDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKIAkJfQogCQlyZXR1cm47CiAJfQpAQCAtMjM3LDcgKzIzNyw3IEBACiAJCQlDRlhfQnl0ZVN0cmluZyBzU3RyZWFtID0gInFcbiI7CiAJCQlDRlhfQnl0ZVN0cmluZyBzQm9keSA9IENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKilhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKIAkJCXNTdHJlYW0gPSBzU3RyZWFtICsgc0JvZHkgKyAiXG5RIjsKLQkJCXBDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKKwkJCXBDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKIAkJCXBDb250ZW50c0FycmF5LT5BZGRSZWZlcmVuY2UocERvY3VtZW50LCBkd09iak51bSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMjY0LDcgKzI2NCw3IEBACiAKIAkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKIAkJc1N0cmVhbS5Gb3JtYXQoInEgMSAwIDAgMSAwIDAgY20gLyVzIERvIFEiLCBrZXkuY19zdHIoKSk7Ci0JCXBOZXdDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKKwkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBmYWxzZSwgZmFsc2UpOwogCX0KIH0KIApAQCAtNTM4LDcgKzUzOCw3IEBACiAJCXNUZW1wLkZvcm1hdCgicSAlZiAwIDAgJWYgJWYgJWYgY20gLyVzIERvIFFcbiIsIG0uYSwgbS5kLCBtLmUsIG0uZiwgc0Zvcm1OYW1lLmNfc3RyKCkpOwogCQlzU3RyZWFtICs9IHNUZW1wOwogCi0JCXBOZXdYT2JqZWN0LT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworCQlwTmV3WE9iamVjdC0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgZmFsc2UsIGZhbHNlKTsKIAl9CiAJcFBhZ2VEaWN0LT5SZW1vdmVBdCggIkFubm90cyIgKTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9wcm9ncmVzc2l2ZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcAppbmRleCA0ZWM3M2FjLi4wYzQ5ZGY2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcApAQCAtMjksMjAgKzI5LDIwIEBACiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9Ta2lhRGV2aWNlOwogICAgIGlmIChmbGFncyAmIEZQREZfUkVWRVJTRV9CWVRFX09SREVSKQotICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLFRSVUUpOworICAgICAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLHRydWUpOwogICAgIGVsc2UKICAgICAgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwogI2Vsc2UKICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOwogICAgIGlmIChmbGFncyAmIEZQREZfUkVWRVJTRV9CWVRFX09SREVSKQotICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLFRSVUUpOworICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLHRydWUpOwogICAgIGVsc2UKICAgICAgICAgKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwogI2VuZGlmCiAgICAgSUZTREtfUEFVU0VfQWRhcHRlciBJUGF1c2VBZGFwdGVyKHBhdXNlKTsKIAogICAgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncyxGQUxTRSwgJklQYXVzZUFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncyxmYWxzZSwgJklQYXVzZUFkYXB0ZXIpOwogCiAgICAgaWYgKHBDb250ZXh0LT5tX3BSZW5kZXJlcikKICAgICAgICAgcmV0dXJuIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6VG9GUERGU3RhdHVzKHBDb250ZXh0LT5tX3BSZW5kZXJlci0+R2V0U3RhdHVzKCkpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcAppbmRleCBjZjBjZGQ5Li42OTE3MTA3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcApAQCAtMjAsMTYgKzIwLDE2IEBACiAJCWRlbGV0ZSB0aGlzOwogCX0KIAotCXZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZQorCXZpcnR1YWwJYm9vbAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZQogCXsKIAkJaWYgKG1fcEluZm8tPkVudW1Gb250cykgewogCQkJbV9wSW5mby0+RW51bUZvbnRzKG1fcEluZm8sIHBNYXBwZXIpOwotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKLQl2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpICBvdmVycmlkZQorCXZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgYm9vbCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgIG92ZXJyaWRlCiAJewogCQlpZiAobV9wSW5mby0+TWFwRm9udCkKIAkJCXJldHVybiBtX3BJbmZvLT5NYXBGb250KG1fcEluZm8sIHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LCBmYW1pbHksICZpRXhhY3QpOwpAQCAtNTAsMjUgKzUwLDI1IEBACiAJCXJldHVybiAwOwogCX0KIAotCXZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSAgb3ZlcnJpZGUKKwl2aXJ0dWFsIGJvb2wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgIG92ZXJyaWRlCiAJewotCQlpZiAobV9wSW5mby0+R2V0RmFjZU5hbWUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCQlpZiAobV9wSW5mby0+R2V0RmFjZU5hbWUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogCQlGWF9EV09SRCBzaXplID0gbV9wSW5mby0+R2V0RmFjZU5hbWUobV9wSW5mbywgaEZvbnQsIE5VTEwsIDApOwotCQlpZiAoc2l6ZSA9PSAwKSByZXR1cm4gRkFMU0U7CisJCWlmIChzaXplID09IDApIHJldHVybiBmYWxzZTsKIAkJY2hhciogYnVmZmVyID0gRlhfQWxsb2MoY2hhciwgc2l6ZSk7CiAJCXNpemUgPSBtX3BJbmZvLT5HZXRGYWNlTmFtZShtX3BJbmZvLCBoRm9udCwgYnVmZmVyLCBzaXplKTsKIAkJbmFtZSA9IENGWF9CeXRlU3RyaW5nKGJ1ZmZlciwgc2l6ZSk7CiAJCUZYX0ZyZWUoYnVmZmVyKTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgIG92ZXJyaWRlCisJdmlydHVhbCBib29sCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSAgb3ZlcnJpZGUKIAl7CiAJCWlmIChtX3BJbmZvLT5HZXRGb250Q2hhcnNldCkgewogCQkJY2hhcnNldCA9IG1fcEluZm8tPkdldEZvbnRDaGFyc2V0KG1fcEluZm8sIGhGb250KTsKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KSAgb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCmluZGV4IGEyOWRiNWEuLmNmMTdmMjAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKQogewogCWlmKCFwYWdlKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKIAlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJNZWRpYUJveCIpOwpAQCAtNTIsMTUgKzUyLDE1IEBACiAJCSpib3R0b20gPSBwQXJyYXktPkdldEZsb2F0KDEpOwogCQkqcmlnaHQgPSBwQXJyYXktPkdldEZsb2F0KDIpOwogCQkqdG9wID0gcEFycmF5LT5HZXRGbG9hdCgzKTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQqIGxlZnQsIGZsb2F0KiBib3R0b20sIGZsb2F0KiByaWdodCwgZmxvYXQqIHRvcCkKIHsKIAlpZighcGFnZSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CiAJQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CiAJQ1BERl9BcnJheSogcEFycmF5ID0gcFBhZ2VEaWN0LT5HZXRBcnJheSgiQ3JvcEJveCIpOwpAQCAtNzAsMTUgKzcwLDE1IEBACiAJCSpib3R0b20gPSBwQXJyYXktPkdldEZsb2F0KDEpOwogCQkqcmlnaHQgPSBwQXJyYXktPkdldEZsb2F0KDIpOwogCQkqdG9wID0gcEFycmF5LT5HZXRGbG9hdCgzKTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfVHJhbnNGb3JtV2l0aENsaXAoRlBERl9QQUdFIHBhZ2UsIEZTX01BVFJJWCogbWF0cml4LCBGU19SRUNURiogY2xpcFJlY3QpCiB7CiAJaWYoIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7CiAJdGV4dEJ1Zjw8InEgIjsKQEAgLTk5LDE5ICs5OSwxOSBAQAogCWlmKCFwQ29udGVudE9iaikKIAkJcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRBcnJheSgiQ29udGVudHMiKSA6IE5VTEw7CiAJaWYoIXBDb250ZW50T2JqKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCUNQREZfRGljdGlvbmFyeSogcERpYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CiAJQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwwLCBwRGljKTsKLQlwU3RyZWFtLT5TZXREYXRhKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0U2l6ZSgpLCBGQUxTRSwgRkFMU0UpOworCXBTdHJlYW0tPlNldERhdGEodGV4dEJ1Zi5HZXRCdWZmZXIoKSwgdGV4dEJ1Zi5HZXRTaXplKCksIGZhbHNlLCBmYWxzZSk7CiAJQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKIAlpZighcERvYykKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CiAKIAlwRGljID0gbmV3IENQREZfRGljdGlvbmFyeTsKIAlDUERGX1N0cmVhbSogcEVuZFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLDAsIHBEaWMpOwotCXBFbmRTdHJlYW0tPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKSIgUSIsIDIsIEZBTFNFLCBGQUxTRSk7CisJcEVuZFN0cmVhbS0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopIiBRIiwgMiwgZmFsc2UsIGZhbHNlKTsKIAlwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRW5kU3RyZWFtKTsKIAogCUNQREZfQXJyYXkqIHBDb250ZW50QXJyYXkgPSBOVUxMOwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZU9ial9UcmFuc2Zvcm1DbGlwUGF0aChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZikKQEAgLTIwNSw3ICsyMDUsNyBAQAogCUNQREZfUGF0aCBQYXRoOwogCVBhdGguR2V0TW9kaWZ5KCk7CiAJUGF0aC5BcHBlbmRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Ci0JcE5ld0NsaXBQYXRoLT5BcHBlbmRQYXRoKFBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKKwlwTmV3Q2xpcFBhdGgtPkFwcGVuZFBhdGgoUGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgZmFsc2UpOwogCXJldHVybiBwTmV3Q2xpcFBhdGg7CiB9CiAKQEAgLTI4Miw3ICsyODIsNyBAQAogCX0KIAlDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwogCUNQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsMCwgcERpYyk7Ci0JcFN0cmVhbS0+U2V0RGF0YShzdHJDbGlwLkdldEJ1ZmZlcigpLCBzdHJDbGlwLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKwlwU3RyZWFtLT5TZXREYXRhKHN0ckNsaXAuR2V0QnVmZmVyKCksIHN0ckNsaXAuR2V0U2l6ZSgpLCBmYWxzZSwgZmFsc2UpOwogCUNQREZfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CiAJaWYoIXBEb2MpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZkb2MuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKaW5kZXggZjc1MTk3Yi4uZTI2NDA2OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKQEAgLTIwOCwxMyArMjA4LDEzIEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCkKIHsKICAgICBpZighcGFnZSB8fCAhc3RhcnRQb3MgfHwgIWxpbmtBbm5vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CiAgICAgaWYoIXBQYWdlLT5tX3BGb3JtRGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOwogICAgIGlmKCFwQW5ub3RzKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBmb3IgKGludCBpID0gKnN0YXJ0UG9zOyBpIDwgKGludClwQW5ub3RzLT5HZXRDb3VudCgpOyBpKyspIHsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKTsKICAgICAgICAgaWYgKCFwRGljdCB8fCBwRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKQpAQCAtMjIyLDIzICsyMjIsMjMgQEAKICAgICAgICAgaWYocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKS5FcXVhbChGWF9CU1RSQygiTGluayIpKSkgewogICAgICAgICAgICAgKnN0YXJ0UG9zID0gaSArIDE7CiAgICAgICAgICAgICAqbGlua0Fubm90ID0gKEZQREZfTElOSylwRGljdDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LCBGU19SRUNURiogcmVjdCkKIHsKICAgICBpZighbGlua0Fubm90IHx8ICFyZWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7CiAgICAgQ1BERl9SZWN0IHJ0ID0gcEFubm90RGljdC0+R2V0UmVjdChGWF9CU1RSQygiUmVjdCIpKTsKICAgICByZWN0LT5sZWZ0ID0gcnQubGVmdDsKICAgICByZWN0LT5ib3R0b20gPSBydC5ib3R0b207CiAgICAgcmVjdC0+cmlnaHQgPSBydC5yaWdodDsKICAgICByZWN0LT50b3AgPSBydC50b3A7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCkKQEAgLTI1NSwxMiArMjU1LDEyIEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90LCBpbnQgcXVhZEluZGV4LCBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cykKIHsKICAgICBpZighbGlua0Fubm90IHx8ICFxdWFkUG9pbnRzKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7CiAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcEFubm90RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlF1YWRQb2ludHMiKSk7CiAgICAgaWYgKHBBcnJheSkgewogICAgICAgICBpZiAocXVhZEluZGV4IDwgMCB8fCBxdWFkSW5kZXggPj0gKGludClwQXJyYXktPkdldENvdW50KCkvOCB8fCAoKHF1YWRJbmRleCo4KzcpID49IChpbnQpcEFycmF5LT5HZXRDb3VudCgpKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgcXVhZFBvaW50cy0+eDEgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCk7CiAgICAgICAgIHF1YWRQb2ludHMtPnkxID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMSk7CiAgICAgICAgIHF1YWRQb2ludHMtPngyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMik7CkBAIC0yNjksOSArMjY5LDkgQEAKICAgICAgICAgcXVhZFBvaW50cy0+eTMgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCs1KTsKICAgICAgICAgcXVhZFBvaW50cy0+eDQgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCs2KTsKICAgICAgICAgcXVhZFBvaW50cy0+eTQgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCs3KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsIEZQREZfQllURVNUUklORyB0YWcsCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAKaW5kZXggOTZjZmJhNC4uY2VjM2UyMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmVkaXRpbWcuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcApAQCAtMjEsNyArMjEsNyBAQAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUoRlBERl9QQUdFKiBwYWdlcywgaW50IG5Db3VudCxGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LCBGUERGX0ZJTEVBQ0NFU1MqIGZpbGVBY2Nlc3MpCiB7CiAJaWYgKCFpbWFnZV9vYmplY3QgfHwgIWZpbGVBY2Nlc3MpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IG5ldyBDUERGX0N1c3RvbUFjY2VzcyhmaWxlQWNjZXNzKTsKIAlDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKWltYWdlX29iamVjdDsKQEAgLTMzLDcgKzMzLDcgQEAKIAl9CiAJcEltZ09iai0+bV9wSW1hZ2UtPlNldEpwZWdJbWFnZShwRmlsZSk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCkBAIC00MSw3ICs0MSw3IEBACiAJCQkJCQkJCQkJCQkgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZikKIHsKIAlpZiAoIWltYWdlX29iamVjdCkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IChDUERGX0ltYWdlT2JqZWN0KilpbWFnZV9vYmplY3Q7CiAJcEltZ09iai0+bV9NYXRyaXguYSA9IChGWF9GTE9BVClhOwogCXBJbWdPYmotPm1fTWF0cml4LmIgPSAoRlhfRkxPQVQpYjsKQEAgLTUwLDEzICs1MCwxMyBAQAogCXBJbWdPYmotPm1fTWF0cml4LmUgPSAoRlhfRkxPQVQpZTsKIAlwSW1nT2JqLT5tX01hdHJpeC5mID0gKEZYX0ZMT0FUKWY7CiAJcEltZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JcmV0dXJuICBUUlVFOworCXJldHVybiAgdHJ1ZTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRCaXRtYXAoRlBERl9QQUdFKiBwYWdlcyxpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsRlBERl9CSVRNQVAgYml0bWFwKQogewogCWlmICghaW1hZ2Vfb2JqZWN0IHx8ICFiaXRtYXApCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCUNGWF9ESUJpdG1hcCogcEJtcCA9IE5VTEw7CiAJcEJtcCA9IChDRlhfRElCaXRtYXAqKWJpdG1hcDsKIAlDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKWltYWdlX29iamVjdDsKQEAgLTY2LDggKzY2LDggQEAKIAkJQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2VzW2luZGV4XTsKIAkJcEltZ09iai0+bV9wSW1hZ2UtPlJlc2V0Q2FjaGUocFBhZ2UsTlVMTCk7CiAJfQotCXBJbWdPYmotPm1fcEltYWdlLT5TZXRJbWFnZShwQm1wLEZBTFNFKTsKKwlwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SW1hZ2UocEJtcCxmYWxzZSk7CiAJcEltZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwCmluZGV4IDEyYzJjY2UxLi44MjM2Y2IyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRSBwYWdlKQogewotCWlmKCFwYWdlKSByZXR1cm4gRkFMU0U7CisJaWYoIXBhZ2UpIHJldHVybiBmYWxzZTsKIAlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKIAogCXJldHVybiBwUGFnZS0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCk7CkBAIC0yMjMsMzQgKzIyMywzNCBAQAogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KQogewotCWlmKCFwYWdlT2JqZWN0KSByZXR1cm4gRkFMU0U7CisJaWYoIXBhZ2VPYmplY3QpIHJldHVybiBmYWxzZTsKIAlDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopcGFnZU9iamVjdDsKIAogCWNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZTsKIAlpbnQgYmxlbmRfdHlwZSA9IHBHZW5lcmFsU3RhdGUgPyBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKLQlpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHJldHVybiBUUlVFOworCWlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgcmV0dXJuIHRydWU7CiAKIAlDUERGX0RpY3Rpb25hcnkqIHBTTWFza0RpY3QgPSBwR2VuZXJhbFN0YXRlID8gKENQREZfRGljdGlvbmFyeSopcEdlbmVyYWxTdGF0ZS0+bV9wU29mdE1hc2sgOiBOVUxMOwotCWlmKHBTTWFza0RpY3QpIHJldHVybiBUUlVFOworCWlmKHBTTWFza0RpY3QpIHJldHVybiB0cnVlOwogCiAJaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxBbHBoYSAhPSAxLjBmKQotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAKIAlpZihwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfUEFUSCkKIAl7CiAJCWlmKHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBbHBoYSAhPSAxLjBmKQotCQkJcmV0dXJuIFRSVUU7CisJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKIAlpZihwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkKIAl7CiAJCUNQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKIAkJaWYocEZvcm1PYmotPm1fcEZvcm0gJiYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEKSkKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCWlmKHBGb3JtT2JqLT5tX3BGb3JtICYmICghKHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEKSAmJiAocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApKSkKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpCkBAIC0yNTksMTIgKzI1OSwxMiBAQAogCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKIAkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCiAJewotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAl9CiAJQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlIENHKHBQYWdlKTsKIAlDRy5HZW5lcmF0ZUNvbnRlbnQoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlT2JqX1RyYW5zZm9ybShGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcAppbmRleCBkMjFkNWQyLi4yMWE0NDFjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIENQREZTREtfUGFnZVZpZXcqIEZvcm1IYW5kbGVUb1BhZ2VWaWV3KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSkKIHsKICAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOwotICAgIHJldHVybiBwU0RLRG9jID8gcFNES0RvYy0+R2V0UGFnZVZpZXcoKENQREZfUGFnZSopcGFnZSwgVFJVRSkgOiBudWxscHRyOworICAgIHJldHVybiBwU0RLRG9jID8gcFNES0RvYy0+R2V0UGFnZVZpZXcoKENQREZfUGFnZSopcGFnZSwgdHJ1ZSkgOiBudWxscHRyOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTQxLDcgKzQxLDcgQEAKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopIHBhZ2U7CiAKICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q1BERl9JbnRlckZvcm0+IHBJbnRlckZvcm0oCi0gICAgICAgIG5ldyBDUERGX0ludGVyRm9ybShwUGFnZS0+bV9wRG9jdW1lbnQsIEZBTFNFKSk7CisgICAgICAgIG5ldyBDUERGX0ludGVyRm9ybShwUGFnZS0+bV9wRG9jdW1lbnQsIGZhbHNlKSk7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEludGVyRm9ybS0+R2V0Q29udHJvbEF0UG9pbnQoCiAgICAgICAgIHBQYWdlLCAoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKICAgICBpZiAoIXBGb3JtQ3RybCkKQEAgLTg0LDcgKzg0LDcgQEAKIHsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwogICAgIHJldHVybiBwUGFnZVZpZXctPk9uTW91c2VNb3ZlKHB0LCBtb2RpZmllcik7CkBAIC05NCw3ICs5NCw3IEBACiB7CiAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKICAgICByZXR1cm4gcFBhZ2VWaWV3LT5PbkxCdXR0b25Eb3duKHB0LCBtb2RpZmllcik7CkBAIC0xMDQsNyArMTA0LDcgQEAKIHsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwogICAgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvblVwKHB0LCBtb2RpZmllcik7CkBAIC0xMTQsNyArMTE0LDcgQEAKIHsKICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICByZXR1cm4gcFBhZ2VWaWV3LT5PbktleURvd24obktleUNvZGUsIG1vZGlmaWVyKTsKIH0KQEAgLTEyMyw3ICsxMjMsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIHJldHVybiBwUGFnZVZpZXctPk9uS2V5VXAobktleUNvZGUsIG1vZGlmaWVyKTsKIH0KQEAgLTEzMiw3ICsxMzIsNyBAQAogewogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIHJldHVybiBwUGFnZVZpZXctPk9uQ2hhcihuQ2hhciwgbW9kaWZpZXIpOwogfQpAQCAtMTQxLDcgKzE0MSw3IEBACiB7CiAgICAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IEZvcm1IYW5kbGVUb1NES0RvYyhoSGFuZGxlKTsKICAgICBpZiAoIXBTREtEb2MpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgcmV0dXJuIHBTREtEb2MtPktpbGxGb2N1c0Fubm90KDApOwogfQpAQCAtMjE2LDcgKzIxNiw3IEBACiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fT25BZnRlckxvYWRQYWdlKEZQREZfUEFHRSBwYWdlLCBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKIHsKICAgICBpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSkpCi0gICAgICAgIHBQYWdlVmlldy0+U2V0VmFsaWQoVFJVRSk7CisgICAgICAgIHBQYWdlVmlldy0+U2V0VmFsaWQodHJ1ZSk7CiB9CiAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShGUERGX1BBR0UgcGFnZSwgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpCkBAIC0yMjksMTAgKzIyOSwxMCBAQAogICAgICAgICByZXR1cm47CiAKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOworICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSk7CiAgICAgaWYgKHBQYWdlVmlldykKICAgICB7Ci0gICAgICAgIHBQYWdlVmlldy0+U2V0VmFsaWQoRkFMU0UpOworICAgICAgICBwUGFnZVZpZXctPlNldFZhbGlkKGZhbHNlKTsKICAgICAgICAgLy8gUmVNb3ZlUGFnZVZpZXcoKSB0YWtlcyBjYXJlIG9mIHRoZSBkZWxldGUgZm9yIHVzLgogICAgICAgICBwU0RLRG9jLT5SZU1vdmVQYWdlVmlldyhwUGFnZSk7CiAgICAgfQpAQCAtMjc5LDcgKzI3OSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0U0RLRG9jdW1lbnQoKTsKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOworICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSk7CiAgICAgaWYocFBhZ2VWaWV3KQogICAgIHsKICAgICAgICAgQ1BERkRvY19FbnZpcm9ubWVudCAqcEVudiA9IHBTREtEb2MtPkdldEVudigpOwpAQCAtMjkzLDggKzI5Myw4IEBACiAKICAgICAgICAgQ1BERl9BQWN0aW9uIGFhID0gcFBhZ2VEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJBQSIpKTsKIAotICAgICAgICBGWF9CT09MIGJFeGlzdE9BQWN0aW9uID0gRkFMU0U7Ci0gICAgICAgIEZYX0JPT0wgYkV4aXN0Q0FBY3Rpb24gPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiRXhpc3RPQUFjdGlvbiA9IGZhbHNlOworICAgICAgICBib29sIGJFeGlzdENBQWN0aW9uID0gZmFsc2U7CiAgICAgICAgIGlmIChGUERGUEFHRV9BQUNUSU9OX09QRU4gPT0gYWFUeXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBiRXhpc3RPQUFjdGlvbiA9IGFhLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6T3BlblBhZ2UpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnBwby5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcAppbmRleCA0MGQ1NmIzLi4xZWY2OWJmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcApAQCAtMTUsMTQgKzE1LDE0IEBACiAgICAgQ1BERl9QYWdlT3JnYW5pemVyKCk7CiAgICAgfkNQREZfUGFnZU9yZ2FuaXplcigpOwogCi0gICAgRlhfQk9PTCBQREZEb2NJbml0KENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLCBDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jKTsKLSAgICBGWF9CT09MIEV4cG9ydFBhZ2UoQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYywKKyAgICBib29sIFBERkRvY0luaXQoQ1BERl9Eb2N1bWVudCogcERlc3RQREZEb2MsIENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MpOworICAgIGJvb2wgRXhwb3J0UGFnZShDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jLAogICAgICAgICAgICAgICAgICAgICAgICBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwKICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERlc3RQREZEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSW5kZXgpOwogICAgIENQREZfT2JqZWN0KiBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKENQREZfRGljdGlvbmFyeSogcERpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgblNyY3RhZyk7Ci0gICAgRlhfQk9PTCBVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QqIHBPYmosCisgICAgYm9vbCBVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QqIHBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROdW1iZXJNYXAqIHBPYmpOdW1iZXJNYXApOwogICAgIEZYX0RXT1JEIEdldE5ld09iaklkKENQREZfRG9jdW1lbnQqIHBEb2MsCkBAIC0zOSwyMSArMzksMjEgQEAKIHsKIH0KIAotRlhfQk9PTCBDUERGX1BhZ2VPcmdhbml6ZXI6OlBERkRvY0luaXQoQ1BERl9Eb2N1bWVudCogcERlc3RQREZEb2MsCitib29sIENQREZfUGFnZU9yZ2FuaXplcjo6UERGRG9jSW5pdChDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MpCiB7CiAgICAgaWYgKCFwRGVzdFBERkRvYyB8fCAhcFNyY1BERkRvYykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBOZXdSb290ID0gcERlc3RQREZEb2MtPkdldFJvb3QoKTsKICAgICBpZiAoIXBOZXdSb290KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vU2V0IHRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICAgICBDUERGX0RpY3Rpb25hcnkqIERJbmZvRGljdCA9IHBEZXN0UERGRG9jLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFESW5mb0RpY3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvZHVjZXJzdHI7CiAgICAgcHJvZHVjZXJzdHIuRm9ybWF0KCJQREZpdW0iKTsKQEAgLTg5LDEwICs4OSwxMCBAQAogICAgICAgICBwTmV3UGFnZXMtPlNldEF0KCJDb3VudCIsIG5ldyBDUERGX051bWJlcigwKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCitib29sIENQREZfUGFnZU9yZ2FuaXplcjo6RXhwb3J0UGFnZShDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dvcmRBcnJheSogblBhZ2VOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSW5kZXgpCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3JjUGFnZURpY3QgPQogICAgICAgICAgICAgcFNyY1BERkRvYy0+R2V0UGFnZShuUGFnZU51bS0+R2V0QXQoaSkgLSAxKTsKICAgICAgICAgaWYgKCFwU3JjUGFnZURpY3QgfHwgIXBDdXJQYWdlRGljdCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAvLyBDbG9uZSB0aGUgcGFnZSBkaWN0aW9uYXJ5Ly8vLy8vLy8vLy8KICAgICAgICAgRlhfUE9TSVRJT04gU3JjUG9zID0gcFNyY1BhZ2VEaWN0LT5HZXRTdGFydFBvcygpOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgICAgIGlmICghcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiUmVzb3VyY2VzIikpIHsKICAgICAgICAgICAgIHBJbmhlcml0YWJsZSA9IFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcocFNyY1BhZ2VEaWN0LCAiUmVzb3VyY2VzIik7CiAgICAgICAgICAgICBpZiAoIXBJbmhlcml0YWJsZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKICAgICAgICAgfQogICAgICAgICAvLzMgQ3JvcEJveCAgLy9PcHRpb25hbApAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICsrY3VycGFnZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogQ1BERl9PYmplY3QqIENQREZfUGFnZU9yZ2FuaXplcjo6UGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZygKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1GWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6VXBkYXRlUmVmZXJlbmNlKENQREZfT2JqZWN0KiBwT2JqLAorYm9vbCBDUERGX1BhZ2VPcmdhbml6ZXI6OlVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TnVtYmVyTWFwKiBwT2JqTnVtYmVyTWFwKQogewpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZmVyZW5jZSA9IChDUERGX1JlZmVyZW5jZSopcE9iajsKICAgICAgICAgICAgIEZYX0RXT1JEIG5ld29iam51bSA9IEdldE5ld09iaklkKHBEb2MsIHBPYmpOdW1iZXJNYXAsIHBSZWZlcmVuY2UpOwogICAgICAgICAgICAgaWYgKG5ld29iam51bSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBwUmVmZXJlbmNlLT5TZXRSZWYocERvYywgbmV3b2JqbnVtKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFVcGRhdGVSZWZlcmVuY2UocE5leHRPYmosIHBEb2MsIHBPYmpOdW1iZXJNYXApKQogICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZW1vdmVBdChrZXkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CkBAIC0yNjAsOSArMjYwLDkgQEAKICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBOZXh0T2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOwogICAgICAgICAgICAgICAgIGlmICghcE5leHRPYmopCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIGlmICghVXBkYXRlUmVmZXJlbmNlKHBOZXh0T2JqLCBwRG9jLCBwT2JqTnVtYmVyTWFwKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjcxLDkgKzI3MSw5IEBACiAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwogICAgICAgICAgICAgaWYgKHBEaWN0KSB7CiAgICAgICAgICAgICAgICAgaWYgKCFVcGRhdGVSZWZlcmVuY2UocERpY3QsIHBEb2MsIHBPYmpOdW1iZXJNYXApKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODEsNyArMjgxLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBGWF9EV09SRCBDUERGX1BhZ2VPcmdhbml6ZXI6OkdldE5ld09iaklkKENQREZfRG9jdW1lbnQqIHBEb2MsCkBAIC0zNDEsNyArMzQxLDcgQEAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JDb21wYXJlU3RyaW5nKCIwMTIzNDU2Nzg5LSwiKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgIGlmIChjYkNvbXBhcmVTdHJpbmcuRmluZChyYW5nc3RyaW5nW2ldKSA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNiTWlkUmFuZ2U7CiAgICAgICAgIGludCBuU3RyaW5nRnJvbSA9IDA7CkBAIC0zNTUsMjMgKzM1NSwyMyBAQAogICAgICAgICAgICAgaWYgKG5NaWQgPT0gLTEpIHsKICAgICAgICAgICAgICAgICBsb25nIGxQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlKTsKICAgICAgICAgICAgICAgICBpZiAobFBhZ2VOdW0gPD0gMCB8fCBsUGFnZU51bSA+IG5Db3VudCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgcGFnZUFycmF5LT5BZGQoKEZYX1dPUkQpbFBhZ2VOdW0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0UGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZS5NaWQoMCwgbk1pZCkpOwogICAgICAgICAgICAgICAgIGlmIChuU3RhcnRQYWdlTnVtID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICAgICAgKytuTWlkOwogICAgICAgICAgICAgICAgIGludCBuRW5kID0gY2JNaWRSYW5nZS5HZXRMZW5ndGgoKSAtIG5NaWQ7CiAgICAgICAgICAgICAgICAgaWYgKG5FbmQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgICAgICBpbnQgbkVuZFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKG5NaWQsIG5FbmQpKTsKICAgICAgICAgICAgICAgICBpZiAoblN0YXJ0UGFnZU51bSA8IDAgfHwKICAgICAgICAgICAgICAgICAgICAgblN0YXJ0UGFnZU51bSA+bkVuZFBhZ2VOdW0gfHwKICAgICAgICAgICAgICAgICAgICAgbkVuZFBhZ2VOdW0gPiBuQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBuU3RhcnRQYWdlTnVtOyBpIDw9IG5FbmRQYWdlTnVtOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgcGFnZUFycmF5LT5BZGQoaSk7CkBAIC0zODAsNyArMzgwLDcgQEAKICAgICAgICAgICAgIG5TdHJpbmdGcm9tID0gblN0cmluZ1RvICsgMTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSW1wb3J0UGFnZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKQEAgLTM4OSwxNCArMzg5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpCiB7CiAgICAgaWYgKCFkZXN0X2RvYyB8fCAhc3JjX2RvYykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDRlhfV29yZEFycmF5IHBhZ2VBcnJheTsKICAgICBDUERGX0RvY3VtZW50KiBwU3JjRG9jID0gKENQREZfRG9jdW1lbnQqKXNyY19kb2M7CiAgICAgaW50IG5Db3VudCA9IHBTcmNEb2MtPkdldFBhZ2VDb3VudCgpOwogICAgIGlmIChwYWdlcmFuZ2UpIHsKICAgICAgICAgaWYgKCFQYXJzZXJQYWdlUmFuZ2VTdHJpbmcocGFnZXJhbmdlLCZwYWdlQXJyYXksbkNvdW50KSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuQ291bnQ7ICsraSkgewogICAgICAgICAgICAgcGFnZUFycmF5LkFkZChpKTsKQEAgLTQyMSwxMiArNDIxLDEyIEBACiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3JjRGljdCA9IHBTcmNEb2MtPkdldFJvb3QoKTsKICAgICBwU3JjRGljdCA9IHBTcmNEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTs7CiAgICAgaWYgKCFwU3JjRGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0RvY3VtZW50KiBwRHN0RG9jID0gKENQREZfRG9jdW1lbnQqKWRlc3RfZG9jOwogICAgIENQREZfRGljdGlvbmFyeSogcERzdERpY3QgPSBwRHN0RG9jLT5HZXRSb290KCk7CiAgICAgaWYgKCFwRHN0RGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHBEc3REaWN0LT5TZXRBdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSwgcFNyY0RpY3QtPkNsb25lKFRSVUUpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHBEc3REaWN0LT5TZXRBdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSwgcFNyY0RpY3QtPkNsb25lKHRydWUpKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcAppbmRleCBkZGQ2ZjZlLi44ZTVlNDc2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwCkBAIC0xOSw4ICsxOSw4IEBACiAKIHB1YmxpYzoKICAgICBDRlhfSUZpbGVXcml0ZSgpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgSW5pdCggRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlU3RydWN0ICk7Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICBXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCAgICAgICAgICAgICBJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIFJlbGVhc2UoKSBvdmVycmlkZSB7fQogCiBwcm90ZWN0ZWQ6CkBAIC0zMiwyMiArMzIsMjIgQEAKICAgICBtX3BGaWxlV3JpdGVTdHJ1Y3QgPSBOVUxMOwogfQogCi1GWF9CT09MIENGWF9JRmlsZVdyaXRlOjpJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKQorYm9vbCBDRlhfSUZpbGVXcml0ZTo6SW5pdCggRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlU3RydWN0ICkKIHsKICAgICBpZiAoIXBGaWxlV3JpdGVTdHJ1Y3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgbV9wRmlsZVdyaXRlU3RydWN0ID0gcEZpbGVXcml0ZVN0cnVjdDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDRlhfSUZpbGVXcml0ZTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpCitib29sIENGWF9JRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBpZiAoIW1fcEZpbGVXcml0ZVN0cnVjdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBtX3BGaWxlV3JpdGVTdHJ1Y3QtPldyaXRlQmxvY2soIG1fcEZpbGVXcml0ZVN0cnVjdCwgcERhdGEsIHNpemUgKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogRlBERl9CT09MIF9GUERGX0RvY19TYXZlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLEZQREZfRFdPUkQgZmxhZ3MsIEZQREZfQk9PTCBiU2V0VmVyc2lvbiwKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgRmlsZU1ha2VyLlJlbW92ZVNlY3VyaXR5KCk7CiAgICAgfQogICAgIENGWF9JRmlsZVdyaXRlKiBwU3RyZWFtV3JpdGUgPSBOVUxMOwotICAgIEZYX0JPT0wgYlJldDsKKyAgICBib29sIGJSZXQ7CiAgICAgcFN0cmVhbVdyaXRlID0gbmV3IENGWF9JRmlsZVdyaXRlOwogICAgIHBTdHJlYW1Xcml0ZS0+SW5pdCggcEZpbGVXcml0ZSApOwogICAgIGJSZXQgPSBGaWxlTWFrZXIuQ3JlYXRlKHBTdHJlYW1Xcml0ZSwgZmxhZ3MpOwpAQCAtODIsMTIgKzgyLDEyIEBACiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlQXNDb3B5KCAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MgKQogewotICAgIHJldHVybiBfRlBERl9Eb2NfU2F2ZShkb2N1bWVudCwgcEZpbGVXcml0ZSwgZmxhZ3MsIEZBTFNFICwgMCk7CisgICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgZmFsc2UgLCAwKTsKIH0KIAogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlV2l0aFZlcnNpb24oICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCxGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGUsCiAgICAgRlBERl9EV09SRCBmbGFncywgaW50IGZpbGVWZXJzaW9uKQogewotICAgIHJldHVybiBfRlBERl9Eb2NfU2F2ZShkb2N1bWVudCwgcEZpbGVXcml0ZSwgZmxhZ3MsIFRSVUUgLCBmaWxlVmVyc2lvbik7CisgICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgdHJ1ZSAsIGZpbGVWZXJzaW9uKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcAppbmRleCA0YTY1NzE1Li40ZmVjZWY0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwCkBAIC0xNTQsMTMgKzE1NCwxMyBAQAogfQogRExMRVhQT1JUIEZQREZfQk9PTAlTVERDQUxMIEZQREZUZXh0X0ZpbmROZXh0KEZQREZfU0NISEFORExFIGhhbmRsZSkKIHsKLQlpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOworCWlmICghaGFuZGxlKSByZXR1cm4gZmFsc2U7CiAJSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZD0oSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKIAlyZXR1cm4JdGV4dHBhZ2VGaW5kLT5GaW5kTmV4dCgpOwogfQogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZUZXh0X0ZpbmRQcmV2KEZQREZfU0NISEFORExFIGhhbmRsZSkKIHsKLQlpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOworCWlmICghaGFuZGxlKSByZXR1cm4gZmFsc2U7CiAJSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZD0oSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKIAlyZXR1cm4JdGV4dHBhZ2VGaW5kLT5GaW5kUHJldigpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwCmluZGV4IDllZGQ1ZDkuLjVhNzJlOGYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAKQEAgLTIxLDE1ICsyMSwxNSBAQAogICAgICAgICBtX0ZpbGVBY2Nlc3MgPSAqcEZpbGVBY2Nlc3M7CiB9CiAKLUZYX0JPT0wgQ1BERl9DdXN0b21BY2Nlc3M6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCitib29sIENQREZfQ3VzdG9tQWNjZXNzOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQogewogICAgIGlmIChvZmZzZXQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBGWF9TQUZFX0ZJTEVTSVpFIG5ld1BvcyA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFLCBzaXplX3Q+KHNpemUpOwogICAgIG5ld1BvcyArPSBvZmZzZXQ7CiAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gbV9GaWxlQWNjZXNzLm1fR2V0QmxvY2sobV9GaWxlQWNjZXNzLm1fUGFyYW0sIG9mZnNldCwodWludDhfdCopIGJ1ZmZlciwgc2l6ZSk7CiB9CkBAIC01OSw5ICs1OSw5IEBACiAgICAgc3dpdGNoKHBvbGljeSkKICAgICB7CiAgICAgY2FzZSBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1M6Ci0gICAgICAgIHJldHVybiAoZm94aXRfc2FuZGJveF9wb2xpY3kgJiAweDAxKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIChmb3hpdF9zYW5kYm94X3BvbGljeSAmIDB4MDEpID8gdHJ1ZSA6IGZhbHNlOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KIApAQCAtODEsMTEgKzgxLDExIEBACiAgICAgdmlydHVhbCBGVF9GYWNlIEZpbmRTdWJzdEZvbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywgICAgICAgICAgICAgICAgLy8gW0lOXSBUaGUgUERGIGRvY3VtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgICAgLy8gW0lOXSBPcmlnaW5hbCBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsICAgICAgICAgICAgICAgICAgLy8gW0lOXSBUcnVlVHlwZSBvciBUeXBlMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRydWVUeXBlLCAgICAgICAgICAgICAgICAgIC8vIFtJTl0gVHJ1ZVR5cGUgb3IgVHlwZTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFBERiBmb250IGZsYWdzIChzZWUgUERGIFJlZmVyZW5jZSBzZWN0aW9uIDUuNy4xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X3dlaWdodCwgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gb3JpZ2luYWwgZm9udCB3ZWlnaHQuIDAgZm9yIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ2hhcnNldENQLCAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIGNvZGUgcGFnZSBmb3IgY2hhcnNldCAoc2VlIFdpbjMyIEdldEFDUCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3Vic3RGb250KiBwU3Vic3RGb250ICAgICAgICAgIC8vIFtPVVRdIFN1YnN0IGZvbnQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgKTsKIApAQCAtMTkxLDE4ICsxOTEsMTggQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIFJlbGVhc2UoKSB7ZGVsZXRlIHRoaXM7fQogICAgIHZpcnR1YWwgRlhfRklMRVNJWkUgICAgIEdldFNpemUoKSB7cmV0dXJuIG1fc2l6ZTt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQogICAgIHsKICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZYX1NBRkVfRklMRVNJWkUgbmV3UG9zID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRklMRVNJWkUsIHNpemVfdD4oc2l6ZSk7CiAgICAgICAgICAgICBuZXdQb3MgKz0gb2Zmc2V0OwogICAgICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiAoRlhfRFdPUkQpbV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgbV9wQnVmK29mZnNldCwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiBwcml2YXRlOgogICAgIHVpbnQ4X3QqIG1fcEJ1ZjsKQEAgLTI0NCwxNCArMjQ0LDE0IEBACiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLCBpbnQqIGZpbGVWZXJzaW9uKQogewotICAgIGlmKCFkb2N8fCFmaWxlVmVyc2lvbikgcmV0dXJuIEZBTFNFOworICAgIGlmKCFkb2N8fCFmaWxlVmVyc2lvbikgcmV0dXJuIGZhbHNlOwogICAgICpmaWxlVmVyc2lvbiA9IDA7CiAgICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2M7CiAgICAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpOwogICAgIGlmKCFwUGFyc2VyKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAqZmlsZVZlcnNpb24gPSBwUGFyc2VyLT5HZXRGaWxlVmVyc2lvbigpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvLyBqYWJkZWxtYWxlazogY2hhbmdlZCByZXR1cm4gdHlwZSBmcm9tIEZYX0RXT1JEIHRvIGJ1aWxkIG9uIExpbnV4IChhbmQgbWF0Y2ggaGVhZGVyKS4KQEAgLTMzMiw3ICszMzIsNyBAQAogCiAjaWZuZGVmIF9XSU4zMl9XQ0UKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBOVUxMOwotICAgIEZYX0JPT0wgYkJhY2tncm91bmRBbHBoYU5lZWRlZD1GQUxTRTsKKyAgICBib29sIGJCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ9ZmFsc2U7CiAgICAgYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IHBQYWdlLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKTsKICAgICBpZiAoYkJhY2tncm91bmRBbHBoYU5lZWRlZCkKICAgICB7CkBAIC0zNTIsNyArMzUyLDcgQEAKICAgICAgICAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfV2luZG93c0RldmljZShkYyk7CiAKICAgICBGUERGX1JlbmRlclBhZ2VfUmV0YWlsKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsIFRSVUUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgdHJ1ZSwgTlVMTCk7CiAKICAgICBpZiAoYkJhY2tncm91bmRBbHBoYU5lZWRlZCkKICAgICB7CkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgICAgICAgICAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwogICAgICAgICAgICAgICAgIHBEc3QtPkNyZWF0ZShzaXplX3gsIHNpemVfeSwgRlhESUJfUmdiMzIpOwogICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChwRHN0LT5HZXRCdWZmZXIoKSwgLTEsIHBpdGNoKnNpemVfeSk7Ci0gICAgICAgICAgICAgICAgcERzdC0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHNpemVfeCwgc2l6ZV95LCBwQml0bWFwLCAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBwRHN0LT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgc2l6ZV94LCBzaXplX3ksIHBCaXRtYXAsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgZmFsc2UsIE5VTEwpOwogICAgICAgICAgICAgICAgIFdpbkRDLlN0cmV0Y2hESUJpdHMocERzdCwwLDAsc2l6ZV94LHNpemVfeSk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIHBEc3Q7CiAgICAgICAgICAgICB9CkBAIC00OTIsMjAgKzQ5MiwyMCBAQAogICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7CiAKICAgICBpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKLSAgICAgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCxUUlVFKTsKKyAgICAgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCx0cnVlKTsKICAgICBlbHNlCiAgICAgICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKICNlbHNlCiAgICAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKIAogICAgIGlmIChmbGFncyAmIEZQREZfUkVWRVJTRV9CWVRFX09SREVSKQotICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLFRSVUUpOworICAgICAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLHRydWUpOwogICAgIGVsc2UKICAgICAgICAgKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwogI2VuZGlmCiAKICAgICBGUERGX1JlbmRlclBhZ2VfUmV0YWlsKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsIFRSVUUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgdHJ1ZSwgTlVMTCk7CiAKICAgICBkZWxldGUgcENvbnRleHQ7CiAgICAgcFBhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKCh2b2lkKikxKTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogfQogCiB2b2lkIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwoQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncyxGWF9CT09MIGJOZWVkVG9SZXN0b3JlLCBJRlNES19QQVVTRV9BZGFwdGVyICogcGF1c2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncyxib29sIGJOZWVkVG9SZXN0b3JlLCBJRlNES19QQVVTRV9BZGFwdGVyICogcGF1c2UgKQogewogICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwogICAgIGlmIChwUGFnZSA9PSBOVUxMKSByZXR1cm47CkBAIC03MDUsOCArNzA1LDggQEAKIAogICAgIGlmIChmbGFncyAmIEZQREZfQU5OT1QpIHsKICAgICAgICAgcENvbnRleHQtPm1fcEFubm90cyA9IG5ldyBDUERGX0Fubm90TGlzdChwUGFnZSk7Ci0gICAgICAgIEZYX0JPT0wgYlByaW50aW5nID0gcENvbnRleHQtPm1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSAhPSBGWERDX0RJU1BMQVk7Ci0gICAgICAgIHBDb250ZXh0LT5tX3BBbm5vdHMtPkRpc3BsYXlBbm5vdHMocFBhZ2UsIHBDb250ZXh0LT5tX3BDb250ZXh0LCBiUHJpbnRpbmcsICZtYXRyaXgsIFRSVUUsIE5VTEwpOworICAgICAgICBib29sIGJQcmludGluZyA9IHBDb250ZXh0LT5tX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgIT0gRlhEQ19ESVNQTEFZOworICAgICAgICBwQ29udGV4dC0+bV9wQW5ub3RzLT5EaXNwbGF5QW5ub3RzKHBQYWdlLCBwQ29udGV4dC0+bV9wQ29udGV4dCwgYlByaW50aW5nLCAmbWF0cml4LCB0cnVlLCBOVUxMKTsKICAgICB9CiAKICAgICBwQ29udGV4dC0+bV9wUmVuZGVyZXIgPSBuZXcgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKApAQCAtNzIwLDIzICs3MjAsMjMgQEAKIHsKICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwogICAgIGlmKHBEb2MgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX1BhZ2UgcGFnZTsKICAgICBwYWdlLkxvYWQocERvYywgcERpY3QpOwogICAgICp3aWR0aCA9IHBhZ2UuR2V0UGFnZVdpZHRoKCk7CiAgICAgKmhlaWdodCA9IHBhZ2UuR2V0UGFnZUhlaWdodCgpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFNjYWxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKIHsKICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIGlmICghcERvYykgcmV0dXJuIFRSVUU7CisgICAgaWYgKCFwRG9jKSByZXR1cm4gdHJ1ZTsKICAgICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7CiAgICAgcmV0dXJuIHZpZXdSZWYuUHJpbnRTY2FsaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwIGIvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcAppbmRleCAxNDU1NTllLi43YmEyMjdmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKQEAgLTI0LDE0ICsyNCwxNCBAQAogfQogCiAvL2RvY3VtZW50IG9wZW4KLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGFjdGlvbiwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAogLy9kb2N1bWVudCBvcGVuCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sQ0ZYX1dpZGVTdHJpbmcgY3NKU05hbWUsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sQ0ZYX1dpZGVTdHJpbmcgY3NKU05hbWUsCiAJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCWlmIChKc0FjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCkBAIC00MCwxNCArNDAsMTQgQEAKIAkJaWYgKCFzd0pTLklzRW1wdHkoKSkKIAkJewogCQkJUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRG9jdW1lbnQsIGNzSlNOYW1lLCBzd0pTKTsKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCiAJCQkJCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpCiB7CkBAIC01OSw0OCArNTksNDggQEAKIAkJaWYgKCFzd0pTLklzRW1wdHkoKSkKIAkJewogCQkJUnVuRmllbGRKYXZhU2NyaXB0KHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7Ci0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9QYWdlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9QYWdlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKIAkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQ0ZYX1B0ckxpc3QgbGlzdDsKIAlyZXR1cm4gRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihhY3Rpb24sIGVUeXBlLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRG9jdW1lbnQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY3VtZW50KGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKIAkJCQkJCQkJCQkJIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGFjdGlvbiwgZVR5cGUsIHBEb2N1bWVudCwgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKIAkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQ0ZYX1B0ckxpc3QgbGlzdDsKIAlyZXR1cm4gRXhlY3V0ZUJvb2tNYXJrKGFjdGlvbiwgcERvY3VtZW50LCBwQm9va01hcmssIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU2NyZWVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwogCXJldHVybiBFeGVjdXRlU2NyZWVuQWN0aW9uKGFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwU2NyZWVuLCBsaXN0KTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9MaW5rKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCiAJCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUNGWF9QdHJMaXN0IGxpc3Q7CiAJcmV0dXJuIEV4ZWN1dGVMaW5rQWN0aW9uKGFjdGlvbiwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKK2Jvb2wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAogCQkJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpCiB7CkBAIC0xMDgsMTIgKzEwOCwxMiBAQAogCXJldHVybiBFeGVjdXRlRmllbGRBY3Rpb24oYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyTGlzdCYgbGlzdCkKIHsKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0xMzgsMjAgKzEzOCwyMCBAQAogCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCiAJewogCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7CisJCWlmICghRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpIHJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKK2Jvb2wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAJCQkJCQkJCQkJCQkgIENGWF9QdHJMaXN0JiBsaXN0KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKIAlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0LkFkZFRhaWwocERpY3QpOwogCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkJCQlwQ29udGV4dC0+T25MaW5rX01vdXNlVXAocERvY3VtZW50KTsKIAogCQkJCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQkJCQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CisJCQkJYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOwogCQkJCWlmICghYlJldCkKIAkJCQl7CiAJCQkJCS8vIEZJWE1FOiByZXR1cm4gZXJyb3IuCkBAIC0xOTMsMjAgKzE5MywyMCBAQAogCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCiAJewogCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVMaW5rQWN0aW9uKHN1YmFjdGlvbiwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIEZBTFNFOworCQlpZiAoIUV4ZWN1dGVMaW5rQWN0aW9uKHN1YmFjdGlvbiwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJCQkgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfUHRyTGlzdCYgbGlzdCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CiAJaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJbGlzdC5BZGRUYWlsKHBEaWN0KTsKIApAQCAtMjI5LDE4ICsyMjksMTggQEAKIAl9CiAKIAlpZiAoIUlzVmFsaWREb2NWaWV3KHBEb2N1bWVudCkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgbGlzdCkpIHJldHVybiBGQUxTRTsKKwkJaWYgKCFFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6SXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KQorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OklzVmFsaWRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkKIHsKICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKICAgQVNTRVJUKHBGaWVsZERpY3QgIT0gTlVMTCk7CkBAIC0yNTQsNyArMjU0LDcgQEAKICAgcmV0dXJuIHBQREZJbnRlckZvcm0tPkdldEZpZWxkQnlEaWN0KHBGaWVsZERpY3QpICE9IE5VTEw7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVGaWVsZEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAogCQkJCQkJCQkJCSAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDRlhfUHRyTGlzdCYgbGlzdCkKIHsKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CiAJaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJbGlzdC5BZGRUYWlsKHBEaWN0KTsKIApAQCAtMjc3LDcgKzI3Nyw3IEBACiAJCQl7CiAJCQkJUnVuRmllbGRKYXZhU2NyaXB0KHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7CiAJCQkJaWYgKCFJc1ZhbGlkRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRGaWVsZERpY3QoKSkpCi0JCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQl9CiAJfQpAQCAtMjg5LDIwICsyODksMjAgQEAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlRmllbGRBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpKSByZXR1cm4gRkFMU0U7CisJCWlmICghRXhlY3V0ZUZpZWxkQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwRm9ybUZpZWxkLCBkYXRhLCBsaXN0KSkgcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZVNjcmVlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCitib29sIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZVNjcmVlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuLCBDRlhfUHRyTGlzdCYgbGlzdCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CiAJaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCiAJbGlzdC5BZGRUYWlsKHBEaWN0KTsKIApAQCAtMzU2LDEyICszNTYsMTIgQEAKIAkvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX091dFZpZXcoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKIAkvLyAJCQkJYnJlYWs7CiAJLy8gCQkJZGVmYXVsdDoKLQkvLyAJCQkJQVNTRVJUKEZBTFNFKTsKKwkvLyAJCQkJQVNTRVJUKGZhbHNlKTsKIAkvLyAJCQkJYnJlYWs7CiAJLy8gCQkJfQogCiAJCQkJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCQkJCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKKwkJCQlib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CiAJCQkJaWYgKCFiUmV0KQogCQkJCXsKIAkJCQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtMzc5LDIwICszNzksMjAgQEAKIAlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQogCXsKIAkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlU2NyZWVuQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwU2NyZWVuLCBsaXN0KSkgcmV0dXJuIEZBTFNFOworCQlpZiAoIUV4ZWN1dGVTY3JlZW5BY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpKSByZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlQm9va01hcmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorYm9vbAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAJCQkJCQkJCQkJIENQREZfQm9va21hcmsqIHBCb29rbWFyaywgQ0ZYX1B0ckxpc3QmIGxpc3QpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAogCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwogCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWxpc3QuQWRkVGFpbChwRGljdCk7CiAKQEAgLTQxNiw3ICs0MTYsNyBAQAogCQkJCXBDb250ZXh0LT5PbkJvb2ttYXJrX01vdXNlVXAocEJvb2ttYXJrKTsKIAogCQkJCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQkJCQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7CisJCQkJYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOwogCQkJCWlmICghYlJldCkKIAkJCQl7CiAJCQkJCS8vQ0JDTF9Gb3JtTm90aWZ5OjpNc2dCb3hKU0Vycm9yKHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgY3NJbmZvKTsKQEAgLTQzNCwxMCArNDM0LDEwIEBACiAJZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKIAl7CiAJCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUJvb2tNYXJrKHN1YmFjdGlvbiwgcERvY3VtZW50LCBwQm9va21hcmssIGxpc3QpKSByZXR1cm4gRkFMU0U7CisJCWlmICghRXhlY3V0ZUJvb2tNYXJrKHN1YmFjdGlvbiwgcERvY3VtZW50LCBwQm9va21hcmssIGxpc3QpKSByZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Ob0pzKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKQEAgLTUwMiw3ICs1MDIsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1BERl9BY3Rpb246OkphdmFTY3JpcHQ6Ci0JCUFTU0VSVChGQUxTRSk7CisJCUFTU0VSVChmYWxzZSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BERl9BY3Rpb246OlNldE9DR1N0YXRlOgogCQlEb0FjdGlvbl9TZXRPQ0dTdGF0ZShwRG9jdW1lbnQsICBhY3Rpb24pOwpAQCAtNTIyLDEwICs1MjIsMTAgQEAKIAl9CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6SXNWYWxpZERvY1ZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Hb1RvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKQEAgLTYzOSwxMiArNjM5LDEyIEBACiAJCQlkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwgZGF0YS5zVmFsdWUsIGRhdGEuYlJDKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJQVNTRVJUKEZBTFNFKTsKKwkJQVNTRVJUKGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCiAJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOworCWJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOwogCWlmICghYlJldCkKIAl7CiAJCS8vQ0JDTF9Gb3JtTm90aWZ5OjpNc2dCb3hKU0Vycm9yKHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgY3NJbmZvKTsKQEAgLTY2OCw3ICs2NjgsNyBAQAogCXBDb250ZXh0LT5PbkRvY19PcGVuKHBEb2N1bWVudCwgc1NjcmlwdE5hbWUpOwogCiAJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOworCWJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOwogCWlmICghYlJldCkKIAl7CiAJCS8vQ0JDTF9Gb3JtTm90aWZ5OjpNc2dCb3hKU0Vycm9yKHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgY3NJbmZvKTsKQEAgLTcxOSwxMiArNzE5LDEyIEBACiAJCXBDb250ZXh0LT5PblBhZ2VfT3V0VmlldyhwRG9jdW1lbnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlBU1NFUlQoRkFMU0UpOworCQlBU1NFUlQoZmFsc2UpOwogCQlicmVhazsKIAl9CiAKIAlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CisJYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7CiAJaWYgKCFiUmV0KQogCXsKIAkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwpAQCAtNzM0LDcgKzczNCw3IEBACiB9CiAKIAotRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtNzQ0LDEzICs3NDQsMTMgQEAKIAlpZiAocEludGVyRm9ybS0+RG9BY3Rpb25fSGlkZShhY3Rpb24pKQogCXsKIAkJcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC03NjAsNyArNzYwLDcgQEAKIAlyZXR1cm4gcEludGVyRm9ybS0+RG9BY3Rpb25fU3VibWl0Rm9ybShhY3Rpb24pOwogfQogCi1GWF9CT09MCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtNzY5LDEzICs3NjksMTMgQEAKIAogCWlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9SZXNldEZvcm0oYWN0aW9uKSkKIAl7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MCUNQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorYm9vbAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC03ODUsMjMgKzc4NSwyMyBAQAogCWlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9JbXBvcnREYXRhKGFjdGlvbikpCiAJewogCQlwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1JlbmRpdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sCUNQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9SZW5kaXRpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NvdW5kKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKK2Jvb2wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NvdW5kKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MCUNQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Nb3ZpZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCitib29sCUNQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Nb3ZpZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcAppbmRleCA5YjAwOGNkLi42Njk1ZmUwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCkBAIC0xNDQsNyArMTQ0LDcgQEAKIH0KIAogCi1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKQEAgLTE1Miw5ICsxNTIsOSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uTEJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0xNjIsOSArMTYyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiAgfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMTcyLDkgKzE3Miw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCkBAIC0xODIsOSArMTgyLDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlTW92ZShwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMTkyLDkgKzE5Miw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LG5GbGFncyx6RGVsdGEsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMjAyLDkgKzIwMiw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIApAQCAtMjEyLDcgKzIxMiw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25SQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKQEAgLTIzNywxOCArMjM3LDE4IEBACiAgICAgcmV0dXJuOwogfQogCi1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQorYm9vbCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykKIHsKIAogICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uQ2hhcihwQW5ub3QsbkNoYXIsIG5GbGFncyk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiAKIH0KIAotRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK2Jvb2wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCiB7CiAKICAgICBpZiAoIW1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpICYmICFtX3BBcHAtPkZGSV9Jc0FMVEtleURvd24obkZsYWcpKQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPkdldFNES0RvY3VtZW50KCk7CiAgICAgICAgICAgICAgICAgcERvY3VtZW50LT5TZXRGb2N1c0Fubm90KHBOZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI3MiwxNCArMjcyLDE0IEBACiAgICAgewogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25LZXlEb3duKHBBbm5vdCxuS2V5Q29kZSwgbkZsYWcpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQotRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCitib29sICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MICAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKQEAgLTI4OSwxOSArMjg5LDE5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICAgICAgICAgICAgcFBhZ2UtPkdldFNES0RvY3VtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBBU1NFUlQocEFubm90KTsKICAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uS2lsbEZvY3VzKHBBbm5vdCwgbkZsYWcpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogQ1BERl9SZWN0ICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCkBAIC0zMTMsNyArMzEzLDcgQEAKICAgICByZXR1cm4gcEFubm90LT5HZXRSZWN0KCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QpOwogICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQpAQCAtMzIxLDMxICszMjEsMzEgQEAKICAgICAgICAgaWYgKHBBbm5vdEhhbmRsZXItPkNhbkFuc3dlcihwQW5ub3QpKQogICAgICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPkhpdFRlc3QocFBhZ2VWaWV3LCBwQW5ub3QsIHBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotQ1BERlNES19Bbm5vdCogIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX0JPT0wgYk5leHQpCitDUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsYm9vbCBiTmV4dCkKIHsKICAgICBDQkFfQW5ub3RJdGVyYXRvciBhaShwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCksICJXaWRnZXQiLCAiIik7CiAgICAgcmV0dXJuIGJOZXh0ID8gYWkuR2V0TmV4dEFubm90KHBTREtBbm5vdCkgOiBhaS5HZXRQcmV2QW5ub3QocFNES0Fubm90KTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KQogewogICAgIEFTU0VSVChwQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAgICAgaWYgKHBBbm5vdC0+R2V0U3ViVHlwZSgpID09IEJGRlRfU0lHTkFUVVJFKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAgICAgaWYgKCFwV2lkZ2V0LT5Jc1Zpc2libGUoKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuRmllbGRGbGFncyA9IHBXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKICAgICBpZiAoKG5GaWVsZEZsYWdzICYgRklFTERGTEFHX1JFQURPTkxZKSA9PSBGSUVMREZMQUdfUkVBRE9OTFkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwogICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgIHBJbnRlckZvcm0tPkFkZE1hcChwQ3RybCwgcFdpZGdldCk7CiAgICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKICAgICBpZiAocFBERkludGVyRm9ybSAmJiBwUERGSW50ZXJGb3JtLT5OZWVkQ29uc3RydWN0QVAoKSkKLSAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKG51bGxwdHIsIEZBTFNFKTsKKyAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKG51bGxwdHIsIGZhbHNlKTsKIAogICAgIHJldHVybiBwV2lkZ2V0OwogfQpAQCAtNDM5LDcgKzQzOSw3IEBACiAgICAgfQogCiB9Ci1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNDUzLDEwICs0NTMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC00NzAsMTAgKzQ3MCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTQ4NywxMCArNDg3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQorYm9vbCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01MDQsMTIgKzUwNCwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogCiB9CiAKIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNTIzLDEwICs1MjMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgekRlbHRhLHBvaW50KTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNTQwLDkgKzU0MCw5IEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKQEAgLTU1NiwxMCArNTU2LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25SQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC01NzMsMTAgKzU3MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uQ2hhcihwQW5ub3QsbkNoYXIsIG5GbGFncyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNTkwLDEzICs1OTAsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiB2b2lkICAgIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKQEAgLTYyNiwxNiArNjI2LDE2IEBACiAgICAgewogICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogICAgICAgICBpZiAoIXBXaWRnZXQtPklzQXBwZWFyYW5jZVZhbGlkKCkpCi0gICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOworICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKIAogICAgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOwogICAgICAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEIHx8IG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YKQogICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiRm9ybWF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CiAgICAgICAgICAgICBpZiAoYkZvcm1hdGVkICYmIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOworICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY0NCw3ICs2NDQsNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CkBAIC02NTgsOSArNjU4LDkgQEAKICAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblNldEZvY3VzKHBBbm5vdCxuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKICAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwpAQCAtNjc0LDcgKzY3NCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25LaWxsRm9jdXMocEFubm90LG5GbGFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogQ1BERl9SZWN0IENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQpAQCAtNjk1LDcgKzY5NSw3IEBACiAgICAgcmV0dXJuIENQREZfUmVjdCgwLDAsMCwwKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK2Jvb2wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6SGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAgICAgQVNTRVJUKHBBbm5vdCk7CkBAIC03MDYsOSArNzA2LDkgQEAKIAogLy9DUmVhZGVyX0Fubm90SXRlcmF0b3JFeAogCi1DUERGU0RLX0Fubm90SXRlcmF0b3I6OkNQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LEZYX0JPT0wgYlJldmVyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlVG9wbW9zdC8qPUZBTFNFKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2lyY2xlLyo9RkFMU0UqLywKK0NQREZTREtfQW5ub3RJdGVyYXRvcjo6Q1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsYm9vbCBiUmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJZ25vcmVUb3Btb3N0Lyo9ZmFsc2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaXJjbGUvKj1mYWxzZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSAqcExpc3QvKj1OVUxMKi8pCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyk7CkBAIC04NTAsNyArODUwLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90SXRlcmF0b3I6OkluaXRJdGVyYXRvckFubm90TGlzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsQ0ZYX1B0ckFycmF5ICogcEFubm90TGlzdCkKK2Jvb2wgQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpJbml0SXRlcmF0b3JBbm5vdExpc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENGWF9QdHJBcnJheSAqIHBBbm5vdExpc3QpCiB7CiAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKQEAgLTg1OSw3ICs4NTksNyBAQAogICAgIH0KIAogICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0LlJlbW92ZUFsbCgpOwotICAgIGlmKCFwQW5ub3RMaXN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYoIXBBbm5vdExpc3QpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfQW5ub3QgKiBwVG9wTW9zdEFubm90PSAobV9iSWdub3JlVG9wbW9zdCkgPyBOVUxMIDogcFBhZ2VWaWV3LT5HZXRGb2N1c0Fubm90KCk7CiAKQEAgLTg4OCw1ICs4ODgsNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAKaW5kZXggZDBkYzRlZi4uYmJkZmMxOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcApAQCAtMTcsMTQgKzE3LDE0IEBACiAgICAgcmV0dXJuIChpbnQpdHpob3VyICogMzYwMCArIChpbnQpdHptaW51dGUgKiAodHpob3VyID49IDAgPyA2MCA6IC02MCk7CiB9CiAKLUZYX0JPT0wgX2dBZnhJc0xlYXBZZWFyKGludDE2X3QgeWVhcikKK2Jvb2wgX2dBZnhJc0xlYXBZZWFyKGludDE2X3QgeWVhcikKIHsKICAgICByZXR1cm4gKCh5ZWFyICUgNDAwID09IDApIHx8ICgoeWVhciAlIDQgPT0gMCkgJiYgKHllYXIgJSAxMDAgIT0gMCkpKTsKIH0KIAogRlhfV09SRCBfZ0FmeEdldFllYXJEYXlzKGludDE2X3QgeWVhcikKIHsKLSAgICByZXR1cm4gKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSBUUlVFID8gMzY2IDogMzY1KTsKKyAgICByZXR1cm4gKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSB0cnVlID8gMzY2IDogMzY1KTsKIH0KIAogdWludDhfdCBfZ0FmeEdldE1vbnRoRGF5cyhpbnQxNl90IHllYXIsIHVpbnQ4X3QgbW9udGgpCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAyOgotICAgICAgICBpZiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IFRSVUUpCisgICAgICAgIGlmIChfZ0FmeElzTGVhcFllYXIoeWVhcikgPT0gdHJ1ZSkKICAgICAgICAgICAgIG1EYXlzID0gMjk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG1EYXlzID0gMjg7CkBAIC0xMjgsMTcgKzEyOCwxNyBAQAogICAgIHJldHVybiAqdGhpczsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA9PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCitib29sIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID09IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICByZXR1cm4gKEZYU1lTX21lbWNtcCgmZHQsICZkYXRldGltZS5kdCwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgPT0gMCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgIT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciAhPSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCiB7CiAgICAgcmV0dXJuIChGWFNZU19tZW1jbXAoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDApOwogfQogCi1GWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA+IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKIHsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwpAQCAtMTQ3LDEyICsxNDcsMTIgQEAKICAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwogICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwogCi0gICAgaWYgKGQxID4gZDMpIHJldHVybiBUUlVFOwotICAgIGlmIChkMiA+IGQ0KSByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGQxID4gZDMpIHJldHVybiB0cnVlOworICAgIGlmIChkMiA+IGQ0KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPj0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQorYm9vbCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCiB7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOwogICAgIENQREZTREtfRGF0ZVRpbWUgZHQyID0gZGF0ZXRpbWUuVG9HTVQoKTsKQEAgLTE2MSwxMiArMTYxLDEyIEBACiAgICAgaW50IGQzID0gKCgoaW50KWR0Mi5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQyLmR0LmRheTsKICAgICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQyLmR0LnNlY29uZDsKIAotICAgIGlmIChkMSA+PSBkMykgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKGQyID49IGQ0KSByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGQxID49IGQzKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoZDIgPj0gZDQpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKK2Jvb2wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPCAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCiB7CiAgICAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOwogICAgIENQREZTREtfRGF0ZVRpbWUgZHQyID0gZGF0ZXRpbWUuVG9HTVQoKTsKQEAgLTE3NSwxMiArMTc1LDEyIEBACiAgICAgaW50IGQzID0gKCgoaW50KWR0Mi5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQyLmR0LmRheTsKICAgICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQyLmR0LnNlY29uZDsKIAotICAgIGlmIChkMSA8IGQzKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoZDIgPCBkNCkgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChkMSA8IGQzKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoZDIgPCBkNCkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIDw9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKK2Jvb2wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPD0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQogewogICAgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKICAgICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CkBAIC0xODksOSArMTg5LDkgQEAKICAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwogICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwogCi0gICAgaWYgKGQxIDw9IGQzKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoZDIgPD0gZDQpIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZDEgPD0gZDMpIHJldHVybiB0cnVlOworICAgIGlmIChkMiA8PSBkNCkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciB0aW1lX3QoKQpAQCAtNTA2LDcgKzUwNiw3IEBACiBDUERGU0RLX0Fubm90OjpDUERGU0RLX0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA6CiBtX3BBbm5vdChwQW5ub3QpLAogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwKLW1fYlNlbGVjdGVkKEZBTFNFKSwKK21fYlNlbGVjdGVkKGZhbHNlKSwKIG1fblRhYk9yZGVyKC0xKQogewogfQpAQCAtNTM5LDEyICs1MzksMTIgQEAKICAgICByZXR1cm4gbV9wUGFnZVZpZXc7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNTZWxlY3RlZCgpCitib29sIENQREZTREtfQW5ub3Q6OklzU2VsZWN0ZWQoKQogewogICAgIHJldHVybiBtX2JTZWxlY3RlZDsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCkKK3ZvaWQgQ1BERlNES19Bbm5vdDo6U2V0U2VsZWN0ZWQoYm9vbCBiU2VsZWN0ZWQpCiB7CiAgICAgbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7CiB9CkBAIC02MDYsMTUgKzYwNiwxNSBAQAogICAgIG1fcEFubm90LT5EcmF3QXBwZWFyYW5jZShtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZCgpCitib29sIENQREZTREtfQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKCkKIHsKICAgICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpICE9IE5VTEw7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKK2Jvb2wgQ1BERlNES19Bbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQVAiKTsKLSAgICBpZiAocEFQID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAocEFQID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAogICAgIC8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCiAgICAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7CkBAIC02MjcsOSArNjI3LDkgQEAKIAogICAgIC8vIEdldCB0aGUgQVAgc3RyZWFtIG9yIHN1YmRpcmVjdG9yeQogICAgIENQREZfT2JqZWN0KiBwc3ViID0gcEFQLT5HZXRFbGVtZW50VmFsdWUoYXBfZW50cnkpOwotICAgIGlmIChwc3ViID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAocHN1YiA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUERGU0RLX0Fubm90OjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCkBAIC04NzUsNyArODc1LDcgQEAKICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJDIik7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdDo6R2V0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAorYm9vbCBDUERGU0RLX0Fubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CiB7CiAgICAgaWYgKENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIkMiKSkKICAgICB7CkBAIC04ODYsNyArODg2LDcgQEAKIAogICAgICAgICAgICAgY29sb3IgPSBGWFNZU19SR0IoKGludClnLCAoaW50KWcsIChpbnQpZyk7CiAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAobkNvdW50ID09IDMpCiAgICAgICAgIHsKQEAgLTg5Niw3ICs4OTYsNyBAQAogCiAgICAgICAgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KXIsIChpbnQpZywgKGludCliKTsKIAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChuQ291bnQgPT0gNCkKICAgICAgICAgewpAQCAtOTExLDExICs5MTEsMTEgQEAKIAogICAgICAgICAgICAgY29sb3IgPSBGWFNZU19SR0IoKGludCkociAqIDI1NSksIChpbnQpKGcgKiAyNTUpLCAoaW50KShiICogMjU1KSk7CiAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiAKQEAgLTk3Niw3ICs5NzYsNyBAQAogICAgICAgICBwU3RyZWFtRGljdC0+U2V0QXRSZWN0KCJCQm94IiwgcmNCQm94KTsKICAgICB9CiAKLSAgICBwU3RyZWFtLT5TZXREYXRhKCh1aW50OF90KilzQ29udGVudHMuY19zdHIoKSwgc0NvbnRlbnRzLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICAgIHBTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNDb250ZW50cy5jX3N0cigpLCBzQ29udGVudHMuR2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7CiB9CiAKICNkZWZpbmUgQkFfQU5OT1RfTUlOV0lEVEggICAgICAgICAgIDEKQEAgLTk5MiwxMSArOTkyLDExIEBACiAgICAgcmV0dXJuIEJBX0FOTk9UX01JTkhFSUdIVDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpDcmVhdGVGb3JtRmlsbGVyKCkKK2Jvb2wgQ1BERlNES19Bbm5vdDo6Q3JlYXRlRm9ybUZpbGxlcigpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9Ci1GWF9CT09MIENQREZTREtfQW5ub3Q6OklzVmlzaWJsZSgpIGNvbnN0Citib29sIENQREZTREtfQW5ub3Q6OklzVmlzaWJsZSgpIGNvbnN0CiB7CiAgICAgaW50IG5GbGFncyA9IEdldEZsYWdzKCk7CiAgICAgcmV0dXJuICEoKG5GbGFncyAmIEFOTk9URkxBR19JTlZJU0lCTEUpIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKSB8fCAobkZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcAppbmRleCBlZTE2MjEyLi40OTMzYTA1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcApAQCAtMzcsMTAgKzM3LDEwIEBACiAKIH0KIAotRlhfQk9PTCAgICAgQ1BERlNES19XaWRnZXQ6OklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpCitib29sICAgICBDUERGU0RLX1dpZGdldDo6SXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQVAiKTsKLSAgICBpZiAocEFQID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAocEFQID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAogICAgIC8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCiAgICAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7CkBAIC01Myw3ICs1Myw3IEBACiAKICAgICAvLyBHZXQgdGhlIEFQIHN0cmVhbSBvciBzdWJkaXJlY3RvcnkKICAgICBDUERGX09iamVjdCogcHN1YiA9IHBBUC0+R2V0RWxlbWVudFZhbHVlKGFwX2VudHJ5KTsKLSAgICBpZiAocHN1YiA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHBzdWIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKICAgICBzd2l0Y2ggKG5GaWVsZFR5cGUpCkBAIC03MCwxMCArNzAsMTAgQEAKICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFN1YkRpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5Kilwc3ViOwogICAgICAgICAgICAgcmV0dXJuIHBTdWJEaWN0LT5HZXRTdHJlYW0oR2V0QXBwU3RhdGUoKSkgIT0gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogaW50IENQREZTREtfV2lkZ2V0OjpHZXRGaWVsZFR5cGUoKSBjb25zdApAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgcmV0dXJuIHBDdHJsLT5HZXRSb3RhdGlvbigpICUgMzYwOwogfQogCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAorYm9vbCBDUERGU0RLX1dpZGdldDo6R2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKIHsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwogICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlckNvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKK2Jvb2wgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlckNvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKIHsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwogICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkdldFRleHRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0Citib29sIENQREZTREtfV2lkZ2V0OjpHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAgICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogRlhfRkxPQVQgQ1BERlNES19XaWRnZXQ6OkdldEZvbnRTaXplKCkgY29uc3QKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgIHJldHVybiBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdAorYm9vbCBDUERGU0RLX1dpZGdldDo6SXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdAogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0VG9wVmlzaWJsZUluZGV4KCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzQ2hlY2tlZCgpIGNvbnN0Citib29sIENQREZTREtfV2lkZ2V0OjpJc0NoZWNrZWQoKSBjb25zdAogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQordm9pZCBDUERGU0RLX1dpZGdldDo6U2V0Q2hlY2soYm9vbCBiQ2hlY2tlZCwgYm9vbCBiTm90aWZ5KQogewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgIHBGb3JtRmllbGQtPkNoZWNrQ29udHJvbChwRm9ybUZpZWxkLT5HZXRDb250cm9sSW5kZXgocEZvcm1DdHJsKSwgYkNoZWNrZWQsIGJOb3RpZnkpOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlLCBib29sIGJOb3RpZnkpCiB7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0RGVmYXVsdFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUpCiB7CiB9Ci12b2lkIENQREZTREtfV2lkZ2V0OjpTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQordm9pZCBDUERGU0RLX1dpZGdldDo6U2V0T3B0aW9uU2VsZWN0aW9uKGludCBpbmRleCwgYm9vbCBiU2VsZWN0ZWQsIGJvb2wgYk5vdGlmeSkKIHsKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihpbmRleCwgYlNlbGVjdGVkLCBiTm90aWZ5KTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KQordm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJTZWxlY3Rpb24oYm9vbCBiTm90aWZ5KQogewogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0zMTksMjAgKzMxOSwyMCBAQAogCiB2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRBcHBNb2RpZmllZCgpCiB7Ci0gICAgbV9iQXBwTW9kaWZpZWQgPSBUUlVFOworICAgIG1fYkFwcE1vZGlmaWVkID0gdHJ1ZTsKIH0KIAogdm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJBcHBNb2RpZmllZCgpCiB7Ci0gICAgbV9iQXBwTW9kaWZpZWQgPSBGQUxTRTsKKyAgICBtX2JBcHBNb2RpZmllZCA9IGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpJc0FwcE1vZGlmaWVkKCkgY29uc3QKK2Jvb2wgQ1BERlNES19XaWRnZXQ6OklzQXBwTW9kaWZpZWQoKSBjb25zdAogewogICAgIHJldHVybiBtX2JBcHBNb2RpZmllZDsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZShjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLCBib29sIGJWYWx1ZUNoYW5nZWQpCiB7CiAgICAgU2V0QXBwTW9kaWZpZWQoKTsKIApAQCAtMzcwLDE0ICszNzAsMTQgQEAKICAgICBtX3BBbm5vdC0+Q2xlYXJDYWNoZWRBUCgpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6T25Gb3JtYXQoRlhfQk9PTCYgYkZvcm1hdGVkKQorQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6Ok9uRm9ybWF0KGJvb2wmIGJGb3JtYXRlZCkKIHsKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogICAgIHJldHVybiBtX3BJbnRlckZvcm0tPk9uRm9ybWF0KHBGb3JtRmllbGQsIGJGb3JtYXRlZCk7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0RmllbGRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0RmllbGRBcHBlYXJhbmNlKGJvb2wgYlZhbHVlQ2hhbmdlZCkKIHsKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMTAxNyw3ICsxMDE3LDcgQEAKIAogICAgIGlmIChJRlhfRWRpdCAqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkKICAgICB7Ci0gICAgICAgIHBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKKyAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goZmFsc2UpOwogCiAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBtX3BJbnRlckZvcm0tPkdldERvY3VtZW50KCk7CiAgICAgICAgIEFTU0VSVChwRG9jICE9IE5VTEwpOwpAQCAtMTAzNSw3ICsxMDM1LDcgQEAKIAogICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZSgpOwogICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLSAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgICAgICAgICBwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKHRydWUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIApAQCAtMTA5Myw3ICsxMDkzLDcgQEAKIAogICAgIGlmIChJRlhfRWRpdCAqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkKICAgICB7Ci0gICAgICAgIHBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKKyAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goZmFsc2UpOwogCiAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBtX3BJbnRlckZvcm0tPkdldERvY3VtZW50KCk7CiAgICAgICAgIEFTU0VSVChwRG9jICE9IE5VTEwpOwpAQCAtMTEyMywxMiArMTEyMywxMiBAQAogCiAgICAgICAgIGZvciAoaW50MzJfdCBpPW5Ub3A7IGk8bkNvdW50OyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJTZWxlY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgZm9yIChpbnQzMl90IGo9MDsgajxuU2VsQ291bnQ7IGorKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAocEZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGopID09IGkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTQxLDE2ICsxMTQxLDE2IEBACiAgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfUmVjdCByY0l0ZW0gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxmeS1mSXRlbUhlaWdodCxyY0NsaWVudC5yaWdodCxmeSk7Ci0gICAgICAgICAgICAgICAgc0xpc3QgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDAsNTEuMGYvMjU1LjBmLDExMy4wZi8yNTUuMGYpLFRSVUUpCisgICAgICAgICAgICAgICAgc0xpc3QgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDAsNTEuMGYvMjU1LjBmLDExMy4wZi8yNTUuMGYpLHRydWUpCiAgICAgICAgICAgICAgICAgICAgIDw8IHJjSXRlbS5sZWZ0IDw8ICIgIiA8PCByY0l0ZW0uYm90dG9tIDw8ICIgIiA8PCByY0l0ZW0uV2lkdGgoKSA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKIAotICAgICAgICAgICAgICAgIHNMaXN0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpLFRSVUUpIDw8CisgICAgICAgICAgICAgICAgc0xpc3QgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSksdHJ1ZSkgPDwKICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCxDUERGX1BvaW50KDAuMGYsZnkpKSA8PCAiRVRcbiI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvciBjclRleHQgPSBHZXRUZXh0UFdMQ29sb3IoKTsKLSAgICAgICAgICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8CisgICAgICAgICAgICAgICAgc0xpc3QgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCx0cnVlKSA8PAogICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsQ1BERl9Qb2ludCgwLjBmLGZ5KSkgPDwgIkVUXG4iOwogICAgICAgICAgICAgfQogCkBAIC0xMTgzLDcgKzExODMsNyBAQAogCiAgICAgaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQogICAgIHsKLSAgICAgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChmYWxzZSk7CiAKICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKICAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CkBAIC0xMTk4LDEyICsxMTk4LDEyIEBACiAgICAgICAgIHBFZGl0LT5TZXRBbGlnbm1lbnRIKHBDb250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpOwogCiAgICAgICAgIEZYX0RXT1JEIGR3RmllbGRGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOwotICAgICAgICBGWF9CT09MIGJNdWx0aUxpbmUgPSAoZHdGaWVsZEZsYWdzID4+IDEyKSAmIDE7CisgICAgICAgIGJvb2wgYk11bHRpTGluZSA9IChkd0ZpZWxkRmxhZ3MgPj4gMTIpICYgMTsKIAogICAgICAgICBpZiAoYk11bHRpTGluZSkKICAgICAgICAgewotICAgICAgICAgICAgcEVkaXQtPlNldE11bHRpTGluZShUUlVFKTsKLSAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKFRSVUUpOworICAgICAgICAgICAgcEVkaXQtPlNldE11bHRpTGluZSh0cnVlKTsKKyAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTIxOCw3ICsxMjE4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCBuTWF4TGVuID0gcEZpZWxkLT5HZXRNYXhMZW4oKTsKLSAgICAgICAgRlhfQk9PTCBiQ2hhckFycmF5ID0gKGR3RmllbGRGbGFncyA+PiAyNCkgJiAxOworICAgICAgICBib29sIGJDaGFyQXJyYXkgPSAoZHdGaWVsZEZsYWdzID4+IDI0KSAmIDE7CiAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7CiAKICAgICAgICAgaWYgKG5NYXhMZW4gPiAwKQpAQCAtMTI0MSw3ICsxMjQxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotICAgICAgICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUodHJ1ZSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogCkBAIC0xMjc2LDExICsxMjc2LDExIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIEJCU19TT0xJRDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lcyA8PCAicVxuIiA8PCBHZXRCb3JkZXJXaWR0aCgpIDw8ICIgd1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpIDw8ICIgMiBKIDAgalxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLGZhbHNlKSA8PCAiIDIgSiAwIGpcbiI7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpPTE7aTxuTWF4TGVuO2krKykKICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTEyOTYsMTMgKzEyOTYsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQkJTX0RBU0g6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX0Rhc2ggZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lcyA8PCAicVxuIiA8PCBHZXRCb3JkZXJXaWR0aCgpIDw8ICIgd1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiWyIgPDwgZHNCb3JkZXIubkRhc2ggPDwgIiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZHNCb3JkZXIubkdhcCA8PCAiXSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZHNCb3JkZXIublBoYXNlIDw8ICIgZFxuIjsKQEAgLTE1NDksNyArMTU0OSw3IEBACiAgICAgfQogfQogCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpPbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKK2Jvb2wgQ1BERlNES19XaWRnZXQ6Ok9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewogICAgIENQREZfQWN0aW9uIGFjdGlvbiA9IEdldEFBY3Rpb24odHlwZSk7CiAKQEAgLTE1NjcsNyArMTU2Nyw3IEBACiAgICAgICAgIHJldHVybiBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGQoYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIEdldEZvcm1GaWVsZCgpLCBkYXRhKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX0FjdGlvbiBDUERGU0RLX1dpZGdldDo6R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpCkBAIC0xNjI0LDM3ICsxNjI0LDM3IEBACiB9CiAKIAotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SGl0VGVzdChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCitib29sIENQREZTREtfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKIHsKICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBHZXRQREZBbm5vdCgpOwogICAgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OwogICAgIHBBbm5vdC0+R2V0UmVjdChhbm5vdFJlY3QpOwogICAgIGlmKGFubm90UmVjdC5Db250YWlucyhwYWdlWCwgcGFnZVkpKQogICAgIHsKLSAgICAgICAgaWYgKCFJc1Zpc2libGUoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUlzVmlzaWJsZSgpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5GaWVsZEZsYWdzID0gR2V0RmllbGRGbGFncygpOwogICAgICAgICBpZiAoKG5GaWVsZEZsYWdzICYgRklFTERGTEFHX1JFQURPTkxZKSA9PSBGSUVMREZMQUdfUkVBRE9OTFkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGU0RLX0ludGVyRm9ybTo6Q1BERlNES19JbnRlckZvcm0oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQogICAgIDptX3BEb2N1bWVudChwRG9jdW1lbnQpLAogICAgIG1fcEludGVyRm9ybShOVUxMKSwKLSAgICBtX2JDYWxjdWxhdGUoVFJVRSksCi0gICAgbV9iQnVzeShGQUxTRSkKKyAgICBtX2JDYWxjdWxhdGUodHJ1ZSksCisgICAgbV9iQnVzeShmYWxzZSkKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgbV9wSW50ZXJGb3JtID0gbmV3IENQREZfSW50ZXJGb3JtKG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLCBGQUxTRSk7CisgICAgbV9wSW50ZXJGb3JtID0gbmV3IENQREZfSW50ZXJGb3JtKG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLCBmYWxzZSk7CiAgICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKICAgICBtX3BJbnRlckZvcm0tPlNldEZvcm1Ob3RpZnkodGhpcyk7CiAKICAgICBmb3IoaW50IGk9MDsgaTw2OyBpKyspCi0gICAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W2ldID0gRkFMU0U7CisgICAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W2ldID0gZmFsc2U7CiAgICAgbV9pSGlnaGxpZ2h0QWxwaGEgPSAwOwogfQogCkBAIC0xNjY1LDEyICsxNjY1LDEyIEBACiAgICAgbV9NYXAuY2xlYXIoKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SGlnaGxpZ2h0V2lkZ2V0cygpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpIaWdobGlnaHRXaWRnZXRzKCkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1DUERGU0RLX1dpZGdldCogQ1BERlNES19JbnRlckZvcm06OkdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYk5leHQpIGNvbnN0CitDUERGU0RLX1dpZGdldCogQ1BERlNES19JbnRlckZvcm06OkdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIGJvb2wgYk5leHQpIGNvbnN0CiB7CiAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENCQV9Bbm5vdEl0ZXJhdG9yPiBwSXRlcmF0b3IoCiAgICAgICAgIG5ldyBDQkFfQW5ub3RJdGVyYXRvcihwV2lkZ2V0LT5HZXRQYWdlVmlldygpLCAiV2lkZ2V0IiwgIiIpKTsKQEAgLTE3ODIsMTIgKzE3ODIsMTIgQEAKICAgICBtX01hcC5lcmFzZShwQ29udHJvbCk7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OkVuYWJsZUNhbGN1bGF0ZShGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RW5hYmxlQ2FsY3VsYXRlKGJvb2wgYkVuYWJsZWQpCiB7CiAgICAgbV9iQ2FsY3VsYXRlID0gYkVuYWJsZWQ7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0Citib29sIENQREZTREtfSW50ZXJGb3JtOjpJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdAogewogICAgIHJldHVybiBtX2JDYWxjdWxhdGU7CiB9CkBAIC0xODA3LDcgKzE4MDcsNyBAQAogICAgICAgICBpbnQgbkhlaWdodCA9IHBCbXAtPkdldEhlaWdodCgpOwogCiAgICAgICAgIENQREZfSW1hZ2UgSW1hZ2UocERvY3VtZW50KTsKLSAgICAgICAgSW1hZ2UuU2V0SW1hZ2UocEJtcCwgRkFMU0UpOworICAgICAgICBJbWFnZS5TZXRJbWFnZShwQm1wLCBmYWxzZSk7CiAgICAgICAgIENQREZfU3RyZWFtKiBwSW1hZ2VTdHJlYW0gPSBJbWFnZS5HZXRTdHJlYW0oKTsKICAgICAgICAgaWYgKHBJbWFnZVN0cmVhbSkKICAgICAgICAgewpAQCAtMTg2Nyw3ICsxODY3LDcgQEAKIAogICAgIGlmIChtX2JCdXN5KSByZXR1cm47CiAKLSAgICBtX2JCdXN5ID0gVFJVRTsKKyAgICBtX2JCdXN5ID0gdHJ1ZTsKIAogICAgIGlmIChJc0NhbGN1bGF0ZUVuYWJsZWQoKSkKICAgICB7CkBAIC0xODk5LDExICsxODk5LDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc09sZFZhbHVlID0gcEZpZWxkLT5HZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBzT2xkVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUkMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T25GaWVsZF9DYWxjdWxhdGUocEZvcm1GaWVsZCwgcEZpZWxkLCBzVmFsdWUsIGJSQyk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0luZm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoY3NKUywgc0luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KGNzSlMsIHNJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlJldCkKQEAgLTE5MTEsNyArMTkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlJDKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzVmFsdWUuQ29tcGFyZShzT2xkVmFsdWUpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTkyNCwxMCArMTkyNCwxMCBAQAogCiAgICAgfQogCi0gICAgbV9iQnVzeSA9IEZBTFNFOworICAgIG1fYkJ1c3kgPSBmYWxzZTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19JbnRlckZvcm06Ok9uRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBGWF9CT09MJiBiRm9ybWF0ZWQpCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6T25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGJvb2wmIGJGb3JtYXRlZCkKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0xOTM3LDcgKzE5MzcsNyBAQAogICAgIEFTU0VSVChwRW52KTsKICAgICBpZighcEVudi0+SXNKU0luaXRpYXRlZCgpKQogICAgIHsKLSAgICAgICAgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgIGJGb3JtYXRlZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gc1ZhbHVlOwogICAgIH0KIApAQCAtMTk1Niw3ICsxOTU2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGJGb3JtYXRlZCA9IEZBTFNFOworICAgIGJGb3JtYXRlZCA9IGZhbHNlOwogCiAgICAgQ1BERl9BQWN0aW9uIGFBY3Rpb24gPSBwRm9ybUZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7CiAgICAgaWYgKGFBY3Rpb24gIT0gTlVMTCAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6Rm9ybWF0KSkKQEAgLTE5NzIsMTYgKzE5NzIsMTYgQEAKICAgICAgICAgICAgICAgICBJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7CiAgICAgICAgICAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPk9uRmllbGRfRm9ybWF0KHBGb3JtRmllbGQsIFZhbHVlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T25GaWVsZF9Gb3JtYXQocEZvcm1GaWVsZCwgVmFsdWUsIHRydWUpOwogCiAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0luZm87Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIHNJbmZvKTsKKyAgICAgICAgICAgICAgICBib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgc0luZm8pOwogICAgICAgICAgICAgICAgIHBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CiAKICAgICAgICAgICAgICAgICBpZiAoYlJldCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHNWYWx1ZSA9IFZhbHVlOwotICAgICAgICAgICAgICAgICAgICBiRm9ybWF0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRm9ybWF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTk5MCw3ICsxOTkwLDcgQEAKICAgICByZXR1cm4gc1ZhbHVlOwogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZXNldEZpZWxkQXBwZWFyYW5jZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIGJvb2wgYlZhbHVlQ2hhbmdlZCkKIHsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIApAQCAtMjAyMCw3ICsyMDIwLDcgQEAKICAgICAgICAgICAgIENGRkxfSUZvcm1GaWxsZXIqIHBJRm9ybUZpbGxlciA9IHBFbnYtPkdldElGb3JtRmlsbGVyKCk7CiAKICAgICAgICAgICAgIENQREZfUGFnZSAqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwotICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSxGQUxTRSk7CisgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlLGZhbHNlKTsKIAogICAgICAgICAgICAgRlhfUkVDVCByY0JCb3ggPSBwSUZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcFdpZGdldCk7CiAKQEAgLTIwMjksNyArMjAyOSw3IEBACiAgICAgfQogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpPbktleVN0cm9rZUNvbW1pdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQykKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgYm9vbCYgYlJDKQogewogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCkBAIC0yMDU4LDcgKzIwNTgsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQykKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBib29sJiBiUkMpCiB7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKQEAgLTIwODksNyArMjA4OSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCitib29sIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCiB7CiAgICAgQVNTRVJUKGFjdGlvbik7CiAKQEAgLTIxMDAsOSArMjEwMCw5IEBACiAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKICAgICBHZXRGaWVsZEZyb21PYmplY3RzKGZpZWxkT2JqZWN0cywgZmllbGRzKTsKIAotICAgIEZYX0JPT0wgYkhpZGUgPSBhY3Rpb24uR2V0SGlkZVN0YXR1cygpOworICAgIGJvb2wgYkhpZGUgPSBhY3Rpb24uR2V0SGlkZVN0YXR1cygpOwogCi0gICAgRlhfQk9PTCBiQ2hhbmdlZCA9IEZBTFNFOworICAgIGJvb2wgYkNoYW5nZWQgPSBmYWxzZTsKIAogICAgIGZvciAoaW50IGk9MCwgc3o9ZmllbGRzLkdldFNpemUoKTsgaTxzejsgaSsrKQogICAgIHsKQEAgLTIxMzcsNyArMjEzNyw3IEBACiAKICAgICAgICAgICAgICAgICBwUGFnZVZpZXctPlVwZGF0ZVZpZXcocFdpZGdldCk7CiAKLSAgICAgICAgICAgICAgICBiQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjE0NSwxMiArMjE0NSwxMiBAQAogICAgIHJldHVybiBiQ2hhbmdlZDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQorYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQogewogICAgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Rlc3RpbmF0aW9uID0gYWN0aW9uLkdldEZpbGVQYXRoKCk7CiAgICAgaWYgKHNEZXN0aW5hdGlvbi5Jc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWN0aW9uRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CiAgICAgaWYgKHBBY3Rpb25EaWN0LT5LZXlFeGlzdCgiRmllbGRzIikpCkBAIC0yMTY0LDIxICsyMTY0LDIxIEBACiAgICAgICAgIEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwogICAgICAgICBpZiAoZmllbGRzLkdldFNpemUoKSAhPSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gIShkd0ZsYWdzICYgMHgwMSk7CisgICAgICAgICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlID0gIShkd0ZsYWdzICYgMHgwMSk7CiAgICAgICAgICAgICBpZiAobV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKCZmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgICAgICByZXR1cm4gU3VibWl0RmllbGRzKHNEZXN0aW5hdGlvbiwgZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSwgRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuIFN1Ym1pdEZpZWxkcyhzRGVzdGluYXRpb24sIGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgcmV0dXJuIFN1Ym1pdEZvcm0oc0Rlc3RpbmF0aW9uLCBGQUxTRSk7CisgICAgcmV0dXJuIFN1Ym1pdEZvcm0oc0Rlc3RpbmF0aW9uLCBmYWxzZSk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwgY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJVcmxFbmNvZGVkKQorYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6U3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsIGJvb2wgYlVybEVuY29kZWQpCiB7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKICAgICBBU1NFUlQocEVudiAhPSBOVUxMKTsKQEAgLTIxOTIsMTIgKzIxOTIsMTIgQEAKICAgICBpZiAoYlVybEVuY29kZWQpCiAgICAgewogICAgICAgICBpZighRkRGVG9VUkxFbmNvZGVkRGF0YShwQnVmZmVyLCBuQnVmU2l6ZSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgY3NEZXN0aW5hdGlvbi5jX3N0cigpKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENQREZTREtfSW50ZXJGb3JtOjpEb0ZERkJ1ZmZlcihDRlhfQnl0ZVN0cmluZyBzQnVmZmVyKQpAQCAtMjIzNiwyMiArMjIzNiwyMiBAQAogICAgIHNCdWZmZXIuUmVsZWFzZUJ1ZmZlcigpOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKENGWF9XaWRlU3RyaW5nIGNzRkRGRmlsZSwgQ0ZYX1dpZGVTdHJpbmcgY3NUeHRGaWxlKQorYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSkKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKHVpbnQ4X3QqJiBwQnVmLCBGWF9TVFJTSVpFJiBuQnVmU2l6ZSkKIHsKICAgICBDRkRGX0RvY3VtZW50KiBwRkRGID0gQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkocEJ1ZiwgbkJ1ZlNpemUpOwogICAgIGlmIChwRkRGKQogICAgIHsKICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOwotICAgICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKHBNYWluRGljdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgLy8gR2V0IGZpZWxkcwogICAgICAgICBDUERGX0FycmF5KiBwRmllbGRzID0gcE1haW5EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7Ci0gICAgICAgIGlmIChwRmllbGRzID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBmZGZFbmNvZGVkRGF0YTsKIApAQCAtMjI3OSwxNyArMjI3OSwxNyBAQAogICAgICAgICBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgbkJ1ZlNpemUpOwogICAgICAgICBGWFNZU19tZW1jcHkocEJ1ZiwgZmRmRW5jb2RlZERhdGEuR2V0QnVmZmVyKCksIG5CdWZTaXplKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcyxGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKICAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgQ0ZERl9Eb2N1bWVudCogcEZERiA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRG9jdW1lbnQtPkdldFBhdGgoKSwoQ0ZYX1B0ckFycmF5JilmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlKTsKLSAgICBpZiAoIXBGREYpIHJldHVybiBGQUxTRTsKLSAgICBGWF9CT09MIGJSZXQgPSBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKTsgLy8gPSBGQUxTRTsvLworICAgIGlmICghcEZERikgcmV0dXJuIGZhbHNlOworICAgIGJvb2wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOyAvLyA9IGZhbHNlOy8vCiAgICAgZGVsZXRlIHBGREY7CiAKICAgICByZXR1cm4gYlJldDsKQEAgLTIzMDEsMjQgKzIzMDEsMjQgQEAKICAgICByZXR1cm4gTCIiOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIEZYX0JPT0wgYlVybEVuY29kZWQpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIGJvb2wgYlVybEVuY29kZWQpCiB7Ci0gICAgaWYgKHNEZXN0aW5hdGlvbi5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKICAgICBBU1NFUlQocEVudiAhPSBOVUxMKTsKIAotICAgIGlmKE5VTEwgPT0gbV9wRG9jdW1lbnQpIHJldHVybiBGQUxTRTsKKyAgICBpZihOVUxMID09IG1fcERvY3VtZW50KSByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQREZGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7CiAKLSAgICBpZihOVUxMID09IG1fcEludGVyRm9ybSkgcmV0dXJuIEZBTFNFOworICAgIGlmKE5VTEwgPT0gbV9wSW50ZXJGb3JtKSByZXR1cm4gZmFsc2U7CiAgICAgQ0ZERl9Eb2N1bWVudCogcEZERkRvYyA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYod3NQREZGaWxlUGF0aCk7Ci0gICAgaWYgKE5VTEwgPT0gcEZERkRvYykgcmV0dXJuIEZBTFNFOworICAgIGlmIChOVUxMID09IHBGREZEb2MpIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9CeXRlVGV4dEJ1ZiBGZGZCdWZmZXI7Ci0gICAgRlhfQk9PTCBiUmV0ID0gcEZERkRvYy0+V3JpdGVCdWYoRmRmQnVmZmVyKTsKKyAgICBib29sIGJSZXQgPSBwRkRGRG9jLT5Xcml0ZUJ1ZihGZGZCdWZmZXIpOwogICAgIGRlbGV0ZSBwRkRGRG9jOwotICAgIGlmICghYlJldCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghYlJldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgdWludDhfdCogcEJ1ZmZlciA9IEZkZkJ1ZmZlci5HZXRCdWZmZXIoKTsKICAgICBGWF9TVFJTSVpFIG5CdWZTaXplID0gRmRmQnVmZmVyLkdldExlbmd0aCgpOwpAQCAtMjMyNiw3ICsyMzI2LDcgQEAKICAgICBpZiAoYlVybEVuY29kZWQpCiAgICAgewogICAgICAgICBpZighRkRGVG9VUkxFbmNvZGVkRGF0YShwQnVmZmVyLCBuQnVmU2l6ZSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOwpAQCAtMjMzNywyNiArMjMzNywyNiBAQAogICAgICAgICBwQnVmZmVyID0gTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKIHsKIAogICAgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZERl9Eb2N1bWVudCogcEZERiA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRG9jdW1lbnQtPkdldFBhdGgoKSk7Ci0gICAgaWYgKCFwRkRGKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRkRGKSByZXR1cm4gZmFsc2U7CiAKLSAgICBGWF9CT09MIGJSZXQgPSBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKTsKKyAgICBib29sIGJSZXQgPSBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKTsKICAgICBkZWxldGUgcEZERjsKIAogICAgIHJldHVybiBiUmV0OwogfQogCiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQorYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCiB7CiAgICAgQVNTRVJUKGFjdGlvbik7CiAKQEAgLTIzNzAsMTUgKzIzNzAsMTUgQEAKICAgICAgICAgYWYuR2V0QWxsRmllbGRzKGZpZWxkT2JqZWN0cyk7CiAgICAgICAgIENGWF9QdHJBcnJheSBmaWVsZHM7CiAgICAgICAgIEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwotICAgICAgICByZXR1cm4gbV9wSW50ZXJGb3JtLT5SZXNldEZvcm0oZmllbGRzLCAhKGR3RmxhZ3MgJiAweDAxKSwgVFJVRSk7CisgICAgICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShmaWVsZHMsICEoZHdGbGFncyAmIDB4MDEpLCB0cnVlKTsKICAgICB9CiAKLSAgICByZXR1cm4gbV9wSW50ZXJGb3JtLT5SZXNldEZvcm0oVFJVRSk7CisgICAgcmV0dXJuIG1fcEludGVyRm9ybS0+UmVzZXRGb3JtKHRydWUpOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCitib29sIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6R2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsIENGWF9QdHJBcnJheSYgZmllbGRzKQpAQCAtMjQxNSw3ICsyNDE1LDcgQEAKICAgICBpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKICAgICBpZiAoblR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpCiAgICAgewotICAgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgICAgIGJvb2wgYlJDID0gdHJ1ZTsKICAgICAgICAgT25LZXlTdHJva2VDb21taXQocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKICAgICAgICAgaWYgKGJSQykKICAgICAgICAgewpAQCAtMjQzNCwxMiArMjQzNCwxMiBAQAogICAgIGlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKICAgICB7CiAgICAgICAgIE9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOwotICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworICAgICAgICBib29sIGJGb3JtYXRlZCA9IGZhbHNlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBPbkZvcm1hdChwRm9ybUZpZWxkLCBiRm9ybWF0ZWQpOwogICAgICAgICBpZiAoYkZvcm1hdGVkKQotICAgICAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgc1ZhbHVlLmNfc3RyKCksIFRSVUUpOworICAgICAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgc1ZhbHVlLmNfc3RyKCksIHRydWUpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIHRydWUpOwogICAgICAgICBVcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yNDUxLDcgKzI0NTEsNyBAQAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfTElTVEJPWCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgYm9vbCBiUkMgPSB0cnVlOwogICAgIE9uS2V5U3Ryb2tlQ29tbWl0KHBGb3JtRmllbGQsIGNzVmFsdWUsIGJSQyk7CiAgICAgaWYgKCFiUkMpCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI0NjksNyArMjQ2OSw3IEBACiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9MSVNUQk9YKQogICAgIHsKICAgICAgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7Ci0gICAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIFRSVUUpOworICAgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCB0cnVlKTsKICAgICAgICAgVXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtMjUwOSwxNiArMjUwOSwxNiBAQAogICAgIHJldHVybiAwOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpCiB7CiAgICAgaWYobkZpZWxkVHlwZSA8MSB8fCBuRmllbGRUeXBlID4gNikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIG1fYk5lZWRIaWdodGxpZ2h0W25GaWVsZFR5cGUtMV07CiB9CiAKIHZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlbW92ZUFsbEhpZ2hMaWdodCgpCiB7Ci0gICAgbWVtc2V0KCh2b2lkKiltX2JOZWVkSGlnaHRsaWdodCwgMCwgNipzaXplb2YoRlhfQk9PTCkpOworICAgIG1lbXNldCgodm9pZCopbV9iTmVlZEhpZ2h0bGlnaHQsIDAsIDYqc2l6ZW9mKGJvb2wpKTsKIH0KIHZvaWQgICBDUERGU0RLX0ludGVyRm9ybTo6U2V0SGlnaGxpZ2h0Q29sb3IoRlhfQ09MT1JSRUYgY2xyLCBpbnQgbkZpZWxkVHlwZSkKIHsKQEAgLTI1MzAsMTQgKzI1MzAsMTQgQEAKICAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtX2FIaWdobGlnaHRDb2xvcltpXSA9IGNscjsKLSAgICAgICAgICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICBtX2FIaWdobGlnaHRDb2xvcltuRmllbGRUeXBlLTFdID0gY2xyOwotICAgICAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZS0xXSA9IFRSVUU7CisgICAgICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlLTFdID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjc4Myw3ICsyNzgzLDcgQEAKIAogICAgICAgICAgICAgaWYgKHNhLkdldFNpemUoKSA+IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2EuU29ydChDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5VG9wLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgc2EuU29ydChDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5VG9wLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHdoaWxlIChzYS5HZXRTaXplKCkgPiAwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwIGIvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCmluZGV4IDA1YzFhM2QuLmRhNDA1Y2QgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdChGWF9IV05EIGhXbmQsIEZYX1JFQ1QgcmVjdCkgOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBPdXRwdXRTZWxlY3RlZFJlY3Qodm9pZCogcEZvcm1GaWxsZXIsIENQREZfUmVjdCYgcmVjdCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBJc1NlbGVjdGlvbkltcGxlbWVudGVkKCk7CiAKICAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nICAgICAgR2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQpe3JldHVybiBMIiI7fQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIEZBTFNFO30KKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykge3JldHVybiBmYWxzZTt9CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgQ2xpZW50VG9TY3JlZW4oRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSB7fQogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBTY3JlZW5Ub0NsaWVudChGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIHt9CkBAIC00NSwyMyArNDUsMjMgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgU2V0Q3Vyc29yKGludDMyX3QgbkN1cnNvclR5cGUpOwogCiAgICAgdmlydHVhbCBGWF9ITUVOVSAgICAgICAgICAgIENyZWF0ZVBvcHVwTWVudSgpIHtyZXR1cm4gTlVMTDt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIEFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JRE5ld0l0ZW0sIENGWF9XaWRlU3RyaW5nIHN0cmluZykge3JldHVybiBGQUxTRTt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JREl0ZW0sIEZYX0JPT0wgYkVuYWJsZWQpIHtyZXR1cm4gRkFMU0U7fQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBBcHBlbmRNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSUROZXdJdGVtLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpIHtyZXR1cm4gZmFsc2U7fQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBFbmFibGVNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCBuSURJdGVtLCBib29sIGJFbmFibGVkKSB7cmV0dXJuIGZhbHNlO30KICAgICB2aXJ0dWFsIGludDMyX3QgICAgICAgICBUcmFja1BvcHVwTWVudShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0hXTkQgaFBhcmVudCkge3JldHVybiAtMTt9CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIERlc3Ryb3lNZW51KEZYX0hNRU5VIGhNZW51KSB7fQogCiAgICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyAgICAgIEdldE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgRmluZE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgRmluZE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKTsKICAgICB2aXJ0dWFsIENQREZfRm9udCogICAgICAgICAgQWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwgdWludDhfdCBuQ2hhcnNldCk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgICAgICAgICBTZXRUaW1lcihpbnQzMl90IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpIDsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgS2lsbFRpbWVyKGludDMyX3QgbklEKSA7CiAKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBJc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7fQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBJc0NUUkxLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzQUxUS2V5RG93bihuRmxhZyk7fQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBJc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNJTlNFUlRLZXlEb3duKG5GbGFnKTt9CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTt9CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7fQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICBJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNBTFRLZXlEb3duKG5GbGFnKTt9CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgIElzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0lOU0VSVEtleURvd24obkZsYWcpO30KIAogICAgIHZpcnR1YWwgRlhfU1lTVEVNVElNRSAgICAgICBHZXRMb2NhbFRpbWUoKTsKIApAQCAtMTIyLDE1ICsxMjIsMTUgQEAKIAogfQogCi1GWF9CT09MIENGWF9TeXN0ZW1IYW5kbGVyOjpJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkKK2Jvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKQogewogICAgIGlmKG1fcEVudikKICAgICB7CiAgICAgICAgIEZQREZfRk9STUZJTExJTkZPKiBwSW5mbyA9IG1fcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCk7CiAgICAgICAgIGlmKHBJbmZvICYmIHBJbmZvLT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0KQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1N5c3RlbUhhbmRsZXI6OkdldE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0KQpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgcmV0dXJuICIiOwogfQogCi1GWF9CT09MIENGWF9TeXN0ZW1IYW5kbGVyOjpGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpCitib29sIENGWF9TeXN0ZW1IYW5kbGVyOjpGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpCiB7CiAgICAgQ0ZYX0ZvbnRNZ3IqIHBGb250TWdyID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpOwogICAgIGlmKHBGb250TWdyKQpAQCAtMTU2LDEzICsxNTYsMTMgQEAKICAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG5TaXplOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYocEZvbnRNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250c1tpXS5Db21wYXJlKHNGb250RmFjZU5hbWUpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBpbnQgQ2hhclNldDJDUChpbnQgY2hhcnNldCkKQEAgLTE4Myw4ICsxODMsOCBAQAogICAgIGlmKHBEb2MpCiAgICAgewogICAgICAgICBDRlhfRm9udCogcEZYRm9udCA9IG5ldyBDRlhfRm9udCgpOwotICAgICAgICBwRlhGb250LT5Mb2FkU3Vic3Qoc0ZvbnRGYWNlTmFtZSxUUlVFLDAsMCwwLENoYXJTZXQyQ1AobkNoYXJzZXQpLEZBTFNFKTsKLSAgICAgICAgQ1BERl9Gb250KiBwRm9udCA9IHBEb2MtPkFkZEZvbnQocEZYRm9udCxuQ2hhcnNldCxGQUxTRSk7CisgICAgICAgIHBGWEZvbnQtPkxvYWRTdWJzdChzRm9udEZhY2VOYW1lLHRydWUsMCwwLDAsQ2hhclNldDJDUChuQ2hhcnNldCksZmFsc2UpOworICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gcERvYy0+QWRkRm9udChwRlhGb250LG5DaGFyc2V0LGZhbHNlKTsKICAgICAgICAgZGVsZXRlIHBGWEZvbnQ7CiAgICAgICAgIHJldHVybiBwRm9udDsKICAgICB9CkBAIC00MDksNyArNDA5LDcgQEAKICAgICBtX3BGb2N1c0Fubm90KG51bGxwdHIpLAogICAgIG1fcEVudihwRW52KSwKICAgICBtX3BPY2NvbnRlbnQobnVsbHB0ciksCi0gICAgbV9iQ2hhbmdlTWFzayhGQUxTRSkKKyAgICBtX2JDaGFuZ2VNYXNrKGZhbHNlKQogewogfQogCkBAIC00MjYsNyArNDI2LDcgQEAKICAgICBtX3BPY2NvbnRlbnQgPSBudWxscHRyOwogfQogCi1DUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlLCBGWF9CT09MIFJlTmV3KQorQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSwgYm9vbCBSZU5ldykKIHsKICAgICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocFBERlBhZ2UpOwogICAgIGlmIChpdCAhPSBtX3BhZ2VNYXAuZW5kKCkpCkBAIC00NDUsNyArNDQ1LDcgQEAKIENQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldEN1cnJlbnRWaWV3KCkKIHsKICAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopbV9wRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jKTsKLSAgICByZXR1cm4gcFBhZ2UgPyBHZXRQYWdlVmlldyhwUGFnZSwgVFJVRSkgOiBudWxscHRyOworICAgIHJldHVybiBwUGFnZSA/IEdldFBhZ2VWaWV3KHBQYWdlLCB0cnVlKSA6IG51bGxwdHI7CiB9CiAKIENQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KGludCBuSW5kZXgpCkBAIC00NzQsMjQgKzQ3NCwyNCBAQAogCiB9CiAKLUZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6UHJvY09wZW5BY3Rpb24oKQorYm9vbCBDUERGU0RLX0RvY3VtZW50OjpQcm9jT3BlbkFjdGlvbigpCiB7CiAgICAgaWYoIW1fcERvYykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jLT5HZXRSb290KCk7CiAgICAgaWYgKCFwUm9vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX09iamVjdCogcE9wZW5BY3Rpb24gPSBwUm9vdC0+R2V0RGljdCgiT3BlbkFjdGlvbiIpOwogICAgIGlmKCFwT3BlbkFjdGlvbikKICAgICAgICAgcE9wZW5BY3Rpb24gPSBwUm9vdC0+R2V0QXJyYXkoIk9wZW5BY3Rpb24iKTsKIAogICAgIGlmKCFwT3BlbkFjdGlvbikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZihwT3BlbkFjdGlvbi0+R2V0VHlwZSgpPT1QREZPQkpfQVJSQVkpCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIGlmKHBPcGVuQWN0aW9uLT5HZXRUeXBlKCk9PVBERk9CSl9ESUNUSU9OQVJZKQogICAgIHsKQEAgLTQ5OSw5ICs0OTksOSBAQAogICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24ocERpY3QpOwogICAgICAgICBpZihtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpKQogICAgICAgICAgICAgbV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKS0+RG9BY3Rpb25fRG9jT3BlbihhY3Rpb24sIHRoaXMpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIENQREZfT0NDb250ZXh0KiBDUERGU0RLX0RvY3VtZW50OjpHZXRPQ0NvbnRleHQoKQpAQCAtNTU1LDE0ICs1NTUsMTQgQEAKICAgICByZXR1cm4gbV9wRm9jdXNBbm5vdDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQorYm9vbCBDUERGU0RLX0RvY3VtZW50OjpTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQogewogCi0gICAgaWYobV9wRm9jdXNBbm5vdD09cEFubm90KSByZXR1cm4gVFJVRTsKKyAgICBpZihtX3BGb2N1c0Fubm90PT1wQW5ub3QpIHJldHVybiB0cnVlOwogCiAgICAgaWYobV9wRm9jdXNBbm5vdCkKICAgICB7Ci0gICAgICAgIGlmKCFLaWxsRm9jdXNBbm5vdChuRmxhZykgKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmKCFLaWxsRm9jdXNBbm5vdChuRmxhZykgKSByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKICAgICBpZihwQW5ub3QgJiYgcFBhZ2VWaWV3LT5Jc1ZhbGlkKCkpCkBAIC01NzIsMTggKzU3MiwxOCBAQAogICAgICAgICBpZihwQW5ub3RIYW5kbGVyJiYhbV9wRm9jdXNBbm5vdCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PblNldEZvY3VzKHBBbm5vdCxuRmxhZykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIGlmKCFtX3BGb2N1c0Fubm90KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1fcEZvY3VzQW5ub3Q9cEFubm90OwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6S2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZykKK2Jvb2wgQ1BERlNES19Eb2N1bWVudDo6S2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZykKIHsKICAgICBpZihtX3BGb2N1c0Fubm90KQogICAgIHsKQEAgLTYwMCwxMSArNjAwLDExIEBACiAgICAgICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRm9jdXNBbm5vdDsKICAgICAgICAgICAgICAgICAgICAgaW50IG5GaWVsZFR5cGUgPSBwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYoRklFTERUWVBFX1RFWFRGSUVMRCA9PSBuRmllbGRUeXBlIHx8IEZJRUxEVFlQRV9DT01CT0JPWCA9PSBuRmllbGRUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRW52LT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMoTlVMTCwgTlVMTCwgMCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9wRW52LT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMoTlVMTCwgTlVMTCwgMCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmKCFtX3BGb2N1c0Fubm90KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC02MTIsNyArNjEyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQREZTREtfRG9jdW1lbnQ6Ok9uQ2xvc2VEb2N1bWVudCgpCkBAIC02MjAsNyArNjIwLDcgQEAKICAgICBLaWxsRm9jdXNBbm5vdCgpOwogfQogCi1GWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OkdldFBlcm1pc3Npb25zKGludCBuRmxhZykKK2Jvb2wgQ1BERlNES19Eb2N1bWVudDo6R2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKQogewogICAgIEZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBtX3BEb2MtPkdldFVzZXJQZXJtaXNzaW9ucygpOwogICAgIHJldHVybiBkd1Blcm1pc3Npb25zJm5GbGFnOwpAQCAtNjUwLDEzICs2NTAsMTMgQEAKICAgICAgICAgbV9wYWdlLT5TZXRQcml2YXRlRGF0YSgodm9pZCopbV9wYWdlLCAodm9pZCopdGhpcywgTlVMTCk7CiAgICAgbV9meEFubm90QXJyYXkuUmVtb3ZlQWxsKCk7CiAKLSAgICBtX2JFbnRlcldpZGdldCA9IEZBTFNFOwotICAgIG1fYkV4aXRXaWRnZXQgPSBGQUxTRTsKLSAgICBtX2JPbldpZGdldCA9IEZBTFNFOworICAgIG1fYkVudGVyV2lkZ2V0ID0gZmFsc2U7CisgICAgbV9iRXhpdFdpZGdldCA9IGZhbHNlOworICAgIG1fYk9uV2lkZ2V0ID0gZmFsc2U7CiAgICAgbV9DYXB0dXJlV2lkZ2V0ID0gTlVMTDsKLSAgICBtX2JWYWxpZCA9IEZBTFNFOwotICAgICAgICBtX2JMb2NrZWQgPSBGQUxTRTsKLSAgICAgICAgbV9iVGFrZU92ZXJQYWdlID0gRkFMU0U7CisgICAgbV9iVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgbV9iTG9ja2VkID0gZmFsc2U7CisgICAgICAgIG1fYlRha2VPdmVyUGFnZSA9IGZhbHNlOwogfQogCiBDUERGU0RLX1BhZ2VWaWV3Ojp+Q1BERlNES19QYWdlVmlldygpCkBAIC02OTAsNyArNjkwLDcgQEAKICAgICBtX2N1ck1hdHJpeCA9ICpwVXNlcjJEZXZpY2U7CiAKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBUUlVFKTsKKyAgICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCB0cnVlKTsKICAgICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBudWxscHRyOwogICAgIGludCBpbmRleCA9IC0xOwogICAgIHdoaWxlICgocFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KSkpIHsKQEAgLTczNyw3ICs3MzcsNyBAQAogQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0RlhBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQogewogCi0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgRkFMU0UpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIGZhbHNlKTsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90TWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CiAgICAgQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gTlVMTDsKQEAgLTc1NSw3ICs3NTUsNyBAQAogQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0RlhXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKIHsKIAotICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIEZBTFNFKTsKKyAgICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBmYWxzZSk7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CiAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdE1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwogICAgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IE5VTEw7CkBAIC03NzUsMTIgKzc3NSwxMiBAQAogfQogCiAKLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6QW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpCitib29sIENQREZTREtfUGFnZVZpZXc6OkFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KQogewogICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gcEFubm90LT5HZXRBbm5vdERpY3QoKTsKICAgICBpZihwQW5ub3REaWMpCiAgICAgICAgIHJldHVybiAgcEFubm90RGljLT5LZXlFeGlzdCgiQVMiKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGU0RLX0Fubm90KiAgQ1BERlNES19QYWdlVmlldzo6QWRkQW5ub3QoQ1BERl9Bbm5vdCAqIHBQREZBbm5vdCkKQEAgLTgxOSw5ICs4MTksOSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1GWF9CT09MICBDUERGU0RLX1BhZ2VWaWV3OjpEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCitib29sICBDUERGU0RLX1BhZ2VWaWV3OjpEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogQ1BERl9Eb2N1bWVudCogQ1BERlNES19QYWdlVmlldzo6R2V0UERGRG9jdW1lbnQoKQpAQCAtODYxLDcgKzg2MSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCitib29sIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKQogewogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogICAgIEFTU0VSVChwRW52KTsKQEAgLTg3NSwxOCArODc1LDE4IEBACiAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CiAgICAgICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKIAotICAgICAgICBGWF9CT09MIGJSZXQgPSBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxCdXR0b25Eb3duKHRoaXMsIHBGWEFubm90LCBuRmxhZyxwb2ludCk7CisgICAgICAgIGJvb2wgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLHBvaW50KTsKICAgICAgICAgaWYoYlJldCkKICAgICAgICAgewogICAgICAgICAgICAgU2V0Rm9jdXNBbm5vdChwRlhBbm5vdCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJSZXQ7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCitib29sIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKIHsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKICAgICBBU1NFUlQocEVudik7CkBAIC04OTQsNyArODk0LDcgQEAKICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CiAgICAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CiAgICAgQ1BERlNES19Bbm5vdCogcEZvY3VzQW5ub3QgPSBHZXRGb2N1c0Fubm90KCk7Ci0gICAgRlhfQk9PTCBiUmV0ICA9IEZBTFNFOworICAgIGJvb2wgYlJldCAgPSBmYWxzZTsKICAgICBpZihwRm9jdXNBbm5vdCAmJiBwRm9jdXNBbm5vdCAhPSBwRlhBbm5vdCkKICAgICB7CiAgICAgICAgIC8vTGFzdCBmb2N1cyBBbm5vdCBnZXRzIGEgY2hhbmNlIHRvIGhhbmRsZSB0aGUgZXZlbnQuCkBAIC05MDgsNyArOTA4LDcgQEAKICAgICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZykKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBpbnQgbkZsYWcpCiB7CiAKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKQEAgLTkxOCwzNiArOTE4LDM2IEBACiAgICAgewogICAgICAgICBpZihtX0NhcHR1cmVXaWRnZXQgJiYgbV9DYXB0dXJlV2lkZ2V0ICE9IHBGWEFubm90KQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gVFJVRTsKLSAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7CisgICAgICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCBtX0NhcHR1cmVXaWRnZXQsIG5GbGFnKTsKICAgICAgICAgfQogICAgICAgICBtX0NhcHR1cmVXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBGWEFubm90OwotICAgICAgICBtX2JPbldpZGdldCA9IFRSVUU7CisgICAgICAgIG1fYk9uV2lkZ2V0ID0gdHJ1ZTsKICAgICAgICAgaWYoIW1fYkVudGVyV2lkZ2V0KQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JFbnRlcldpZGdldCA9IFRSVUU7Ci0gICAgICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gRkFMU0U7CisgICAgICAgICAgICBtX2JFbnRlcldpZGdldCA9IHRydWU7CisgICAgICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRW50ZXIodGhpcywgcEZYQW5ub3QsbkZsYWcpOwogICAgICAgICB9CiAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VNb3ZlKHRoaXMsIHBGWEFubm90LCBuRmxhZywgcG9pbnQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmKG1fYk9uV2lkZ2V0KQogICAgIHsKLSAgICAgICAgbV9iT25XaWRnZXQgPSBGQUxTRTsKLSAgICAgICAgbV9iRXhpdFdpZGdldCA9IFRSVUU7Ci0gICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7CisgICAgICAgIG1fYk9uV2lkZ2V0ID0gZmFsc2U7CisgICAgICAgIG1fYkV4aXRXaWRnZXQgPSB0cnVlOworICAgICAgICBtX2JFbnRlcldpZGdldCA9IGZhbHNlOwogICAgICAgICBpZihtX0NhcHR1cmVXaWRnZXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFeGl0KHRoaXMsIG1fQ2FwdHVyZVdpZGdldCwgbkZsYWcpOwogICAgICAgICAgICAgbV9DYXB0dXJlV2lkZ2V0ID0gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTW91c2VXaGVlbChkb3VibGUgZGVsdGFYLCBkb3VibGUgZGVsdGFZLGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQgbkZsYWcpCitib29sIENQREZTREtfUGFnZVZpZXc6Ok9uTW91c2VXaGVlbChkb3VibGUgZGVsdGFYLCBkb3VibGUgZGVsdGFZLGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQgbkZsYWcpCiB7CiAgICAgaWYoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0RlhXaWRnZXRBdFBvaW50KHBvaW50LngsIHBvaW50LnkpKQogICAgIHsKQEAgLTk1NiwxMSArOTU2LDExIEBACiAgICAgICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VXaGVlbCh0aGlzLCBwQW5ub3QsIG5GbGFnLCAoaW50KWRlbHRhWSwgcG9pbnQpOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogCiB9CiAKLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZykKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6T25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZykKIHsKICAgICBpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpCiAgICAgewpAQCAtOTcwLDEwICs5NzAsMTAgQEAKICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbktleURvd24oaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCitib29sIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZykKIHsKICAgICBpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpCiAgICAgewpAQCAtOTgyLDE3ICs5ODIsMTcgQEAKICAgICAgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwogICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbktleVVwKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQorYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbktleVVwKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQogewogLy8gIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKIC8vICB7CiAvLyAgICAgIENGRkxfSUZvcm1GaWxsZXIqIHBJRm9ybUZpbGxlciA9IGdfcEZvcm1GaWxsQXBwLT5HZXRJRm9ybUZpbGxlcigpOwogLy8gICAgICByZXR1cm4gcElGb3JtRmlsbGVyLT5PbktleVVwKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKIC8vICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogZXh0ZXJuIHZvaWQgQ2hlY2tVblN1cHBvcnRBbm5vdChDUERGX0RvY3VtZW50ICogcERvYywgQ1BERl9Bbm5vdCogcFBERkFubm90KTsKQEAgLTEwMDEsMTMgKzEwMDEsMTMgQEAKIHsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKIAotICAgIEZYX0JPT0wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKKyAgICBib29sIGVuYWJsZUFQVXBkYXRlID0gQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCk7CiAgICAgLy9EaXNhYmxlIHRoZSBkZWZhdWx0IEFQIGNvbnN0cnVjdGlvbi4KLSAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoRkFMU0UpOworICAgIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChmYWxzZSk7CiAgICAgbV9wQW5ub3RMaXN0ID0gbmV3IENQREZfQW5ub3RMaXN0KG1fcGFnZSk7CiAgICAgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGVuYWJsZUFQVXBkYXRlKTsKICAgICBpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwotICAgICAgICBTZXRMb2NrKFRSVUUpOworICAgICAgICBTZXRMb2NrKHRydWUpOwogICAgIGZvcihpbnQgaT0wOyBpPG5Db3VudDsgaSsrKQogICAgIHsKICAgICAgICAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gbV9wQW5ub3RMaXN0LT5HZXRBdChpKTsKQEAgLTEwMjksNyArMTAyOSw3IEBACiAgICAgICAgIH0KIAogICAgIH0KLSAgICAgICAgU2V0TG9jayhGQUxTRSk7CisgICAgICAgIFNldExvY2soZmFsc2UpOwogfQogCiB2b2lkICAgIENQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVJlY3RzKENGWF9SZWN0QXJyYXkmIHJlY3RzKQpAQCAtMTA2NCwxNiArMTA2NCwxNiBAQAogICAgIHJldHVybiAtMTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpJc1ZhbGlkQW5ub3Qodm9pZCogcCkKK2Jvb2wgQ1BERlNES19QYWdlVmlldzo6SXNWYWxpZEFubm90KHZvaWQqIHApCiB7Ci0gICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChwID09IE5VTEwpIHJldHVybiBmYWxzZTsKICAgICBpbnQgaUNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspCiAgICAgewogICAgICAgICBpZiAobV9wQW5ub3RMaXN0LT5HZXRBdChpKSA9PSBwKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwIGIvZnBkZnNkay9zcmMvZnNka19yZW5kZXJjb250ZXh0LmNwcAppbmRleCBmOTZkYjk0Li4yYmMzZWE4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAKQEAgLTM4LDEwICszOCwxMCBAQAogICAgIG1fSVBhdXNlID0gSVBhdXNlOwogfQogCi1GWF9CT09MIElGU0RLX1BBVVNFX0FkYXB0ZXI6Ok5lZWRUb1BhdXNlTm93KCkKK2Jvb2wgSUZTREtfUEFVU0VfQWRhcHRlcjo6TmVlZFRvUGF1c2VOb3coKQogewogICAgIGlmIChtX0lQYXVzZS0+TmVlZFRvUGF1c2VOb3cpIHsKICAgICAgICAgcmV0dXJuIG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdyhtX0lQYXVzZSk7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9hcC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9hcC5jcHAKaW5kZXggMzA5YTk4Zi4uN2YyODQzYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcApAQCAtNjYsNyArNjYsNyBAQAogfQogCiBDRlhfQnl0ZVN0cmluZyBJRlhfRWRpdDo6R2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCi0JCQkJCQkJCQkJCQkgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgLyogPSBOVUxMKi8sIEZYX0JPT0wgYkNvbnRpbnVvdXMvKiA9IFRSVUUqLywgRlhfV09SRCBTdWJXb3JkLyogPSAwKi8pCisJCQkJCQkJCQkJCQkgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgLyogPSBOVUxMKi8sIGJvb2wgYkNvbnRpbnVvdXMvKiA9IHRydWUqLywgRlhfV09SRCBTdWJXb3JkLyogPSAwKi8pCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNFZGl0U3RyZWFtLCBzV29yZHM7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2VkaXQuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKaW5kZXggNjMxMTVjMi4uYjFhZDU5ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKQEAgLTIxLDcwICsyMSw3MCBAQAogewogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0V29yZCgpCitib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0V29yZCgpCiB7CiAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRXb3JkKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRMaW5lKCkKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRMaW5lKCkKIHsKICAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dExpbmUoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dFNlY3Rpb24oKQorYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dFNlY3Rpb24oKQogewogICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0U2VjdGlvbigpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2V29yZCgpCitib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2V29yZCgpCiB7CiAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZXb3JkKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZMaW5lKCkKK2Jvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZMaW5lKCkKIHsKICAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldkxpbmUoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldlNlY3Rpb24oKQorYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldlNlY3Rpb24oKQogewogICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2U2VjdGlvbigpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0Citib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcEVkaXQpOwogCiAgICAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCiAgICAgewogICAgICAgICB3b3JkLnB0V29yZCA9IG1fcEVkaXQtPlZUVG9FZGl0KHdvcmQucHRXb3JkKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0Citib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcEVkaXQpOwogCiAgICAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldExpbmUobGluZSkpCiAgICAgewogICAgICAgICBsaW5lLnB0TGluZSA9IG1fcEVkaXQtPlZUVG9FZGl0KGxpbmUucHRMaW5lKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0Citib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcEVkaXQpOwogCiAgICAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpCiAgICAgewogICAgICAgICBzZWN0aW9uLnJjU2VjdGlvbiA9IG1fcEVkaXQtPlZUVG9FZGl0KHNlY3Rpb24ucmNTZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGWF9FZGl0X0l0ZXJhdG9yOjpTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQorYm9vbCBDRlhfRWRpdF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQogewogICAgIHJldHVybiBGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmQpOwogfQpAQCAtMjEwLDcgKzIxMCw3IEBACiAKIHZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6QW5hbHlzZShpbnQzMl90IG5BbGlnbm1lbnQpCiB7Ci0gICAgRlhfQk9PTCBiTGluZVRvcENoYW5nZWQgPSBGQUxTRTsKKyAgICBib29sIGJMaW5lVG9wQ2hhbmdlZCA9IGZhbHNlOwogICAgIENQREZfUmVjdCByY1Jlc3VsdDsKICAgICBGWF9GTE9BVCBmV2lkdGhEaWZmOwogCkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwTmV3UmVjdC0+SXNTYW1lVG9wKCpwT2xkUmVjdCkgfHwgIXBOZXdSZWN0LT5Jc1NhbWVIZWlnaHQoKnBPbGRSZWN0KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGluZVRvcENoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMaW5lVG9wQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTMyNCw5ICszMjQsOSBAQAogCiBDRlhfRWRpdF9VbmRvOjpDRlhfRWRpdF9VbmRvKGludDMyX3QgbkJ1ZnNpemUpIDogbV9uQ3VyVW5kb1BvcygwKSwKICAgICBtX25CdWZTaXplKG5CdWZzaXplKSwKLSAgICBtX2JNb2RpZmllZChGQUxTRSksCi0gICAgbV9iVmlyZ2luKFRSVUUpLAotICAgIG1fYldvcmtpbmcoRkFMU0UpCisgICAgbV9iTW9kaWZpZWQoZmFsc2UpLAorICAgIG1fYlZpcmdpbih0cnVlKSwKKyAgICBtX2JXb3JraW5nKGZhbHNlKQogewogfQogCkBAIC0zMzUsMTQgKzMzNSwxNCBAQAogICAgIFJlc2V0KCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6Q2FuVW5kbygpIGNvbnN0Citib29sIENGWF9FZGl0X1VuZG86OkNhblVuZG8oKSBjb25zdAogewogICAgIHJldHVybiBtX25DdXJVbmRvUG9zID4gMDsKIH0KIAogdm9pZCBDRlhfRWRpdF9VbmRvOjpVbmRvKCkKIHsKLSAgICBtX2JXb3JraW5nID0gVFJVRTsKKyAgICBtX2JXb3JraW5nID0gdHJ1ZTsKIAogICAgIGlmIChtX25DdXJVbmRvUG9zID4gMCkKICAgICB7CkBAIC0zNTUsMTcgKzM1NSwxNyBAQAogICAgICAgICBtX2JNb2RpZmllZCA9IChtX25DdXJVbmRvUG9zICE9IDApOwogICAgIH0KIAotICAgIG1fYldvcmtpbmcgPSBGQUxTRTsKKyAgICBtX2JXb3JraW5nID0gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6Q2FuUmVkbygpIGNvbnN0Citib29sIENGWF9FZGl0X1VuZG86OkNhblJlZG8oKSBjb25zdAogewogICAgIHJldHVybiBtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKIH0KIAogdm9pZCBDRlhfRWRpdF9VbmRvOjpSZWRvKCkKIHsKLSAgICBtX2JXb3JraW5nID0gVFJVRTsKKyAgICBtX2JXb3JraW5nID0gdHJ1ZTsKIAogICAgIGludDMyX3QgblN0YWNrU2l6ZSA9IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCk7CiAKQEAgLTM4MCwxMCArMzgwLDEwIEBACiAgICAgICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CiAgICAgfQogCi0gICAgbV9iV29ya2luZyA9IEZBTFNFOworICAgIG1fYldvcmtpbmcgPSBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpJc1dvcmtpbmcoKSBjb25zdAorYm9vbCBDRlhfRWRpdF9VbmRvOjpJc1dvcmtpbmcoKSBjb25zdAogewogICAgIHJldHVybiBtX2JXb3JraW5nOwogfQpAQCAtNDAwLDcgKzQwMCw3IEBACiAgICAgaWYgKG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkgPj0gbV9uQnVmU2l6ZSkKICAgICB7CiAgICAgICAgIFJlbW92ZUhlYWRzKCk7Ci0gICAgICAgIG1fYlZpcmdpbiA9IEZBTFNFOworICAgICAgICBtX2JWaXJnaW4gPSBmYWxzZTsKICAgICB9CiAKICAgICBtX1VuZG9JdGVtU3RhY2suQWRkKHBJdGVtKTsKQEAgLTQwOSw5ICs0MDksOSBAQAogICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6SXNNb2RpZmllZCgpIGNvbnN0Citib29sIENGWF9FZGl0X1VuZG86OklzTW9kaWZpZWQoKSBjb25zdAogewotICAgIHJldHVybiBtX2JWaXJnaW4gPyBtX2JNb2RpZmllZCA6IFRSVUU7CisgICAgcmV0dXJuIG1fYlZpcmdpbiA/IG1fYk1vZGlmaWVkIDogdHJ1ZTsKIH0KIAogSUZYX0VkaXRfVW5kb0l0ZW0qIENGWF9FZGl0X1VuZG86OkdldEl0ZW0oaW50MzJfdCBuSW5kZXgpCkBAIC00NjksOCArNDY5LDggQEAKIHsKICAgICBBU1NFUlQocFVuZG9JdGVtICE9IE5VTEwpOwogCi0gICAgcFVuZG9JdGVtLT5TZXRGaXJzdChGQUxTRSk7Ci0gICAgcFVuZG9JdGVtLT5TZXRMYXN0KEZBTFNFKTsKKyAgICBwVW5kb0l0ZW0tPlNldEZpcnN0KGZhbHNlKTsKKyAgICBwVW5kb0l0ZW0tPlNldExhc3QoZmFsc2UpOwogCiAgICAgbV9JdGVtcy5BZGQocFVuZG9JdGVtKTsKIApAQCAtNDg0LDExICs0ODQsMTEgQEAKICAgICB7CiAgICAgICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwRmlyc3RJdGVtID0gbV9JdGVtc1swXTsKICAgICAgICAgQVNTRVJUKHBGaXJzdEl0ZW0gIT0gTlVMTCk7Ci0gICAgICAgIHBGaXJzdEl0ZW0tPlNldEZpcnN0KFRSVUUpOworICAgICAgICBwRmlyc3RJdGVtLT5TZXRGaXJzdCh0cnVlKTsKIAogICAgICAgICBDRlhfRWRpdF9VbmRvSXRlbSogcExhc3RJdGVtID0gbV9JdGVtc1ttX0l0ZW1zLkdldFNpemUoKSAtIDFdOwogICAgICAgICBBU1NFUlQocExhc3RJdGVtICE9IE5VTEwpOwotICAgICAgICBwTGFzdEl0ZW0tPlNldExhc3QoVFJVRSk7CisgICAgICAgIHBMYXN0SXRlbS0+U2V0TGFzdCh0cnVlKTsKICAgICB9CiB9CiAKQEAgLTUzOSw3ICs1MzksNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7CisgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLGZhbHNlLHRydWUpOwogICAgIH0KIH0KIApAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoRkFMU0UsVFJVRSk7CisgICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTU3OSw3ICs1NzksNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTU4OSw3ICs1ODksNyBAQAogICAgIHsKICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKLSAgICAgICAgbV9wRWRpdC0+QmFja3NwYWNlKEZBTFNFLFRSVUUpOworICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoZmFsc2UsdHJ1ZSk7CiAgICAgfQogfQogCkBAIC02MTksNyArNjE5LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+QmFja3NwYWNlKGZhbHNlLHRydWUpOwogICAgIH0KIH0KIApAQCAtNjMxLDExICs2MzEsMTEgQEAKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CiAgICAgICAgIGlmIChtX3dwTmV3LlNlY0NtcChtX3dwT2xkKSAhPSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOworICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxmYWxzZSx0cnVlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOworICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02NDUsNyArNjQ1LDcgQEAKIAogQ0ZYRVVfRGVsZXRlOjpDRlhFVV9EZWxldGUoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcywgRlhfQk9PTCBiU2VjRW5kKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcywgYm9vbCBiU2VjRW5kKSA6CiAgICAgICAgICAgICBtX3BFZGl0KHBFZGl0KSwKICAgICAgICAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCiAgICAgICAgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLApAQCAtNjY3LDcgKzY2Nyw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBtX3BFZGl0LT5EZWxldGUoRkFMU0UsVFJVRSk7CisgICAgICAgIG1fcEVkaXQtPkRlbGV0ZShmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTY3OSwxMSArNjc5LDExIEBACiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwogICAgICAgICBpZiAobV9iU2VjRW5kKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOworICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxmYWxzZSx0cnVlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOworICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsZmFsc2UsdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC03MDgsNyArNzA4LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotICAgICAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+Q2xlYXIoZmFsc2UsdHJ1ZSk7CiAgICAgfQogfQogCkBAIC03MTgsNyArNzE4LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93clNlbC5CZWdpblBvcyk7Ci0gICAgICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgREVGQVVMVF9DSEFSU0VULCBOVUxMLCBOVUxMLCBGQUxTRSwgVFJVRSk7CisgICAgICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgREVGQVVMVF9DSEFSU0VULCBOVUxMLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLG1fd3JTZWwuRW5kUG9zKTsKICAgICB9CiB9CkBAIC03NTAsNyArNzUwLDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotICAgICAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+Q2xlYXIoZmFsc2UsdHJ1ZSk7CiAgICAgfQogfQogCkBAIC03NjIsMTEgKzc2MiwxMSBAQAogICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKICAgICAgICAgaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsRkFMU0UsRkFMU0UpOworICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxmYWxzZSxmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxGQUxTRSk7CisgICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxmYWxzZSxmYWxzZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoSXNGaXJzdCgpKQpAQCAtODA2LDcgKzgwNiw3IEBACiAgICAgewogICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CiAgICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBtX3BFZGl0LT5JbnNlcnRUZXh0KG1fc3dUZXh0LmNfc3RyKCksIG1fbkNoYXJzZXQsICZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBtX25DaGFyc2V0LCAmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLCBmYWxzZSwgdHJ1ZSk7CiAgICAgfQogfQogCkBAIC04MTYsNyArODE2LDcgQEAKICAgICB7CiAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKICAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3BPbGQsbV93cE5ldyk7Ci0gICAgICAgIG1fcEVkaXQtPkNsZWFyKEZBTFNFLFRSVUUpOworICAgICAgICBtX3BFZGl0LT5DbGVhcihmYWxzZSx0cnVlKTsKICAgICB9CiB9CiAKQEAgLTg0NCw3ICs4NDQsNyBAQAogewogICAgIGlmIChtX3BFZGl0KQogICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX05ld1NlY1Byb3BzLCZtX05ld1dvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOworICAgICAgICBtX3BFZGl0LT5TZXRTZWNQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fTmV3U2VjUHJvcHMsJm1fTmV3V29yZFByb3BzLG1fd3JQbGFjZSxmYWxzZSk7CiAgICAgICAgIGlmIChJc0xhc3QoKSkKICAgICAgICAgewogICAgICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwpAQCAtODU4LDcgKzg1OCw3IEBACiB7CiAgICAgaWYgKG1fcEVkaXQpCiAgICAgewotICAgICAgICBtX3BFZGl0LT5TZXRTZWNQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fT2xkU2VjUHJvcHMsJm1fT2xkV29yZFByb3BzLG1fd3JQbGFjZSxGQUxTRSk7CisgICAgICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRTZWNQcm9wcywmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLGZhbHNlKTsKICAgICAgICAgaWYgKElzRmlyc3QoKSkKICAgICAgICAgewogICAgICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwpAQCAtODg5LDcgKzg4OSw3IEBACiB7CiAgICAgaWYgKG1fcEVkaXQpCiAgICAgewotICAgICAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX05ld1dvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOworICAgICAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX05ld1dvcmRQcm9wcyxtX3dyUGxhY2UsZmFsc2UpOwogICAgICAgICBpZiAoSXNMYXN0KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKQEAgLTkwMyw3ICs5MDMsNyBAQAogewogICAgIGlmIChtX3BFZGl0KQogICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2V0V29yZFByb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLEZBTFNFKTsKKyAgICAgICAgbV9wRWRpdC0+U2V0V29yZFByb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLGZhbHNlKTsKICAgICAgICAgaWYgKElzRmlyc3QoKSkKICAgICAgICAgewogICAgICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwpAQCAtOTI1LDE4ICs5MjUsMTggQEAKICAgICBtX1NlbFN0YXRlKCksCiAgICAgbV9wdFNjcm9sbFBvcygwLDApLAogICAgIG1fcHRSZWZyZXNoU2Nyb2xsUG9zKDAsMCksCi0gICAgbV9iRW5hYmxlU2Nyb2xsKEZBTFNFKSwKKyAgICBtX2JFbmFibGVTY3JvbGwoZmFsc2UpLAogICAgIG1fcEl0ZXJhdG9yKE5VTEwpLAogICAgIG1fcHRDYXJldCgwLjBmLDAuMGYpLAogICAgIG1fVW5kbyhGWF9FRElUX1VORE9fTUFYSVRFTSksCiAgICAgbV9uQWxpZ25tZW50KDApLAotICAgIG1fYk5vdGlmeUZsYWcoRkFMU0UpLAotICAgIG1fYkVuYWJsZU92ZXJmbG93KEZBTFNFKSwKLSAgICBtX2JFbmFibGVSZWZyZXNoKFRSVUUpLAorICAgIG1fYk5vdGlmeUZsYWcoZmFsc2UpLAorICAgIG1fYkVuYWJsZU92ZXJmbG93KGZhbHNlKSwKKyAgICBtX2JFbmFibGVSZWZyZXNoKHRydWUpLAogICAgIG1fcmNPbGRDb250ZW50KDAuMGYsMC4wZiwwLjBmLDAuMGYpLAotICAgIG1fYkVuYWJsZVVuZG8oVFJVRSksCi0gICAgbV9iTm90aWZ5KFRSVUUpLAotICAgIG1fYk9wck5vdGlmeShGQUxTRSksCisgICAgbV9iRW5hYmxlVW5kbyh0cnVlKSwKKyAgICBtX2JOb3RpZnkodHJ1ZSksCisgICAgbV9iT3ByTm90aWZ5KGZhbHNlKSwKICAgICBtX3BHcm91cFVuZG9JdGVtKE5VTEwpCiB7CiAgICAgQVNTRVJUKHBWVCAhPSBOVUxMKTsKQEAgLTEwMDIsOTIgKzEwMDIsOTIgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0UGxhdGVSZWN0KHJlY3QpOwogICAgIG1fcHRTY3JvbGxQb3MgPSBDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LnRvcCk7CiAgICAgaWYgKGJQYWludCkgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0LyogPTAgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldEFsaWdubWVudChuRm9ybWF0KTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdC8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQvKiA9MCAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX25BbGlnbm1lbnQgPSBuRm9ybWF0OwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkLyogPScqJyAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkLyogPScqJyAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0UGFzc3dvcmRDaGFyKHdTdWJXb3JkKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyLyogPTAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyLyogPTAgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5LyogPTAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5LyogPTAgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldENoYXJBcnJheShuQ2hhckFycmF5KTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZS8qID0wLjBmICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UvKiA9MC4wZiAqLywgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUvKiA9MTAwICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZS8qID0xMDAgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldEhvcnpTY2FsZShuSG9yelNjYWxlKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRNdWx0aUxpbmUoYm9vbCBiTXVsdGlMaW5lLyogPXRydWUgKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9wVlQtPlNldE11bHRpTGluZShiTXVsdGlMaW5lKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8vKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9SZXR1cm4oYm9vbCBiQXV0by8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRBdXRvUmV0dXJuKGJBdXRvKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZy8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRMaW5lTGVhZGluZyhmTGluZUxlYWRpbmcpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRBdXRvRm9udFNpemUoYm9vbCBiQXV0by8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRBdXRvRm9udFNpemUoYkF1dG8pOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKICAgICBtX3BWVC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8vKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9TY3JvbGwoYm9vbCBiQXV0by8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fYkVuYWJsZVNjcm9sbCA9IGJBdXRvOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkIC8qPSBGQUxTRSovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDRlhfRWRpdDo6U2V0VGV4dE92ZXJmbG93KGJvb2wgYkFsbG93ZWQgLyo9IGZhbHNlKi8sIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAgICAgbV9iRW5hYmxlT3ZlcmZsb3cgPSBiQWxsb3dlZDsKICAgICBpZiAoYlBhaW50KSBQYWludCgpOwpAQCAtMTE5Myw3ICsxMTkzLDcgQEAKICAgICB7CiAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJSaWNoID0gbV9wVlQtPklzUmljaFRleHQoKTsKKyAgICAgICAgICAgIGJvb2wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOwogCiAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCkBAIC0xMjM1LDcgKzEyMzUsNyBAQAogCiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewotICAgICAgICBGWF9CT09MIGJSaWNoID0gbV9wVlQtPklzUmljaFRleHQoKTsKKyAgICAgICAgYm9vbCBiUmljaCA9IG1fcFZULT5Jc1JpY2hUZXh0KCk7CiAKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCiAgICAgICAgIHsKQEAgLTEzMzEsNDYgKzEzMzEsNDYgQEAKICAgICByZXR1cm4gd3JSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OklzUmljaFRleHQoKSBjb25zdAorYm9vbCBDRlhfRWRpdDo6SXNSaWNoVGV4dCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fcFZULT5Jc1JpY2hUZXh0KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0LyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENGWF9FZGl0OjpTZXRSaWNoVGV4dChib29sIGJSaWNoVGV4dC8qID10cnVlICovLCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogICAgIG1fcFZULT5TZXRSaWNoVGV4dChiUmljaFRleHQpOwogICAgIGlmIChiUGFpbnQpIFBhaW50KCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hGb250SW5kZXgoaW50MzJfdCBuRm9udEluZGV4KQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIFdvcmRQcm9wcy5uRm9udEluZGV4ID0gbkZvbnRJbmRleDsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9GT05USU5ERVgsTlVMTCwmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKK2Jvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCiB7CiAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogICAgIFdvcmRQcm9wcy5mRm9udFNpemUgPSBmRm9udFNpemU7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfRk9OVFNJWkUsTlVMTCwmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBXb3JkUHJvcHMuZHdXb3JkQ29sb3IgPSBkd0NvbG9yOwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX1dPUkRDT0xPUixOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRTY3JpcHQoaW50MzJfdCBuU2NyaXB0VHlwZSkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLm5TY3JpcHRUeXBlID0gblNjcmlwdFR5cGU7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfU0NSSVBUVFlQRSxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCkKK2Jvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Qm9sZChib29sIGJCb2xkKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBpZiAoYkJvbGQpCkBAIC0xMzc4LDcgKzEzNzgsNyBAQAogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0JPTEQsTlVMTCwmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRJdGFsaWMoYm9vbCBiSXRhbGljKQogewogICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKICAgICBpZiAoYkl0YWxpYykKQEAgLTEzODYsNyArMTM4Niw3IEBACiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfSVRBTElDLE5VTEwsJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSkKK2Jvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0VW5kZXJsaW5lKGJvb2wgYlVuZGVybGluZSkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgaWYgKGJVbmRlcmxpbmUpCkBAIC0xMzk0LDcgKzEzOTQsNyBAQAogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX1VOREVSTElORSxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0KQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRDcm9zc291dChib29sIGJDcm9zc291dCkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgaWYgKGJDcm9zc291dCkKQEAgLTE0MDIsNDUgKzE0MDIsNDUgQEAKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9DUk9TU09VVCxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLmZDaGFyU3BhY2UgPSBmQ2hhclNwYWNlOwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NIQVJTUEFDRSxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgLyo9IDEwMCovKQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlIC8qPSAxMDAqLykKIHsKICAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiAgICAgV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBuSG9yelNjYWxlOwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0hPUlpTQ0FMRSxOVUxMLCZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykKK2Jvb2wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKQogewogICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7CiAgICAgU2VjUHJvcHMuZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOwogICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0xJTkVMRUFESU5HLCZTZWNQcm9wcyxOVUxMKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KQogewogICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7CiAgICAgU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBmTGluZUluZGVudDsKICAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FSU5ERU5ULCZTZWNQcm9wcyxOVUxMKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KQorYm9vbCBDRlhfRWRpdDo6U2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KQogewogICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7CiAgICAgU2VjUHJvcHMubkFsaWdubWVudCA9IG5BbGlnbm1lbnQ7CiAgICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQUxJR05NRU5ULCZTZWNQcm9wcyxOVUxMKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCitib29sIENGWF9FZGl0OjpTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykKIHsKLSAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJTZXQxLGJTZXQyOworICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgIGJvb2wgYlNldDEsYlNldDI7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkgJiYgbV9wVlQtPklzUmljaFRleHQoKSkKICAgICB7CiAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQpAQCAtMTQ1MywxNCArMTQ1MywxNCBAQAogCiAgICAgICAgICAgICBCZWdpbkdyb3VwVW5kbyhMIiIpOzsKIAotICAgICAgICAgICAgYlNldCA9IFNldFNlY1Byb3BzKGVQcm9wcyx3clRlbXAuQmVnaW5Qb3MscFNlY1Byb3BzLHBXb3JkUHJvcHMsd3JUZW1wLFRSVUUpOworICAgICAgICAgICAgYlNldCA9IFNldFNlY1Byb3BzKGVQcm9wcyx3clRlbXAuQmVnaW5Qb3MscFNlY1Byb3BzLHBXb3JkUHJvcHMsd3JUZW1wLHRydWUpOwogCiAgICAgICAgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwogICAgICAgICAgICAgICAgIGlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgYlNldDEgPSBTZXRTZWNQcm9wcyhlUHJvcHMscGxhY2UscFNlY1Byb3BzLHBXb3JkUHJvcHMsd3JUZW1wLFRSVUUpOwotICAgICAgICAgICAgICAgIGJTZXQyID0gU2V0V29yZFByb3BzKGVQcm9wcyxwbGFjZSxwV29yZFByb3BzLHdyVGVtcCxUUlVFKTsKKyAgICAgICAgICAgICAgICBiU2V0MSA9IFNldFNlY1Byb3BzKGVQcm9wcyxwbGFjZSxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsdHJ1ZSk7CisgICAgICAgICAgICAgICAgYlNldDIgPSBTZXRXb3JkUHJvcHMoZVByb3BzLHBsYWNlLHBXb3JkUHJvcHMsd3JUZW1wLHRydWUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFiU2V0KQogICAgICAgICAgICAgICAgICAgICBiU2V0ID0gKGJTZXQxIHx8IGJTZXQyKTsKQEAgLTE1MTYsMTUgKzE1MTYsMTUgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCitib29sIENGWF9FZGl0OjpTZXRTZWNQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIGJvb2wgYkFkZFVuZG8pCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkgJiYgbV9wVlQtPklzUmljaFRleHQoKSkKICAgICB7CiAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOwogICAgICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY2luZm87CiAgICAgICAgICAgICBDUFZUX1NlY3Rpb24gT2xkU2VjaW5mbzsKIApAQCAtMTU0NSwyMSArMTU0NSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5TZWNQcm9wcy5mTGluZUxlYWRpbmcscFNlY1Byb3BzLT5mTGluZUxlYWRpbmcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5TZWNQcm9wcy5mTGluZUxlYWRpbmcgPSBwU2VjUHJvcHMtPmZMaW5lTGVhZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfTElORUlOREVOVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQscFNlY1Byb3BzLT5mTGluZUluZGVudCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLmZMaW5lSW5kZW50ID0gcFNlY1Byb3BzLT5mTGluZUluZGVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfQUxJR05NRU5UOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLlNlY1Byb3BzLm5BbGlnbm1lbnQgIT0gcFNlY1Byb3BzLT5uQWxpZ25tZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5TZWNQcm9wcy5uQWxpZ25tZW50ID0gcFNlY1Byb3BzLT5uQWxpZ25tZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE1ODMsNDIgKzE1ODMsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCAhPSBwV29yZFByb3BzLT5uRm9udEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0ZPTlRTSVpFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplLHBXb3JkUHJvcHMtPmZGb250U2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUgPSBwV29yZFByb3BzLT5mRm9udFNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1dPUkRDT0xPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgIT0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciA9IHBXb3JkUHJvcHMtPmR3V29yZENvbG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSAhPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlID0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0NIQVJTUEFDRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHNlY2luZm8uV29yZFByb3BzLmZDaGFyU3BhY2UscFdvcmRQcm9wcy0+ZkNoYXJTcGFjZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlID0gcFdvcmRQcm9wcy0+ZkNoYXJTcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfSE9SWlNDQUxFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlID0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgpAQCAtMTYyNyw3ICsxNjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE2MzUsNyArMTYzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNjQ1LDcgKzE2NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE2NTMsNyArMTY1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTY2Myw3ICsxNjYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTY3MSw3ICsxNjcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0JPTEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTY4MSw3ICsxNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9JVEFMSUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE2ODksNyArMTY4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzE3LDE3ICsxNzE3LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKQorYm9vbCBDRlhfRWRpdDo6U2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgYm9vbCBiQWRkVW5kbykKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQogICAgIHsKICAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBDUFZUX1dvcmQgd29yZGluZm87CiAgICAgICAgICAgICBDUFZUX1dvcmQgT2xkV29yZGluZm87CiAKQEAgLTE3NDksNDIgKzE3NDksNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ID0gcEZvbnRNYXAtPkdldFdvcmRGb250SW5kZXgod29yZGluZm8uV29yZCx3b3JkaW5mby5uQ2hhcnNldCxwV29yZFByb3BzLT5uRm9udEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9GT05UU0laRToKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwod29yZGluZm8uV29yZFByb3BzLmZGb250U2l6ZSxwV29yZFByb3BzLT5mRm9udFNpemUpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5mRm9udFNpemUgPSBwV29yZFByb3BzLT5mRm9udFNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9XT1JEQ09MT1I6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29yZGluZm8uV29yZFByb3BzLmR3V29yZENvbG9yICE9IHBXb3JkUHJvcHMtPmR3V29yZENvbG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciA9IHBXb3JkUHJvcHMtPmR3V29yZENvbG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfU0NSSVBUVFlQRToKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgIT0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlID0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9DSEFSU1BBQ0U6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHdvcmRpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlLHBXb3JkUHJvcHMtPmZDaGFyU3BhY2UpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlID0gcFdvcmRQcm9wcy0+ZkNoYXJTcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0hPUlpTQ0FMRToKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSAhPSBwV29yZFByb3BzLT5uSG9yelNjYWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlID0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1VOREVSTElORToKQEAgLTE3OTMsNyArMTc5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xODAxLDcgKzE4MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTgxMSw3ICsxODExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xODE5LDcgKzE4MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE4MjksNyArMTgyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE4MzcsNyArMTgzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0JPTEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE4NDcsNyArMTg0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9JVEFMSUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xODU1LDcgKzE4NTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTg4MSw0NCArMTg4MSw0NCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDRlhfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCxpbnQzMl90IGNoYXJzZXQgLyo9IERFRkFVTFRfQ0hBUlNFVCovLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyAvKj0gTlVMTCovLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQogewotICAgIFNldFRleHQodGV4dCxjaGFyc2V0LHBTZWNQcm9wcyxwV29yZFByb3BzLFRSVUUsVFJVRSk7CisgICAgU2V0VGV4dCh0ZXh0LGNoYXJzZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMsdHJ1ZSx0cnVlKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQorYm9vbCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQogewotICAgIHJldHVybiBJbnNlcnRXb3JkKHdvcmQsY2hhcnNldCxwV29yZFByb3BzLFRSVUUsVFJVRSk7CisgICAgcmV0dXJuIEluc2VydFdvcmQod29yZCxjaGFyc2V0LHBXb3JkUHJvcHMsdHJ1ZSx0cnVlKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgLyo9IE5VTEwqLyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykKK2Jvb2wgQ0ZYX0VkaXQ6Okluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzIC8qPSBOVUxMKi8sY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCiB7Ci0gICAgcmV0dXJuIEluc2VydFJldHVybihwU2VjUHJvcHMscFdvcmRQcm9wcyxUUlVFLFRSVUUpOworICAgIHJldHVybiBJbnNlcnRSZXR1cm4ocFNlY1Byb3BzLHBXb3JkUHJvcHMsdHJ1ZSx0cnVlKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKCkKK2Jvb2wgQ0ZYX0VkaXQ6OkJhY2tzcGFjZSgpCiB7Ci0gICAgcmV0dXJuIEJhY2tzcGFjZShUUlVFLFRSVUUpOworICAgIHJldHVybiBCYWNrc3BhY2UodHJ1ZSx0cnVlKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6RGVsZXRlKCkKK2Jvb2wgQ0ZYX0VkaXQ6OkRlbGV0ZSgpCiB7Ci0gICAgcmV0dXJuIERlbGV0ZShUUlVFLFRSVUUpOworICAgIHJldHVybiBEZWxldGUodHJ1ZSx0cnVlKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6Q2xlYXIoKQorYm9vbCBDRlhfRWRpdDo6Q2xlYXIoKQogewotICAgIHJldHVybiBDbGVhcihUUlVFLFRSVUUpOworICAgIHJldHVybiBDbGVhcih0cnVlLHRydWUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgLyo9IERFRkFVTFRfQ0hBUlNFVCovLAorYm9vbCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyAvKj0gTlVMTCovLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQogewotICAgIHJldHVybiBJbnNlcnRUZXh0KHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcyxUUlVFLFRSVUUpOworICAgIHJldHVybiBJbnNlcnRUZXh0KHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcyx0cnVlLHRydWUpOwogfQogCiBGWF9GTE9BVCBDRlhfRWRpdDo6R2V0Rm9udFNpemUoKSBjb25zdApAQCAtMjAzOSw5ICsyMDM5LDkgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uQ29udGVudENoYW5nZShyY0NvbnRlbnQpOwotICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtX3JjT2xkQ29udGVudCA9IHJjQ29udGVudDsKICAgICAgICAgfQpAQCAtMjA3NSw3ICsyMDc1LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OklzU2VsZWN0ZWQoKSBjb25zdAorYm9vbCBDRlhfRWRpdDo6SXNTZWxlY3RlZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fU2VsU3RhdGUuSXNFeGlzdCgpOwogfQpAQCAtMjE1MywxMyArMjE1MywxMyBAQAogCiAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1gocmNQbGF0ZS5sZWZ0LCByY1BsYXRlLnJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQubGVmdCwgcmNDb250ZW50LnJpZ2h0LCByY1BsYXRlLldpZHRoKCkgLyAzLCByY1BsYXRlLldpZHRoKCkpOwogCiAgICAgICAgICAgICBtX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9ZKHJjUGxhdGUuYm90dG9tLCByY1BsYXRlLnRvcCwKICAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LmJvdHRvbSwgcmNDb250ZW50LnRvcCwgcmNQbGF0ZS5IZWlnaHQoKSAvIDMsIHJjUGxhdGUuSGVpZ2h0KCkpOwotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjE3OSw5ICsyMTc5LDkgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWChmeCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjIwMyw5ICsyMjAzLDkgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM3MywxMyArMjM3MywxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYgKGNvbnN0IENGWF9FZGl0X1JlY3RBcnJheSAqIHBSZWN0cyA9IG1fUmVmcmVzaC5HZXRSZWZyZXNoUmVjdHMoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwUmVjdHMtPkdldFNpemUoKTsgaSA8IHN6OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KHBSZWN0cy0+R2V0QXQoaSkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI0OTksMTAgKzI0OTksMTAgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY1dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI1MTcsMTAgKzI1MTcsMTAgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY0xpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMjU2NSw5ICsyNTY1LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAgICAgICAgICAgICBtX3BOb3RpZnktPklPblNldENhcmV0KCFtX1NlbFN0YXRlLklzRXhpc3QoKSxWVFRvRWRpdChwdEhlYWQpLFZUVG9FZGl0KHB0Rm9vdCksIG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MDMsOSArMjYwMyw5IEBACiAKICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwogICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25DYXJldENoYW5nZShTZWNQcm9wcyxXb3JkUHJvcHMpOwotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjYyNCw3ICsyNjI0LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjYzOCw3ICsyNjM4LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjY1Nyw3ICsyNjU3LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNjg4LDcgKzI2ODgsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPblZLX0RPV04oYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNzE5LDcgKzI3MTksNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9FZGl0OjpPblZLX0xFRlQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yNzczLDcgKzI3NzMsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25WS19SSUdIVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25WS19SSUdIVChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI4MjcsNyArMjgyNyw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfSE9NRShib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI4NzYsNyArMjg3Niw3IEBACiAgICAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfRWRpdDo6T25WS19FTkQoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKICAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKICAgICB7CkBAIC0yOTI2LDcgKzI5MjYsNyBAQAogfQogCiB2b2lkIENGWF9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkKIHsKICAgICBFbXB0eSgpOwogICAgIERvSW5zZXJ0VGV4dChDUFZUX1dvcmRQbGFjZSgwLDAsLTEpLCB0ZXh0LCBjaGFyc2V0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpOwpAQCAtMjkzNiw5ICsyOTM2LDkgQEAKICAgICAvL2lmIChiQWRkVW5kbykKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKK2Jvb2wgQ0ZYX0VkaXQ6Okluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCiB7Ci0gICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMjk2MCwxNyArMjk2MCwxNyBAQAogICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCiAgICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFdvcmQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQorYm9vbCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQogewotICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKQEAgLTI5OTgsMTggKzI5OTgsMTggQEAKICAgICAgICAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQogICAgICAgICAgICAgICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRSZXR1cm4obV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQorYm9vbCBDRlhfRWRpdDo6QmFja3NwYWNlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKLSAgICAgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247CiAgICAgICAgIENQVlRfV29yZCB3b3JkOwpAQCAtMzA2MiwxOCArMzA2MiwxOCBAQAogICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCiAgICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5PbkJhY2tTcGFjZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpEZWxldGUoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCitib29sIENGWF9FZGl0OjpEZWxldGUoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewotICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOwogICAgICAgICBDUFZUX1dvcmQgd29yZDsKQEAgLTMwODksNyArMzA4OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0gICAgICAgIEZYX0JPT0wgYlNlY0VuZCA9IChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgICAgYm9vbCBiU2VjRW5kID0gKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwogCiAgICAgICAgIFNldENhcmV0KG1fcFZULT5EZWxldGVXb3JkKG1fd3BDYXJldCkpOwogICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsbV93cENhcmV0KTsKQEAgLTMxMjYsMjYgKzMxMjYsMjYgQEAKICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCiAgICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uRGVsZXRlKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6RW1wdHkoKQorYm9vbCBDRlhfRWRpdDo6RW1wdHkoKQogewogICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQogICAgIHsKICAgICAgICAgbV9wVlQtPkRlbGV0ZVdvcmRzKEdldFdob2xlV29yZFJhbmdlKCkpOwogICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQorYm9vbCBDRlhfRWRpdDo6Q2xlYXIoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpCiB7CiAgICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCiAgICAgewpAQCAtMzE4NCw4ICszMTg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIob2xkcGxhY2UsVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIocGxhY2UsVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIob2xkcGxhY2UsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIocGxhY2UsdHJ1ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQ2xlYXJSaWNoKHRoaXMsb2xkcGxhY2UscGxhY2UscmFuZ2Usd29yZGluZm8uV29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5uQ2hhcnNldCxzZWNpbmZvLlNlY1Byb3BzLHdvcmRpbmZvLldvcmRQcm9wcykpOwpAQCAtMzIyMCwxNyArMzIyMCwxNyBAQAogICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCiAgICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5PbkNsZWFyKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKK2Jvb2wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkKIHsKLSAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIEZBTFNFOworICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gZmFsc2U7CiAKICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CiAgICAgU2V0Q2FyZXQoRG9JbnNlcnRUZXh0KG1fd3BDYXJldCwgdGV4dCwgY2hhcnNldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzKSk7CkBAIC0zMjQ5LDkgKzMyNDksOSBAQAogICAgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKICAgICAgICAgICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRUZXh0KG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OlBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3KQpAQCAtMzI3MiwzMiArMzI3MiwzMiBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6UmVkbygpCitib29sIENGWF9FZGl0OjpSZWRvKCkKIHsKICAgICBpZiAobV9iRW5hYmxlVW5kbykKICAgICB7CiAgICAgICAgIGlmIChtX1VuZG8uQ2FuUmVkbygpKQogICAgICAgICB7CiAgICAgICAgICAgICBtX1VuZG8uUmVkbygpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlVuZG8oKQorYm9vbCBDRlhfRWRpdDo6VW5kbygpCiB7CiAgICAgaWYgKG1fYkVuYWJsZVVuZG8pCiAgICAgewogICAgICAgICBpZiAobV9VbmRvLkNhblVuZG8oKSkKICAgICAgICAgewogICAgICAgICAgICAgbV9VbmRvLlVuZG8oKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENGWF9FZGl0OjpTZXRDYXJldE9yaWdpbigpCkBAIC0zMzM5LDcgKzMzMzksNyBAQAogICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJc1RleHRGdWxsKCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdAogewogICAgIGludDMyX3QgblRvdGFsV29yZHMgPSBtX3BWVC0+R2V0VG90YWxXb3JkcygpOwogICAgIGludDMyX3QgbkxpbWl0Q2hhciA9IG1fcFZULT5HZXRMaW1pdENoYXIoKTsKQEAgLTMzNDksNyArMzM0OSw3IEBACiAgICAgICAgIHx8IChuQ2hhckFycmF5PjAgJiYgblRvdGFsV29yZHMgPj0gbkNoYXJBcnJheSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OklzVGV4dE92ZXJmbG93KCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXQ6OklzVGV4dE92ZXJmbG93KCkgY29uc3QKIHsKICAgICBpZiAoIW1fYkVuYWJsZVNjcm9sbCAmJiAhbV9iRW5hYmxlT3ZlcmZsb3cpCiAgICAgewpAQCAtMzM1OCwxMyArMzM1OCwxMyBAQAogCiAgICAgICAgIGlmIChtX3BWVC0+SXNNdWx0aUxpbmUoKSAmJiBHZXRUb3RhbExpbmVzKCkgPiAxKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5IZWlnaHQoKSxyY1BsYXRlLkhlaWdodCgpKSkgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5IZWlnaHQoKSxyY1BsYXRlLkhlaWdodCgpKSkgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLHJjUGxhdGUuV2lkdGgoKSkpIHJldHVybiBUUlVFOworICAgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLHJjUGxhdGUuV2lkdGgoKSkpIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIENQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdApAQCAtMzM4Nyw1MiArMzM4Nyw1MiBAQAogICAgIHJldHVybiBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHBsYWNlKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6Q2FuVW5kbygpIGNvbnN0Citib29sIENGWF9FZGl0OjpDYW5VbmRvKCkgY29uc3QKIHsKICAgICBpZiAobV9iRW5hYmxlVW5kbykKICAgICB7CiAgICAgICAgIHJldHVybiBtX1VuZG8uQ2FuVW5kbygpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkNhblJlZG8oKSBjb25zdAorYm9vbCBDRlhfRWRpdDo6Q2FuUmVkbygpIGNvbnN0CiB7CiAgICAgaWYgKG1fYkVuYWJsZVVuZG8pCiAgICAgewogICAgICAgICByZXR1cm4gbV9VbmRvLkNhblJlZG8oKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJc01vZGlmaWVkKCkgY29uc3QKK2Jvb2wgQ0ZYX0VkaXQ6OklzTW9kaWZpZWQoKSBjb25zdAogewogICAgIGlmIChtX2JFbmFibGVVbmRvKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fVW5kby5Jc01vZGlmaWVkKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6RW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKQordm9pZCBDRlhfRWRpdDo6RW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKQogewogICAgIG1fYkVuYWJsZVJlZnJlc2ggPSBiUmVmcmVzaDsKIH0KIAotdm9pZCBDRlhfRWRpdDo6RW5hYmxlVW5kbyhGWF9CT09MIGJVbmRvKQordm9pZCBDRlhfRWRpdDo6RW5hYmxlVW5kbyhib29sIGJVbmRvKQogewogICAgIG1fYkVuYWJsZVVuZG8gPSBiVW5kbzsKIH0KIAotdm9pZCBDRlhfRWRpdDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKK3ZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpCiB7CiAgICAgbV9iTm90aWZ5ID0gYk5vdGlmeTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6RW5hYmxlT3ByTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKK3ZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU9wck5vdGlmeShib29sIGJOb3RpZnkpCiB7CiAgICAgbV9iT3ByTm90aWZ5ID0gYk5vdGlmeTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2xpc3QuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAKaW5kZXggZDk0Y2MxNi4uYzg0ZGI0ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAKQEAgLTExLDggKzExLDggQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0xpc3RJdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQ0ZYX0xpc3RJdGVtOjpDRlhfTGlzdEl0ZW0oKSA6IG1fcEVkaXQoTlVMTCksCi0JbV9iU2VsZWN0ZWQoRkFMU0UpLAotCW1fYkNhcmV0KEZBTFNFKSwKKwltX2JTZWxlY3RlZChmYWxzZSksCisJbV9iQ2FyZXQoZmFsc2UpLAogCW1fcmNMaXN0SXRlbSgwLjBmLDAuMGYsMC4wZiwwLjBmKQogewogCW1fcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpOwpAQCAtNTYsMjIgKzU2LDIyIEBACiAJcmV0dXJuIG1fcmNMaXN0SXRlbTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdEl0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAorYm9vbCBDRlhfTGlzdEl0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAogewogCXJldHVybiBtX2JTZWxlY3RlZDsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCkKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRTZWxlY3QoYm9vbCBiU2VsZWN0ZWQpCiB7CiAJbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7CiB9CiAKLUZYX0JPT0wgQ0ZYX0xpc3RJdGVtOjpJc0NhcmV0KCkgY29uc3QKK2Jvb2wgQ0ZYX0xpc3RJdGVtOjpJc0NhcmV0KCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2FyZXQ7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRDYXJldChGWF9CT09MIGJDYXJldCkKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRDYXJldChib29sIGJDYXJldCkKIHsKIAltX2JDYXJldCA9IGJDYXJldDsKIH0KQEAgLTExOSw3ICsxMTksNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0xpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNGWF9MaXN0OjpDRlhfTGlzdCgpIDogbV9mRm9udFNpemUoMC4wZiksIG1fcEZvbnRNYXAoTlVMTCksIG1fYk11bHRpcGxlKEZBTFNFKQorQ0ZYX0xpc3Q6OkNGWF9MaXN0KCkgOiBtX2ZGb250U2l6ZSgwLjBmKSwgbV9wRm9udE1hcChOVUxMKSwgbV9iTXVsdGlwbGUoZmFsc2UpCiB7CiB9CiAKQEAgLTIxMSw4ICsyMTEsOCBAQAogewogCUNQREZfUG9pbnQgcHQgPSBPdXRlclRvSW5uZXIocG9pbnQpOwogCi0JRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwotCUZYX0JPT0wgYkxhc3QgPSBUUlVFOworCWJvb2wgYkZpcnN0ID0gdHJ1ZTsKKwlib29sIGJMYXN0ID0gdHJ1ZTsKIAogCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQogCXsKQEAgLTIyMiwxMiArMjIyLDEyIEBACiAKIAkJCWlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHQueSwgcmNMaXN0SXRlbS50b3ApKQogCQkJewotCQkJCWJGaXJzdCA9IEZBTFNFOworCQkJCWJGaXJzdCA9IGZhbHNlOwogCQkJfQogCiAJCQlpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihwdC55LCByY0xpc3RJdGVtLmJvdHRvbSkpCiAJCQl7Ci0JCQkJYkxhc3QgPSBGQUxTRTsKKwkJCQliTGFzdCA9IGZhbHNlOwogCQkJfQogCiAJCQlpZiAocHQueSA+PSByY0xpc3RJdGVtLnRvcCAmJiBwdC55IDwgcmNMaXN0SXRlbS5ib3R0b20pCkBAIC0zMTgsMTcgKzMxOCwxNyBAQAogCXJldHVybiBDUERGX1JlY3QoKTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdDo6SXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0Citib29sIENGWF9MaXN0OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QKIHsKIAlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCiAJewogCQlyZXR1cm4gcExpc3RJdGVtLT5Jc1NlbGVjdGVkKCk7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKQordm9pZCBDRlhfTGlzdDo6U2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKQogewogCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpCiAJewpAQCAtMzM2LDcgKzMzNiw3IEBACiAJfQogfQogCi12b2lkIENGWF9MaXN0OjpTZXRJdGVtQ2FyZXQoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJDYXJldCkKK3ZvaWQgQ0ZYX0xpc3Q6OlNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYkNhcmV0KQogewogCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpCiAJewpAQCAtMzQ0LDE3ICszNDQsMTcgQEAKIAl9CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldE11bHRpcGxlU2VsKEZYX0JPT0wgYk11bHRpcGxlKQordm9pZCBDRlhfTGlzdDo6U2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpCiB7CiAJbV9iTXVsdGlwbGUgPSBiTXVsdGlwbGU7CiB9CiAKLUZYX0JPT0wgQ0ZYX0xpc3Q6OklzTXVsdGlwbGVTZWwoKSBjb25zdAorYm9vbCBDRlhfTGlzdDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0CiB7CiAJcmV0dXJuIG1fYk11bHRpcGxlOwogfQogCi1GWF9CT09MIENGWF9MaXN0OjpJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKK2Jvb2wgQ0ZYX0xpc3Q6OklzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAogewogCXJldHVybiBuSXRlbUluZGV4ID49IDAgJiYgbkl0ZW1JbmRleCA8IG1fYUxpc3RJdGVtcy5HZXRTaXplKCk7CiB9CkBAIC00NDYsNyArNDQ2LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLUZYX0JPT0wgQ1BMU1RfU2VsZWN0OjpJc0V4aXN0KGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKK2Jvb2wgQ1BMU1RfU2VsZWN0OjpJc0V4aXN0KGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKIHsKIAlyZXR1cm4gRmluZChuSXRlbUluZGV4KSA+PSAwOwogfQpAQCAtNTA3LDExICs1MDcsMTEgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdEN0cmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIENGWF9MaXN0Q3RybDo6Q0ZYX0xpc3RDdHJsKCkgOiBtX3BOb3RpZnkoTlVMTCksCi0JbV9iTm90aWZ5RmxhZyhGQUxTRSksCisJbV9iTm90aWZ5RmxhZyhmYWxzZSksCiAJbV9wdFNjcm9sbFBvcygwLjBmLDAuMGYpLAogCW1fblNlbEl0ZW0oLTEpLAogCW1fbkZvb3RJbmRleCgtMSksCi0JbV9iQ3RybFNlbChGQUxTRSksCisJbV9iQ3RybFNlbChmYWxzZSksCiAJbV9uQ2FyZXRJbmRleCgtMSkKIHsKIH0KQEAgLTU1Nyw3ICs1NTcsNyBAQAogCXJldHVybiBDUERGX1JlY3QocHRMZWZ0Qm90dG9tLngscHRMZWZ0Qm90dG9tLnkscHRSaWdodFRvcC54LHB0UmlnaHRUb3AueSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKIAlpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7CiAKQEAgLTU2OSwxMyArNTY5LDEzIEBACiAJCQl7CiAJCQkJbV9hU2VsSXRlbXMuU3ViKG5IaXRJbmRleCk7CiAJCQkJU2VsZWN0SXRlbXMoKTsKLQkJCQltX2JDdHJsU2VsID0gRkFMU0U7CisJCQkJbV9iQ3RybFNlbCA9IGZhbHNlOwogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCW1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOwogCQkJCVNlbGVjdEl0ZW1zKCk7Ci0JCQkJbV9iQ3RybFNlbCA9IFRSVUU7CisJCQkJbV9iQ3RybFNlbCA9IHRydWU7CiAJCQl9CiAKIAkJCW1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKQEAgLTYwNiw3ICs2MDYsNyBAQAogCQlTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKIAlpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7CiAKQEAgLTYzOSw3ICs2MzksNyBAQAogCQlTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLKGludDMyX3Qgbkl0ZW1JbmRleCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVksoaW50MzJfdCBuSXRlbUluZGV4LGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJaWYgKElzTXVsdGlwbGVTZWwoKSkKIAl7CkBAIC02NzQsMzcgKzY3NCwzNyBAQAogCQlTY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfVVAoYm9vbCBiU2hpZnQsYm9vbCBiQ3RybCkKIHsKIAlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCktMSA6IEdldFNlbGVjdCgpLTEsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19ET1dOKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJT25WSyhJc011bHRpcGxlU2VsKCkgPyBHZXRDYXJldCgpKzEgOiBHZXRTZWxlY3QoKSsxLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfTEVGVChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCU9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19SSUdIVChib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCU9uVksoR2V0Q291bnQoKS0xLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfSE9NRShib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCU9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfRU5EKGJvb2wgYlNoaWZ0LGJvb2wgYkN0cmwpCiB7CiAJT25WSyhHZXRDb3VudCgpLTEsIGJTaGlmdCwgYkN0cmwpOwogfQogCi1GWF9CT09MCUNGWF9MaXN0Q3RybDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKK2Jvb2wJQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhcixib29sIGJTaGlmdCxib29sIGJDdHJsKQogewogCWludDMyX3QgbkluZGV4ID0gR2V0TGFzdFNlbGVjdGVkKCk7CiAJaW50MzJfdCBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LG5DaGFyKTsKQEAgLTcxMiw5ICs3MTIsOSBAQAogCWlmIChuRmluZEluZGV4ICE9IG5JbmRleCkKIAl7CiAJCU9uVksobkZpbmRJbmRleCwgYlNoaWZ0LCBiQ3RybCk7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogLyogLS0tLS0tLS0gaW5uZXIgbWV0aG9kcyAtLS0tLS0tICovCkBAIC03MzksNyArNzM5LDcgQEAKIAlSZUFycmFuZ2UoR2V0Q291bnQoKSAtIDEpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0TXVsdGlwbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKQogewogCWlmICghSXNWYWxpZChuSXRlbUluZGV4KSkgcmV0dXJuOwogCkBAIC03NDcsMTIgKzc0NywxMiBAQAogCXsKIAkJaWYgKGJTZWxlY3RlZCkKIAkJewotCQkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LFRSVUUpOworCQkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LHRydWUpOwogCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsRkFMU0UpOworCQkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LGZhbHNlKTsKIAkJCUludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwogCQl9CiAJfQpAQCAtNzY2LDExICs3NjYsMTEgQEAKIAl7CiAJCWlmIChtX25TZWxJdGVtID49IDApCiAJCXsKLQkJCVNldEl0ZW1TZWxlY3QobV9uU2VsSXRlbSxGQUxTRSk7CisJCQlTZXRJdGVtU2VsZWN0KG1fblNlbEl0ZW0sZmFsc2UpOwogCQkJSW52YWxpZGF0ZUl0ZW0obV9uU2VsSXRlbSk7CiAJCX0KIAotCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsVFJVRSk7CisJCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCx0cnVlKTsKIAkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CiAJCW1fblNlbEl0ZW0gPSBuSXRlbUluZGV4OwogCX0KQEAgLTc4OCw4ICs3ODgsOCBAQAogCQl7CiAJCQltX25DYXJldEluZGV4ID0gbkl0ZW1JbmRleDsKIAotCQkJU2V0SXRlbUNhcmV0KG5PbGRJbmRleCwgRkFMU0UpOwotCQkJU2V0SXRlbUNhcmV0KG5JdGVtSW5kZXgsVFJVRSk7CisJCQlTZXRJdGVtQ2FyZXQobk9sZEluZGV4LCBmYWxzZSk7CisJCQlTZXRJdGVtQ2FyZXQobkl0ZW1JbmRleCx0cnVlKTsKIAogCQkJSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKIAkJCUludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwpAQCAtODA1LDE3ICs4MDUsMTcgQEAKIAkJewogCQkJaWYgKCFtX2JOb3RpZnlGbGFnKQogCQkJewotCQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOworCQkJCW1fYk5vdGlmeUZsYWcgPSB0cnVlOwogCQkJCUNQREZfUmVjdCByY1JlZnJlc2ggPSBHZXRQbGF0ZVJlY3QoKTsKIAkJCQltX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKwkJCQltX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAJCQl9CiAJCX0KIAkJZWxzZQogCQl7CiAJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCiAJCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisJCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAJCQkJQ1BERl9SZWN0IHJjUmVmcmVzaCA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwogCQkJCXJjUmVmcmVzaC5sZWZ0IC09IDEuMGY7CiAJCQkJcmNSZWZyZXNoLnJpZ2h0ICs9IDEuMGY7CkBAIC04MjMsNyArODIzLDcgQEAKIAkJCQlyY1JlZnJlc2gudG9wICs9IDEuMGY7CiAKIAkJCQltX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKwkJCQltX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAJCQl9CiAJCX0KIAl9CkBAIC04MzksMTAgKzgzOSwxMCBAQAogCQlzd2l0Y2goblN0YXRlKQogCQl7CiAJCWNhc2UgMToKLQkJCVNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIFRSVUUpOworCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgdHJ1ZSk7CiAJCQlicmVhazsKIAkJY2FzZSAtMToKLQkJCVNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIEZBTFNFKTsKKwkJCVNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIGZhbHNlKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtODYzLDcgKzg2Myw3IEBACiAJCVNldFNpbmdsZVNlbGVjdChuSXRlbUluZGV4KTsKIH0KIAotRlhfQk9PTAlDRlhfTGlzdEN0cmw6OklzSXRlbVZpc2libGUoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAorYm9vbAlDRlhfTGlzdEN0cmw6OklzSXRlbVZpc2libGUoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAogewogCUNQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CiAJQ1BERl9SZWN0IHJjSXRlbSA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwpAQCAtOTA0LDEwICs5MDQsMTAgQEAKIAogCQlpZiAoIW1fYk5vdGlmeUZsYWcpCiAJCXsKLQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOworCQkJbV9iTm90aWZ5RmxhZyA9IHRydWU7CiAJCQltX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9ZKHJjUGxhdGUuYm90dG9tLCByY1BsYXRlLnRvcCwKIAkJCQkJcmNDb250ZW50LmJvdHRvbSwgcmNDb250ZW50LnRvcCwgR2V0Rmlyc3RIZWlnaHQoKSwgcmNQbGF0ZS5IZWlnaHQoKSk7Ci0JCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7CisJCQltX2JOb3RpZnlGbGFnID0gZmFsc2U7CiAJCX0KIAl9CiB9CkBAIC05NDcsOSArOTQ3LDkgQEAKIAkJewogCQkJaWYgKCFtX2JOb3RpZnlGbGFnKQogCQkJewotCQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOworCQkJCW1fYk5vdGlmeUZsYWcgPSB0cnVlOwogCQkJCW1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworCQkJCW1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcCBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcAppbmRleCAxYzAyNjliLi4wNDgwOWE0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9wYWdlb2Jqcy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwCkBAIC0xMzIsOSArMTMyLDkgQEAKIAkJCQkJCWNvbnN0IENQREZfUmVjdCYgcmNDbGlwLCBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLCB2b2lkKiBwRkZMRGF0YSkKIHsKIAotCUZYX0JPT0wgYkNvbnRpbnVvdXMgPSBwRWRpdC0+R2V0Q2hhckFycmF5KCkgPT0gMDsKKwlib29sIGJDb250aW51b3VzID0gcEVkaXQtPkdldENoYXJBcnJheSgpID09IDA7CiAJaWYgKHBFZGl0LT5HZXRDaGFyU3BhY2UoKSA+IDAuMGYpCi0JCWJDb250aW51b3VzID0gRkFMU0U7CisJCWJDb250aW51b3VzID0gZmFsc2U7CiAKIAlGWF9XT1JEIFN1YldvcmQgPSBwRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCk7CiAJRlhfRkxPQVQgZkZvbnRTaXplID0gcEVkaXQtPkdldEZvbnRTaXplKCk7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlGWF9DT0xPUlJFRiBjckN1ckZpbGwgPSBjclRleHRGaWxsOwogCUZYX0NPTE9SUkVGIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKIAotCUZYX0JPT0wgYlNlbGVjdCA9IEZBTFNFOworCWJvb2wgYlNlbGVjdCA9IGZhbHNlOwogCWNvbnN0IEZYX0NPTE9SUkVGIGNyV2hpdGUgPSBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSk7CiAJY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LDAsNTEsMTEzKTsKIApAQCAtMjc4LDcgKzI3OCw3IEBACiAKIAlGWF9DT0xPUlJFRiBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgMCwwLDApOwogCUZYX0NPTE9SUkVGIGNyT2xkID0gY3JDdXJUZXh0OwotCUZYX0JPT0wgYlNlbGVjdCA9IEZBTFNFOworCWJvb2wgYlNlbGVjdCA9IGZhbHNlOwogCWNvbnN0IEZYX0NPTE9SUkVGIGNyV2hpdGUgPSBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSk7CiAJY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LDAsNTEsMTEzKTsKIApAQCAtNDEwLDcgKzQxMCw3IEBACiAJcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQiksIHJnYiwgMyk7CiAKIAlwUGF0aE9iai0+bV9GaWxsVHlwZSA9IEZYRklMTF9BTFRFUk5BVEU7Ci0JcFBhdGhPYmotPm1fYlN0cm9rZSA9IEZBTFNFOworCXBQYXRoT2JqLT5tX2JTdHJva2UgPSBmYWxzZTsKIAogCXBQYWdlT2Jqcy0+SW5zZXJ0T2JqZWN0KHBQYWdlT2Jqcy0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCkscFBhdGhPYmopOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0RvY3VtZW50LmNwcAppbmRleCBmYzQ1M2IwLi45MTZhZjZlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0RvY3VtZW50LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0RvY3VtZW50LmNwcApAQCAtNDUsMTQgKzQ1LDE0IEBACiBQcmludFBhcmFtc09iajo6UHJpbnRQYXJhbXNPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KQogOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KQogewotICAgIGJVSSA9IFRSVUU7CisgICAgYlVJID0gdHJ1ZTsKICAgICBuU3RhcnQgPSAwOwogICAgIG5FbmQgPSAwOwotICAgIGJTaWxlbnQgPSBGQUxTRTsKLSAgICBiU2hyaW5rVG9GaXQgPSBGQUxTRTsKLSAgICBiUHJpbnRBc0ltYWdlID0gRkFMU0U7Ci0gICAgYlJldmVyc2UgPSBGQUxTRTsKLSAgICBiQW5ub3RhdGlvbnMgPSBUUlVFOworICAgIGJTaWxlbnQgPSBmYWxzZTsKKyAgICBiU2hyaW5rVG9GaXQgPSBmYWxzZTsKKyAgICBiUHJpbnRBc0ltYWdlID0gZmFsc2U7CisgICAgYlJldmVyc2UgPSBmYWxzZTsKKyAgICBiQW5ub3RhdGlvbnMgPSB0cnVlOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0Miw3ICsxNDIsNyBAQAogCiBJTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0RvY3VtZW50LCBEb2N1bWVudCkKIAotRlhfQk9PTCBDSlNfRG9jdW1lbnQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKK2Jvb2wgQ0pTX0RvY3VtZW50OjpJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogICAgIHBEb2MtPkF0dGFjaERvYyhwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7CiAgICAgcERvYy0+U2V0SXNvbGF0ZShwQ29udGV4dC0+R2V0SlNSdW50aW1lKCktPkdldElzb2xhdGUoKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRG9jdW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICBtX3BJY29uVHJlZShOVUxMKSwKICAgICBtX3BEb2N1bWVudChOVUxMKSwKICAgICBtX2N3QmFzZVVSTChMIiIpLAotICAgIG1fYkRlbGF5KEZBTFNFKQorICAgIG1fYkRlbGF5KGZhbHNlKQogewogfQogCkBAIC0xOTAsMjAgKzE5MCwyMCBAQAogfQogCiAvL3RoZSB0b3RhbCBudW1iZXIgb2YgZmlsZWRzIGluIGRvY3VtZW50LgotRlhfQk9PTCBEb2N1bWVudDo6bnVtRmllbGRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Om51bUZpZWxkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKSB7CiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIENQREZTREtfSW50ZXJGb3JtICpwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgIENQREZfSW50ZXJGb3JtICpwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogICAgIHZwIDw8IChpbnQpcFBERkZvcm0tPkNvdW50RmllbGRzKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmRpcnR5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmRpcnR5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTIyNiwxMCArMjI2LDEwIEBACiAgICAgICAgICAgICBtX3BEb2N1bWVudC0+Q2xlYXJDaGFuZ2VNYXJrKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OkFEQkUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6QURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0yNDEsMTAgKzI0MSwxMCBAQAogICAgIHsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6cGFnZU51bShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTI3Niw1NSArMjc2LDU1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6UGFyc2VyUGFyYW1zKEpTT2JqZWN0KiBwT2JqLENKU19Bbm5vdE9iaiYgYW5ub3RvYmopCitib29sIERvY3VtZW50OjpQYXJzZXJQYXJhbXMoSlNPYmplY3QqIHBPYmosQ0pTX0Fubm90T2JqJiBhbm5vdG9iaikKIHsKICAgICAvLyBOb3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjphZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6YWRkQW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBOb3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjphZGRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6YWRkRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBOb3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpleHBvcnRBc1RleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmV4cG9ydEFzVGV4dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmV4cG9ydEFzRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpleHBvcnRBc1hGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmV4cG9ydEFzWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy9NYXBzIGEgZmllbGQgb2JqZWN0IGluIFBERiBkb2N1bWVudCB0byBhIEphdmFTY3JpcHQgdmFyaWFibGUKIC8vY29tbWVudDoKIC8vbm90ZTogdGhlIHBhcmVtdGVyIGNOYW1lLCB0aGlzIGlzIGNsdWUgaG93IHRvIHRyZWF0IGlmIHRoZSBjTmFtZSBpcyBub3QgYSB2YWxpYWJsZSBmaWxlZCBuYW1lIGluIHRoaXMgZG9jdW1lbnQKIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0RmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSA8IDEpIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZU5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CkBAIC0zMzQsNyArMzM0LDcgQEAKICAgICBpZiAocFBERkZvcm0tPkNvdW50RmllbGRzKHdpZGVOYW1lKSA8PSAwKQogICAgIHsKICAgICAgICAgdlJldC5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CkBAIC0zNDYsNjYgKzM0Niw2NiBAQAogICAgIHBGaWVsZC0+QXR0YWNoRmllbGQodGhpcywgd2lkZU5hbWUpOwogCiAgICAgdlJldCA9IHBKU0ZpZWxkOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvL0dldHMgdGhlIG5hbWUgb2YgdGhlIG50aCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldE50aEZpZWxkTmFtZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGludCBuSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICBpZiAobkluZGV4IDwgMCkgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1ZBTFVFRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKG5JbmRleCk7CiAgICAgaWYgKCFwRmllbGQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgdlJldCA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKS5jX3N0cigpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjppbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aW1wb3J0QW5GREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmltcG9ydEFuWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjppbXBvcnRUZXh0RGF0YShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aW1wb3J0VGV4dERhdGEoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vZXhwb3J0cyB0aGUgZm9ybSBkYXRhIGFuZCBtYWlscyB0aGUgcmVzdWx0aW5nIGZkZiBmaWxlIGFzIGFuIGF0dGFjaG1lbnQgdG8gYWxsIHJlY2lwaWVudHMuCiAvL2NvbW1lbnQ6IG5lZWQgcmVhZGVyIHN1cHBvcnRzCiAvL25vdGU6Ci0vL2ludCBDUERGU0RLX0RvY3VtZW50OjptYWlsRm9ybShGWF9CT09MIGJVSSxTdHJpbmcgY3RvLHN0cmluZyBjY2Msc3RyaW5nIGNiY2Msc3RyaW5nIGNTdWJqZWN0LHN0cmluZyBjbXMpOworLy9pbnQgQ1BERlNES19Eb2N1bWVudDo6bWFpbEZvcm0oYm9vbCBiVUksU3RyaW5nIGN0byxzdHJpbmcgY2NjLHN0cmluZyBjYmNjLHN0cmluZyBjU3ViamVjdCxzdHJpbmcgY21zKTsKIAotRlhfQk9PTCBEb2N1bWVudDo6bWFpbEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Om1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gZmFsc2U7CiAKICAgICBpbnQgaUxlbmd0aCA9IHBhcmFtcy5zaXplKCk7CiAKLSAgICBGWF9CT09MIGJVSSA9IGlMZW5ndGggPiAwID8gcGFyYW1zWzBdLlRvQm9vbCgpIDogVFJVRTsKKyAgICBib29sIGJVSSA9IGlMZW5ndGggPiAwID8gcGFyYW1zWzBdLlRvQm9vbCgpIDogdHJ1ZTsKICAgICBDRlhfV2lkZVN0cmluZyBjVG8gPSBpTGVuZ3RoID4gMSA/IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKICAgICBDRlhfV2lkZVN0cmluZyBjQ2MgPSBpTGVuZ3RoID4gMiA/IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKICAgICBDRlhfV2lkZVN0cmluZyBjQmNjID0gaUxlbmd0aCA+IDMgPyBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7CkBAIC00MTcsNyArNDE3LDcgQEAKIAogICAgIENGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOwogICAgIGlmICghcEludGVyRm9ybS0+RXhwb3J0Rm9ybVRvRkRGVGV4dEJ1Zih0ZXh0QnVmKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTQyOSwyNCArNDI5LDI0IEBACiAgICAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKICAgICBwRW52LT5KU19kb2NtYWlsRm9ybSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldExlbmd0aCgpLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOwogICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpwcmludChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CiAgICAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwogCi0gICAgRlhfQk9PTCBiVUkgPSBUUlVFOworICAgIGJvb2wgYlVJID0gdHJ1ZTsKICAgICBpbnQgblN0YXJ0ID0gMDsKICAgICBpbnQgbkVuZCA9IDA7Ci0gICAgRlhfQk9PTCBiU2lsZW50ID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiU2hyaW5rVG9GaXQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJSZXZlcnNlID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiQW5ub3RhdGlvbnMgPSBGQUxTRTsKKyAgICBib29sIGJTaWxlbnQgPSBmYWxzZTsKKyAgICBib29sIGJTaHJpbmtUb0ZpdCA9IGZhbHNlOworICAgIGJvb2wgYlByaW50QXNJbWFnZSA9IGZhbHNlOworICAgIGJvb2wgYlJldmVyc2UgPSBmYWxzZTsKKyAgICBib29sIGJBbm5vdGF0aW9ucyA9IGZhbHNlOwogCiAgICAgaW50IG5sZW5ndGggPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmKG5sZW5ndGggPT05KQpAQCAtNTAwLDI2ICs1MDAsMjYgQEAKICAgICBpZiAoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKSkKICAgICB7CiAgICAgICAgIHBFbnYtPkpTX2RvY3ByaW50KGJVSSwgblN0YXJ0LCBuRW5kLCBiU2lsZW50LCBiU2hyaW5rVG9GaXQsIGJQcmludEFzSW1hZ2UsIGJSZXZlcnNlLCBiQW5ub3RhdGlvbnMpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIC8vcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGZpZWxkIGZyb20gdGhlIGRvY3VtZW50LgogLy9jb21tZW50OgogLy9ub3RlOiBpZiB0aGUgZmlsZWQgbmFtZSBpcyBub3QgcmV0aW9uYWwsIGFkb2JlIGlzIGR1bWIgZm9yIGl0LgogCi1GWF9CT09MIERvY3VtZW50OjpyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6cmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAoIShtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSB8fAotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSkpIHJldHVybiBmYWxzZTsKIAogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRmllbGROYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwpAQCAtNTU4LDIwICs1NTgsMjAgQEAKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy9yZXNldCBmaWxlZCB2YWx1ZXMgd2l0aGluIGEgZG9jdW1lbnQuCiAvL2NvbW1lbnQ6CiAvL25vdGU6IGlmIHRoZSBmaWVsZHMgbmFtZXMgciBub3QgcmF0aW9uYWwsIGFvZGJlIGlzIGR1bWIgZm9yIGl0LgogCi1GWF9CT09MIERvY3VtZW50OjpyZXNldEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OnJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8CiAgICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0ZJTExfRk9STSkpKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwpAQCAtNjEwLDQyICs2MTAsNDIgQEAKIAogICAgICAgICBpZiAoYUZpZWxkcy5HZXRTaXplKCkgPiAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBwUERGRm9ybS0+UmVzZXRGb3JtKGFGaWVsZHMsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgcFBERkZvcm0tPlJlc2V0Rm9ybShhRmllbGRzLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBwUERGRm9ybS0+UmVzZXRGb3JtKFRSVUUpOworICAgICAgICBwUERGRm9ybS0+UmVzZXRGb3JtKHRydWUpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogCiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIAotRlhfQk9PTCBEb2N1bWVudDo6c2F2ZUFzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIAotRlhfQk9PTCBEb2N1bWVudDo6c3VibWl0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6c3VibWl0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIGludCBuU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAgICAgaWYgKG5TaXplIDwgMSkgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzdHJVUkw7Ci0gICAgRlhfQk9PTCBiRkRGID0gVFJVRTsKLSAgICBGWF9CT09MIGJFbXB0eSA9IEZBTFNFOworICAgIGJvb2wgYkZERiA9IHRydWU7CisgICAgYm9vbCBiRW1wdHkgPSBmYWxzZTsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogICAgIENKU19BcnJheSBhRmllbGRzKGlzb2xhdGUpOwogCkBAIC02NzcsMTYgKzY3NywxNiBAQAogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogICAgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgRlhfQk9PTCBiQWxsID0gKGFGaWVsZHMuR2V0TGVuZ3RoKCkgPT0gMCk7CisgICAgYm9vbCBiQWxsID0gKGFGaWVsZHMuR2V0TGVuZ3RoKCkgPT0gMCk7CiAgICAgaWYgKGJBbGwgJiYgYkVtcHR5KQogICAgIHsKICAgICAgICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoKSkKICAgICAgICAgewogICAgICAgICAgICAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKLSAgICAgICAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZvcm0oc3RyVVJMLCBGQUxTRSk7CisgICAgICAgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGb3JtKHN0clVSTCwgZmFsc2UpOwogICAgICAgICAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENGWF9QdHJBcnJheSBmaWVsZE9iamVjdHM7CkBAIC03MDcsMTMgKzcwNywxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgVFJVRSkpCisgICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgdHJ1ZSkpCiAgICAgewogICAgICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGaWVsZHMoc3RyVVJMLCBmaWVsZE9iamVjdHMsIFRSVUUsICFiRkRGKTsKKyAgICAgICAgcEludGVyRm9ybS0+U3VibWl0RmllbGRzKHN0clVSTCwgZmllbGRPYmplY3RzLCB0cnVlLCAhYkZERik7CiAgICAgICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNzI4LDI2ICs3MjgsMjYgQEAKICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OkV4dHJhY3RGaWxlTmFtZShDUERGU0RLX0RvY3VtZW50ICpwRG9jLENGWF9CeXRlU3RyaW5nICZzdHJGaWxlTmFtZSkKK2Jvb2wgRG9jdW1lbnQ6OkV4dHJhY3RGaWxlTmFtZShDUERGU0RLX0RvY3VtZW50ICpwRG9jLENGWF9CeXRlU3RyaW5nICZzdHJGaWxlTmFtZSkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpFeHRyYWN0Rm9sZGVyTmFtZShDUERGU0RLX0RvY3VtZW50ICpwRG9jLENGWF9CeXRlU3RyaW5nICZzdHJGb2xkZXJOYW1lKQorYm9vbCBEb2N1bWVudDo6RXh0cmFjdEZvbGRlck5hbWUoQ1BERlNES19Eb2N1bWVudCAqcERvYyxDRlhfQnl0ZVN0cmluZyAmc3RyRm9sZGVyTmFtZSkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojpib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Ym9va21hcmtSb290KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6bWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIEZYX0JPT0wgYlVJID0gVFJVRTsKKyAgICBib29sIGJVSSA9IHRydWU7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY1RvID0gTCIiOwogICAgIENGWF9XaWRlU3RyaW5nIGNDYyA9IEwiIjsKICAgICBDRlhfV2lkZVN0cmluZyBjQmNjID0gTCIiOwpAQCAtODAzLDQwICs4MDMsNDAgQEAKICAgICBwRW52LT5KU19kb2NtYWlsRm9ybShOVUxMLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOwogICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmF1dGhvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjphdXRob3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwotICAgIGlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOworICAgIGlmICghcERpY3Rpb25hcnkpcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKICAgICAgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0F1dGhvcjsKICAgICAgICAgdnAgPj4gY3NBdXRob3I7CiAgICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQXV0aG9yIiwgUERGX0VuY29kZVRleHQoY3NBdXRob3IpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6aW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjppbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKICAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9XaWRlU3RyaW5nIGN3QXV0aG9yICAgICAgICAgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIkF1dGhvciIpOwogICAgIENGWF9XaWRlU3RyaW5nIGN3VGl0bGUgICAgICAgICAgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlRpdGxlIik7CkBAIC04ODAsMTQgKzg4MCwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHZwIDw8IHBPYmo7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpjcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Y3JlYXRpb25EYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKICAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkKICAgICB7CkBAIC04OTYsMjEgKzg5NiwyMSBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NDcmVhdGlvbkRhdGU7CiAgICAgICAgIHZwID4+IGNzQ3JlYXRpb25EYXRlOwogICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIkNyZWF0aW9uRGF0ZSIsIFBERl9FbmNvZGVUZXh0KGNzQ3JlYXRpb25EYXRlKSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpjcmVhdG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTkxOSwxNyArOTE5LDE3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0NyZWF0b3I7CiAgICAgICAgIHZwID4+IGNzQ3JlYXRvcjsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJDcmVhdG9yIiwgUERGX0VuY29kZVRleHQoY3NDcmVhdG9yKSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTkzOCw3ICs5MzgsNyBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiOwogICAgICAgICB2cCA+PiBiOwpAQCAtOTcxLDE0ICs5NzEsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6a2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6a2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwogICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTk4NywyMSArOTg3LDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0tleXdvcmRzOwogICAgICAgICB2cCA+PiBjc0tleXdvcmRzOwogICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIktleXdvcmRzIiwgUERGX0VuY29kZVRleHQoY3NLZXl3b3JkcykpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bW9kRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojptb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKICAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkKICAgICB7CkBAIC0xMDEwLDIxICsxMDEwLDIxIEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfV2lkZVN0cmluZyBjc21vZERhdGU7CiAgICAgICAgIHZwID4+IGNzbW9kRGF0ZTsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJNb2REYXRlIiwgUERGX0VuY29kZVRleHQoY3Ntb2REYXRlKSk7CiAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojpwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojpwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTAzMywyMSArMTAzMywyMSBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3Nwcm9kdWNlcjsKICAgICAgICAgdnAgPj4gY3Nwcm9kdWNlcjsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJQcm9kdWNlciIsIFBERl9FbmNvZGVUZXh0KGNzcHJvZHVjZXIpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6c3ViamVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTA1NiwyNCArMTA1NiwyNCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NzdWJqZWN0OwogICAgICAgICB2cCA+PiBjc3N1YmplY3Q7CiAgICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiU3ViamVjdCIsIFBERl9FbmNvZGVUZXh0KGNzc3ViamVjdCkpOwogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMIHx8IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CiAgICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNHZXR0aW5nKCkpCiAgICAgewpAQCAtMTA4Miw1OCArMTA4Miw1OCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3N0aXRsZTsKICAgICAgICAgdnAgPj4gY3N0aXRsZTsKICAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJUaXRsZSIsIFBERl9FbmNvZGVUZXh0KGNzdGl0bGUpKTsKICAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdnAgPDwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgLy9JbiBDaHJvbWUgY2FzZSxzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgogICAgIGlmICh2cC5Jc0dldHRpbmcoKSkgewotICAgICAgICB2cCA8PCBUUlVFOworICAgICAgICB2cCA8PCB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewogICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2cCA8PCAwOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojptb3VzZVgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6bW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Om1vdXNlWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmJhc2VVUkwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6YmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKQEAgLTExNDMsMTAgKzExNDMsMTAgQEAKICAgICB7CiAgICAgICAgIHZwID4+IG1fY3dCYXNlVVJMOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0xMTY4LDE1ICsxMTY4LDE1IEBACiAgICAgICAgIHBJbnRlckZvcm0tPkVuYWJsZUNhbGN1bGF0ZShiQ2FsY3VsYXRlKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50Ojpkb2N1bWVudEZpbGVOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7CiAgICAgaW50MzJfdCBpID0gd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDE7CkBAIC0xMTkxLDcgKzExOTEsNyBAQAogICAgIH1lbHNlewogICAgICAgICB2cCA8PCBMIiI7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBDRlhfV2lkZVN0cmluZyBEb2N1bWVudDo6UmV2ZXJzYWxTdHIoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKQpAQCAtMTI0MSw3NCArMTI0MSw3NCBAQAogICAgIHJldHVybiBjYlJldDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6cGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpwYXRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdnAgPDwgYXBwOjpTeXNQYXRoVG9QREZQYXRoKG1fcERvY3VtZW50LT5HZXRQYXRoKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpjbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRBbm5vdHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2UmV0LlNldE51bGwoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHZSZXQuU2V0TnVsbCgpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2UmV0ID0gVlRfdW5kZWZpbmVkOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIERvY3VtZW50OjpJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCkKQEAgLTEzNzIsMTIgKzEzNzIsMTIgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6YWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6YWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwpAQCAtMTM4NiwxMyArMTM4NiwxMyBAQAogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBKU0ljb24pICE9IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiSWNvbiIpKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQ0pTX0VtYmVkT2JqKiBwRW1iZWRPYmogPSBwYXJhbXNbMV0uVG9DSlNPYmplY3QoKS0+R2V0RW1iZWRPYmplY3QoKTsKICAgICBpZiAoIXBFbWJlZE9iaikgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1RZUEVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEljb24qIHBJY29uID0gKEljb24qKXBFbWJlZE9iajsKQEAgLTE0MDQsMjEgKzE0MDQsMjEgQEAKICAgICBwTmV3SWNvbi0+TmV4dEljb24gPSBOVUxMOwogICAgIHBOZXdJY29uLT5JY29uU3RyZWFtID0gcEljb247CiAgICAgbV9wSWNvblRyZWUtPkluc2VydEljb25FbGVtZW50KHBOZXdJY29uKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6aWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewogICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmICghbV9wSWNvblRyZWUpCiAgICAgewogICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBDSlNfQXJyYXkgSWNvbnMobV9pc29sYXRlKTsKQEAgLTE0MzMsMTMgKzE0MzMsMTMgQEAKICAgICAgICAgcEljb25FbGVtZW50ID0gKCptX3BJY29uVHJlZSlbaV07CiAKICAgICAgICAgSlNGWE9iamVjdCAgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0gICAgICAgIGlmIChwT2JqLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDSlNfSWNvbiAqIHBKU19JY29uID0gKENKU19JY29uICopSlNfR2V0UHJpdmF0ZShwT2JqKTsKLSAgICAgICAgaWYgKCFwSlNfSWNvbikgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgSWNvbiogcEljb24gPSAoSWNvbiopcEpTX0ljb24tPkdldEVtYmVkT2JqZWN0KCk7Ci0gICAgICAgIGlmICghcEljb24pcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBJY29uKXJldHVybiBmYWxzZTsKIAogICAgICAgICBwSWNvbi0+U2V0U3RyZWFtKHBJY29uRWxlbWVudC0+SWNvblN0cmVhbS0+R2V0U3RyZWFtKCkpOwogICAgICAgICBwSWNvbi0+U2V0SWNvbk5hbWUocEljb25FbGVtZW50LT5JY29uTmFtZSk7CkBAIC0xNDQ3LDE5ICsxNDQ3LDE5IEBACiAgICAgfQogCiAgICAgdnAgPDwgSWNvbnM7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmKCFtX3BJY29uVHJlZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgICBpbnQgaUljb25Db3VudHMgPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7CiAKQEAgLTE0NzIsODIgKzE0NzIsODIgQEAKICAgICAgICAgICAgIEljb24qIHBSZXRJY29uID0gKCptX3BJY29uVHJlZSlbaV0tPkljb25TdHJlYW07CiAKICAgICAgICAgICAgIEpTRlhPYmplY3QgIHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJJY29uIikpOwotICAgICAgICAgICAgaWYgKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgQ0pTX0ljb24gKiBwSlNfSWNvbiA9IChDSlNfSWNvbiAqKUpTX0dldFByaXZhdGUocE9iaik7Ci0gICAgICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIXBKU19JY29uKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIEljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOwotICAgICAgICAgICAgaWYgKCFwSWNvbilyZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIXBJY29uKXJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgcEljb24tPlNldEljb25OYW1lKHN3SWNvbk5hbWUpOwogICAgICAgICAgICAgcEljb24tPlNldFN0cmVhbShwUmV0SWNvbi0+R2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgdlJldCA9IHBKU19JY29uOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBpbXBsZW1lbnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNhbGN1bGF0ZU5vdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Y2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAgICAgcEludGVyRm9ybS0+T25DYWxjdWxhdGUoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Q29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OkNvbGxhYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IG5QYWdlTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKICAgICBpbnQgbldvcmRObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KCkgOiAwOwogICAgIGJvb2wgYlN0cmlwID0gcGFyYW1zLkdldFNpemUoKSA+IDIgPyBwYXJhbXNbMl0uVG9Cb29sKCkgOiB0cnVlOwogCiAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFwRG9jdW1lbnQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBEb2N1bWVudCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwUGFnZURpY3QpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CkBAIC0xNTg2LDIzICsxNTg2LDIzIEBACiAgICAgfQogCiAgICAgdlJldCA9IHN3UmV0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBmYWxzZTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6Z2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gZmFsc2U7CiAKICAgICBpbnQgblBhZ2VObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAwID8gcGFyYW1zWzBdLlRvSW50KCkgOiAwOwogCkBAIC0xNjEzLDExICsxNjEzLDExIEBACiAgICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwUGFnZURpY3QpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfUGFnZSBwYWdlOwogICAgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CkBAIC0xNjQyLDEwICsxNjQyLDEwIEBACiAKICAgICB2UmV0ID0gbldvcmRzOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFByaW50UGFyYW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwpAQCAtMTY1NCw3ICsxNjU0LDcgQEAKICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgogCiAgICAgdlJldCA9IHBSZXRPYmo7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKICNkZWZpbmUgSVNMQVRJTldPUkQodSkgICh1ICE9IDB4MjAgJiYgdSA8PSAweDI4RkYpCkBAIC0xNjY4LDcgKzE2NjgsNyBAQAogICAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwogICAgIGlmICghcEZvbnQpIHJldHVybiAwOwogCi0gICAgRlhfQk9PTCBiSXNMYXRpbiA9IEZBTFNFOworICAgIGJvb2wgYklzTGF0aW4gPSBmYWxzZTsKIAogICAgIGZvciAoaW50IGk9MCwgc3o9cFRleHRPYmotPkNvdW50Q2hhcnMoKTsgaTxzejsgaSsrKQogICAgIHsKQEAgLTE3MDMsNyArMTcwMyw3IEBACiAgICAgaWYgKCFwRm9udCkgcmV0dXJuIEwiIjsKIAogICAgIGludCBuV29yZHMgPSAwOwotICAgIEZYX0JPT0wgYklzTGF0aW4gPSBGQUxTRTsKKyAgICBib29sIGJJc0xhdGluID0gZmFsc2U7CiAKICAgICBmb3IgKGludCBpPTAsIHN6PXBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGk8c3o7IGkrKykKICAgICB7CkBAIC0xNzM0LDEwICsxNzM0LDEwIEBACiAgICAgcmV0dXJuIHN3UmV0OwogfQogCi1GWF9CT09MIERvY3VtZW50Ojp6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Onpvb20oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qKgpAQCAtMTc1MCwzOSArMTc1MCwzOSBAQAogKHJlZlcsICBSZWZsb3dXaWR0aCkKICovCiAKLUZYX0JPT0wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZGVsZXRlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmRlbGV0ZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm8gc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmV4dHJhY3RQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6ZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjppbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6aW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBEb2N1bWVudDo6cmVwbGFjZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRG9jdW1lbnQ6OmdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBEb2N1bWVudDo6QWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAppbmRleCA2MTQ4NDM0Li5jYTE2YzkwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRmllbGQsIEZpZWxkKQogCi1GWF9CT09MIENKU19GaWVsZDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQorYm9vbCBDSlNfRmllbGQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTEyMCwxNSArMTIwLDE1IEBACiAKICAgICBwRmllbGQtPlNldElzb2xhdGUocENvbnRleHQtPkdldEpTUnVudGltZSgpLT5HZXRJc29sYXRlKCkpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9OwogCiBGaWVsZDo6RmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCiAgICAgbV9wSlNEb2MoTlVMTCksCiAgICAgbV9wRG9jdW1lbnQoTlVMTCksCiAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCgtMSksCi0gICAgbV9iQ2FuU2V0KEZBTFNFKSwKLSAgICBtX2JEZWxheShGQUxTRSksCisgICAgbV9iQ2FuU2V0KGZhbHNlKSwKKyAgICBtX2JEZWxheShmYWxzZSksCiAgICAgbV9pc29sYXRlKE5VTEwpCiB7CiB9CkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKDAsaVN0YXJ0KTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKQorYm9vbCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgbV9wSlNEb2MgPSBwRG9jdW1lbnQ7CkBAIC0xOTQsMTcgKzE5NCwxNyBAQAogICAgICAgICBzdGQ6OndzdHJpbmcgc3RyRmllbGROYW1lOwogICAgICAgICBpbnQgaUNvbnRyb2xObyA9IC0xOwogICAgICAgICBQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKLSAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBtX0ZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZS5jX3N0cigpOwogICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIG1fRmllbGROYW1lID0gc3dGaWVsZE5hbWVUZW1wOwogICAgIG1fbkZvcm1Db250cm9sSW5kZXggPSAtMTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCkBAIC0yMzQsNyArMjM0LDcgQEAKIH0KIAogdm9pZCBGaWVsZDo6VXBkYXRlRm9ybUZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFuZ2VNYXJrLCBib29sIGJSZXNldEFQLCBib29sIGJSZWZyZXNoKQogewogICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0yNTUsMTIgKzI1NSwxMiBAQAogICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwogICAgICAgICAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBib29sIGJGb3JtYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CiAgICAgICAgICAgICAgICAgaWYgKGJGb3JtYXRlZCkKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0cy5HZXRBdChpKTsKICAgICAgICAgICAgICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIAotICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogfQogCiB2b2lkIEZpZWxkOjpVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssIGJvb2wgYlJlc2V0QVAsIGJvb2wgYlJlZnJlc2gpCiB7CiAgICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKICAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOwpAQCAtMzEyLDE2ICszMTIsMTYgQEAKICAgICAgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm9vbCBiRm9ybWF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0ZWQpOwogICAgICAgICAgICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM1MCwxNyArMzUwLDE3IEBACiAgICAgcmV0dXJuIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwogfQogCi1GWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCitib29sIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCiB7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBmb3IgKGludCBpPTAsc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspCiAgICAgewogICAgICAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX0Zvcm1Db250cm9sKiBGaWVsZDo6R2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpCkBAIC0zNzYsMTMgKzM3NiwxMyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3BlcnR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotRlhfQk9PTCBGaWVsZDo6YWxpZ25tZW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDRlhfQnl0ZVN0cmluZyBhbGlnblN0cjsKICAgICAgICAgdnAgPj4gYWxpZ25TdHI7CkBAIC00MDAsMTYgKzQwMCwxNiBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHN3aXRjaCAocEZvcm1Db250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpCiAgICAgICAgIHsKQEAgLTQyNyw3ICs0MjcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCkBAIC00MzYsMTMgKzQzNiwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Ym9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Ym9yZGVyU3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9ICIiOwogICAgICAgICB2cCA+PiBzdHJUeXBlOwpAQCAtNDYwLDEzICs0NjAsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIGlmICghcEZvcm1GaWVsZCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChtX3BEb2N1bWVudCwgR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5Cb3JkZXJzdHlsZSA9IHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCk7CiAKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEJvcmRlclN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTUyNSw3ICs1MjUsNyBAQAogCiAgICAgICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkKICAgICAgICAgewotICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJTZXQgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBEb2N1bWVudCwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCkBAIC01MzMsMTEgKzUzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpICE9IG5Cb3JkZXJTdHlsZSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyU3R5bGUobkJvcmRlclN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCB0cnVlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU1NywxMyArNTU3LDEzIEBACiAgICAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnV0dG9uQWxpZ25YKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTU4MSwxNiArNTgxLDE2IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKIApAQCAtNjAwLDcgKzYwMCw3IEBACiAgICAgICAgIHZwIDw8IChpbnQzMl90KWZMZWZ0OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25BbGlnblgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtNjA4LDEzICs2MDgsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25BbGlnblkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5WUDsKICAgICAgICAgdnAgPj4gblZQOwpAQCAtNjMyLDE2ICs2MzIsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogCkBAIC02NTEsNyArNjUxLDcgQEAKICAgICAgICAgdnAgPDwgIChpbnQzMl90KWZCb3R0b207CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC02NTksMTMgKzY1OSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmJ1dHRvbkZpdEJvdW5kcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtNjgzLDIyICs2ODMsMjIgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogICAgICAgICB2cCA8PCBJY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtNzA2LDEzICs3MDYsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTczMCwyMCArNzMwLDIwIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgdnAgPDwgIHBGb3JtQ29udHJvbC0+R2V0VGV4dFBvc2l0aW9uKCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25Qb3NpdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC03NTEsMTMgKzc1MSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IG5WUDsKICAgICAgICAgdnAgPj4gblZQOwpAQCAtNzc1LDE2ICs3NzUsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKICAgICAgICAgaWYgKEljb25GaXQuSXNQcm9wb3J0aW9uYWxTY2FsZSgpKQpAQCAtNzkzLDcgKzc5Myw3IEBACiAgICAgICAgICAgICB2cCA8PCAoaW50MzJfdCkxOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC04MDEsMTMgKzgwMSwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgblZQOwogICAgICAgICB2cCA+PiBuVlA7CkBAIC04MjUsMTYgKzgyNSwxNiBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKSBGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CiAgICAgICAgIGludCBTY2FsZU0gPSBJY29uRml0LkdldFNjYWxlTWV0aG9kKCk7CkBAIC04NTUsNyArODU1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtODYzLDEzICs4NjMsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTg4NywxMyArODg3LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBSREludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBSREludGVyRm9ybSAhPSBOVUxMKTsKQEAgLTkwNCw3ICs5MDQsNyBAQAogICAgICAgICB2cCA8PCAoaW50MzJfdClwSW50ZXJGb3JtLT5GaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIocEZvcm1GaWVsZCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKQEAgLTkxMiwxMyArOTEyLDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpjaGFyTGltaXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Y2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTkzNiwxNyArOTM2LDE3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA8PCAoaW50MzJfdClwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENoYXJMaW1pdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCkBAIC05NTQsMTMgKzk1NCwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Y29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpjb21iKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC05NzgsMTMgKzk3OCwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0NPTUIpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtOTkyLDcgKzk5Miw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKQEAgLTEwMDAsMTMgKzEwMDAsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMDI0LDEzICsxMDI0LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKICAgICAgICAgICAgIHZwIDw8IHRydWU7CkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMTA0NiwxMyArMTA0NiwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Y3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9EV29yZEFycmF5IGFycmF5OwogCkBAIC0xMDg5LDEzICsxMDg5LDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID09IDEpCiAgICAgICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwpAQCAtMTExMiw3ICsxMTEyLDcgQEAKICAgICAgICAgICAgIHZwIDw8IC0xOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTExMzIsNyArMTEzMiw3IEBACiAgICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YKQogICAgICAgICB7CiAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpZWxkRmxhZ3MgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihUUlVFKTsKKyAgICAgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKHRydWUpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9YXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgICAgICAgICB7CkBAIC0xMTQzLDIyICsxMTQzLDIyIEBACiAKICAgICAgICAgICAgICAgICBpbnQgaVNlbGVjdGluZyA9IChpbnQzMl90KWFycmF5LkdldEF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChpU2VsZWN0aW5nIDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkgJiYgIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlTZWxlY3RpbmcpKQotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIHRydWUpOwogCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0U3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICAvLyBNUUcgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19OT1RTVVBQT1JUKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICA7CiAgICAgfQpAQCAtMTE2Niw3ICsxMTY2LDcgQEAKICAgICB7CiAgICAgICAgIDsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERlZmF1bHRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgpCkBAIC0xMTc0LDEzICsxMTc0LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGVmYXVsdFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIFdpZGVTdHI7CiAgICAgICAgIHZwID4+IFdpZGVTdHI7CkBAIC0xMTk4LDE4ICsxMTk4LDE4IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTiB8fAogICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCkBAIC0xMjE4LDEzICsxMjE4LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMTI0MiwxMyArMTI0MiwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0RPTk9UU0NST0xMKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTEyNTYsNyArMTI1Niw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0xMjY0LDEzICsxMjY0LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMjc5LDE0ICsxMjc5LDE0IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEICYmCiAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMTI5NCwxMCArMTI5NCwxMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldERlbGF5KEZYX0JPT0wgYkRlbGF5KQordm9pZCBGaWVsZDo6U2V0RGVsYXkoYm9vbCBiRGVsYXkpCiB7CiAgICAgbV9iRGVsYXkgPSBiRGVsYXk7CiAKQEAgLTEzMDgsMTEgKzEzMDgsMTEgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0xMzIzLDE2ICsxMzIzLDE2IEBACiAgICAgewogICAgICAgICB2cCA8PCBtX2JEZWxheTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRpc3BsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgblZQOwogICAgICAgICB2cCA+PiBuVlA7CkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTEzNTksNyArMTM1OSw3IEBACiAgICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBmYWxzZTsKIAogICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwogCkBAIC0xMzg3LDcgKzEzODcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldERpc3BsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMTQwNyw3ICsxNDA3LDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaik7CkBAIC0xNDQ1LDEyICsxNDQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChiU2V0KSBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTQ4OSw3ICsxNDg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRGbGFncyhkd0ZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNDk3LDIxICsxNDk3LDIxIEBACiAgICAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZG9jKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpZiAoIXZwLklzR2V0dGluZygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICB2cCA8PCBtX3BKU0RvYy0+R2V0Q0pTRG9jKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMTUyMCwxMyArMTUyMCwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMTUzNCwzMCArMTUzNCwzMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmV4cG9ydFZhbHVlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7CiAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7CiAgICAgICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTU3MywzNiArMTU3MywzNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOwogICAgICAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgICAgICB2cCA8PCBFeHBvcnRWYWx1c0FycmF5OwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZmlsZVNlbGVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKICAgICAgICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTE2MTQsMTAgKzE2MTQsMTAgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZmlsbENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTE2MjYsMTUgKzE2MjYsMTUgQEAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewogICAgICAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA+PiBjckFycmF5OwogCkBAIC0xNjU2LDcgKzE2NTYsNyBAQAogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwogICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgaUNvbG9yVHlwZTsKICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7CkBAIC0xNjg0LDEzICsxNjg0LDEzIEBACiAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigzKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRGaWxsQ29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTE2OTgsMTMgKzE2OTgsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmhpZGRlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTE3MjIsNyArMTcyMiw3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMTczMSw3ICsxNzMxLDcgQEAKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CiAKQEAgLTE3NDMsNyArMTc0Myw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMTc2Myw3ICsxNzYzLDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkKQEAgLTE3ODcsMTMgKzE3ODcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYlNldCkKLSAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTgyMSw3ICsxODIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE4MjksMTMgKzE4MjksMTMgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKICAgICAgICAgdnAgPj4gc3RyTW9kZTsKQEAgLTE4NTMsMTYgKzE4NTMsMTYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBlSE0gPSBwRm9ybUNvbnRyb2wtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKICAgICAgICAgc3dpdGNoIChlSE0pCkBAIC0xODg1LDcgKzE4ODUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldEhpZ2hsaWdodChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCkBAIC0xODkzLDEzICsxODkzLDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6bGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBpV2lkdGg7CiAgICAgICAgIHZwID4+IGlXaWR0aDsKQEAgLTE5MTcsMjYgKzE5MTcsMjYgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKICAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICAgICAgaWYoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKSk7Ci0gICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2cCA8PCAoaW50MzJfdClwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRMaW5lV2lkdGgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMTk1Niw3ICsxOTU2LDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBqPTAsanN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopOwpAQCAtMTk2NywxMSArMTk2NywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyICE9IHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlcldpZHRoKG51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTk4Myw3ICsxOTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTk5MSwxMyArMTk5MSwxMyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBGaWVsZDo6bXVsdGlsaW5lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6Om11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjAxNSwxMyArMjAxNSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjAyOSw3ICsyMDI5LDcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRNdWx0aWxpbmUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0yMDM3LDEzICsyMDM3LDEzIEBACiAgICAgLy9Ob3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjA2MSwxMyArMjA2MSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKICAgICAgICAgICAgIHZwIDw8IHRydWU7CkBAIC0yMDc1LDcgKzIwNzUsNyBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQpAQCAtMjA4Myw0OSArMjA4Myw0OSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgdnAgPDwgbV9GaWVsZE5hbWU7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6bnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6bnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBmYWxzZTsKIAogICAgIHZwIDw8IChpbnQzMl90KXBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6cGFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBGb3JtRmllbGQpIHJldHVybiBmYWxzZTsKIAogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjE0Niw3ICsyMTQ2LDcgQEAKIAogICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKICAgICAgICAgICAgIGlmKCFwUGFnZVZpZXcpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgUGFnZUFycmF5LlNldEVsZW1lbnQoaSwgQ0pTX1ZhbHVlKG1faXNvbGF0ZSwoaW50MzJfdClwUGFnZVZpZXctPkdldFBhZ2VJbmRleCgpKSk7CiAgICAgICAgIH0KQEAgLTIxNTgsMTYgKzIxNTgsMTYgQEAKICAgICAgICAgdnAgPDwgKGludDMyX3QpIC0xOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjE4NSwxMyArMjE4NSwxMyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1BBU1NXT1JEKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTIxOTksNyArMjE5OSw3IEBACiAgICAgICAgICAgICB2cCA8PCBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0UGFzc3dvcmQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCkBAIC0yMjA3LDcgKzIyMDcsNyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6cHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMjIxNiwxMSArMjIxNiwxMSBAQAogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBib29sIGJWUDsKICAgICAgICAgdnAgPj4gYlZQOwpAQCAtMjIzMiw3ICsyMjMyLDcgQEAKIAogICAgICAgICAgICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJvb2wgYlNldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCkBAIC0yMjQ2LDE3ICsyMjQ2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJTZXQpCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGlmKG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKQEAgLTIyNzAsNyArMjI3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCksIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTIyODMsNyArMjI4Myw3IEBACiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKQogICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKQEAgLTIyOTEsMjAgKzIyOTEsMjAgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0yMzE2LDcgKzIzMTYsNyBAQAogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjMyNCwyMCArMjMyNCwyMCBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYm9vbCBiVlA7CiAgICAgICAgIHZwID4+IGJWUDsKQEAgLTIzNTQsMTcgKzIzNTQsMTcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpyZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENKU19BcnJheSByY0FycmF5KG1faXNvbGF0ZSk7CiAgICAgICAgIHZwID4+IHJjQXJyYXk7CkBAIC0yMzk1LDcgKzIzOTUsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTI0MDQsNyArMjQwNCw3IEBACiAgICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCiAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcFdpZGdldC0+R2V0UmVjdCgpOwogICAgICAgICBDSlNfVmFsdWUgVXBwZXJfTGVmdHgobV9pc29sYXRlKSxVcHBlcl9MZWZ0eShtX2lzb2xhdGUpLExvd2VyX1JpZ2h0eChtX2lzb2xhdGUpLExvd2VyX1JpZ2h0eShtX2lzb2xhdGUpOwpAQCAtMjQyMiw3ICsyNDIyLDcgQEAKICAgICAgICAgdnAgIDw8ICByY0FycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KQpAQCAtMjQ0Miw3ICsyNDQyLDcgQEAKIAogICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBpPTAsIHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CkBAIC0yNDY5LDEzICsyNDY5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yNTAzLDcgKzI1MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjUxMiwxNyArMjUxMiwxNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBmYWxzZTsKIAogCiAgICAgICAgIGJvb2wgYlZQOwpAQCAtMjUzNSw3ICsyNTM1LDcgQEAKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjU0MywxNiArMjU0MywxNiBAQAogICAgICAgICAgICAgdnAgPDwgZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGJvb2wgYlZQOwogICAgICAgICB2cCA+PiBiVlA7CkBAIC0yNTcwLDEzICsyNTcwLDEzIEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUklDSFRFWFQpCiAgICAgICAgICAgICB2cCA8PCB0cnVlOwpAQCAtMjU4NCw3ICsyNTg0LDcgQEAKICAgICAgICAgICAgIHZwIDw8IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRSaWNoVGV4dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKQEAgLTI1OTIsMTkgKzI1OTIsMTkgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgIDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0UmljaFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkKQEAgLTI2MTIsMTMgKzI2MTIsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTI2MzYsMTggKzI2MzYsMTggQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHZwIDw8IChpbnQzMl90KXBGb3JtQ29udHJvbC0+R2V0Um90YXRpb24oKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0Um90YXRpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMjY1NSwxNSArMjY1NSwxNSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKICAgICAgICAgdnAgPj4gY3JBcnJheTsKQEAgLTI2ODQsMTMgKzI2ODQsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBpQ29sb3JUeXBlOwogICAgICAgICBwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOwpAQCAtMjcxOSwxNCArMjcxOSwxNCBAQAogICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigzKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7CiAgICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQpAQCAtMjczNCwxMyArMjczNCwxMyBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKICAgICAgICAgdnAgPj4gY3NCQ2FwdGlvbjsKQEAgLTI3NTgsMTcgKzI3NTgsMTcgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJgogICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NIRUNLQk9YKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKQEAgLTI3OTcsNyArMjc5Nyw3IEBACiAgICAgICAgIHZwIDw8IGNzQkNhcHRpb247CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKQEAgLTI4MDYsMjEgKzI4MDYsMjEgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6c3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjp0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gZmFsc2U7CiAgICAgICAgIHZwID4+IGNyQXJyYXk7CiAKICAgICAgICAgQ1BXTF9Db2xvciBjb2xvcjsKQEAgLTI4MzksMTMgKzI4MzksMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBpQ29sb3JUeXBlOwogICAgICAgICBGWF9BUkdCIGNvbG9yOwpAQCAtMjg2Niw3ICsyODY2LDcgQEAKICAgICAgICAgdnAgIDw8ICBjckFycmF5OwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRUZXh0Q29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTI4NzQsMTcgKzI4NzQsMTcgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7CiAgICAgICAgIHZwID4+IGNzRm9udE5hbWU7Ci0gICAgICAgIGlmIChjc0ZvbnROYW1lLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoY3NGb250TmFtZS5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAobV9iRGVsYXkpCiAgICAgICAgIHsKQEAgLTI4OTksMTMgKzI4OTksMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CiAKQEAgLTI5MTUsMTUgKzI5MTUsMTUgQEAKICAgICAgICAgICAgIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKICAgICAgICAgewogICAgICAgICAgICAgQ1BERl9Gb250ICogcEZvbnQgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRDb250cm9sRm9udCgpOwotICAgICAgICAgICAgaWYgKCFwRm9udCkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCFwRm9udCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICB2cCA8PCBwRm9udC0+R2V0QmFzZUZvbnQoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFRleHRGb250KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykKQEAgLTI5MzEsMTMgKzI5MzEsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCBuVlA7CiAgICAgICAgIHZwID4+IG5WUDsKQEAgLTI5NTUsMTMgKzI5NTUsMTMgQEAKICAgICB7CiAgICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwogCkBAIC0yOTcyLDcgKzI5NzIsNyBAQAogICAgICAgICB2cCA8PCAoaW50KWZGb250U2l6ZTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWVsZDo6U2V0VGV4dFNpemUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQpAQCAtMjk4MCwxNSArMjk4MCwxNSBAQAogICAgIC8vTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6dHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjp0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CkBAIC0zMDI0LDE2ICszMDI0LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKICAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dOYW1lOwogICAgICAgICB2cCA+PiBzd05hbWU7CkBAIC0zMDUxLDcgKzMwNTEsNyBAQAogICAgIHsKICAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKQEAgLTMwNTksNyArMzA1OSw3IEBACiAgICAgICAgIHZwIDw8IChDRlhfV2lkZVN0cmluZylwRm9ybUZpZWxkLT5HZXRBbHRlcm5hdGVOYW1lKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGQ6OlNldFVzZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykKQEAgLTMwNjcsMTMgKzMwNjcsMTMgQEAKICAgICAvL05vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKICAgICBpZiAodnAuSXNTZXR0aW5nKCkpCiAgICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIENKU19XaWRlU3RyaW5nQXJyYXkgc3RyQXJyYXk7CiAKQEAgLTMxMDksNyArMzEwOSw3IEBACiAgICAgewogICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzExOSwxNCArMzExOSwxNCBAQAogICAgICAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgogICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7CiAKICAgICAgICAgICAgICAgICBkb3VibGUgZFJldDsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJEb3Q7CisgICAgICAgICAgICAgICAgYm9vbCBiRG90OwogICAgICAgICAgICAgICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKHN3VmFsdWUuY19zdHIoKSwgZFJldCwgYkRvdCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKQEAgLTMxNjAsNyArMzE2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkUmV0OwotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEb3Q7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRvdDsKICAgICAgICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJEb3QpCkBAIC0zMTc2LDE0ICszMTc2LDE0IEBACiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgogICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwICwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkUmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG90OworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRG90OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKQEAgLTMxOTQsNyArMzE5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMzIxMCw3ICszMjEwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEZpZWxkOjpTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKQEAgLTMyMzgsOCArMzIzOCw4IEBACiAgICAgICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSAhPSBzdHJBcnJheS5HZXRBdCgwKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBXaWRlU3RyaW5nID0gc3RyQXJyYXkuR2V0QXQoMCk7Ci0gICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwotICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzdHJBcnJheS5HZXRBdCgwKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOiAvL21hbnRpczogMDAwNDQ5MwpAQCAtMzI0NywxNCArMzI0NywxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHN0ckFycmF5LkdldEF0KDApLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZWQgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1zdHJBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKICAgICAgICAgICAgICAgICB7CkBAIC0zMjYyLDIxICszMjYyLDIxIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpSW5kZXgpKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTW9kaWZpZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYk1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJNb2RpZmllZCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKFRSVUUpOworICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbih0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wLHN6PXN0ckFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTMyODYsMjUgKzMyODYsMjUgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnZhbHVlQXNTdHJpbmcoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6dmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBmYWxzZTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCiAgICAgewotICAgICAgICBpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKS0+SXNDaGVja2VkKCkpCiAgICAgICAgICAgICB2cCA8PCBMIlllcyI7CkBAIC0zMzMxLDE4ICszMzMxLDE4IEBACiAgICAgZWxzZQogICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgRmllbGQ6OmJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnJvd3NlRm9yRmlsZVRvU3VibWl0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzM1NywxNyArMzM1NywxNyBAQAogICAgICAgICBpZighd3NGaWxlTmFtZS5Jc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHdzRmlsZU5hbWUpOwotICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zMzc4LDE2ICszMzc4LDE2IEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKG5mYWNlID09IDApCiAgICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKS5jX3N0cigpOwpAQCAtMzM5NiwxNCArMzM5NiwxNCBAQAogICAgIGVsc2UgaWYgKG5mYWNlID09IDIpCiAgICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldFJvbGxvdmVyQ2FwdGlvbigpLmNfc3RyKCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvLyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0ODAwKQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zNDE0LDE2ICszNDE0LDE2IEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zNDMyLDcgKzM0MzIsNyBAQAogICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAogICAgIEpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0gICAgQVNTRVJUKHBPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKyAgICBBU1NFUlQocE9iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOwogCiAgICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOwogICAgIEFTU0VSVChwSlNfSWNvbiAhPSBOVUxMKTsKQEAgLTM0NDgsMjcgKzM0NDgsMjcgQEAKICAgICBlbHNlIGlmIChuZmFjZSA9PSAyKQogICAgICAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0Um9sbG92ZXJJY29uKCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIHBJY29uLT5TZXRTdHJlYW0ocEljb25TdHJlYW0pOwogICAgIHZSZXQgPSBwSlNfSWNvbjsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvLyNwcmFnbWEgd2FybmluZyhkZWZhdWx0OiA0ODAwKQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25JbXBvcnRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25JbXBvcnRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAjaWYgMAogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgIGlmICghcEZvcm1GaWVsZClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUZpZWxkKXJldHVybiBmYWxzZTsKIAogICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CiAgICAgQVNTRVJUKHBFbnYpOwpAQCAtMzQ3Nyw3ICszNDc3LDcgQEAKICAgICBpZiAoc0ljb25GaWxlTmFtZS5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICB2UmV0ID0gMTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CkBAIC0zNDg3LDExMCArMzQ4NywxMTAgQEAKICAgICBpZiAoIXBTdHJlYW0pCiAgICAgewogICAgICAgICB2UmV0ID0gLTE7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIGZhbHNlOwogCiAgICAgcEZvcm1Db250cm9sLT5TZXROb3JtYWxJY29uKHBTdHJlYW0pOwotICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwogCiAgICAgdlJldCA9IDA7CiAjZW5kaWYgLy8gMAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6YnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Y2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLSAgICBGWF9CT09MIGJDaGVja2l0ID0gVFJVRTsKKyAgICBib29sIGJDaGVja2l0ID0gdHJ1ZTsKICAgICBpZiAoaVNpemUgPj0gMikKICAgICAgICAgYkNoZWNraXQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZihuV2lkZ2V0IDwwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIFRSVUUpOworICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIHRydWUpOwogICAgIGVsc2UKLSAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCBUUlVFKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCB0cnVlKTsKIAotICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmKG5XaWRnZXQgPDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCiAgICAgewotICAgICAgICB2UmV0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgdlJldCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQogICAgICAgICB8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKICAgICB7CiAKLSAgICAgICAgdlJldCA9IFRSVUU7CisgICAgICAgIHZSZXQgPSB0cnVlOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHZSZXQgPSBGQUxTRTsKKyAgICAgICAgdlJldCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRlbGV0ZUl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6ZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGludCBKU19DT01QQVJFU1RSSU5HKENGWF9XaWRlU3RyaW5nKiBwczEsIENGWF9XaWRlU3RyaW5nKiBwczIpCkBAIC0zNjAyLDEzICszNjAyLDEzIEBACiB9CiAKIAotRlhfQk9PTCBGaWVsZDo6Z2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OmdldEFycmF5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDR1dfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+IHN3U29ydDsKIApAQCAtMzYzMyw3ICszNjMzLDcgQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBTdHIgPSBzd1NvcnQuR2V0QXQoaik7CiAKICAgICAgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBmYWxzZSk7CiAKICAgICAgICAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9IChDSlNfRmllbGQqKUpTX0dldFByaXZhdGUocE9iaik7CiAgICAgICAgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKQEAgLTM2NTIsMTAgKzM2NTIsMTAgQEAKIAogICAgIHZSZXQgPSBGb3JtRmllbGRBcnJheTsKICAgICBzd1NvcnQuUmVtb3ZlQWxsKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Z2V0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CkBAIC0zNjY0LDEzICszNjY0LDEzIEBACiAgICAgaWYgKGlTaXplID49IDEpCiAgICAgICAgIG5JZHggPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotICAgIEZYX0JPT0wgYkV4cG9ydCA9IFRSVUU7CisgICAgYm9vbCBiRXhwb3J0ID0gdHJ1ZTsKICAgICBpZiAoaVNpemUgPj0gMikKICAgICAgICAgYkV4cG9ydCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKIAogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwpAQCAtMzY5MiwyMiArMzY5MiwyMiBAQAogICAgICAgICAgICAgdlJldCA9IHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JZHgpLmNfc3RyKCk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6Omluc2VydEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6aW5zZXJ0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmlzQm94Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6aXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCkBAIC0zNzE3LDMyICszNzE3LDMyIEBACiAKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBmYWxzZTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmKG5JbmRleCA8MCB8fCBuSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQogICAgIHsKLSAgICAgICAgdlJldCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHZSZXQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQogICAgICAgICB8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKICAgICB7CiAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5JbmRleCktPklzQ2hlY2tlZCgpICE9MCApCi0gICAgICAgICAgICB2UmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHZSZXQgPSB0cnVlOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gRkFMU0U7CisgICAgICAgICAgICB2UmV0ID0gZmFsc2U7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IEZBTFNFOworICAgICAgICB2UmV0ID0gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIApAQCAtMzc1Miw0OSArMzc1Miw0OSBAQAogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBpZihuSW5kZXggPDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKICAgICB7Ci0gICAgICAgIHZSZXQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB2UmV0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCiAgICAgICAgIHx8IChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pKQogICAgIHsKICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2wobkluZGV4KS0+SXNEZWZhdWx0Q2hlY2tlZCgpICE9IDApCi0gICAgICAgICAgICB2UmV0ID0gVFJVRTsKKyAgICAgICAgICAgIHZSZXQgPSB0cnVlOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gRkFMU0U7CisgICAgICAgICAgICB2UmV0ID0gZmFsc2U7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IEZBTFNFOworICAgICAgICB2UmV0ID0gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzZXRBY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNldEZvY3VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CiAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKICAgICBpbnQzMl90IG5Db3VudCA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsKIAotICAgIGlmIChuQ291bnQgPCAxKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKG5Db3VudCA8IDEpIHJldHVybiBmYWxzZTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CkBAIC0zODEwLDcgKzM4MTAsNyBAQAogICAgICAgICBBU1NFUlQocEVudik7CiAgICAgICAgIENQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkpOwogICAgICAgICBpZighcFBhZ2UpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwQ3VyUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UpKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKGludDMyX3QgaT0wOyBpPG5Db3VudDsgaSsrKQpAQCAtMzgzMiw1NyArMzgzMiw1NyBAQAogICAgICAgICBtX3BEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwV2lkZ2V0KTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNldEl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVHZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVTZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNpZ25hdHVyZVZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgRmllbGQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzR2V0dGluZygpKQogICAgIHsKICAgICAgICAgdnAgPDwgKENKU19PYmplY3QqKU5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZGVsYXkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcAppbmRleCA2YjNlMDJlLi4yN2E5NzczIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5jcHAKQEAgLTU3LDExICs1NywxMSBAQAogCXJldHVybiBtX3N3SWNvbk5hbWU7CiB9CiAKLUZYX0JPT0wgSWNvbjo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIEljb246Om5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCXZwIDw8IG1fc3dJY29uTmFtZTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAKaW5kZXggNzJiZTM0ZC4uMGVkYmYwZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwCkBAIC0xNiw4ICsxNiw4IEBACiAKIENKU19Db250ZXh0OjpDSlNfQ29udGV4dChDSlNfUnVudGltZSogcFJ1bnRpbWUpIDoKIAltX3BSdW50aW1lKHBSdW50aW1lKSwKLQltX2JCdXN5KEZBTFNFKSwKLQltX2JNc2dCb3hFbmFibGUoVFJVRSkKKwltX2JCdXN5KGZhbHNlKSwKKwltX2JNc2dCb3hFbmFibGUodHJ1ZSkKIHsKIAltX3BFdmVudEhhbmRsZXIgPSBuZXcgQ0pTX0V2ZW50SGFuZGxlcih0aGlzKTsKIH0KQEAgLTQxLDE1ICs0MSwxNSBAQAogCXJldHVybiBtX3BSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKIH0KIAotRlhfQk9PTCBDSlNfQ29udGV4dDo6RG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykKK2Jvb2wgQ0pTX0NvbnRleHQ6OkRvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCiB7CiAJaWYgKG1fYkJ1c3kpCiAJewogCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0JVU1kpOwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKLQltX2JCdXN5ID0gVFJVRTsKKwltX2JCdXN5ID0gdHJ1ZTsKIAogCUFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CkBAIC01OCw3ICs1OCw3IEBACiAJaWYgKCFtX3BSdW50aW1lLT5BZGRFdmVudFRvTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSkpCiAJewogCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0VWRU5UKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJRlhKU0VyciBlcnJvciA9e05VTEwsTlVMTCwgMH07CkBAIC05NSwxMiArOTUsMTIgQEAKIAltX3BSdW50aW1lLT5SZW1vdmVFdmVudEluTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSk7CiAKIAltX3BFdmVudEhhbmRsZXItPkRlc3Ryb3koKTsKLQltX2JCdXN5ID0gRkFMU0U7CisJbV9iQnVzeSA9IGZhbHNlOwogCiAJcmV0dXJuIG5SZXQgPj0gMDsKIH0KIAotRlhfQk9PTCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQorYm9vbCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJcmV0dXJuIERvSm9iKDAsIHNjcmlwdCwgaW5mbyk7CiB9CiAKLUZYX0JPT0wgQ0pTX0NvbnRleHQ6OkNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCitib29sIENKU19Db250ZXh0OjpDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwpAQCAtMTg2LDU4ICsxODYsNTggQEAKIAltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PdXRWaWV3KHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlRW50ZXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQsIFZhbHVlKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQ2FsY3VsYXRlKHBTb3VyY2UsIHBUYXJnZXQsIFZhbHVlLCBiUmMpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KQordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCkKIHsKICAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfRm9ybWF0KHBUYXJnZXQsIFZhbHVlLCBiV2lsbENvbW1pdCk7CiB9CiAKIAogdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwKLQkJCQkJCQkJCUZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotCQkJCQkJCQkJRlhfQk9PTCBiV2lsbENvbW1pdCwgRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MJiBiUmMpCisJCQkJCQkJCQlib29sIGJLZXlEb3duLCBib29sIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LAorCQkJCQkJCQkJYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisJCQkJCQkJCQlib29sIGJXaWxsQ29tbWl0LCBib29sIGJGaWVsZEZ1bGwsIGJvb2wmIGJSYykKIHsKICAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfS2V5c3Ryb2tlKAogICAgICAgICBzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBiS2V5RG93biwgYk1vZGlmaWVyLCBuU2VsRW5kLCBuU2VsU3RhcnQsCkBAIC0yNDUsNjggKzI0NSw2OCBAQAogfQogCiB2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkgICBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotCQkJCQkJCQkgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKKwkJCQkJCQkJICAgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKwkJCQkJCQkJICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBib29sJiBiUmMpCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfVmFsaWRhdGUoc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgYktleURvd24sIGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Gb2N1cyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCiB7CiAJQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKIAltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9PcGVuKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9DbG9zZShiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZVVwKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAJbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fSW5WaWV3KGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKIAlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwogCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3V0VmlldyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAKaW5kZXggMTc2OWUzMC4uMTA1NmM0NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcApAQCAtMjAsMjEgKzIwLDIxIEBACiBDSlNfRXZlbnRIYW5kbGVyOjpDSlNfRXZlbnRIYW5kbGVyKENKU19Db250ZXh0ICogcENvbnRleHQpICAgOgogICAgIG1fcEpTQ29udGV4dChwQ29udGV4dCksCiAgICAgbV9lRXZlbnRUeXBlKEpFVF9VTktOT1dOKSwKLSAgICBtX2JWYWxpZChGQUxTRSksCisgICAgbV9iVmFsaWQoZmFsc2UpLAogICAgIG1fcFdpZGVTdHJDaGFuZ2UoTlVMTCksCiAgICAgbV9uQ29tbWl0S2V5KC0xKSwKLSAgICBtX2JLZXlEb3duKEZBTFNFKSwKLSAgICBtX2JNb2RpZmllcihGQUxTRSksCi0gICAgbV9iU2hpZnQoRkFMU0UpLAorICAgIG1fYktleURvd24oZmFsc2UpLAorICAgIG1fYk1vZGlmaWVyKGZhbHNlKSwKKyAgICBtX2JTaGlmdChmYWxzZSksCiAgICAgbV9wSVNlbEVuZChOVUxMKSwKICAgICBtX25TZWxFbmREdSgwKSwKICAgICBtX3BJU2VsU3RhcnQoTlVMTCksCiAgICAgbV9uU2VsU3RhcnREdSgwKSwKLSAgICBtX2JXaWxsQ29tbWl0KEZBTFNFKSwKKyAgICBtX2JXaWxsQ29tbWl0KGZhbHNlKSwKICAgICBtX3BWYWx1ZShOVUxMKSwKLSAgICBtX2JGaWVsZEZ1bGwoRkFMU0UpLAorICAgIG1fYkZpZWxkRnVsbChmYWxzZSksCiAgICAgbV9wYlJjKE5VTEwpLAotICAgIG1fYlJjRHUoRkFMU0UpLAorICAgIG1fYlJjRHUoZmFsc2UpLAogICAgIG1fcFNvdXJjZURvYyhOVUxMKSwKICAgICBtX3BUYXJnZXRCb29rTWFyayhOVUxMKSwKICAgICBtX3BUYXJnZXREb2MoTlVMTCksCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRVhJVCk7CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRURPV04pOwogICAgIG1fZUV2ZW50VHlwZSA9IEpFVF9GSUVMRF9NT1VTRURPV047CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRVVQKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfRk9DVVMpOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfQkxVUik7CkBAIC0xODgsMTEgKzE4OCwxMSBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nICZzdHJDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwgaW50JiBuU2VsRW5kLCBpbnQmIG5TZWxTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wmIGJSYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBib29sIEtleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLCBpbnQmIG5TZWxFbmQsIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpZWxkRnVsbCwgYm9vbCYgYlJjKQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX0tFWVNUUk9LRSk7CiAKQEAgLTIxMyw4ICsyMTMsOCBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwgYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIGJvb2wmIGJSYykKIHsKICAgICBJbml0aWFsKEpFVF9GSUVMRF9WQUxJREFURSk7CiAKQEAgLTIzMCw3ICsyMzAsNyBAQAogfQogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgYm9vbCYgYlJjKQogewogICAgIEluaXRpYWwoSkVUX0ZJRUxEX0NBTENVTEFURSk7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCiB2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpCiB7CiAgICAgSW5pdGlhbChKRVRfRklFTERfRk9STUFUKTsKIApAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgbV9iV2lsbENvbW1pdCA9IGJXaWxsQ29tbWl0OwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9GT0NVUyk7CiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCiB7CiAgICAgSW5pdGlhbChKRVRfU0NSRUVOX0JMVVIpOwogCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9PUEVOKTsKIApAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9DTE9TRSk7CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRURPV04pOwogCkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRVVQKTsKIApAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7CiAKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogICAgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRUVYSVQpOwogCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKIApAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKIHsKICAgICBJbml0aWFsKEpFVF9TQ1JFRU5fT1VUVklFVyk7CiAKQEAgLTM5NSwzMyArMzk1LDMzIEBACiAgICAgbV9XaWRlU3RyQ2hhbmdlRHUgPSBMIiI7CiAgICAgbV9XaWRlU3RyQ2hhbmdlRXggPSBMIiI7CiAgICAgbV9uQ29tbWl0S2V5ID0gLTE7Ci0gICAgbV9iS2V5RG93biA9IEZBTFNFOwotICAgIG1fYk1vZGlmaWVyID0gRkFMU0U7Ci0gICAgbV9iU2hpZnQgPSBGQUxTRTsKKyAgICBtX2JLZXlEb3duID0gZmFsc2U7CisgICAgbV9iTW9kaWZpZXIgPSBmYWxzZTsKKyAgICBtX2JTaGlmdCA9IGZhbHNlOwogICAgIG1fcElTZWxFbmQgPSBOVUxMOwogICAgIG1fblNlbEVuZER1ID0gMDsKICAgICBtX3BJU2VsU3RhcnQgPSBOVUxMOwogICAgIG1fblNlbFN0YXJ0RHUgPSAwOwotICAgIG1fYldpbGxDb21taXQgPSBGQUxTRTsKKyAgICBtX2JXaWxsQ29tbWl0ID0gZmFsc2U7CiAgICAgbV9wVmFsdWUgPSBOVUxMOwotICAgIG1fYkZpZWxkRnVsbCA9IEZBTFNFOworICAgIG1fYkZpZWxkRnVsbCA9IGZhbHNlOwogICAgIG1fcGJSYyA9IE5VTEw7Ci0gICAgbV9iUmNEdSA9IEZBTFNFOworICAgIG1fYlJjRHUgPSBmYWxzZTsKIAogICAgIG1fcFNvdXJjZURvYyA9IE5VTEw7CiAgICAgbV9wVGFyZ2V0Qm9va01hcmsgPSBOVUxMOwogICAgIG1fcFRhcmdldERvYyA9IE5VTEw7CiAgICAgbV9wVGFyZ2V0QW5ub3QgPSBOVUxMOwogCi0gICAgbV9iVmFsaWQgPSBUUlVFOworICAgIG1fYlZhbGlkID0gdHJ1ZTsKIH0KIAogdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpEZXN0cm95KCkKIHsKLSAgICBtX2JWYWxpZCA9IEZBTFNFOworICAgIG1fYlZhbGlkID0gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6SXNWYWxpZCgpCitib29sIENKU19FdmVudEhhbmRsZXI6OklzVmFsaWQoKQogewogICAgIHJldHVybiBtX2JWYWxpZDsKIH0KQEAgLTQ0NCwxNyArNDQ0LDE3IEBACiAgICAgcmV0dXJuIG1fbkNvbW1pdEtleTsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQorYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQogewogICAgIHJldHVybiBtX2JGaWVsZEZ1bGw7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6S2V5RG93bigpCitib29sIENKU19FdmVudEhhbmRsZXI6OktleURvd24oKQogewogICAgIHJldHVybiBtX2JLZXlEb3duOwogfQogCi1GWF9CT09MIENKU19FdmVudEhhbmRsZXI6Ok1vZGlmaWVyKCkKK2Jvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6TW9kaWZpZXIoKQogewogICAgIHJldHVybiBtX2JNb2RpZmllcjsKIH0KQEAgLTU1NSw3ICs1NTUsNyBAQAogICAgIHJldHVybiBMIiI7CiB9CiAKLUZYX0JPT0wmIENKU19FdmVudEhhbmRsZXI6OlJjKCkKK2Jvb2wmIENKU19FdmVudEhhbmRsZXI6OlJjKCkKIHsKICAgICBpZiAobV9wYlJjKSB7CiAgICAgICAgIHJldHVybiAqbV9wYlJjOwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgcmV0dXJuIG1fblNlbFN0YXJ0RHU7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6U2hpZnQoKQorYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpCiB7CiAgICAgcmV0dXJuIG1fYlNoaWZ0OwogfQpAQCAtNTkxLDkgKzU5MSw5IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAogICAgIEpTRlhPYmplY3QgIHBEb2NPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSk7Ci0gICAgQVNTRVJUKHBEb2NPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKyAgICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOwogICAgIEpTRlhPYmplY3QgIHBGaWVsZE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJGaWVsZCIpKTsKLSAgICBBU1NFUlQocEZpZWxkT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgICAgQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gZmFsc2UpOwogCiAgICAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9IChDSlNfRG9jdW1lbnQqKUpTX0dldFByaXZhdGUocERvY09iaik7CiAgICAgQVNTRVJUKHBKU0RvY3VtZW50ICE9IE5VTEwpOwpAQCAtNjI1LDkgKzYyNSw5IEBACiAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAogICAgIEpTRlhPYmplY3QgcERvY09iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJEb2N1bWVudCIpKTsKLSAgICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOworICAgIEFTU0VSVChwRG9jT2JqLklzRW1wdHkoKSA9PSBmYWxzZSk7CiAgICAgSlNGWE9iamVjdCBwRmllbGRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOworICAgIEFTU0VSVChwRmllbGRPYmouSXNFbXB0eSgpID09IGZhbHNlKTsKIAogICAgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBEb2NPYmopOwogICAgIEFTU0VSVChwSlNEb2N1bWVudCAhPSBOVUxMKTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogICAgIHJldHVybiAqbV9wVmFsdWU7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6V2lsbENvbW1pdCgpCitib29sIENKU19FdmVudEhhbmRsZXI6OldpbGxDb21taXQoKQogewogICAgIHJldHVybiBtX2JXaWxsQ29tbWl0OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAKaW5kZXggOGM3YmQ3MS4uNzFlM2E1MCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCkBAIC0yOTYsNyArMjk2LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCkKK2Jvb2wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgYm9vbCBiUGVyc2lzdGVudCkKIHsKICAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CkBAIC0zMDQsMTggKzMwNCwxOCBAQAogICAgIHNQcm9wTmFtZS5UcmltTGVmdCgpOwogICAgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKIAotICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkKICAgICB7CiAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9IGJQZXJzaXN0ZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6RGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpCitib29sIENKU19HbG9iYWxEYXRhOjpEZWxldGVHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkKIHsKICAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKICAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CiAKLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuRmluZCA9IEZpbmRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpOwogCkBAIC0zMzEsMTAgKzMzMSwxMCBAQAogICAgIHsKICAgICAgICAgZGVsZXRlIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKTsKICAgICAgICAgbV9hcnJheUdsb2JhbERhdGEuUmVtb3ZlQXQobkZpbmQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogaW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0CkBAIC00MTcsNyArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CkBAIC00MjUsNyArNDI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdEYXRhID0gKigoRlhfV09SRCopcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKHNFbnRyeSwgKGJvb2wpKHdEYXRhID09IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6CkBAIC00MzcsMTQgKzQzNywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKHNFbnRyeSwgQ0ZYX0J5dGVTdHJpbmcocCwgZHdMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihjaGFyKSAqIGR3TGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdWxsKHNFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lLmNwcAppbmRleCA0ODVjZDI3Li43MzMzZTg4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgICAgIGVtYmVkZGVyRGF0YVNsb3QgPSBwQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybS0+bV92OEVtYmVkZGVyU2xvdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIEpTX0luaXRpYWwoZW1iZWRkZXJEYXRhU2xvdCk7Ci0gICAgICAgIG1fYkluaXQgPSBUUlVFOworICAgICAgICBtX2JJbml0ID0gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIG5ldyBDSlNfUnVudGltZShwQXBwKTsKIH0KQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgSlNfUmVsZWFzZSgpOwogICAgICAgICAgICAgUmVsZWFzZUdsb2JhbERhdGEoKTsKLSAgICAgICAgICAgIG1fYkluaXQgPSBGQUxTRTsKKyAgICAgICAgICAgIG1fYkluaXQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTEwOCw3ICsxMDgsNyBAQAogQ0pTX1J1bnRpbWU6OkNKU19SdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwKSA6CiAJbV9wQXBwKHBBcHApLAogCW1fcERvY3VtZW50KE5VTEwpLAotCW1fYkJsb2NraW5nKEZBTFNFKSwKKwltX2JCbG9ja2luZyhmYWxzZSksCiAJbV9wRmllbGRFdmVudFBhdGgoTlVMTCksCiAgICAgbV9pc29sYXRlKE5VTEwpCiB7CkBAIC0xNTAsNDYgKzE1MCw0NiBAQAogICAgIG1faXNvbGF0ZS0+RGlzcG9zZSgpOwogfQogCi1GWF9CT09MIENKU19SdW50aW1lOjpJbml0SlNPYmplY3RzKCkKK2Jvb2wgQ0pTX1J1bnRpbWU6OkluaXRKU09iamVjdHMoKQogewogICAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwogICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoR2V0SXNvbGF0ZSgpKTsKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKICAgICAvLzAgLSA4Ci0gICAgaWYgKENKU19Cb3JkZXI6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19EaXNwbGF5OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfRm9udDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0hpZ2hsaWdodDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX1Bvc2l0aW9uOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfU2NhbGVIb3c6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19TY2FsZVdoZW46OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19TdHlsZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX1pvb210eXBlOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfQm9yZGVyOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfRGlzcGxheTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0ZvbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19IaWdobGlnaHQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19Qb3NpdGlvbjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX1NjYWxlSG93OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfU2NhbGVXaGVuOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfU3R5bGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19ab29tdHlwZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKIAogICAgIC8vOSAtIDExCi0gICAgaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLzEyIC0gMTQKLSAgICBpZiAoQ0pTX0RvY3VtZW50OjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0V2ZW50OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfRmllbGQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfRG9jdW1lbnQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfRXZlbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKENKU19GaWVsZDo6SW5pdCgqdGhpcywgSlNfRFlOQU1JQykgPCAwKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLzE1IC0gMTcKLSAgICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKENKU19HbG9iYWxDb25zdHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChDSlNfR2xvYmFsQXJyYXlzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfR2xvYmFsQ29uc3RzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ0pTX0dsb2JhbEFycmF5czo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gZmFsc2U7CiAKLSAgICBpZiAoQ0pTX1RpbWVyT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoQ0pTX1ByaW50UGFyYW1zT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8MCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChDSlNfVGltZXJPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChDSlNfUHJpbnRQYXJhbXNPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwwKSByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogSUZYSlNfQ29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0NvbnRleHQoKQpAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgfQogfQogCi1GWF9CT09MIENKU19SdW50aW1lOjpBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKK2Jvb2wgQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKQogewogICAgIGlmIChtX3BGaWVsZEV2ZW50UGF0aCA9PSBOVUxMKQogICAgIHsKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgICAgICBtX3BGaWVsZEV2ZW50UGF0aC0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7CiAgICAgICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5wTmV4dCA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8vdG8gc2VhcmNoCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICB3aGlsZSAocCkKICAgICB7CiAgICAgICAgIGlmIChwLT5lRXZlbnRUeXBlID09IGVFdmVudFR5cGUgJiYgcC0+c1RhcmdldE5hbWUgPT0gc1RhcmdldE5hbWUpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgcExhc3QgPSBwOwogICAgICAgICBwID0gcC0+cE5leHQ7CkBAIC0yODcsMTIgKzI4NywxMiBAQAogCiAgICAgcExhc3QtPnBOZXh0ID0gcE5ldzsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENKU19SdW50aW1lOjpSZW1vdmVFdmVudEluTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKIHsKLSAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CisgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogCiAgICAgQ0pTX0ZpZWxkRXZlbnQqIHAgPSBtX3BGaWVsZEV2ZW50UGF0aDsKICAgICBDSlNfRmllbGRFdmVudCogcExhc3QgPSBOVUxMOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgewogICAgICAgICBpZiAocC0+ZUV2ZW50VHlwZSA9PSBlRXZlbnRUeXBlICYmIHAtPnNUYXJnZXROYW1lID09IHNUYXJnZXROYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICBiRmluZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCmluZGV4IDA1OGYyZWEuLjYxMWIxMTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCkBAIC0yNTYsNDUgKzI1Niw0NSBAQAogCXJldHVybiBWVF91bmtub3duOwogfQogCi1GWF9CT09MIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0Citib29sIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0CiB7Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisJaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIG1fcFZhbHVlLT5Jc0FycmF5KCk7CiB9CiAKLUZYX0JPT0wgQ0pTX1ZhbHVlOjpJc0RhdGVPYmplY3QoKSBjb25zdAorYm9vbCBDSlNfVmFsdWU6OklzRGF0ZU9iamVjdCgpIGNvbnN0CiB7Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisJaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIG1fcFZhbHVlLT5Jc0RhdGUoKTsKIH0KIAogLy9DSlNfVmFsdWU6Om9wZXJhdG9yIENKU19BcnJheSgpCi1GWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX0FycmF5ICZhcnJheSkgY29uc3QKK2Jvb2wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJmFycmF5KSBjb25zdAogewogCWlmIChJc0FycmF5T2JqZWN0KCkpCiAJewogCQlhcnJheS5BdHRhY2goSlNfVG9BcnJheShtX2lzb2xhdGUsIG1fcFZhbHVlKSk7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvRGF0ZShDSlNfRGF0ZSAmZGF0ZSkgY29uc3QKK2Jvb2wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9EYXRlKENKU19EYXRlICZkYXRlKSBjb25zdAogewogLy8gCWlmIChHZXRUeXBlKCkgPT0gVlRfZGF0ZSkKIC8vIAl7CiAvLyAJCWRhdGUgPSAoZG91YmxlKSgqdGhpcyk7Ci0vLyAJCXJldHVybiBUUlVFOworLy8gCQlyZXR1cm4gdHJ1ZTsKIC8vIAl9CiAKIAlpZiAoSXNEYXRlT2JqZWN0KCkpCiAJewogCQlkYXRlLkF0dGFjaChtX3BWYWx1ZSk7Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19Qcm9wVmFsdWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzE0LDEyICszMTQsMTIgQEAKIHsKIH0KIAotRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQorYm9vbCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQogewogCXJldHVybiBtX2JJc1NldHRpbmc7CiB9CiAKLUZYX0JPT0wgQ0pTX1Byb3BWYWx1ZTo6SXNHZXR0aW5nKCkKK2Jvb2wgQ0pTX1Byb3BWYWx1ZTo6SXNHZXR0aW5nKCkKIHsKIAlyZXR1cm4gIW1fYklzU2V0dGluZzsKIH0KQEAgLTQ4MCw5ICs0ODAsOSBAQAogCW1fcEFycmF5ID0gcEFycmF5OwogfQogCi1GWF9CT09MIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCitib29sIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDSlNfQXJyYXk6OkdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSkKQEAgLTU0Myw5ICs1NDMsOSBAQAogewogfQogCi1GWF9CT09MCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCitib29sCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCiB7Ci0JaWYobV9wRGF0ZS5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKKwlpZihtX3BEYXRlLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwogCXJldHVybiAhSlNfUG9ydElzTmFuKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcAppbmRleCBkYWVjZGJlLi4wYWEyM2QxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKQEAgLTcyLDc2ICs3Miw3NiBAQAogICAgIEwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIgogfTsKIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpCiB7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CiAgICAgY29uc3QgRlhfV0NIQVIqIHBUcmltID0gc1RyaW0uY19zdHIoKTsKICAgICBjb25zdCBGWF9XQ0hBUiogcCA9IHBUcmltOwogCiAKLSAgICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CisgICAgYm9vbCBiRG90ID0gZmFsc2U7CisgICAgYm9vbCBiS1hKUyA9IGZhbHNlOwogCiAgICAgd2NoYXJfdCBjOwogICAgIHdoaWxlICgoYyA9ICpwKSkKICAgICB7CiAgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcsJykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGJEb3QpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIGJEb3QgPSBUUlVFOworICAgICAgICAgICAgaWYgKGJEb3QpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJEb3QgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocCAhPSBwVHJpbSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYktYSlMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiS1hKUyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICghSXNEaWdpdChjKSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHArKzsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQogewogICAgIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQogewogICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYWJldGljKHdjaGFyX3QgY2gpCiB7CiAgICAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKQogewogICAgIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKIHsKICAgICBzd2l0Y2ggKGNfTWFzaykKICAgICB7CkBAIC0xNTIsMTMgKzE1MiwxMyBAQAogICAgIGNhc2UgTCdPJzoKICAgICAgICAgcmV0dXJuIElzQWxwaGFOdW1lcmljKGNfQ2hhbmdlKTsKICAgICBjYXNlIEwnWCc6Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7CiAgICAgfQogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQogewogICAgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwogfQpAQCAtMjI2LDEzICsyMjYsMTMgQEAKICAgICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgRlhfQk9PTCYgYkFsbERpZ2l0cywgRlhfQk9PTCYgYkRvdCwgRlhfQk9PTCYgYlNpZ24sIEZYX0JPT0wmIGJLWEpTKQorZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGJvb2wmIGJBbGxEaWdpdHMsIGJvb2wmIGJEb3QsIGJvb2wmIGJTaWduLCBib29sJiBiS1hKUykKIHsKLSAgICBiRG90ID0gRkFMU0U7Ci0gICAgYlNpZ24gPSBGQUxTRTsKLSAgICBiS1hKUyA9IEZBTFNFOworICAgIGJEb3QgPSBmYWxzZTsKKyAgICBiU2lnbiA9IGZhbHNlOworICAgIGJLWEpTID0gZmFsc2U7CiAKLSAgICBGWF9CT09MIGJEaWdpdEV4aXN0ID0gRkFMU0U7CisgICAgYm9vbCBiRGlnaXRFeGlzdCA9IGZhbHNlOwogCiAgICAgY29uc3QgRlhfV0NIQVIqIHAgPSBzd1NvdXJjZTsKICAgICB3Y2hhcl90IGM7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAogICAgIGlmICghcFN0YXJ0KQogICAgIHsKLSAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgICAgICBiQWxsRGlnaXRzID0gZmFsc2U7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjY3LDcgKzI2Nyw3IEBACiAKICAgICBkb3VibGUgZFJldCA9IDA7CiAgICAgcCA9IHBTdGFydDsKLSAgICBiQWxsRGlnaXRzID0gVFJVRTsKKyAgICBiQWxsRGlnaXRzID0gdHJ1ZTsKICAgICBDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKIAogICAgIHdoaWxlIChwIDw9IHBFbmQpCkBAIC0yNzcsMTQgKzI3NywxNCBAQAogICAgICAgICBpZiAoSXNEaWdpdChjKSkKICAgICAgICAgewogICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgTCcgJzoKLSAgICAgICAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMJy4nOgogICAgICAgICAgICAgY2FzZSBMJywnOgpAQCAtMjk4LDEwICsyOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBiRG90ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYkRvdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgJ2UnOgpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGMgPSAqcDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiS1hKUyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiS1hKUyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSAnZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjIsMjEgKzMyMiwyMSBAQAogICAgICAgICAgICAgICAgIGlmICghYkRpZ2l0RXhpc3QgJiYgIWJTaWduKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgYlNpZ24gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiU2lnbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJBbGxEaWdpdHMgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgIGlmIChwICE9IHBTdGFydCAmJiAhYkRvdCAmJiBiRGlnaXRFeGlzdCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgIGJEb3QgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRG90ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkRvdCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBiRG90ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzID0gTCIiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM3NCwxOSArMzc0LDE5IEBACiAKIGRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpCiB7Ci0gICAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwotICAgIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKKyAgICBib29sIGJBbGxEaWdpdHMgPSBmYWxzZTsKKyAgICBib29sIGJEb3QgPSBmYWxzZTsKKyAgICBib29sIGJTaWduID0gZmFsc2U7CisgICAgYm9vbCBiS1hKUyA9IGZhbHNlOwogCiAgICAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCkKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIGJvb2wgJiBiRG90KQogewotICAgIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwotICAgIEZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKLSAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CisgICAgYm9vbCBiQWxsRGlnaXRzID0gZmFsc2U7CisgICAgYm9vbCBiU2lnbiA9IGZhbHNlOworICAgIGJvb2wgYktYSlMgPSBmYWxzZTsKIAogICAgIGRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKIApAQCAtNDc3LDcgKzQ3Nyw3IEBACiAgICAgcmV0dXJuIHN3UmV0OwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBib29sJiBiV3JvbmdGb3JtYXQpCiB7CiAgICAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKIApAQCAtNTI1LDcgKzUyNSw3IEBACiAgICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07CiAgICAgICAgIH0KIAotICAgICAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAgICAgfQogICAgIGVsc2UgaWYgKG5JbmRleCA9PSAzKQogICAgIHsKQEAgLTU1MiwxMSArNTUyLDExIEBACiAgICAgICAgICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgICAgICAgfQogCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICAgICAgICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIGR0OwogICAgIH0KIApAQCAtNTY1LDcgKzU2NSw3IEBACiAgICAgcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgYm9vbCYgYldyb25nRm9ybWF0KQogewogICAgIGRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CiAKQEAgLTU4MSw5ICs1ODEsOSBAQAogCiAgICAgaW50IG5ZZWFyU3ViID0gOTk7IC8vblllYXIgLSAyMDAwOwogCi0gICAgRlhfQk9PTCBiUG0gPSBGQUxTRTsKLSAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0gICAgYldyb25nRm9ybWF0ID0gRkFMU0U7CisgICAgYm9vbCBiUG0gPSBmYWxzZTsKKyAgICBib29sIGJFeGl0ID0gZmFsc2U7CisgICAgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAKICAgICBpbnQgaT0wOwogICAgIGludCBqPTA7CkBAIC03MTUsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQpAQCAtNzIzLDcgKzcyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz0zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKz1uU2tpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc1Nyw3ICs3NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc01vbnRoLk1ha2VMb3dlcigpOwpAQCAtNzcyLDcgKzc3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC03OTUsOCArNzk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgaisrOwpAQCAtODA0LDggKzgwNCw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGogPT0gaikKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTgxMywxMiArODEzLDEyIEBACiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGkrKzsKQEAgLTgzMywxOSArODMzLDE5IEBACiAgICAgICAgIG5ZZWFyICs9IDIwMDA7CiAKICAgICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKIAogICAgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CiAKICAgICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IHRydWU7CiAKICAgICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQotICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOworICAgICAgICBiV3JvbmdGb3JtYXQgPSB0cnVlOwogCiAgICAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgYldyb25nRm9ybWF0ID0gdHJ1ZTsKIAogICAgIGRvdWJsZSBkUmV0ID0gMDsKIApAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8vZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CkBAIC0xMDMzLDIxICsxMDMzLDIxIEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKIAotICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBUUlVFOworICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiB0cnVlOwogCiAgICAgaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAgICAgaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOwogICAgIC8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgogICAgIHN0ZDo6d3N0cmluZyB3c3RyQ3VycmVuY3kocGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotICAgIEZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKKyAgICBib29sIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CiAKICAgICBpZiAoaURlYyA8IDApIGlEZWMgPSAtaURlYzsKIApAQCAtMTIyNCwxMSArMTIyNCwxMSBAQAogICAgIH0KICAgICBWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwogI2VuZGlmCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTIzNiwxMyArMTIzNiwxMyBAQAogICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKICAgICBpZihwYXJhbXMuc2l6ZSgpIDwgMikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwogCiAgICAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgICAgICAgaVNlcFN0eWxlID0gMDsKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgJiB3X3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKQEAgLTEyNTIsMTggKzEyNTIsMTggQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwogICAgICAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgICAgICBzd1RlbXAuUmVwbGFjZShMIiwiLCBMIi4iKTsKICAgICAgICAgaWYgKCFJc051bWJlcihzd1RlbXAuY19zdHIoKSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CiAgICAgICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7CiAgICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAorICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAogICAgIH0KIAogICAgIHN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKQEAgLTEyNzEsMTUgKzEyNzEsMTUgQEAKICAgICBzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKICAgICBpZigtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCiAgICAgICAgIHdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7Ci0gICAgRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CisgICAgYm9vbCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CiAgICAgaWYgKGJIYXNTaWduKQogICAgIHsKICAgICAgICAgLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgogICAgICAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjk3LDQ5ICsxMjk3LDQ5IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIEZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKKyAgICBib29sIGJIYXNTZXAgPSAod19zdHJWYWx1ZTIuZmluZChjU2VwKSAhPSAtMSk7CiAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd19zdHJDaGFuZ2UyLmJlZ2luKCk7IGl0ICE9IHdfc3RyQ2hhbmdlMi5lbmQoKTsgaXQrKykKICAgICB7CiAgICAgICAgIGlmICgqaXQgPT0gY1NlcCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGJIYXNTZXApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTZXAgPSBUUlVFOworICAgICAgICAgICAgYkhhc1NlcCA9IHRydWU7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoKml0ID09IEwnLScpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChiSGFzU2lnbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICAgICAgICAgICAgYlJjID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgYm9vbCAmYlJjID0gcEV2ZW50LT5SYygpOworICAgICAgICAgICAgICAgIGJSYyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICAgICAgYlJjID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocEV2ZW50LT5TZWxTdGFydCgpICE9IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGJvb2wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTaWduID0gVFJVRTsKKyAgICAgICAgICAgIGJIYXNTaWduID0gdHJ1ZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFJc0RpZ2l0KCppdCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgICAgICBiUmMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzUxLDEyICsxMzUxLDEyIEBACiAgICAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKICAgICB3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKICAgICB2YWwgPSB3X3N0clZhbHVlOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogCiB9CiAKIC8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwpAQCAtMTM2NywxNSArMTM2NywxNSBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgIGlmIChpRGVjIDwgMCkKQEAgLTE0NjEsMTYgKzE0NjEsMTYgQEAKICAgICBzdHJWYWx1ZSArPSAiJSI7CiAgICAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKICNlbmRpZgotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHJldHVybiBBRk51bWJlcl9LZXlzdHJva2UoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKIH0KIAogLy9mdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTQ4MCwxOCArMTQ4MCwxOCBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CisgICAgYm9vbCBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKICAgICBkb3VibGUgZERhdGUgPSAwLjBmOwogCiAgICAgaWYoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKQpAQCAtMTUxMCwxMSArMTUxMCwxMSBAQAogICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwogICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHZhbCA9ICBNYWtlRm9ybWF0RGF0ZShkRGF0ZSxzRm9ybWF0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQpAQCAtMTU3OCw3ICsxNTc4LDcgQEAKIH0KIAogLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTU4OCwzMyArMTU4OCwzMyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKICAgICB7CiAgICAgICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICAgICAgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICAgICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKyAgICAgICAgYm9vbCBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKICAgICAgICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwogICAgICAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkKICAgICAgICAgewogICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CiAgICAgICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKIApAQCAtMTYyNCw3ICsxNjI0LDcgQEAKICAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKQEAgLTE2NDUsNyArMTY0NSw3IEBACiB9CiAKIC8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCkBAIC0xNjU1LDcgKzE2NTUsNyBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTY3Niw3ICsxNjc2LDcgQEAKIH0KIAogLy9mdW5jdGlvbiBBRlRpbWVfRm9ybWF0KHB0ZikKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKICAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKQEAgLTE3MTEsNyArMTcxMSw3IEBACiAgICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwpAQCAtMTcyOSwxOCArMTcyOSwxOCBAQAogICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxwYXJhbXMsdlJldCxzRXJyb3IpOwogfQogCiAvL2Z1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE3NDgsNyArMTc0OCw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CkBAIC0xNzU4LDcgKzE3NTgsNyBAQAogICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkuY19zdHIoKTsKIApAQCAtMTc4OCwxMiArMTc4OCwxMiBAQAogICAgIHN0ZDo6c3RyaW5nIHN0ckRlczsKICAgICB1dGlsOjpwcmludHgoY0Zvcm1hdCxzdHJTcmMsc3RyRGVzKTsKICAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIC8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE4MDQsMjMgKzE4MDQsMjMgQEAKICAgICBpZiAocGFyYW1zLnNpemUoKSA8IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOwogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSA9IHZhbEV2ZW50LmNfc3RyKCk7CiAKICAgICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCiAgICAgewogICAgICAgICBpZiAod3N0clZhbHVlLmVtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBpbnQgaUluZGV4TWFzayA9IDA7CiAgICAgICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCiAgICAgICAgIHsKQEAgLTE4MzMsMzAgKzE4MzMsMzAgQEAKICAgICAgICAgaWYgKGlJbmRleE1hc2sgIT0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgfHwgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkKICAgICAgICAgewogICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgICBzdGQ6OndzdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2UuY19zdHIoKTsKICAgICBpZiAod0NoYW5nZS5lbXB0eSgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKIAogICAgIGlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKICAgICB7CiAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSAmJiAoIXdDaGFuZ2UuZW1wdHkoKSkpCiAgICAgewogICAgICAgICBBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKLSAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd0NoYW5nZS5iZWdpbigpOyBpdCAhPSB3Q2hhbmdlLmVuZCgpOyBpdCsrKQpAQCAtMTg2NCw4ICsxODY0LDggQEAKICAgICAgICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgd2NoYXJfdCB3X01hc2sgPSB3c3RyTWFza1tpSW5kZXhNYXNrXTsKICAgICAgICAgaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKQEAgLTE4NzUsMTkgKzE4NzUsMTkgQEAKICAgICAgICAgd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfQ2hhbmdlLHdfTWFzaykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlJbmRleE1hc2srKzsKICAgICB9CiAKICAgICB3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIC8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCkBAIC0xODk5LDE0ICsxODk5LDE0IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CiAgICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogCiAgICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIC8vQ0pTX1ZhbHVlIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CkBAIC0xOTQ2LDcgKzE5NDYsNyBAQAogICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xOTU2LDcgKzE5NTYsNyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwpAQCAtMTk2Niw3ICsxOTY2LDcgQEAKICAgICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKQogICAgIHsKICAgICAgICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHByZWZpeCxwb3N0Zml4OwpAQCAtMTk4MywxMCArMTk4MywxMCBAQAogCiAgICAgdlJldCA9IChwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXgpLmNfc3RyKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTE5OTQsMTMgKzE5OTQsMTMgQEAKICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQogICAgIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CiAKLSAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAgICAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAKICAgICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKQEAgLTIwMDgsMTQgKzIwMDgsMTQgQEAKICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgICAgQWxlcnQoKENKU19Db250ZXh0ICopY2MsIHN3TXNnLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2UmV0ID0gZERhdGU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpCiAgICAgewpAQCAtMjAyMywxNCArMjAyMywxNCBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICAgewpAQCAtMjAzOCwxMyArMjAzOCwxMyBAQAogICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKQEAgLTIwNTQsNyArMjA1NCw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwpAQCAtMjA2Miw3ICsyMDYyLDcgQEAKICAgICBpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKQEAgLTIxNjIsMTMgKzIxNjIsMTMgQEAKICAgICBpZigoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKICAgICAgICAgKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCkpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMKICoqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjE3OCwxNyArMjE3OCwxNyBAQAogICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDQpCiAgICAgewogICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKLSAgICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICBib29sIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKICAgICBkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7Ci0gICAgRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CisgICAgYm9vbCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CiAgICAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOwogICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogCkBAIC0yMjE1LDEyICsyMjE1LDEyIEBACiAgICAgaWYgKCFzd01zZy5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKQEAgLTIyMjksNyArMjIyOSw3IEBACiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENKU19BcnJheSBudW1zKGlzb2xhdGUpOwpAQCAtMjI2OSw1ICsyMjY5LDUgQEAKICAgICBlbHNlCiAgICAgICAgIHZSZXQuU2V0TnVsbCgpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAKaW5kZXggYWYzMjk2NS4uMGYzNTI5NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcApAQCAtMTM0LDEwICsxMzQsMTAgQEAKIAltX2FUaW1lci5SZW1vdmVBbGwoKTsKIH0KIAotRlhfQk9PTCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKQEAgLTE2NiwxMjAgKzE2NiwxMjAgQEAKICAgICBlbHNlCiAgICAgICAgIHZwLlNldE51bGwoKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpjYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmICh2cC5Jc1NldHRpbmcoKSkKIAl7CiAJCWJvb2wgYlZQOwogCQl2cCA+PiBiVlA7Ci0JCW1fYkNhbGN1bGF0ZSA9IChGWF9CT09MKWJWUDsKKwkJbV9iQ2FsY3VsYXRlID0gKGJvb2wpYlZQOwogCiAJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CiAJCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAkJQ0pTX0FycmF5IGFEb2NzKHBSdW50aW1lLT5HZXRJc29sYXRlKCkpOwogCQlpZiAoQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBBcHAtPkdldFNES0RvY3VtZW50KCkpCi0JCQlwRG9jLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKChGWF9CT09MKW1fYkNhbGN1bGF0ZSk7CisJCQlwRG9jLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKChib29sKW1fYkNhbGN1bGF0ZSk7CiAJfQogCWVsc2UKIAl7CiAJCXZwIDw8IChib29sKW1fYkNhbGN1bGF0ZTsKIAl9Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmZvcm1zVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfTlVNX0ZPUk1TVkVSU0lPTjsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewogCQl2cCA8PCBMInVua25vd24iOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6OnZpZXdlclZhcmlhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6dmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewogCQl2cCA8PCBKU19TVFJfVklFV0VSVkFSSUFUSU9OOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmICh2cC5Jc0dldHRpbmcoKSkKIAl7CiAJCXZwIDw8IEpTX1NUUl9WSUVXRVJWRVJTSU9OOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6OnBsYXRmb3JtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfU1RSX1BMQVRGT1JNOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBhcHA6Omxhbmd1YWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpsYW5ndWFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHZwLklzR2V0dGluZygpKQogCXsKIAkJdnAgPDwgSlNfU1RSX0xBTkdVQU5HRTsKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8vY3JlYXRlcyBhIG5ldyBmZGYgb2JqZWN0IHRoYXQgY29udGFpbnMgbm8gZGF0YQogLy9jb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0CiAvL25vdGU6CiAvL0NGREZfRG9jdW1lbnQgKiBDUERGRG9jX0Vudmlyb25tZW50OjpOZXdGREYoKTsKLUZYX0JPT0wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIC8vb3BlbnMgYSBzcGVjaWZpZWQgcGRmIGRvY3VtZW50IGFuZCByZXR1cm5zIGl0cyBkb2N1bWVudCBvYmplY3QKIC8vY29tbWVudDpuZWVkIHJlYWRlciBzdXBwb3J0CiAvL25vdGU6IGFzIGRlZmluZWQgaW4ganMgcmVmZXJlbmNlLCB0aGUgcHJvdG8gb2YgdGhpcyBmdW5jdGlvbidzIGZvdXJ0aCBwYXJtZXRlcnMsIGhvdyBvbGQgYW4gZmRmIGRvY3VtZW50IHdoaWxlIGRvIG5vdCBzaG93IGl0LgogLy9DRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6T3BlbkZERihzdHJpbmcgc3RyUGF0aCxib29sIGJVc2VyQ29udik7CiAKLUZYX0JPT0wgYXBwOjpvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6b3BlbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6YWxlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjphbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAJaWYgKGlTaXplIDwgMSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAKIAlDRlhfV2lkZVN0cmluZyBzd01zZyA9IEwiIjsKIAlDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCIiOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJCX0KIAkJZWxzZSBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9ib29sZWFuKQogCQl7Ci0JCQlGWF9CT09MIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisJCQlib29sIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAJCQlpZiAoYkdldCkKIAkJCQlzd01zZyA9IEwidHJ1ZSI7CiAJCQllbHNlCkBAIC0zNTQsNyArMzU0LDcgQEAKIAl7CiAJCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Jvb2xlYW4pCiAJCXsKLQkJCUZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKwkJCWJvb2wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKIAkJCWlmIChiR2V0KQogCQkJCXN3TXNnID0gTCJ0cnVlIjsKIAkJCWVsc2UKQEAgLTM4NiwxMSArMzg2LDExIEBACiAJdlJldCA9IE1zZ0JveChwUnVudGltZS0+R2V0UmVhZGVyQXBwKCksIEpTR2V0UGFnZVZpZXcoY2MpLCBzd01zZy5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIGlUeXBlLCBpSWNvbik7CiAJcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCi1GWF9CT09MIGFwcDo6YmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmJlZXAoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAocGFyYW1zLnNpemUoKSA9PSAxKQogCXsKQEAgLTM5OCw0MiArMzk4LDQyIEBACiAJCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKIAkJQ1BERkRvY19FbnZpcm9ubWVudCAqIHBFbnYgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7CiAJCXBFbnYtPkpTX2FwcEJlZXAocGFyYW1zWzBdLlRvSW50KCkpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6ZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6cG9wVXBNZW51RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6ZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OnNldEludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQogCXsKIAkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gcGFyYW1zLnNpemUoKSA+IDAgPyAgcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOwogCWlmIChzY3JpcHQuSXNFbXB0eSgpKQogCXsKIAkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwpAQCAtNDYzLDE1ICs0NjMsMTUgQEAKIAogCXZSZXQgPSBwUmV0T2JqOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpzZXRUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6c2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCWlmIChwYXJhbXMuc2l6ZSgpID4gMiB8fCBwYXJhbXMuc2l6ZSgpID09IDApCiAJewogCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CkBAIC00ODMsNyArNDgzLDcgQEAKIAlpZiAoc2NyaXB0LklzRW1wdHkoKSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJRlhfRFdPUkQgZHdUaW1lT3V0ID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CkBAIC01MTIsMTAgKzUxMiwxMCBAQAogCiAJdlJldCA9IHBSZXRPYmo7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBhcHA6OmNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OmNsZWFyVGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpCkBAIC01NjAsMTAgKzU2MCwxMCBAQAogCQl9CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpjbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6Y2xlYXJJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKIAl7CiAJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpCkBAIC02MDgsMTIgKzYwOCwxMiBAQAogCQl9CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIGFwcDo6VGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKQpAQCAtNjUxLDI0ICs2NTEsMjQgQEAKIAl9CiB9CiAKLUZYX0JPT0wgYXBwOjpnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpnb0JhY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gTm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGFwcDo6Z29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6Z29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOworICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBhcHA6Om1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjptYWlsTXNnKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogCi0JRlhfQk9PTCBiVUkgPSBUUlVFOworCWJvb2wgYlVJID0gdHJ1ZTsKIAlDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CiAJQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwogCUNGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CkBAIC02NzYsNyArNjc2LDcgQEAKIAlDRlhfV2lkZVN0cmluZyBjTXNnID0gTCIiOwogCiAJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKIAl7CkBAIC03MDEsNyArNzAxLDcgQEAKIAkJY01zZyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwogCX0gZWxzZSB7CiAJCWlmIChwYXJhbXMuc2l6ZSgpIDwgMikKLQkJCXJldHVybiBGQUxTRTsKKwkJCXJldHVybiBmYWxzZTsKIAogCQliVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CiAJCWNUbyA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKQEAgLTcyNiwxNiArNzI2LDE2IEBACiAJcEFwcC0+SlNfZG9jbWFpbEZvcm0oTlVMTCwgMCwgYlVJLCBjVG8uY19zdHIoKSwgY1N1YmplY3QuY19zdHIoKSwgY0NjLmNfc3RyKCksIGNCY2MuY19zdHIoKSwgY01zZy5jX3N0cigpKTsKIAlwUnVudGltZS0+RW5kQmxvY2soKTsKIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewpAQCAtNzQ2LDI0ICs3NDYsMjQgQEAKIAkJdnA8PG1fYlJ1bnRpbWVIaWdoTGlnaHQ7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjpmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgYXBwOjpmdWxsc2NyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIEZBTFNFOworCXJldHVybiBmYWxzZTsKIH0KIAogCi1GWF9CT09MIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCiBDRlhfV2lkZVN0cmluZyBhcHA6OlN5c1BhdGhUb1BERlBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNPbGRQYXRoKQpAQCAtNzkyLDE3ICs3OTIsMTcgQEAKIAlyZXR1cm4gc1JldDsKIH0KIAotRlhfQk9PTCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpvcGVuRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6b3BlbkRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpyZXNwb25zZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBhcHA6OnJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0ZYX1dpZGVTdHJpbmcgc3dRdWVzdGlvbiA9IEwiIjsKIAlDRlhfV2lkZVN0cmluZyBzd0xhYmVsID0gTCIiOwpAQCAtODczLDcgKzg3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlBVVF9CWVRFUyk7CiAgICAgaWYgKG5MZW5ndGhCeXRlcyA8PSAwKSB7CiAgICAgICAgIHZSZXQuU2V0TnVsbCgpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbkxlbmd0aEJ5dGVzID0gc3RkOjptaW4obkxlbmd0aEJ5dGVzLCBNQVhfSU5QVVRfQllURVMpOwogCkBAIC04ODEsMTUgKzg4MSwxNSBAQAogICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KilwQnVmZi5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGhCeXRlcyAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwogICAgIHZSZXQgPSByZXRfc3RyaW5nLmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgYXBwOjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6bWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgYXBwOjpleGVjRGlhbG9nKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGFwcDo6ZXhlY0RpYWxvZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcAppbmRleCBhMmJiYWRjLi43YzNjMTM3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcApAQCAtMTU1LDcgKzE1NSw3IEBACiB9CiAKICNkZWZpbmUgSlNfSU1QTEVNRU5UX0NPTE9SUFJPUChwcm9wLCB2YXIpXAotRlhfQk9PTCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpXAorYm9vbCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpXAoge1wKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjO1wKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpO1wKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAJZWxzZVwKIAl7XAogCQlDSlNfQXJyYXkgYXJyYXkoaXNvbGF0ZSk7XAotCQlpZiAoIXZwLkNvbnZlcnRUb0FycmF5KGFycmF5KSkgcmV0dXJuIEZBTFNFO1wKKwkJaWYgKCF2cC5Db252ZXJ0VG9BcnJheShhcnJheSkpIHJldHVybiBmYWxzZTtcCiAJCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXksIHZhcik7XAogCX1cCi0JcmV0dXJuIFRSVUU7XAorCXJldHVybiB0cnVlO1wKIH0KIAogSlNfSU1QTEVNRU5UX0NPTE9SUFJPUCh0cmFuc3BhcmVudCwgbV9jclRyYW5zcGFyZW50KQpAQCAtMTg3LDEzICsxODcsMTMgQEAKIEpTX0lNUExFTUVOVF9DT0xPUlBST1AoZ3JheSwgbV9jckdyYXkpCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKGx0R3JheSwgbV9jckxUR3JheSkKIAotRlhfQk9PTCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAJaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAyKSByZXR1cm4gRkFMU0U7CisJaWYgKGlTaXplIDwgMikgcmV0dXJuIGZhbHNlOwogCUNKU19BcnJheSBhU291cmNlKGlzb2xhdGUpOwotCWlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KGFTb3VyY2UpKSByZXR1cm4gRkFMU0U7CisJaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYVNvdXJjZSkpIHJldHVybiBmYWxzZTsKIAogCUNQV0xfQ29sb3IgY3JTb3VyY2U7CiAJQ29udmVydEFycmF5VG9QV0xDb2xvcihhU291cmNlLCBjclNvdXJjZSk7CkBAIC0yMjQsMTggKzIyNCwxOCBAQAogCUNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY3JEZXN0LCBhRGVzdCk7CiAJdlJldCA9IGFEZXN0OwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgY29sb3I6OmVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGNvbG9yOjplcXVhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gRkFMU0U7CisJaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gZmFsc2U7CiAKIAlDSlNfQXJyYXkgYXJyYXkxKGlzb2xhdGUpLCBhcnJheTIoaXNvbGF0ZSk7CiAKLQlpZiAoIXBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShhcnJheTEpKSByZXR1cm4gRkFMU0U7Ci0JaWYgKCFwYXJhbXNbMV0uQ29udmVydFRvQXJyYXkoYXJyYXkyKSkgcmV0dXJuIEZBTFNFOworCWlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KGFycmF5MSkpIHJldHVybiBmYWxzZTsKKwlpZiAoIXBhcmFtc1sxXS5Db252ZXJ0VG9BcnJheShhcnJheTIpKSByZXR1cm4gZmFsc2U7CiAKIAlDUFdMX0NvbG9yIGNvbG9yMTsKIAlDUFdMX0NvbG9yIGNvbG9yMjsKQEAgLTI0Niw2ICsyNDYsNiBAQAogCWNvbG9yMS5Db252ZXJ0Q29sb3JUeXBlKGNvbG9yMi5uQ29sb3JUeXBlKTsKIAogCXZSZXQgPSBjb2xvcjEgPT0gY29sb3IyOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmNwcAppbmRleCBlZDliMWZiLi40ZDgwNjcxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAKQEAgLTM4LDI4ICszOCwyOCBAQAogewogfQogCi1GWF9CT09MIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgY29uc29sZTo6aGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBjb25zb2xlOjpoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgY29uc29sZTo6cHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBjb25zb2xlOjpwcmludGxuKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQogCXsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGNvbnNvbGU6OnNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgY29uc29sZTo6c2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKaW5kZXggZjU3YjFmYi4uZWU3M2U0MiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAKQEAgLTU2LDcgKzU2LDcgQEAKIHsKIH0KIAotRlhfQk9PTCBldmVudDo6Y2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OmNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC03MywxMiArNzMsMTIgQEAKIAl7CiAJCXZwIDw8IHdDaGFuZ2U7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTg2LDEyICs4NiwxMiBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPkNoYW5nZUV4KCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OmNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50Ojpjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC05OSwxMCArOTksMTAgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnAgPDwgcEV2ZW50LT5Db21taXRLZXkoKTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6ZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OmZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xMTAsMTggKzExMCwxOCBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAlpZiAoIXZwLklzR2V0dGluZygpICYmIHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksTCJLZXlzdHJva2UiKSAhPSAwKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChwRXZlbnQtPkZpZWxkRnVsbCgpKQotCQl2cCA8PCBUUlVFOworCQl2cCA8PCB0cnVlOwogCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisJCXZwIDw8IGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjprZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OmtleURvd24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0xMjksMTUgKzEyOSwxNSBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAlpZiAocEV2ZW50LT5LZXlEb3duKCkpCi0JCXZwIDw8IFRSVUU7CisJCXZwIDw8IHRydWU7CiAJZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKKwkJdnAgPDwgZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTQ1LDE1ICsxNDUsMTUgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJaWYgKHBFdmVudC0+TW9kaWZpZXIoKSkKLQkJdnAgPDwgVFJVRTsKKwkJdnAgPDwgdHJ1ZTsKIAllbHNlCi0JCXZwIDw8IEZBTFNFOwotCXJldHVybiBUUlVFOworCQl2cCA8PCBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTYxLDE3ICsxNjEsMTcgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnAgPDwgcEV2ZW50LT5OYW1lKCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICBib29sICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAJaWYgKHZwLklzU2V0dGluZygpKQogCXsKIAkJdnA+PmJSYzsKQEAgLTE4MCwxMiArMTgwLDEyIEBACiAJewogCQl2cDw8YlJjOwogCX0KLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6cmljaENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpyaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewogCX0KQEAgLTE5MywxMiArMTkzLDEyIEBACiAJewogCQk7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjpyaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6cmljaENoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIAlpZiAodnAuSXNTZXR0aW5nKCkpCiAJewogCX0KQEAgLTIwNiwxMyArMjA2LDEzIEBACiAJewogCQk7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAKLUZYX0JPT0wgZXZlbnQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogCWlmICh2cC5Jc1NldHRpbmcoKSkKIAl7CiAJfQpAQCAtMjIwLDEwICsyMjAsMTAgQEAKIAl7CiAJCTsKIAl9Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnNlbEVuZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAKIAlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCiAJewotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJaW50ICZpU2VsRW5kID0gcEV2ZW50LT5TZWxFbmQoKTsKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAJewogCQl2cCA8PCBpU2VsRW5kOwogCX0KLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAKIAlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCiAJewotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCWludCAmaVNlbFN0YXJ0ID0gcEV2ZW50LT5TZWxTdGFydCgpOwogCWlmICh2cC5Jc1NldHRpbmcoKSkKQEAgLTI2NywxMiArMjY3LDEyIEBACiAJewogCQl2cCA8PCBpU2VsU3RhcnQ7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTI4MCwxNSArMjgwLDE1IEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCWlmIChwRXZlbnQtPlNoaWZ0KCkpCi0JCXZwIDw8IFRSVUU7CisJCXZwIDw8IHRydWU7CiAJZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKKwkJdnAgPDwgZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGV2ZW50Ojpzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0yOTYsMTIgKzI5NiwxMiBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPlNvdXJjZSgpLT5HZXRKU09iamVjdCgpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50Ojp0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6dGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKKwlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBmYWxzZTsKIAogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMzA5LDEyICszMDksMTIgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJdnA8PHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCktPkdldEpTT2JqZWN0KCk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6dGFyZ2V0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CisJaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gZmFsc2U7CiAKIAlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCXZwIDw8IHBFdmVudC0+VGFyZ2V0TmFtZSgpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50Ojp0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zMzUsMTAgKzMzNSwxMCBAQAogCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKIAl2cCA8PCBwRXZlbnQtPlR5cGUoKTsKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMzQ2LDkgKzM0Niw5IEBACiAJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAogCWlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+VHlwZSgpLEwiRmllbGQiKSAhPSAwKQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAJaWYgKHZwLklzU2V0dGluZygpKQogCXsKQEAgLTM1OCwxMiArMzU4LDEyIEBACiAJewogCQl2cCA8PCB2YWw7CiAJfQotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIGV2ZW50Ojp3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgZXZlbnQ6OndpbGxDb21taXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIGZhbHNlOwogCiAJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKIAlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CkBAIC0zNzEsOSArMzcxLDkgQEAKIAlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCiAJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotCQl2cCA8PCBUUlVFOworCQl2cCA8PCB0cnVlOwogCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisJCXZwIDw8IGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKaW5kZXggNjk2NWM4Yy4uOThhM2NkNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcApAQCAtOTYsNyArOTYsNyBAQAogCiBJTVBMRU1FTlRfU1BFQ0lBTF9KU19DTEFTUyhDSlNfR2xvYmFsLCBnbG9iYWxfYWx0ZXJuYXRlLCBnbG9iYWwpOwogCi1GWF9CT09MIENKU19HbG9iYWw6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKK2Jvb2wgQ0pTX0dsb2JhbDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQogewogICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKICAgICBwR2xvYmFsLT5Jbml0aWFsKHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKSk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH07CiAKIGdsb2JhbF9hbHRlcm5hdGU6Omdsb2JhbF9hbHRlcm5hdGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KQpAQCAtMTI4LDI2ICsxMjgsMjYgQEAKICAgICBVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CiB9CiAKLUZYX0JPT0wgZ2xvYmFsX2FsdGVybmF0ZTo6UXVlcnlQcm9wZXJ0eShjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUpCitib29sIGdsb2JhbF9hbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKQogewogICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50IjsKIH0KIAotRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIGpzX2dsb2JhbF9kYXRhKiBwRGF0YSA9IE5VTEw7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKTsKIAogICAgIGlmIChtX21hcEdsb2JhbC5Mb29rdXAoc1Byb3BOYW1lLCAodm9pZComKXBEYXRhKSkKICAgICB7Ci0gICAgICAgIHBEYXRhLT5iRGVsZXRlZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBwRGF0YS0+YkRlbGV0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaWYgKHZwLklzU2V0dGluZygpKQogICAgIHsKQEAgLTE1OCwzNCArMTU4LDM0IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZG91YmxlIGREYXRhOwogICAgICAgICAgICAgICAgIHZwID4+IGREYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFZUX2Jvb2xlYW46CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YTsKICAgICAgICAgICAgICAgICB2cCA+PiBiRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBWVF9zdHJpbmc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0RhdGE7CiAgICAgICAgICAgICAgICAgdnAgPj4gc0RhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBzRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORywgMCwgZmFsc2UsIHNEYXRhLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFZUX29iamVjdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBKU09iamVjdCBwRGF0YTsKICAgICAgICAgICAgICAgICB2cCA+PiBwRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLCBwRGF0YSwgRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNULCAwLCBmYWxzZSwgIiIsIHBEYXRhLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgVlRfbnVsbDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBWVF91bmRlZmluZWQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRGVsUHJvcGVydHkoY2MsIHByb3BuYW1lLCBzRXJyb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTcsNTEgKzE5Nyw1MSBAQAogICAgICAgICBpZiAoIW1fbWFwR2xvYmFsLkxvb2t1cChDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpLCBwVm9pZCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZwLlNldE51bGwoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwVm9pZCkKICAgICAgICAgewogICAgICAgICAgICAgdnAuU2V0TnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSAoanNfZ2xvYmFsX2RhdGEqKXBWb2lkOwogICAgICAgICBpZiAocERhdGEtPmJEZWxldGVkKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgICAgICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgogICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5kRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CiAgICAgICAgICAgICAgICAgdnAgPDwgcERhdGEtPmJEYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgogICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5zRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyh2cC5HZXRJc29sYXRlKCkscERhdGEtPnBEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgdnAgPDwgb2JqOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKICAgICAgICAgICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgZ2xvYmFsX2FsdGVybmF0ZTo6c2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpzZXRQZXJzaXN0ZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CiAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIENGWF9CeXRlU3RyaW5nIHNOYW1lID0gcGFyYW1zWzBdLlRvQ0ZYQnl0ZVN0cmluZygpOwpAQCAtMjUyLDEyICsyNTIsMTIgQEAKICAgICAgICAgaWYgKHBEYXRhICYmICFwRGF0YS0+YkRlbGV0ZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU05PR0xPQkFMKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIGdsb2JhbF9hbHRlcm5hdGU6OlVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKQpAQCAtNDgwLDEwICs0ODAsMTAgQEAKIH0KIAogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgaW50IG5UeXBlLAorYm9vbCBnbG9iYWxfYWx0ZXJuYXRlOjpTZXRHbG9iYWxWYXJpYWJsZXMoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGludCBuVHlwZSwKICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEsIGJvb2wgYkRhdGEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwgSlNPYmplY3QgcERhdGEsIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KQogewotICAgIGlmIChwcm9wbmFtZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHByb3BuYW1lID09IE5VTEwpIHJldHVybiBmYWxzZTsKIAogICAgIGpzX2dsb2JhbF9kYXRhKiBwVGVtcCA9IE5VTEw7CiAgICAgbV9tYXBHbG9iYWwuTG9va3VwKHByb3BuYW1lLCAodm9pZComKXBUZW1wKTsKQEAgLTQ5OCw3ICs0OTgsNyBAQAogICAgICAgICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwVGVtcC0+YkRlbGV0ZWQgPSBGQUxTRTsKKyAgICAgICAgcFRlbXAtPmJEZWxldGVkID0gZmFsc2U7CiAKICAgICAgICAgc3dpdGNoIChuVHlwZSkKICAgICAgICAgewpAQCAtNTI1LDEwICs1MjUsMTAgQEAKICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIGpzX2dsb2JhbF9kYXRhKiBwTmV3RGF0YSA9IE5VTEw7CkBAIC01NzUsMTIgKzU3NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIG1fbWFwR2xvYmFsLlNldEF0KHByb3BuYW1lLCAodm9pZCopcE5ld0RhdGEpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIEZYSlNWQUxVRVRZUEUgR0VUX1ZBTFVFX1RZUEUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcCkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcAppbmRleCAxNDc4ZmViLi44MjBlNzMwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXBvcnQuY3BwCkBAIC0zNiwxNCArMzYsMTQgQEAKIAogfQogCi1GWF9CT09MIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIFRSVUU7CisgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIFJlcG9ydDo6c2F2ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCBSZXBvcnQ6OnNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcAppbmRleCA0MDgzZWQ1Li4yMWE3Y2I4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAKQEAgLTk4LDcgKzk4LDcgQEAKIAogaW50IHV0aWw6OlBhcnN0RGF0YVR5cGUoc3RkOjp3c3RyaW5nKiBzRm9ybWF0KQogewotICAgIGJvb2wgYlBlcmNlbnQgPSBGQUxTRTsKKyAgICBib29sIGJQZXJjZW50ID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzRm9ybWF0LT5sZW5ndGgoKTsgKytpKQogICAgIHsKICAgICAgICAgd2NoYXJfdCBjID0gKCpzRm9ybWF0KVtpXTsKQEAgLTEzNiwxMSArMTM2LDExIEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1GWF9CT09MIHV0aWw6OnByaW50ZihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQorYm9vbCB1dGlsOjpwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA8IDEpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHN0ZDo6d3N0cmluZyBjX0NvbnZDaGFyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OndzdHJpbmc+IGNfc3RyQ29udmVyczsKICAgICBpbnQgaU9mZnNldCA9IDA7CkBAIC0xOTgsMTYgKzE5OCwxNiBAQAogCiAgICAgY19zdHJSZXN1bHQuZXJhc2UoY19zdHJSZXN1bHQuYmVnaW4oKSk7CiAgICAgdlJldCA9IGNfc3RyUmVzdWx0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgdXRpbDo6cHJpbnRkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIHV0aWw6OnByaW50ZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQogewogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA8IDIpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgQ0pTX1ZhbHVlIHAxKGlzb2xhdGUpOwogICAgIHAxID0gcGFyYW1zWzBdOwpAQCAtMjE3LDEzICsyMTcsMTMgQEAKICAgICBpZiAoIXAyLkNvbnZlcnRUb0RhdGUoanNEYXRlKSkKICAgICB7CiAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQUklOVDEpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZiAoIWpzRGF0ZS5Jc1ZhbGlkRGF0ZSgpKQogICAgIHsKICAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChwMS5HZXRUeXBlKCkgPT0gVlRfbnVtYmVyKQpAQCAtMjYxLDExICsyNjEsMTEgQEAKICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgdlJldCA9IHN3UmVzdWx0LmNfc3RyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHAxLkdldFR5cGUoKSA9PSBWVF9zdHJpbmcpCiAgICAgewpAQCAtMjc5LDcgKzI3OSw3IEBACiAKICAgICAgICAgaWYgKGJYRkFQaWN0dXJlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7IC8vY3VycmVudGx5LCBpdCBkb2Vzbid0IHN1cHBvcnQgWEZBUGljdHVyZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy9jdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgogICAgICAgICB9CiAKICAgICAgICAgaW50IGlJbmRleDsKQEAgLTM1NSw5ICszNTUsOSBAQAogICAgICAgICBzdHJGb3JtYXQgPSB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKICAgICAgICAgY0Zvcm1hdCA9IGJ1ZjsKICAgICAgICAgdlJldCA9IGNGb3JtYXQuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIHV0aWw6OnByaW50ZChjb25zdCBzdGQ6OndzdHJpbmcgJmNGb3JtYXQyLCBDSlNfRGF0ZSBqc0RhdGUsIGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpCkBAIC00NTAsMTEgKzQ1MCwxMSBAQAogICAgIGNQdXJwb3NlID0gY0Zvcm1hdDsKIH0KIAotRlhfQk9PTCB1dGlsOjpwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgdXRpbDo6cHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCiB7CiAgICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKICAgICBpZiAoaVNpemU8MikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgICBDRlhfV2lkZVN0cmluZyBzU291cmNlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc0Zvcm1hdCkuY19zdHIoKTsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgIHN0ZDo6c3RyaW5nIGNEZXN0OwogICAgIHByaW50eChjRm9ybWF0LGNTb3VyY2UsY0Rlc3QpOwogICAgIHZSZXQgPSBjRGVzdC5jX3N0cigpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIHV0aWw6OnByaW50eChjb25zdCBzdGQ6OnN0cmluZyAmY0Zvcm1hdCxjb25zdCBzdGQ6OnN0cmluZyAmY1NvdXJjZTIsc3RkOjpzdHJpbmcgJmNQdXJwb3NlKQpAQCAtNTY0LDE5ICs1NjQsMTkgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKK2Jvb2wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwogICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAgICAgaWYgKGlTaXplIDwgMikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIENGWF9XaWRlU3RyaW5nIHNEYXRlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgIGRvdWJsZSBkRGF0ZSA9IEpTX0dldERhdGVUaW1lKCk7CiAgICAgaWYgKHNEYXRlLkdldExlbmd0aCgpID4gMCkKICAgICB7Ci0gICAgICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CisgICAgICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CiAgICAgICAgIGREYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShzRGF0ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CiAgICAgfQogCkBAIC01OTAsNyArNTkwLDcgQEAKICAgICAgICAgdlJldC5TZXROdWxsKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIgKm5wdHIpCkBAIC02MTgsMTUgKzYxOCwxNSBAQAogICAgICAgICByZXR1cm4gc2lnbiA9PSAnLScgPyAtdG90YWwgOiB0b3RhbDsKIH0KIAotRlhfQk9PTCB1dGlsOjpieXRlVG9DaGFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCitib29sIHV0aWw6OmJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKIHsKICAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogICAgIGlmIChpU2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpbnQgbkJ5dGUgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICB1bnNpZ25lZCBjaGFyIGNCeXRlID0gKHVuc2lnbmVkIGNoYXIpbkJ5dGU7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKICAgICBjc1ZhbHVlLkZvcm1hdChMIiVjIiwgY0J5dGUpOwogICAgIHZSZXQgPSBjc1ZhbHVlLmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcCBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCmluZGV4IGM0ODExYmYuLmUxMjMyODAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwCkBAIC00Miw3ICs0Miw3IEBACiB7CiBwdWJsaWM6CiAJQ0pTX09iakRlZmludGlvbih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlLCBMUF9DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpOgotCSAgb2JqTmFtZShzT2JqTmFtZSksIG9ialR5cGUoZU9ialR5cGUpLCBtX3BDb25zdHJ1Y3RvcihwQ29uc3RydWN0b3IpLCBtX3BEZXN0cnVjdG9yKHBEZXN0cnVjdG9yKSxtX2JTZXRBc0dsb2JhbE9iamVjdChGQUxTRSkKKwkgIG9iak5hbWUoc09iak5hbWUpLCBvYmpUeXBlKGVPYmpUeXBlKSwgbV9wQ29uc3RydWN0b3IocENvbnN0cnVjdG9yKSwgbV9wRGVzdHJ1Y3RvcihwRGVzdHJ1Y3RvciksbV9iU2V0QXNHbG9iYWxPYmplY3QoZmFsc2UpCiAJICB7CiAJCSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAJCSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKQEAgLTU0LDcgKzU0LDcgQEAKIAkJIC8vRG9jdW1lbnQgYXMgdGhlIGdsb2JhbCBvYmplY3QuCiAJCSAgaWYoRlhTWVNfd2NzY21wKHNPYmpOYW1lLCBMIkRvY3VtZW50IikgPT0gMCkKIAkJICB7Ci0JCQkgbV9iU2V0QXNHbG9iYWxPYmplY3QgPSBUUlVFOworCQkJIG1fYlNldEFzR2xvYmFsT2JqZWN0ID0gdHJ1ZTsKIAkJICB9CiAKIAkgIH0KQEAgLTY4LDcgKzY4LDcgQEAKIAlGWEpTT0JKVFlQRSBvYmpUeXBlOwogCUxQX0NPTlNUUlVDVE9SIG1fcENvbnN0cnVjdG9yOwogCUxQX0RFU1RSVUNUT1IgbV9wRGVzdHJ1Y3RvcjsKLQlGWF9CT09MCW1fYlNldEFzR2xvYmFsT2JqZWN0OworCWJvb2wJbV9iU2V0QXNHbG9iYWxPYmplY3Q7CiAKIAl2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT4gbV9vYmpUZW1wbGF0ZTsKIAl2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IG1fU3RhdGljT2JqOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCmluZGV4IDg0OTYyMjguLjE3MTJiZDIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9CdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBDUFdMX0J1dHRvbjo6Q1BXTF9CdXR0b24oKSA6Ci0JbV9iTW91c2VEb3duKEZBTFNFKQorCW1fYk1vdXNlRG93bihmYWxzZSkKIHsKIH0KIApAQCAtMzEsMjMgKzMxLDIzIEBACiAJY3AuZUN1cnNvclR5cGUgPSBGWENUX0hBTkQ7CiB9CiAKLUZYX0JPT0wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKKwltX2JNb3VzZURvd24gPSB0cnVlOwogCVNldENhcHR1cmUoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAogCVJlbGVhc2VDYXB0dXJlKCk7Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9DYXJldC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAppbmRleCA4NGE4YjNkLi5kZWNjZjA2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcApAQCAtMTYsNyArMTYsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBDUFdMX0NhcmV0OjpDUFdMX0NhcmV0KCkgOgotCW1fYkZsYXNoKEZBTFNFKSwKKwltX2JGbGFzaChmYWxzZSksCiAJbV9wdEhlYWQoMCwwKSwKIAltX3B0Rm9vdCgwLDApLAogCW1fZldpZHRoKDAuNGYpLApAQCAtMTM1LDcgKzEzNSw3IEBACiAJCQltX3B0SGVhZC55KTsKIH0KIAotdm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQordm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChib29sIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQogewogCWlmIChiVmlzaWJsZSkKIAl7CkBAIC0xNDcsOSArMTQ3LDkgQEAKIAkJCQltX3B0SGVhZCA9IHB0SGVhZDsKIAkJCQltX3B0Rm9vdCA9IHB0Rm9vdDsKIAotCQkJCW1fYkZsYXNoID0gVFJVRTsKLQkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksRkFMU0UsVFJVRSk7Ci0JCQkJTW92ZShtX3JjSW52YWxpZCwgRkFMU0UsIFRSVUUpOworCQkJCW1fYkZsYXNoID0gdHJ1ZTsKKwkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksZmFsc2UsdHJ1ZSk7CisJCQkJTW92ZShtX3JjSW52YWxpZCwgZmFsc2UsIHRydWUpOwogCQkJfQogCQl9CiAJCWVsc2UKQEAgLTE2MCwxMSArMTYwLDExIEBACiAJCQlFbmRUaW1lcigpOwogCQkJQmVnaW5UaW1lcihQV0xfQ0FSRVRfRkxBU0hJTlRFUlZBTCk7CiAKLQkJCUNQV0xfV25kOjpTZXRWaXNpYmxlKFRSVUUpOwotCQkJbV9iRmxhc2ggPSBUUlVFOworCQkJQ1BXTF9XbmQ6OlNldFZpc2libGUodHJ1ZSk7CisJCQltX2JGbGFzaCA9IHRydWU7CiAKLQkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxGQUxTRSxUUlVFKTsKLQkJCU1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKKwkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxmYWxzZSx0cnVlKTsKKwkJCU1vdmUobV9yY0ludmFsaWQsIGZhbHNlLCB0cnVlKTsKIAkJfQogCX0KIAllbHNlCkBAIC0xNzIsMTEgKzE3MiwxMSBAQAogCQltX3B0SGVhZCA9IENQREZfUG9pbnQoMCwgMCk7CiAJCW1fcHRGb290ID0gQ1BERl9Qb2ludCgwLCAwKTsKIAotCQltX2JGbGFzaCA9IEZBTFNFOworCQltX2JGbGFzaCA9IGZhbHNlOwogCQlpZiAoSXNWaXNpYmxlKCkpCiAJCXsKIAkJCUVuZFRpbWVyKCk7Ci0JCQlDUFdMX1duZDo6U2V0VmlzaWJsZShGQUxTRSk7CisJCQlDUFdMX1duZDo6U2V0VmlzaWJsZShmYWxzZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCmluZGV4IGY1YzhhODEuLjZjNWRkNTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCkBAIC0yMiwxNCArMjIsMTQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NCTGlzdEJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfQ0JMaXN0Qm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogICAgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCxuRmxhZyk7CiAKICAgICBpZiAobV9iTW91c2VEb3duKQogICAgIHsKICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgICAgICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwogCiAgICAgICAgIGlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkKICAgICAgICAgewpAQCAtMzgsMjMgKzM4LDIzIEBACiAgICAgICAgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsUFdMX01BS0VEV09SRChwb2ludC54LHBvaW50LnkpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotICAgICAgICAgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LCBuRmxhZyk7Ci0gICAgICAgICAgICBpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKKyAgICAgICAgICAgIE9uTm90aWZ5U2VsQ2hhbmdlZChmYWxzZSxiRXhpdCwgbkZsYWcpOworICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0NCTGlzdEJveDo6T25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9DQkxpc3RCb3g6Ok9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIGJvb2wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0gICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CiAKICAgICBzd2l0Y2ggKG5DaGFyKQogICAgIHsKICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIEZXTF9WS0VZX1VwOgogICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKICAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CkBAIC04OCwyNSArODgsMjUgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsIG5GbGFnKTsKKyAgICBPbk5vdGlmeVNlbENoYW5nZWQodHJ1ZSxiRXhpdCwgbkZsYWcpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfQ0JMaXN0Qm94OjpPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBib29sICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSkpIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UGFyZW50V2luZG93KCkpCiAgICAgewogICAgICAgICBwQ29tYm9Cb3gtPlNldFNlbGVjdFRleHQoKTsKICAgICB9CiAKLSAgICBPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSxiRXhpdCxuRmxhZyk7CisgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKHRydWUsYkV4aXQsbkZsYWcpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9DQkJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCkBAIC0xODgsMTYgKzE4OCwxNiBAQAogICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLFBXTF9NQUtFRFdPUkQocG9pbnQueCxwb2ludC55KSk7CiAgICAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAogICAgIFJlbGVhc2VDYXB0dXJlKCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NvbWJvQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIwNSw3ICsyMDUsNyBAQAogQ1BXTF9Db21ib0JveDo6Q1BXTF9Db21ib0JveCgpIDogbV9wRWRpdChOVUxMKSwKICAgICBtX3BCdXR0b24oTlVMTCksCiAgICAgbV9wTGlzdChOVUxMKSwKLSAgICBtX2JQb3B1cChGQUxTRSksCisgICAgbV9iUG9wdXAoZmFsc2UpLAogICAgIG1fblBvcHVwV2hlcmUoMCksCiAgICAgbV9uU2VsZWN0SXRlbSgtMSksCiAgICAgbV9wRmlsbGVyTm90aWZ5KE5VTEwpCkBAIC0yMzEsNyArMjMxLDcgQEAKIAogdm9pZCBDUFdMX0NvbWJvQm94OjpLaWxsRm9jdXMoKQogewotICAgIFNldFBvcHVwKEZBTFNFKTsKKyAgICBTZXRQb3B1cChmYWxzZSk7CiAgICAgQ1BXTF9XbmQ6OktpbGxGb2N1cygpOwogfQogCkBAIC00MzksMTUgKzQzOSwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1fcEJ1dHRvbikKLSAgICAgICAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbixUUlVFLEZBTFNFKTsKKyAgICAgICAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbix0cnVlLGZhbHNlKTsKIAogICAgICAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LFRSVUUsRkFMU0UpOworICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsdHJ1ZSxmYWxzZSk7CiAKICAgICAgICAgaWYgKG1fcExpc3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoVFJVRSk7Ci0gICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCxUUlVFLEZBTFNFKTsKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCx0cnVlLGZhbHNlKTsKICAgICAgICAgICAgIG1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9uU2VsZWN0SXRlbSk7CiAgICAgICAgIH0KICAgICB9CkBAIC00NjEsNyArNDYxLDcgQEAKICAgICAgICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0NsaWVudC5sZWZ0OwogCiAgICAgICAgIGlmIChtX3BCdXR0b24pCi0gICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sVFJVRSxGQUxTRSk7CisgICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sdHJ1ZSxmYWxzZSk7CiAKICAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OwogICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKQEAgLTQ3MywxMCArNDczLDEwIEBACiAgICAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKIAogICAgICAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LFRSVUUsRkFMU0UpOworICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsdHJ1ZSxmYWxzZSk7CiAKICAgICAgICAgaWYgKG1fcExpc3QpCi0gICAgICAgICAgICBtX3BMaXN0LT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoZmFsc2UpOwogICAgIH0KIH0KIApAQCAtNDkxLDcgKzQ5MSw3IEBACiAgICAgcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldFBvcHVwKEZYX0JPT0wgYlBvcHVwKQordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRQb3B1cChib29sIGJQb3B1cCkKIHsKICAgICBpZiAoIW1fcExpc3QpIHJldHVybjsKICAgICBpZiAoYlBvcHVwID09IG1fYlBvcHVwKSByZXR1cm47CkBAIC01MjgsMjEgKzUyOCwyMSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1fblBvcHVwV2hlcmUgPSBuV2hlcmU7Ci0gICAgICAgICAgICAgICAgTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICAgICAgTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgbV9iUG9wdXAgPSBiUG9wdXA7Ci0gICAgICAgIE1vdmUobV9yY09sZFdpbmRvdywgVFJVRSwgVFJVRSk7CisgICAgICAgIE1vdmUobV9yY09sZFdpbmRvdywgdHJ1ZSwgdHJ1ZSk7CiAgICAgfQogfQogCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9Db21ib0JveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghbV9wRWRpdCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOworICAgIGlmICghbV9wRWRpdCkgcmV0dXJuIGZhbHNlOwogCiAgICAgbV9uU2VsZWN0SXRlbSA9IC0xOwogCkBAIC01NTEsNDcgKzU1MSw0NyBAQAogICAgIGNhc2UgRldMX1ZLRVlfVXA6CiAgICAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA+IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtX3BMaXN0LT5PbktleURvd25XaXRoRXhpdChuQ2hhcixiRXhpdCxuRmxhZykpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBjYXNlIEZXTF9WS0VZX0Rvd246CiAgICAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA8IG1fcExpc3QtPkdldENvdW50KCkgLSAxKQogICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgICAgICAgICBib29sIGJFeGl0ID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgICAgICByZXR1cm4gbV9wRWRpdC0+T25LZXlEb3duKG5DaGFyLG5GbGFnKTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Db21ib0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0NvbWJvQm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgaWYgKCFtX3BMaXN0KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICghbV9wRWRpdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBtX25TZWxlY3RJdGVtID0gLTE7CiAgICAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgICAgICByZXR1cm4gbV9wRWRpdC0+T25DaGFyKG5DaGFyLG5GbGFnKTsKIAotICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLSAgICByZXR1cm4gbV9wTGlzdC0+T25DaGFyV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpID8gYkV4aXQgOiBGQUxTRTsKKyAgICBib29sIGJFeGl0ID0gZmFsc2U7CisgICAgcmV0dXJuIG1fcExpc3QtPk9uQ2hhcldpdGhFeGl0KG5DaGFyLGJFeGl0LG5GbGFnKSA/IGJFeGl0IDogZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9Db21ib0JveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCkBAIC02MTMsNyArNjEzLDcgQEAKICAgICAgICAgICAgICAgICBTZXRTZWxlY3RUZXh0KCk7CiAgICAgICAgICAgICAgICAgU2VsZWN0QWxsKCk7CiAgICAgICAgICAgICAgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICBTZXRQb3B1cChGQUxTRSk7CisgICAgICAgICAgICAgICAgU2V0UG9wdXAoZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIyLDcgKzYyMiw3IEBACiAgICAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsbXNnLHdQYXJhbSxsUGFyYW0pOwogfQogCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzUG9wdXAoKSBjb25zdAorYm9vbCBDUFdMX0NvbWJvQm94OjpJc1BvcHVwKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9iUG9wdXA7CiB9CkBAIC02MzcsNyArNjM3LDcgQEAKICAgICBtX25TZWxlY3RJdGVtID0gbV9wTGlzdC0+R2V0Q3VyU2VsKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Db21ib0JveDo6SXNNb2RpZmllZCgpIGNvbnN0Citib29sIENQV0xfQ29tYm9Cb3g6OklzTW9kaWZpZWQoKSBjb25zdAogewogICAgIHJldHVybiBtX3BFZGl0LT5Jc01vZGlmaWVkKCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcAppbmRleCA1OGQ4YTc5Li4zMDNhZTk2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKQEAgLTE5LDE0ICsxOSwxNCBAQAogCiBDUFdMX0VkaXQ6OkNQV0xfRWRpdCgpIDogbV9wRmlsbGVyTm90aWZ5KE5VTEwpLAogCW1fcFNwZWxsQ2hlY2soTlVMTCksCi0JbV9iRm9jdXMoRkFMU0UpCisJbV9iRm9jdXMoZmFsc2UpCiB7CiAJbV9wRm9ybUZpbGxlciA9IE5VTEw7CiB9CiAKIENQV0xfRWRpdDo6fkNQV0xfRWRpdCgpCiB7Ci0JQVNTRVJUKG1fYkZvY3VzID09IEZBTFNFKTsKKwlBU1NFUlQobV9iRm9jdXMgPT0gZmFsc2UpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldENsYXNzTmFtZSgpIGNvbnN0CkBAIC00OSw3ICs0OSw3IEBACiAJCWlmIChDWE1MX0VsZW1lbnQgKiBwWE1MID0gQ1hNTF9FbGVtZW50OjpQYXJzZShzVmFsdWUuY19zdHIoKSwgc1ZhbHVlLkdldExlbmd0aCgpKSkKIAkJewogCQkJaW50MzJfdCBuQ291bnQgPSBwWE1MLT5Db3VudENoaWxkcmVuKCk7Ci0JCQlGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisJCQlib29sIGJGaXJzdCA9IHRydWU7CiAKIAkJCXN3VGV4dC5FbXB0eSgpOwogCkBAIC02Nyw3ICs2Nyw3IEBACiAJCQkJCQkJc3dTZWN0aW9uICs9IHBTdWJFbGVtZW50LT5HZXRDb250ZW50KGopOwogCQkJCQkJfQogCi0JCQkJCQlpZiAoYkZpcnN0KWJGaXJzdCA9IEZBTFNFOworCQkJCQkJaWYgKGJGaXJzdCliRmlyc3QgPSBmYWxzZTsKIAkJCQkJCWVsc2UKIAkJCQkJCQlzd1RleHQgKz0gRldMX1ZLRVlfUmV0dXJuOwogCQkJCQkJc3dUZXh0ICs9IHN3U2VjdGlvbjsKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3cucmlnaHQgKyBQV0xfU0NST0xMQkFSX1dJRFRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjV2luZG93LnRvcCk7Ci0gICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCBUUlVFLCBGQUxTRSk7CisgICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCB0cnVlLCBmYWxzZSk7CiAgICAgfQogCiAJaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKQEAgLTExNCwzOSArMTE0LDM5IEBACiAJcmV0dXJuIHJjQ2xpZW50OwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0LCBib29sIGJQYWludC8qID0gdHJ1ZSovKQogewogCW1fcEVkaXQtPlNldEFsaWdubWVudEgoKGludDMyX3QpbkZvcm1hdCwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCit2b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKIAltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKChpbnQzMl90KW5Gb3JtYXQsIGJQYWludCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5TZWxlY3RBbGwoKSBjb25zdAorYm9vbAlDUFdMX0VkaXQ6OkNhblNlbGVjdEFsbCgpIGNvbnN0CiB7CiAJcmV0dXJuICBHZXRTZWxlY3RXb3JkUmFuZ2UoKSAhPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ2xlYXIoKSBjb25zdAorYm9vbAlDUFdMX0VkaXQ6OkNhbkNsZWFyKCkgY29uc3QKIHsKIAlyZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5Jc1NlbGVjdGVkKCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QKK2Jvb2wJQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QKIHsKIAlyZXR1cm4gCSFIYXNGbGFnKFBFU19QQVNTV09SRCkgJiYgIUhhc0ZsYWcoUEVTX05PUkVBRCkgJiYgbV9wRWRpdC0+SXNTZWxlY3RlZCgpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ3V0KCkgY29uc3QKK2Jvb2wJQ1BXTF9FZGl0OjpDYW5DdXQoKSBjb25zdAogewogCXJldHVybiAJQ2FuQ29weSgpICYmICFJc1JlYWRPbmx5KCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5QYXN0ZSgpIGNvbnN0Citib29sCUNQV0xfRWRpdDo6Q2FuUGFzdGUoKSBjb25zdAogewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKKwlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gZmFsc2U7CiAKIAlDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKIAlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKQEAgLTE3NSwxMyArMTc1LDEzIEBACiAKIAlpZiAobV9wRmlsbGVyTm90aWZ5KQogCXsKLQkJRlhfQk9PTCBiUkMgPSBUUlVFOwotCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisJCWJvb2wgYlJDID0gdHJ1ZTsKKwkJYm9vbCBiRXhpdCA9IGZhbHNlOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAkJaW50IG5TZWxTdGFydCA9IDA7CiAJCWludCBuU2VsRW5kID0gMDsKIAkJR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7Ci0JCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIDAgLCBzd0NsaXBib2FyZCwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgMCk7CisJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIDAgLCBzd0NsaXBib2FyZCwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwgYlJDLCBiRXhpdCwgMCk7CiAJCWlmICghYlJDKSByZXR1cm47CiAJCWlmIChiRXhpdCkgcmV0dXJuOwogCX0KQEAgLTE5NCw4ICsxOTQsOCBAQAogCiAJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAl7Ci0JCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwwKTsKKwkJYm9vbCBiRXhpdCA9IGZhbHNlOworCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LDApOwogCQlpZiAoYkV4aXQpIHJldHVybjsKIAl9CiB9CkBAIC0yMjcsNTIgKzIyNyw1MiBAQAogCW1fcmNPbGRXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAKIAltX3BFZGl0LT5TZXRPcHJOb3RpZnkodGhpcyk7Ci0JbV9wRWRpdC0+RW5hYmxlT3ByTm90aWZ5KFRSVUUpOworCW1fcEVkaXQtPkVuYWJsZU9wck5vdGlmeSh0cnVlKTsKIH0KIAogdm9pZCBDUFdMX0VkaXQ6OlNldFBhcmFtQnlGbGFnKCkKIHsKIAlpZiAoSGFzRmxhZyhQRVNfUklHSFQpKQogCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgyLCBGQUxTRSk7CisJCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMiwgZmFsc2UpOwogCX0KIAllbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKQogCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBGQUxTRSk7CisJCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMSwgZmFsc2UpOwogCX0KIAllbHNlCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDAsIEZBTFNFKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwLCBmYWxzZSk7CiAJfQogCiAJaWYgKEhhc0ZsYWcoUEVTX0JPVFRPTSkpCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDIsIEZBTFNFKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigyLCBmYWxzZSk7CiAJfQogCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpCiAJewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIEZBTFNFKTsKKwkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigxLCBmYWxzZSk7CiAJfQogCWVsc2UKIAl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMCwgRkFMU0UpOworCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIGZhbHNlKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfUEFTU1dPUkQpKQogCXsKLQkJbV9wRWRpdC0+U2V0UGFzc3dvcmRDaGFyKCcqJywgRkFMU0UpOworCQltX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBmYWxzZSk7CiAJfQogCi0JbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIEZBTFNFKTsKLQltX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBGQUxTRSk7Ci0JbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSksIEZBTFNFKTsKLQltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBGQUxTRSk7CisJbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIGZhbHNlKTsKKwltX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBmYWxzZSk7CisJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSksIGZhbHNlKTsKKwltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBmYWxzZSk7CiAJbV9wRWRpdC0+RW5hYmxlVW5kbyhIYXNGbGFnKFBFU19VTkRPKSk7CiAKIAlpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKIAl7CiAJCVNldENsaXBSZWN0KENQREZfUmVjdCgwLjBmLDAuMGYsMC4wZiwwLjBmKSk7Ci0JCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFLCBGQUxTRSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlLCBmYWxzZSk7CiAJfQogCWVsc2UKIAl7CkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJY2FzZSBQQlNfU09MSUQ6CiAJCQl7CiAJCQkJc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxGQUxTRSkgPDwgIiAyIEogMCBqXG4iOworCQkJCQk8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJDb2xvcigpLGZhbHNlKSA8PCAiIDIgSiAwIGpcbiI7CiAKIAkJCQlmb3IgKGludDMyX3QgaT0xO2k8bkNoYXJBcnJheTtpKyspCiAJCQkJewpAQCAtMzIwLDcgKzMyMCw3IEBACiAJCWNhc2UgUEJTX0RBU0g6CiAJCQl7CiAJCQkJc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxGQUxTRSkgPDwgIiAyIEogMCBqXG4iCisJCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksZmFsc2UpIDw8ICIgMiBKIDAgalxuIgogCQkJCQk8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIgogCQkJCQk8PCBHZXRCb3JkZXJEYXNoKCkubkdhcCA8PCAiXSAiCiAJCQkJCTw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOwpAQCAtMzgzLDcgKzM4Myw3IEBACiAJewogCQlDRlhfQnl0ZVN0cmluZyBzU3BlbGxDaGVjayA9IENQV0xfVXRpbHM6OkdldFNwZWxsQ2hlY2tBcHBTdHJlYW0obV9wRWRpdCwgbV9wU3BlbGxDaGVjaywgcHRPZmZzZXQsICZ3clZpc2libGUpOwogCQlpZiAoc1NwZWxsQ2hlY2suR2V0TGVuZ3RoKCkgPiAwKQotCQkJc1RleHQgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDEsMCwwKSxGQUxTRSkgPDwgc1NwZWxsQ2hlY2s7CisJCQlzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMSwwLDApLGZhbHNlKSA8PCBzU3BlbGxDaGVjazsKIAl9CiAKIAlpZiAoc1RleHQuR2V0TGVuZ3RoKCkgPiAwKQpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAJfQogfQogCi1GWF9CT09MIENQV0xfRWRpdDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0VkaXQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKQEAgLTQ5NiwxNiArNDk2LDE2IEBACiAJCWlmIChtX2JNb3VzZURvd24pCiAJCQlJbnZhbGlkYXRlUmVjdCgpOwogCi0JCW1fYk1vdXNlRG93biA9IFRSVUU7CisJCW1fYk1vdXNlRG93biA9IHRydWU7CiAJCVNldENhcHR1cmUoKTsKIAogCQltX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCxJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRibENsayhwb2ludCwgbkZsYWcpOwogCkBAIC01MTQsNyArNTE0LDcgQEAKIAkJbV9wRWRpdC0+U2VsZWN0QWxsKCk7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKICNkZWZpbmUgV01fUFdMRURJVF9VTkRPCQkJCQkweDAxCkBAIC01MjYsMTYgKzUyNiwxNiBAQAogI2RlZmluZSBXTV9QV0xFRElUX1NFTEVDVEFMTAkJCTB4MDcKICNkZWZpbmUgV01fUFdMRURJVF9TVUdHRVNUCQkJCTB4MDgKIAotRlhfQk9PTCBDUFdMX0VkaXQ6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdDo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKLQlpZiAobV9iTW91c2VEb3duKSByZXR1cm4gRkFMU0U7CisJaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIGZhbHNlOwogCiAJQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiAKLQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gVFJVRTsKKwlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gdHJ1ZTsKIAogCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JaWYgKCFwU0gpIHJldHVybiBGQUxTRTsKKwlpZiAoIXBTSCkgcmV0dXJuIGZhbHNlOwogCiAJU2V0Rm9jdXMoKTsKIApAQCAtNTQzLDcgKzU0Myw3IEBACiAJQ0ZYX1dpZGVTdHJpbmcgc3dMYXRpbiA9IG1fcEVkaXQtPkdldFJhbmdlVGV4dCh3ckxhdGluKTsKIAogCUZYX0hNRU5VIGhQb3B1cCA9IHBTSC0+Q3JlYXRlUG9wdXBNZW51KCk7Ci0JaWYgKCFoUG9wdXApIHJldHVybiBGQUxTRTsKKwlpZiAoIWhQb3B1cCkgcmV0dXJuIGZhbHNlOwogCiAJQ0ZYX0J5dGVTdHJpbmdBcnJheSBzU3VnZ2VzdFdvcmRzOwogCUNQREZfUG9pbnQgcHRQb3B1cCA9IHBvaW50OwpAQCAtNTg3LDkgKzU4Nyw5IEBACiAJCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCAwLCBMIiIpOwogCiAJCWlmICghbV9wRWRpdC0+Q2FuVW5kbygpKQotCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgRkFMU0UpOworCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgZmFsc2UpOwogCQlpZiAoIW1fcEVkaXQtPkNhblJlZG8oKSkKLQkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIEZBTFNFKTsKKwkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIGZhbHNlKTsKIAl9CiAKIAlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsCkBAIC02MDMsMzIgKzYwMywzMiBAQAogCiAJQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFNILT5HZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpKTsKIAlpZiAoc3dUZXh0LklzRW1wdHkoKSkKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIEZBTFNFKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIGZhbHNlKTsKIAogCWlmICghbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQogCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwgZmFsc2UpOwogCX0KIAogCWlmIChJc1JlYWRPbmx5KCkpCiAJewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1BBU1RFLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIGZhbHNlKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIGZhbHNlKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfUEFTU1dPUkQpKQogCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKKwkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBmYWxzZSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIGZhbHNlKTsKIAl9CiAKIAlpZiAoSGFzRmxhZyhQRVNfTk9SRUFEKSkKIAl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBGQUxTRSk7CisJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgZmFsc2UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBmYWxzZSk7CiAJfQogCiAJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7CkBAIC02MzcsNyArNjM3LDcgQEAKIAogCWlmIChtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCkgPT0gMCkKIAl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwgRkFMU0UpOworCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TRUxFQ1RBTEwsIGZhbHNlKTsKIAl9CiAKIAlpbnQzMl90IHgsIHk7CkBAIC02OTksMTIgKzY5OSwxMiBAQAogCiAJcFNILT5EZXN0cm95TWVudShoUG9wdXApOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0OjpPblNldEZvY3VzKCkKIHsKLQlTZXRFZGl0Q2FyZXQoVFJVRSk7CisJU2V0RWRpdENhcmV0KHRydWUpOwogCiAJaWYgKCFJc1JlYWRPbmx5KCkpCiAJewpAQCAtNzEyLDE1ICs3MTIsMTUgQEAKIAkJCXBGb2N1c0hhbmRsZXItPk9uU2V0Rm9jdXModGhpcyk7CiAJfQogCi0JbV9iRm9jdXMgPSBUUlVFOworCW1fYkZvY3VzID0gdHJ1ZTsKIH0KIAogdm9pZCBDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKIHsKLQlTaG93VlNjcm9sbEJhcihGQUxTRSk7CisJU2hvd1ZTY3JvbGxCYXIoZmFsc2UpOwogCiAJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCVNldENhcmV0KEZBTFNFLCBDUERGX1BvaW50KDAuMGYsMC4wZiksIENQREZfUG9pbnQoMC4wZiwwLjBmKSk7CisJU2V0Q2FyZXQoZmFsc2UsIENQREZfUG9pbnQoMC4wZiwwLjBmKSwgQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKIAogCVNldENoYXJTZXQoMCk7CiAKQEAgLTczMCwyMCArNzMwLDIwIEBACiAJCQlwRm9jdXNIYW5kbGVyLT5PbktpbGxGb2N1cyh0aGlzKTsKIAl9CiAKLQltX2JGb2N1cyA9IEZBTFNFOworCW1fYkZvY3VzID0gZmFsc2U7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQordm9pZCBDUFdMX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAJbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUsIGJQYWludCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgYm9vbCBiUGFpbnQvKiA9IHRydWUqLykKIHsKIAltX3BFZGl0LT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIGJvb2wgYlBhaW50LyogPSB0cnVlKi8pCiB7CiAJbV9wRWRpdC0+U2V0TGluZUxlYWRpbmcoZkxpbmVMZWFkaW5nLCBiUGFpbnQpOwogfQpAQCAtODEzLDcgKzgxMyw3IEBACiAJcmV0dXJuIHB0OwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0Citib29sCUNQV0xfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0CiB7CiAJcmV0dXJuIG1fcEVkaXQtPklzVGV4dEZ1bGwoKTsKIH0KQEAgLTg0MCw3ICs4NDAsNyBAQAogCWlmIChIYXNGbGFnKFBFU19DSEFSQVJSQVkpICYmIG5DaGFyQXJyYXkgPiAwKQogCXsKIAkJbV9wRWRpdC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3coVFJVRSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlKTsKIAogCQlpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKIAkJewpAQCAtODQ5LDcgKzg0OSw3IEBACiAJCQkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKHBGb250TWFwLT5HZXRQREZGb250KDApLCBHZXRDbGllbnRSZWN0KCksIG5DaGFyQXJyYXkpOwogCQkJCWlmIChmRm9udFNpemUgPiAwLjBmKQogCQkJCXsKLQkJCQkJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEZBTFNFKTsKKwkJCQkJbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKGZhbHNlKTsKIAkJCQkJbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIAkJCQl9CiAJCQl9CkBAIC04NzMsNyArODczLDcgQEAKIAlyZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KQordm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpCiB7CiAJaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CkBAIC04ODEsMzUgKzg4MSwzNSBAQAogCQl7CiAJCQlpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKQogCQkJewotCQkJCXBTY3JvbGwtPlNldFZpc2libGUoVFJVRSk7CisJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZSh0cnVlKTsKIAkJCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAJCQkJbV9yY09sZFdpbmRvdyA9IHJjV2luZG93OwogCQkJCXJjV2luZG93LnJpZ2h0ICs9IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCQkJTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7CisJCQkJTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7CiAJCQl9CiAJCX0KIAkJZWxzZQogCQl7CiAJCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCQkJTW92ZShtX3JjT2xkV2luZG93LCBUUlVFLCBUUlVFKTsKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlNb3ZlKG1fcmNPbGRXaW5kb3csIHRydWUsIHRydWUpOwogCQkJfQogCQl9CiAJfQogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0Citib29sCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0CiB7CiAJaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CiAJCXJldHVybiBwU2Nyb2xsLT5Jc1Zpc2libGUoKTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENQV0xfRWRpdDo6RW5hYmxlU3BlbGxDaGVjayhGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUFdMX0VkaXQ6OkVuYWJsZVNwZWxsQ2hlY2soYm9vbCBiRW5hYmxlZCkKIHsKIAlpZiAoYkVuYWJsZWQpCiAJCUFkZEZsYWcoUEVTX1NQRUxMQ0hFQ0spOwpAQCAtOTE3LDE2ICs5MTcsMTYgQEAKIAkJUmVtb3ZlRmxhZyhQRVNfU1BFTExDSEVDSyk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworCWlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOwogCiAJaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkKIAl7CiAJCWlmIChtX3BGaWxsZXJOb3RpZnkpCiAJCXsKLQkJCUZYX0JPT0wgYlJDID0gVFJVRTsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKwkJCWJvb2wgYlJDID0gdHJ1ZTsKKwkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKIAkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZTsKIAkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwogCkBAIC05MzYsMjcgKzkzNiwyNyBAQAogCiAJCQlpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCiAJCQkJblNlbEVuZCA9IG5TZWxTdGFydCArIDE7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBGV0xfVktFWV9EZWxldGUsIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQkJaWYgKCFiUkMpIHJldHVybiBGQUxTRTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZSh0cnVlLCBHZXRBdHRhY2hlZERhdGEoKSwgRldMX1ZLRVlfRGVsZXRlLCBzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIHRydWUsIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJCWlmICghYlJDKSByZXR1cm4gZmFsc2U7CisJCQlpZiAoYkV4aXQpIHJldHVybiBmYWxzZTsKIAkJfQogCX0KIAotCUZYX0JPT0wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihuQ2hhciwgIG5GbGFnKTsKKwlib29sIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbktleURvd24obkNoYXIsICBuRmxhZyk7CiAKIAlpZiAobkNoYXIgPT0gRldMX1ZLRVlfRGVsZXRlKQogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAkJewotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKwkJCWJvb2wgYkV4aXQgPSBmYWxzZTsKKwkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZSh0cnVlLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOworCQkJaWYgKGJFeGl0KSByZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAKIAkvL0luIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgogCWlmKElzUHJvY2VlZHRvT25DaGFyKG5DaGFyLCBuRmxhZykpCi0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGJSZXQ7CiB9CkBAIC05NjUsMTEgKzk2NSwxMSBAQAogKkluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgogKklmIHRoZSBldmVudCBpcyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2ggaXMgbm90IHRoZSBjb250cm9sIG1lYW5zIHRvIGRvLgogKi8KLUZYX0JPT0wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykKIHsKIAotCUZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKLQlGWF9CT09MIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOworCWJvb2wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKKwlib29sIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOwogCWlmKGJDdHJsICYmICFiQWx0KQogCXsKIAkvL2hvdCBrZXlzIGZvciBlZGl0IGNvbnRyb2wuCkBAIC05ODAsNyArOTgwLDcgQEAKIAkJY2FzZSAnWCc6CiAJCWNhc2UgJ0EnOgogCQljYXNlICdaJzoKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtOTkyLDIyICs5OTIsMjIgQEAKIAljYXNlIEZXTF9WS0VZX0JhY2s6CiAJY2FzZSBGV0xfVktFWV9SZXR1cm46CiAJY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogCiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworCWlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOwogCi0JRlhfQk9PTCBiUkMgPSBUUlVFOwotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKwlib29sIGJSQyA9IHRydWU7CisJYm9vbCBiRXhpdCA9IGZhbHNlOwogCi0JRlhfQk9PTCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOworCWJvb2wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKIAlpZiAoIWJDdHJsKQogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKQEAgLTEwMzYsMTIgKzEwMzYsMTIgQEAKIAkJCX0KIAogCQkJQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBuS2V5Q29kZSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIFRSVUUsIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIG5LZXlDb2RlLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwgYlJDLCBiRXhpdCwgbkZsYWcpOwogCQl9CiAJfQogCi0JaWYgKCFiUkMpIHJldHVybiBUUlVFOwotCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCWlmICghYlJDKSByZXR1cm4gdHJ1ZTsKKwlpZiAoYkV4aXQpIHJldHVybiBmYWxzZTsKIAogCWlmIChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCiAJewpAQCAtMTA1MiwyMSArMTA1MiwyMSBAQAogCQkJU2V0Q2hhclNldChuTmV3Q2hhclNldCk7CiAJCX0KIAl9Ci0JRlhfQk9PTCBiUmV0ID0gQ1BXTF9FZGl0Q3RybDo6T25DaGFyKG5DaGFyLG5GbGFnKTsKKwlib29sIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCiAJaWYgKCFiQ3RybCkKIAl7CiAJCWlmIChtX3BGaWxsZXJOb3RpZnkpCiAJCXsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CisJCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UodHJ1ZSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LG5GbGFnKTsKKwkJCWlmIChiRXhpdCkgcmV0dXJuIGZhbHNlOwogCQl9CiAJfQogCiAJcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0VkaXQ6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJaWYgKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpCiAJewpAQCAtMTA4MiwxMCArMTA4MiwxMCBAQAogCQl9CiAJCVNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CiAKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKQEAgLTEyMDUsMjIgKzEyMDUsMjIgQEAKIAogQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0CiB7Ci0JcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShwb2ludCksIFRSVUUsIEZBTFNFKTsKKwlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UobV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKHBvaW50KSwgdHJ1ZSwgZmFsc2UpOwogfQogCiBDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldExhdGluV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAogewotCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgVFJVRSwgRkFMU0UpOworCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgdHJ1ZSwgZmFsc2UpOwogfQogCiBDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldEFyYWJpY1dvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKIHsKLQlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIEZBTFNFLCBUUlVFKTsKKwlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIGZhbHNlLCB0cnVlKTsKIH0KIAogI2RlZmluZSBQV0xfSVNBUkFCSUNXT1JEKHdvcmQpICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiTGF0aW4sIEZYX0JPT0wgYkFyYWJpYykgY29uc3QKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgYm9vbCBiTGF0aW4sIGJvb2wgYkFyYWJpYykgY29uc3QKIHsKIAlDUFZUX1dvcmRSYW5nZSByYW5nZTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAppbmRleCAwZDE0NTg3Li4xMWUxZmU3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcApAQCAtMjIsNyArMjIsNyBAQAogQ1BXTF9FZGl0Q3RybDo6Q1BXTF9FZGl0Q3RybCgpIDoKICAgICBtX3BFZGl0KE5VTEwpLAogICAgIG1fcEVkaXRDYXJldChOVUxMKSwKLSAgICBtX2JNb3VzZURvd24oRkFMU0UpLAorICAgIG1fYk1vdXNlRG93bihmYWxzZSksCiAgICAgbV9wRWRpdE5vdGlmeShOVUxMKSwKICAgICBtX25DaGFyU2V0KERFRkFVTFRfQ0hBUlNFVCksCiAgICAgbV9uQ29kZVBhZ2UoMCkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBtX3BFZGl0LT5Jbml0aWFsaXplKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKIHsKICAgICBDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwogICAgIENQREZfUG9pbnQgcG9pbnQxKDAsMSk7CkBAIC0xNjcsMTcgKzE2NywxNyBAQAogICAgIHJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewotICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiB0cnVlOwogCi0gICAgRlhfQk9PTCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CisgICAgYm9vbCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CiAKICAgICAvL0ZJTFRFUgogICAgIHN3aXRjaCAobkNoYXIpCiAgICAgewogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgogICAgIGNhc2UgRldMX1ZLRVlfVXA6CiAgICAgY2FzZSBGV0xfVktFWV9Eb3duOgpAQCAtMjA5LDM1ICsyMDksMzUgQEAKICAgICB7CiAgICAgICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgogICAgICAgICAgICAgRGVsZXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX0luc2VydDoKICAgICAgICAgICAgIGlmIChJc1NISUZUcHJlc3NlZChuRmxhZykpCiAgICAgICAgICAgICAgICAgUGFzdGVUZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBGV0xfVktFWV9Ib21lOgogICAgICAgICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX0VuZDoKICAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEZXTF9WS0VZX1Vua25vd246CiAgICAgICAgICAgICBpZiAoIUlzU0hJRlRwcmVzc2VkKG5GbGFnKSkKICAgICAgICAgICAgICAgICBDbGVhcigpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIEN1dFRleHQoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKLSAgICBpZiAobV9iTW91c2VEb3duKSByZXR1cm4gVFJVRTsKKyAgICBpZiAobV9iTW91c2VEb3duKSByZXR1cm4gdHJ1ZTsKIAogICAgIENQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCkBAIC0yNTYsMTQgKzI1NiwxNCBAQAogICAgIHsKICAgICAgICAgY2FzZSAweDBBOgogICAgICAgICBjYXNlIDB4MUI6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7Ci0gICAgRlhfQk9PTCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKLSAgICBGWF9CT09MIGJTaGlmdCA9IElzU0hJRlRwcmVzc2VkKG5GbGFnKTsKKyAgICBib29sIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgICAgYm9vbCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKKyAgICBib29sIGJTaGlmdCA9IElzU0hJRlRwcmVzc2VkKG5GbGFnKTsKIAogICAgIEZYX1dPUkQgd29yZCA9IG5DaGFyOwogCkBAIC0yNzMsMjkgKzI3MywyOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlICdDJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgQ29weVRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgJ1YnIC0gJ0EnICsgMToKICAgICAgICAgICAgICAgICBQYXN0ZVRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgJ1gnIC0gJ0EnICsgMToKICAgICAgICAgICAgICAgICBDdXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlICdBJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlICdaJyAtICdBJyArIDE6CiAgICAgICAgICAgICAgICAgaWYgKGJTaGlmdCkKICAgICAgICAgICAgICAgICAgICAgUmVkbygpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgVW5kbygpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAobkNoYXIgPCAzMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gdHJ1ZTsKIAogICAgIGlmIChtX3BFZGl0LT5Jc1NlbGVjdGVkKCkgJiYgd29yZCA9PSAgRldMX1ZLRVlfQmFjaykKICAgICAgICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247CkBAIC0zMTksMTAgKzMxOSwxMCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKQEAgLTMzMSwxNiArMzMxLDE2IEBACiAgICAgICAgIGlmIChtX2JNb3VzZURvd24pCiAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCgpOwogCi0gICAgICAgIG1fYk1vdXNlRG93biA9IFRSVUU7CisgICAgICAgIG1fYk1vdXNlRG93biA9IHRydWU7CiAgICAgICAgIFNldENhcHR1cmUoKTsKIAogICAgICAgICBtX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCxJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIApAQCAtMzUxLDIwICszNTEsMjAgQEAKICAgICAgICAgICAgIFNldEZvY3VzKCk7CiAKICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgICAgICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAgICAgQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LG5GbGFnKTsKIAogICAgIGlmIChtX2JNb3VzZURvd24pCi0gICAgICAgIG1fcEVkaXQtPk9uTW91c2VNb3ZlKHBvaW50LEZBTFNFLEZBTFNFKTsKKyAgICAgICAgbV9wRWRpdC0+T25Nb3VzZU1vdmUocG9pbnQsZmFsc2UsZmFsc2UpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIENQREZfUmVjdCBDUFdMX0VkaXRDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRFZGl0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSkKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0RWRpdENhcmV0KGJvb2wgYlZpc2libGUpCiB7CiAgICAgQ1BERl9Qb2ludCBwdEhlYWQoMCwwKSxwdEZvb3QoMCwwKTsKIApAQCAtNDE4LDE4ICs0MTgsMTggQEAKICAgICBQV0x0b1duZChwdEhlYWQsIHgsIHkpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpCit2b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KGJvb2wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QpCiB7CiAgICAgaWYgKG1fcEVkaXRDYXJldCkKICAgICB7CiAgICAgICAgIGlmICghSXNGb2N1c2VkKCkgfHwgbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotICAgICAgICAgICAgYlZpc2libGUgPSBGQUxTRTsKKyAgICAgICAgICAgIGJWaXNpYmxlID0gZmFsc2U7CiAKICAgICAgICAgbV9wRWRpdENhcmV0LT5TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QpOwogICAgIH0KIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpJc01vZGlmaWVkKCkgY29uc3QKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6SXNNb2RpZmllZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fcEVkaXQtPklzTW9kaWZpZWQoKTsKIH0KQEAgLTQ2Niw3ICs0NjYsNyBAQAogICAgICAgICBtX3BFZGl0LT5QYWludCgpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCkKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6RW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKQogewogICAgIGlmIChtX3BFZGl0KQogICAgICAgICBtX3BFZGl0LT5FbmFibGVSZWZyZXNoKGJSZWZyZXNoKTsKQEAgLTU3OCw3ICs1NzgsNyBAQAogewogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpCit2b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpCiB7CiB9CiAKQEAgLTYxMiwxMiArNjEyLDEyIEBACiAgICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZSgpOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6OkNhblVuZG8oKSBjb25zdAorYm9vbCBDUFdMX0VkaXRDdHJsOjpDYW5VbmRvKCkgY29uc3QKIHsKICAgICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5VbmRvKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6Q2FuUmVkbygpIGNvbnN0Citib29sIENQV0xfRWRpdEN0cmw6OkNhblJlZG8oKSBjb25zdAogewogICAgIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPkNhblJlZG8oKTsKIH0KQEAgLTY1MSwxMSArNjUxLDExIEBACiAgICAgaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pCiAgICAgICAgIHx8IElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikpCiAgICAgewotICAgICAgICBTaG93VlNjcm9sbEJhcihGQUxTRSk7CisgICAgICAgIFNob3dWU2Nyb2xsQmFyKGZhbHNlKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgU2hvd1ZTY3JvbGxCYXIoVFJVRSk7CisgICAgICAgIFNob3dWU2Nyb2xsQmFyKHRydWUpOwogICAgIH0KIH0KIApAQCAtNjY0LDcgKzY2NCw3IEBACiAgICAgT25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUyxTQlRfVlNDUk9MTCwgKGludHB0cl90KSZmeSk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKQordm9pZCBDUFdMX0VkaXRDdHJsOjpJT25TZXRDYXJldChib29sIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpCiB7CiAgICAgUFdMX0NBUkVUX0lORk8gY0luZm87CiAgICAgY0luZm8uYlZpc2libGUgPSBiVmlzaWJsZTsKQEAgLTcxNyw2ICs3MTcsNiBAQAogICAgIGlmIChtX2JNb3VzZURvd24pCiAgICAgewogICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKyAgICAgICAgbV9iTW91c2VEb3duID0gZmFsc2U7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKaW5kZXggNTBiMzIxZC4uMmYwMjk3MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgcmV0dXJuICIiOwogfQogCi1GWF9CT09MIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCitib29sIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCiB7CiAgICAgaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKICAgICB7CkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCkKQEAgLTEwNiwxMyArMTA2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQzMl90IG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoR2V0TmF0aXZlRm9udE5hbWUobkNoYXJzZXQpLCBuQ2hhcnNldCwgVFJVRSk7CisgICAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0gR2V0Rm9udEluZGV4KEdldE5hdGl2ZUZvbnROYW1lKG5DaGFyc2V0KSwgbkNoYXJzZXQsIHRydWUpOwogICAgIGlmIChuTmV3Rm9udEluZGV4ID49IDApCiAgICAgewogICAgICAgICBpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCiAgICAgICAgICAgICByZXR1cm4gbk5ld0ZvbnRJbmRleDsKICAgICB9Ci0gICAgbk5ld0ZvbnRJbmRleCA9IEdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgRkFMU0UpOworICAgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBERUZBVUxUX0NIQVJTRVQsIGZhbHNlKTsKICAgICBpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQogICAgIHsKICAgICAgICAgaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpCiAgICAgICAgIHNGb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwogCi0gICAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7CisgICAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBmYWxzZSk7CiB9CiAKIApAQCAtMjA2LDE1ICsyMDYsMTUgQEAKICAgICAiVGltZXMtUm9tYW4iLCAiVGltZXMtQm9sZCIsICJUaW1lcy1JdGFsaWMiLCAiVGltZXMtQm9sZEl0YWxpYyIsCiAgICAgIlN5bWJvbCIsICJaYXBmRGluZ2JhdHMifTsKIAotRlhfQk9PTCBDUFdMX0ZvbnRNYXA6OklzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpCitib29sIENQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKIHsKICAgICBmb3IgKGludDMyX3QgaT0wOyBpPDE0OyBpKyspCiAgICAgewogICAgICAgICBpZiAoc0ZvbnROYW1lID09IGdfc0RFU3RhbmRhcmRGb250TmFtZVtpXSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQpCkBAIC0yMzQsNyArMjM0LDcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgRlhfQk9PTCBiRmluZCkKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgYm9vbCBiRmluZCkKIHsKICAgICBpbnQzMl90IG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsKICAgICBpZiAobkZvbnRJbmRleCA+PSAwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKaW5kZXggNzExNzRkZi4uODVjNGJjMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwCkBAIC0xNDUsMTIgKzE0NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1GWF9CT09MCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCitib29sCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCiB7CiAJaWYgKG1fcEljb25GaXQpCiAJCXJldHVybiBtX3BJY29uRml0LT5Jc1Byb3BvcnRpb25hbFNjYWxlKCk7CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQV0xfSWNvbjo6R2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUICYgZkxlZnQsIEZYX0ZMT0FUICYgZkJvdHRvbSkKQEAgLTE3NSwxMiArMTc1LDEyIEBACiAJfQogfQogCi1GWF9CT09MIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCitib29sIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCiB7CiAJaWYgKG1fcEljb25GaXQpCiAJCXJldHVybiBtX3BJY29uRml0LT5HZXRGaXR0aW5nQm91bmRzKCk7CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQV0xfSWNvbjo6R2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKaW5kZXggMTU3ZWJhNi4uZWNiYjBmZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIENQV0xfSWNvbkxpc3RfSXRlbTo6Q1BXTF9JY29uTGlzdF9JdGVtKCkgOgogCW1fbkljb25JbmRleCgtMSksCiAJbV9wRGF0YShOVUxMKSwKLQltX2JTZWxlY3RlZChGQUxTRSksCisJbV9iU2VsZWN0ZWQoZmFsc2UpLAogCW1fcFRleHQoTlVMTCkKIHsKIH0KQEAgLTY3LDcgKzY3LDcgQEAKIAkJbV9jckljb24sIG1fcFRleHQtPkdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpCit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6U2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKQogewogCW1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwogCkBAIC03OCw3ICs3OCw3IEBACiAKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAorYm9vbAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAogewogCXJldHVybiBtX2JTZWxlY3RlZDsKIH0KQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAJcmNDbGllbnQubGVmdCArPSAoUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOICsgUFdMX0ljb25MaXN0X0lURU1fV0lEVEggKyBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4pOwogCi0JbV9wVGV4dC0+TW92ZShyY0NsaWVudCwgVFJVRSwgRkFMU0UpOworCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIHRydWUsIGZhbHNlKTsKIH0KIAogdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCkBAIC0xNTEsOCArMTUxLDggQEAKIENQV0xfSWNvbkxpc3RfQ29udGVudDo6Q1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCkgOgogCW1fblNlbGVjdEluZGV4KC0xKSwKIAltX3BOb3RpZnkoTlVMTCksCi0JbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCisJbV9iRW5hYmxlTm90aWZ5KHRydWUpLAorCW1fYk1vdXNlRG93bihmYWxzZSksCiAJbV9uTGlzdENvdW50KG5MaXN0Q291bnQpCiB7CiB9CkBAIC0xOTIsMjkgKzE5MiwyOSBAQAogCX0KIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJU2V0Rm9jdXMoKTsKIAogCVNldENhcHR1cmUoKTsKLQltX2JNb3VzZURvd24gPSBUUlVFOworCW1fYk1vdXNlRG93biA9IHRydWU7CiAKIAlpbnQzMl90IG5JdGVtSW5kZXggPSBGaW5kSXRlbUluZGV4KHBvaW50KTsKIAlTZXRTZWxlY3Qobkl0ZW1JbmRleCk7CiAJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiAJUmVsZWFzZUNhcHR1cmUoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX2JNb3VzZURvd24pCiAJewpAQCAtMjIzLDEwICsyMjMsMTAgQEAKIAkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MCUNQV0xfSWNvbkxpc3RfQ29udGVudDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKIAlzd2l0Y2ggKG5DaGFyKQogCXsKQEAgLTIzNyw3ICsyMzcsNyBAQAogCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwogCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCQl9Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAljYXNlIEZXTF9WS0VZX0Rvd246CiAJCWlmIChtX25TZWxlY3RJbmRleCA8IG1fbkxpc3RDb3VudC0xKQogCQl7CkBAIC0yNDUsMTAgKzI0NSwxMCBAQAogCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwogCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwogCQl9Ci0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiBpbnQzMl90IENQV0xfSWNvbkxpc3RfQ29udGVudDo6RmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkKQEAgLTMwNyw4ICszMDcsOCBAQAogewogCWlmIChtX25TZWxlY3RJbmRleCAhPSBuSW5kZXgpCiAJewotCQlTZWxlY3RJdGVtKG1fblNlbGVjdEluZGV4LCBGQUxTRSk7Ci0JCVNlbGVjdEl0ZW0obkluZGV4LCBUUlVFKTsKKwkJU2VsZWN0SXRlbShtX25TZWxlY3RJbmRleCwgZmFsc2UpOworCQlTZWxlY3RJdGVtKG5JbmRleCwgdHJ1ZSk7CiAJCW1fblNlbGVjdEluZGV4ID0gbkluZGV4OwogCiAJCWlmIChJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSA9IEdldE5vdGlmeSgpKQpAQCAtMzMzLDEyICszMzMsMTIgQEAKIAltX3BOb3RpZnkgPSBwTm90aWZ5OwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpFbmFibGVOb3RpZnkoYm9vbCBiTm90aWZ5KQogewogCW1fYkVuYWJsZU5vdGlmeSA9IGJOb3RpZnk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZWxlY3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0KQordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3QpCiB7CiAJaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKIAl7CkBAIC00MjMsNyArNDIzLDcgQEAKIAlDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOwogCiAJaWYgKG1fcExpc3RDb250ZW50KQotCQltX3BMaXN0Q29udGVudC0+TW92ZShHZXRDbGllbnRSZWN0KCksIFRSVUUsIEZBTFNFKTsKKwkJbV9wTGlzdENvbnRlbnQtPk1vdmUoR2V0Q2xpZW50UmVjdCgpLCB0cnVlLCBmYWxzZSk7CiB9CiAKIHZvaWQgQ1BXTF9JY29uTGlzdDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCkBAIC00NDIsNyArNDQyLDcgQEAKIAl7CiAJCXBTY3JvbGxCYXItPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7CiAJCXBTY3JvbGxCYXItPlNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOworCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKHRydWUpOwogCX0KIH0KIApAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCQkJCXsKIAkJCQkJCWlmICghcFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCiAJCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShUUlVFKTsKKwkJCQkJCQlwU2Nyb2xsQmFyLT5TZXRWaXNpYmxlKHRydWUpOwogCQkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCQkJCQl7CiAJCQkJCQlpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCiAJCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShGQUxTRSk7CisJCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCQkJCQkJUmVQb3NDaGlsZFduZCgpOwogCQkJCQkJfQogCkBAIC01MjIsNyArNTIyLDcgQEAKIAltX3BMaXN0Q29udGVudC0+U2V0Tm90aWZ5KHBOb3RpZnkpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpCit2b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShib29sIGJOb3RpZnkpCiB7CiAJbV9wTGlzdENvbnRlbnQtPkVuYWJsZU5vdGlmeShiTm90aWZ5KTsKIH0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCW1fcExpc3RDb250ZW50LT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsUG9zKCk7CiAJQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wTGlzdENvbnRlbnQtPkdldFNjcm9sbEFyZWEoKTsKQEAgLTU4MywxMCArNTgzLDEwIEBACiAJCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpCiAJCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCmluZGV4IGUxNzgwYzYuLjNlMjMxZDUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAJaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCiAJewogCQlTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwwLjBmLDAuMGYsMC4wZikpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3coVFJVRSk7CisJCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwCmluZGV4IDQ4ZmI0MDkuLmQwZTljYzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcApAQCAtNDksNyArNDksNyBAQAogCQl7CiAJCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7CisJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCQkJbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwogCQkJfQogCQl9CkBAIC01Nyw3ICs1Nyw3IEBACiAJCXsKIAkJCWlmICghcFNjcm9sbC0+SXNWaXNpYmxlKCkpCiAJCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShUUlVFKTsKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKHRydWUpOwogCQkJCW1fcExpc3QtPlJlUG9zQ2hpbGRXbmQoKTsKIAkJCX0KIAkJfQpAQCAtNzksOCArNzksOCBAQAogQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKSA6CiAJbV9wTGlzdChOVUxMKSwKIAltX3BMaXN0Tm90aWZ5KE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9iSG92ZXJTZWwoRkFMU0UpLAorCW1fYk1vdXNlRG93bihmYWxzZSksCisJbV9iSG92ZXJTZWwoZmFsc2UpLAogCW1fcEZpbGxlck5vdGlmeShOVUxMKQogewogCW1fcExpc3QgPSBJRlhfTGlzdDo6TmV3TGlzdCgpOwpAQCAtMjI5LDE2ICsyMjksMTYgQEAKIAl9CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTGlzdEJveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQV0xfV25kOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKIAotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworCWlmICghbV9wTGlzdCkgcmV0dXJuIGZhbHNlOwogCiAJc3dpdGNoIChuQ2hhcikKIAl7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiAJY2FzZSBGV0xfVktFWV9VcDoKIAljYXNlIEZXTF9WS0VZX0Rvd246CiAJY2FzZSBGV0xfVktFWV9Ib21lOgpAQCAtMjcyLDMzICsyNzIsMzMgQEAKIAkJYnJlYWs7CiAJfQogCi0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LG5GbGFnKTsKKwlib29sIGJFeGl0ID0gZmFsc2U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKHRydWUsYkV4aXQsbkZsYWcpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTGlzdEJveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCUNQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOwogCi0JaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CisJaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CiAKLQlpZiAoIW1fcExpc3QtPk9uQ2hhcihuQ2hhcixJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpKSByZXR1cm4gRkFMU0U7CisJaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIGZhbHNlOwogCi0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LCBuRmxhZyk7CisJYm9vbCBiRXhpdCA9IGZhbHNlOworCU9uTm90aWZ5U2VsQ2hhbmdlZCh0cnVlLGJFeGl0LCBuRmxhZyk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCiAJaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKQogCXsKLQkJbV9iTW91c2VEb3duID0gVFJVRTsKKwkJbV9iTW91c2VEb3duID0gdHJ1ZTsKIAkJU2V0Rm9jdXMoKTsKIAkJU2V0Q2FwdHVyZSgpOwogCkBAIC0zMDYsMzEgKzMwNiwzMSBAQAogCQkJbV9wTGlzdC0+T25Nb3VzZURvd24ocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTGlzdEJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOwogCiAJaWYgKG1fYk1vdXNlRG93bikKIAl7CiAJCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCW1fYk1vdXNlRG93biA9IEZBTFNFOworCQltX2JNb3VzZURvd24gPSBmYWxzZTsKIAl9CiAKLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LG5GbGFnKTsKKwlib29sIGJFeGl0ID0gZmFsc2U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKGZhbHNlLGJFeGl0LG5GbGFnKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoRlhfQk9PTCBiSG92ZXJTZWwpCit2b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoYm9vbCBiSG92ZXJTZWwpCiB7CiAJbV9iSG92ZXJTZWwgPSBiSG92ZXJTZWw7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LCBuRmxhZyk7CiAKQEAgLTM0Niw3ICszNDYsNyBAQAogCQkJbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKIAl9CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQpAQCAtNDA1LDE5ICs0MDUsMTkgQEAKIAkJbV9wTGlzdC0+U2V0UGxhdGVSZWN0KEdldExpc3RSZWN0KCkpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6T25Ob3RpZnlTZWxDaGFuZ2VkKEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiRXhpdCwgIEZYX0RXT1JEIG5GbGFnKQordm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5U2VsQ2hhbmdlZChib29sIGJLZXlEb3duLCBib29sICYgYkV4aXQsICBGWF9EV09SRCBuRmxhZykKIHsKIAlpZiAobV9wRmlsbGVyTm90aWZ5KQogCXsKLQkJRlhfQk9PTCBiUkMgPSBUUlVFOworCQlib29sIGJSQyA9IHRydWU7CiAJCUNGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlID0gR2V0VGV4dCgpOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAkJaW50IG5TZWxTdGFydCA9IDA7CiAJCWludCBuU2VsRW5kID0gc3dDaGFuZ2UuR2V0TGVuZ3RoKCk7Ci0JCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoRkFMU0UsIEdldEF0dGFjaGVkRGF0YSgpLCAwLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgYktleURvd24sIGJSQywgYkV4aXQsIG5GbGFnKTsKKwkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShmYWxzZSwgR2V0QXR0YWNoZWREYXRhKCksIDAsIHN3Q2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBiS2V5RG93biwgYlJDLCBiRXhpdCwgbkZsYWcpOwogCQlpZiAoYkV4aXQpIHJldHVybjsKIAotCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoRkFMU0UsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7CisJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShmYWxzZSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LG5GbGFnKTsKIAl9CiB9CiAKQEAgLTQ5OCwxMiArNDk4LDEyIEBACiAJCW1fcExpc3QtPkNhbmNlbCgpOwogfQogCi1GWF9CT09MIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0Citib29sIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0CiB7CiAJaWYgKG1fcExpc3QpCiAJCXJldHVybiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCk7CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiBpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q2FyZXRJbmRleCgpIGNvbnN0CkBAIC01MjIsMTIgKzUyMiwxMiBAQAogCXJldHVybiAtMTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6OklzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7CiAJaWYgKG1fcExpc3QpCiAJCXJldHVybiBtX3BMaXN0LT5Jc0l0ZW1TZWxlY3RlZChuSXRlbUluZGV4KTsKIAotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIGludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdApAQCAtNTc4LDkgKzU3OCw5IEBACiAJcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX0xpc3RCb3g6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7Ci0JaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CisJaWYgKCFtX3BMaXN0KSByZXR1cm4gZmFsc2U7CiAKIAlpZiAoekRlbHRhIDwgMCkKIAl7CkBAIC01OTEsOCArNTkxLDggQEAKIAkJbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwogCX0KIAotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsYkV4aXQsIG5GbGFnKTsKLQlyZXR1cm4gVFJVRTsKKwlib29sIGJFeGl0ID0gZmFsc2U7CisJT25Ob3RpZnlTZWxDaGFuZ2VkKGZhbHNlLGJFeGl0LCBuRmxhZyk7CisJcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKaW5kZXggMzA3N2U2Mi4uZDJkZWFjYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAKQEAgLTUyLDcgKzUyLDcgQEAKIAogdm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEZhY2UoKQogewotCVJlc2V0QWxsKEZBTFNFLCAwKTsKKwlSZXNldEFsbChmYWxzZSwgMCk7CiB9CiAKIHZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KQpAQCAtNjAsNyArNjAsNyBAQAogCWlmIChuU3RhcnQgPCAwKQogCQluU3RhcnQgPSAwOwogCWlmIChuU3RhcnQgPj0gMCAmJiBuU3RhcnQgPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpCi0JCVJlc2V0QWxsKFRSVUUsIG5TdGFydCk7CisJCVJlc2V0QWxsKHRydWUsIG5TdGFydCk7CiB9CiAKIEZYX0ZMT0FUIENQV0xfTGlzdEN0cmw6OkdldENvbnRlbnRzSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKQpAQCAtOTEsNyArOTEsNyBAQAogCXJldHVybiBmUmV0OwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsIGludDMyX3QgblN0YXJ0KQordm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEFsbChib29sIGJNb3ZlLCBpbnQzMl90IG5TdGFydCkKIHsKIAlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogCQkJaWYgKGJNb3ZlKQogCQkJewogCQkJCUZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcENoaWxkLT5HZXRJdGVtSGVpZ2h0KGZXaWR0aCAtIGZMZWZ0IC0gZlJpZ2h0KTsKLQkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIFRSVUUsIEZBTFNFKTsKKwkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIHRydWUsIGZhbHNlKTsKIAkJCQlmeSAtPSBmSXRlbUhlaWdodDsKIAkJCQlmeSAtPSBtX2ZJdGVtU3BhY2U7CiAJCQl9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Ob3RlLmNwcAppbmRleCA3ZWQxMTE1Li5mM2M1ODE2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAKQEAgLTYwLDEzICs2MCwxMyBAQAogCQlpZiAocmNDbGllbnQuV2lkdGgoKSA+IDE1LjBmKQogCQl7CiAJCQlyY0NsaWVudC5yaWdodCAtPSAxNS4wZjsKLQkJCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIFRSVUUsIEZBTFNFKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoVFJVRSk7CisJCQltX3BUZXh0LT5Nb3ZlKHJjQ2xpZW50LCB0cnVlLCBmYWxzZSk7CisJCQltX3BUZXh0LT5TZXRWaXNpYmxlKHRydWUpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIFRSVUUsIEZBTFNFKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoRkFMU0UpOworCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIHRydWUsIGZhbHNlKTsKKwkJCW1fcFRleHQtPlNldFZpc2libGUoZmFsc2UpOwogCQl9CiAJfQogfQpAQCAtMTIyLDkgKzEyMiw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfTm90ZV9FZGl0OjpDUFdMX05vdGVfRWRpdCgpIDogbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAorQ1BXTF9Ob3RlX0VkaXQ6OkNQV0xfTm90ZV9FZGl0KCkgOiBtX2JFbmFibGVOb3RpZnkodHJ1ZSksCiAJbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChGQUxTRSksCisJbV9iU2l6ZUNoYW5nZWQoZmFsc2UpLAogCW1fZk9sZE1pbigwLjBmKSwKIAltX2ZPbGRNYXgoMC4wZikKIHsKQEAgLTEzNiwzMyArMTM2LDMzIEBACiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKQogewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOworCW1fYkVuYWJsZU5vdGlmeSA9IGZhbHNlOwogCUNQV0xfRWRpdDo6UmVQb3NDaGlsZFduZCgpOwotCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CisJbV9iRW5hYmxlTm90aWZ5ID0gdHJ1ZTsKIAogCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpCiB7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7CisJbV9iRW5hYmxlTm90aWZ5ID0gZmFsc2U7CiAJQ1BXTF9FZGl0OjpTZXRUZXh0KGNzVGV4dCk7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKKwltX2JFbmFibGVOb3RpZnkgPSB0cnVlOwogCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpPblNldEZvY3VzKCkKIHsKLQltX2JFbmFibGVOb3RpZnkgPSBGQUxTRTsKKwltX2JFbmFibGVOb3RpZnkgPSBmYWxzZTsKIAlDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKLQltX2JFbmFibGVOb3RpZnkgPSBUUlVFOworCW1fYkVuYWJsZU5vdGlmeSA9IHRydWU7CiAKLQlFbmFibGVTcGVsbENoZWNrKFRSVUUpOworCUVuYWJsZVNwZWxsQ2hlY2sodHJ1ZSk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKIHsKLQlFbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKKwlFbmFibGVTcGVsbENoZWNrKGZhbHNlKTsKIAogCWlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCXsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJCQlpZiAoIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNYXgsIG1fZk9sZE1heCkgfHwKIAkJCQkJCSFJc0Zsb2F0RXF1YWwocEluZm8tPmZDb250ZW50TWluLCBtX2ZPbGRNaW4pKQogCQkJCQl7Ci0JCQkJCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisJCQkJCQltX2JTaXplQ2hhbmdlZCA9IHRydWU7CiAJCQkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQkJCQl7CiAJCQkJCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJCWlmIChQV0xfQ0FSRVRfSU5GTyAqIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pCiAJCQl7CiAJCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCQluZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKKwkJCQluZXdJbmZvLmJWaXNpYmxlID0gdHJ1ZTsKIAkJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CiAJCQkJbmV3SW5mby5wdEZvb3QgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOwogCkBAIC0yMzksMTggKzIzOSwxOCBAQAogCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQogCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKKwkJbV9iU2l6ZUNoYW5nZWQgPSBmYWxzZTsKIAotCQlFbmFibGVOb3RpZnkoRkFMU0UpOwotCQlFbmFibGVSZWZyZXNoKEZBTFNFKTsKLQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKwkJRW5hYmxlTm90aWZ5KGZhbHNlKTsKKwkJRW5hYmxlUmVmcmVzaChmYWxzZSk7CisJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CiAKLQkJTW92ZShDUERGX1JlY3QoMCwwLGZMaW1pdFdpZHRoLDApLCBUUlVFLCBGQUxTRSk7CisJCU1vdmUoQ1BERl9SZWN0KDAsMCxmTGltaXRXaWR0aCwwKSwgdHJ1ZSwgZmFsc2UpOwogCQlGWF9GTE9BVCBmUmV0ID0gR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAotCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7Ci0JCUVuYWJsZU5vdGlmeShUUlVFKTsKLQkJRW5hYmxlUmVmcmVzaChUUlVFKTsKKwkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOworCQlFbmFibGVOb3RpZnkodHJ1ZSk7CisJCUVuYWJsZVJlZnJlc2godHJ1ZSk7CiAKIAkJcmV0dXJuIGZSZXQ7CiAJfQpAQCAtMzQ5LDcgKzM0OSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfQ2xvc2VCb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX05vdGVfQ2xvc2VCb3g6OkNQV0xfTm90ZV9DbG9zZUJveCgpIDogbV9iTW91c2VEb3duKEZBTFNFKQorQ1BXTF9Ob3RlX0Nsb3NlQm94OjpDUFdMX05vdGVfQ2xvc2VCb3goKSA6IG1fYk1vdXNlRG93bihmYWxzZSkKIHsKIH0KIApAQCAtMzg3LDE5ICszODcsMTkgQEAKIAkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCVNldEJvcmRlclN0eWxlKFBCU19JTlNFVCk7CiAJSW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQltX2JNb3VzZURvd24gPSBUUlVFOworCW1fYk1vdXNlRG93biA9IHRydWU7CiAKIAlyZXR1cm4gQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCW1fYk1vdXNlRG93biA9IEZBTFNFOworCW1fYk1vdXNlRG93biA9IGZhbHNlOwogCiAJU2V0Qm9yZGVyU3R5bGUoUEJTX0JFVkVMRUQpOwogCUludmFsaWRhdGVSZWN0KE5VTEwpOwpAQCAtNDI5LDE4ICs0MjksMTggQEAKIAllY3AucFBhcmVudFduZCA9IHRoaXM7CiAJZWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8IFBFU19URVhUT1ZFUkZMT1cgfCBQRVNfVU5ETyB8IFBFU19TUEVMTENIRUNLOwogCi0JbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKwltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOwogCW1fcEVkaXQtPkNyZWF0ZShlY3ApOwotCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKwltX3BFZGl0LT5FbmFibGVOb3RpZnkodHJ1ZSk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKIHsKIAlpZiAobV9wRWRpdCkKIAl7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShmYWxzZSk7CiAJCW1fcEVkaXQtPlNldFRleHQoc1RleHQuY19zdHIoKSk7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKwkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOwogCQlPbk5vdGlmeShtX3BFZGl0LCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAl9CiB9CkBAIC01NTEsOSArNTUxLDkgQEAKIAkJCWludDMyX3QgbkluZGV4ID0gR2V0SXRlbUluZGV4KHBXbmQpOwogCQkJaWYgKG5JbmRleCA8IDApIG5JbmRleCA9IDA7CiAKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOwogCQkJUmVzZXRDb250ZW50KG5JbmRleCk7Ci0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkodHJ1ZSk7CiAKIAkJCWZvciAoaW50MzJfdCBpPW5JbmRleCsxLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKQogCQl7CiAJCQlQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOwotCQkJbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7CisJCQluZXdJbmZvLmJWaXNpYmxlID0gdHJ1ZTsKIAkJCW5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKIAkJCW5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIApAQCAtNTg4LDkgKzU4OCw5IEBACiAJCXJldHVybjsKIAljYXNlIFBOTV9OT1RFUkVTRVQ6CiAJCXsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoZmFsc2UpOwogCQkJUmVzZXRDb250ZW50KDApOwotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KHRydWUpOwogCiAJCQlmb3IgKGludDMyX3QgaT0xLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKQEAgLTU5OCw5ICs1OTgsOSBAQAogCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwogCQkJfQogCi0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KGZhbHNlKTsKIAkJCVJlc2V0Q29udGVudCgwKTsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKwkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeSh0cnVlKTsKIAkJfQogCQlyZXR1cm47CiAJfQpAQCAtNjA4LDE5ICs2MDgsMTkgQEAKIAlDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlX0NvbnRlbnRzOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfTm90ZV9Db250ZW50czo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiBUUlVFOworCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiB0cnVlOwogCiAJaWYgKCFtX3BFZGl0LT5Jc0ZvY3VzZWQoKSkKIAl7CiAJCW1fcEVkaXQtPlNldEZvY3VzKCk7CiAJfQogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCkKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoYm9vbCBiTGFzdCkKIHsKIAlpZiAoIW1fcEVkaXQtPklzRm9jdXNlZCgpKQogCXsKQEAgLTYzNCw3ICs2MzQsNyBAQAogCXJldHVybiBtX3BFZGl0OwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJaWYgKCFiRW5hYmxlZCkKIAkJbV9wRWRpdC0+QWRkRmxhZyhQV1NfUkVBRE9OTFkpOwpAQCAtNjU0LDcgKzY1NCw3IEBACiAJfQogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKQordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkVuYWJsZVJlYWQoYm9vbCBiRW5hYmxlZCkKIHsKIAlpZiAoIWJFbmFibGVkKQogCQltX3BFZGl0LT5BZGRGbGFnKFBFU19OT1JFQUQpOwpAQCAtNjgzLDggKzY4Myw4IEBACiAJbV9wUHJpdmF0ZURhdGEoTlVMTCksCiAJbV9zQXV0aG9yKEwiIiksCiAJbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChGQUxTRSksCi0JbV9iQWxsb3dNb2RpZnkoVFJVRSkKKwltX2JTaXplQ2hhbmdlZChmYWxzZSksCisJbV9iQWxsb3dNb2RpZnkodHJ1ZSkKIHsKIH0KIApAQCAtNzQ4LDcgKzc0OCw3IEBACiAJCXJjU3ViamVjdC5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLCByY0NsaWVudC5yaWdodCk7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CiAKIAkJQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OwpAQCAtNzU2LDcgKzc1Niw3IEBACiAJCXJjRGF0ZS5sZWZ0ID0gUFdMX01BWChyY0RhdGUucmlnaHQgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpIC0gMS4wZiwgcmNTdWJqZWN0LnJpZ2h0KTsKIAkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIFRSVUUsIEZBTFNFKTsKKwkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCB0cnVlLCBmYWxzZSk7CiAJCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKIAkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKQEAgLTc2NSw3ICs3NjUsNyBAQAogCQlyY0NvbnRlbnRzLnRvcCA9IHJjRGF0ZS5ib3R0b20gLSBQT1BVUF9JVEVNX0hFQURfQk9UVE9NOwogCQlyY0NvbnRlbnRzLmJvdHRvbSArPSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIOwogCQlyY0NvbnRlbnRzLk5vcm1hbGl6ZSgpOwotCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCBUUlVFLCBGQUxTRSk7CisJCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIHRydWUsIGZhbHNlKTsKIAkJbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAJfQogCkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQogCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKKwkJbV9iU2l6ZUNoYW5nZWQgPSBmYWxzZTsKIAogCQlBU1NFUlQobV9wU3ViamVjdCAhPSBOVUxMKTsKIAkJQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOwpAQCAtMTA2NiwyNiArMTA2NiwyNiBAQAogCXJldHVybiBQT1BVUF9JVEVNX1NJREVNQVJHSU47CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfTm90ZUl0ZW06Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmICghbV9wQ29udGVudHMtPlduZEhpdFRlc3QobV9wQ29udGVudHMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7Ci0JCVNldE5vdGVGb2N1cyhGQUxTRSk7CisJCVNldE5vdGVGb2N1cyhmYWxzZSk7CiAJfQogCiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCiAJewotCQlTZXROb3RlRm9jdXMoRkFMU0UpOworCQlTZXROb3RlRm9jdXMoZmFsc2UpOwogCQlQb3B1cE5vdGVJdGVtTWVudShwb2ludCk7CiAKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCX0KIAogCXJldHVybiBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsbkZsYWcpOwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAlzd2l0Y2ggKG1zZykKIAl7CiAJY2FzZSBQTk1fTk9URUVESVRDSEFOR0VEOgotCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisJCW1fYlNpemVDaGFuZ2VkID0gdHJ1ZTsKIAogCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJewpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKIAkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKIAkJewogCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOworCQkJbmV3SW5mby5iVmlzaWJsZSA9IHRydWU7CiAJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CiAJCQluZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CiAKQEAgLTExMTgsNyArMTExOCw3IEBACiAJCX0KIAkJcmV0dXJuOwogCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOworCQltX2JTaXplQ2hhbmdlZCA9IHRydWU7CiAJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKIAogCQlyZXR1cm47CkBAIC0xMTc4LDE4ICsxMTc4LDE4IEBACiAJfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldE5vdGVGb2N1cyhGWF9CT09MIGJMYXN0KQordm9pZCBDUFdMX05vdGVJdGVtOjpTZXROb3RlRm9jdXMoYm9vbCBiTGFzdCkKIHsKIAltX3BDb250ZW50cy0+U2V0RWRpdEZvY3VzKGJMYXN0KTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCkKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiAJbV9iQWxsb3dNb2RpZnkgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZVJlYWQoYm9vbCBiRW5hYmxlZCkKIHsKIAltX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CiB9CkBAIC0xMjA1LDkgKzEyMDUsOSBAQAogCW1fcENvbnRlbnRzQmFyKE5VTEwpLAogCW1fcE9wdGlvbnMoTlVMTCksCiAJbV9wTm90ZU5vdGlmeShwTm90ZU5vdGlmeSksCi0JbV9iUmVzaXppbmcoRkFMU0UpLAorCW1fYlJlc2l6aW5nKGZhbHNlKSwKIAltX3JjQ2FwdGlvbigwLDAsMCwwKSwKLQltX2JFbmFsYmxlTm90aWZ5KFRSVUUpLAorCW1fYkVuYWxibGVOb3RpZnkodHJ1ZSksCiAJbV9wUG9wdXBOb3RlKHBQb3B1cE5vdGUpCiB7CiB9CkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCXJldHVybiBDcmVhdGVOb3RlSXRlbSgpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJbV9iRW5hbGJsZU5vdGlmeSA9IGJFbmFibGVkOwogfQpAQCAtMTI0MywxOSArMTI0MywxOSBAQAogCX0KIH0KIAotRlhfQk9PTCBDUFdMX05vdGU6OlJlc2V0U2Nyb2xsQmFyKCkKK2Jvb2wgQ1BXTF9Ob3RlOjpSZXNldFNjcm9sbEJhcigpCiB7Ci0JRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOworCWJvb2wgYlNjcm9sbENoYW5nZWQgPSBmYWxzZTsKIAogCWlmIChTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkpCiAJewogCQlpZiAoIW1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKIAkJewotCQkJbV9wQ29udGVudHNCYXItPlNldFZpc2libGUoVFJVRSk7CisJCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZSh0cnVlKTsKIAkJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCiAJCQl7CiAJCQkJbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCQkJCWJTY3JvbGxDaGFuZ2VkID0gVFJVRTsKKwkJCQliU2Nyb2xsQ2hhbmdlZCA9IHRydWU7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMjYzLDEwICsxMjYzLDEwIEBACiAJewogCQlpZiAobV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKQogCQl7Ci0JCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShGQUxTRSk7CisJCQltX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCQltX3BDb250ZW50c0Jhci0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQkJCWJTY3JvbGxDaGFuZ2VkID0gVFJVRTsKKwkJCWJTY3JvbGxDaGFuZ2VkID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIAkJcmNDb250ZW50cy5yaWdodCA9IHJjTm90ZS5yaWdodCAtIDMuMGY7CiAJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCiAJCQlyY0NvbnRlbnRzLnJpZ2h0IC09IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIFRSVUUsIFRSVUUpOworCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCB0cnVlLCB0cnVlKTsKIAkJbV9wQ29udGVudHMtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsMC4wZikpOwogCQltX3BDb250ZW50cy0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAJfQpAQCAtMTI4NSw3ICsxMjg1LDcgQEAKIAlyZXR1cm4gYlNjcm9sbENoYW5nZWQ7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKK2Jvb2wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKIHsKIAlDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOwogCUNQREZfUmVjdCByY0NvbnRlbnRzQ2xpZW50ID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKQEAgLTEzMDUsNyArMTMwNSw3IEBACiB7CiAJaWYgKG1fYlJlc2l6aW5nKSByZXR1cm47CiAKLQltX2JSZXNpemluZyA9IFRSVUU7CisJbV9iUmVzaXppbmcgPSB0cnVlOwogCiAJaWYgKElzVmFsaWQoKSkKIAl7CkBAIC0xMzI3LDcgKzEzMjcsNyBAQAogCQlyY0ljb24ucmlnaHQgPSByY0ljb24ubGVmdCArIDE0LjBmOwogCQlyY0ljb24uYm90dG9tID0gcmNJY29uLnRvcCAtIDE0LjBmOwogCQlyY0ljb24uTm9ybWFsaXplKCk7Ci0JCW1fcEljb24tPk1vdmUocmNJY29uLCBUUlVFLCBGQUxTRSk7CisJCW1fcEljb24tPk1vdmUocmNJY29uLCB0cnVlLCBmYWxzZSk7CiAJCW1fcEljb24tPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0ljb24pKTsKIAogCQlDUERGX1JlY3QgcmNDbG9zZUJveCA9IHJjQ2xpZW50OwpAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIAkJcmNDbG9zZUJveC5sZWZ0ID0gcmNDbG9zZUJveC5yaWdodCAtIDE0LjBmOwogCQlyY0Nsb3NlQm94LmJvdHRvbSA9IHJjQ2xvc2VCb3gudG9wIC0gMTQuMGY7CiAJCXJjQ2xvc2VCb3guTm9ybWFsaXplKCk7Ci0JCW1fcENsb3NlQm94LT5Nb3ZlKHJjQ2xvc2VCb3gsIFRSVUUsIEZBTFNFKTsKKwkJbV9wQ2xvc2VCb3gtPk1vdmUocmNDbG9zZUJveCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BDbG9zZUJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ2xvc2VCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNEYXRlID0gcmNDbGllbnQ7CkBAIC0xMzQ1LDcgKzEzNDUsNyBAQAogCQlyY0RhdGUudG9wID0gcmNDbGllbnQudG9wIC0gMi4wZjsKIAkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIFRSVUUsIEZBTFNFKTsKKwkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCB0cnVlLCBmYWxzZSk7CiAJCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKIAkJQ1BERl9SZWN0IHJjU3ViamVjdCA9IHJjQ2xpZW50OwpAQCAtMTM1NCw3ICsxMzU0LDcgQEAKIAkJcmNTdWJqZWN0LnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjRGF0ZS5sZWZ0IC0gMS4wZik7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CiAKIAkJQ1BERl9SZWN0IHJjT3B0aW9ucyA9IHJjQ2xpZW50OwpAQCAtMTM2Miw3ICsxMzYyLDcgQEAKIAkJcmNPcHRpb25zLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOwogCQlyY09wdGlvbnMuYm90dG9tID0gcmNPcHRpb25zLnRvcCAtIG1fcE9wdGlvbnMtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAJCXJjT3B0aW9ucy5Ob3JtYWxpemUoKTsKLQkJbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIFRSVUUsIEZBTFNFKTsKKwkJbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIHRydWUsIGZhbHNlKTsKIAkJbV9wT3B0aW9ucy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjT3B0aW9ucykpOwogCiAJCUNQREZfUmVjdCByY0F1dGhvciA9IHJjQ2xpZW50OwpAQCAtMTM3MSwyMSArMTM3MSwyMSBAQAogCQlyY0F1dGhvci5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BBdXRob3ItPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjT3B0aW9ucy5sZWZ0IC0gMS4wZik7CiAJCXJjQXV0aG9yLmJvdHRvbSA9IHJjQXV0aG9yLnRvcCAtIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNBdXRob3IuTm9ybWFsaXplKCk7Ci0JCW1fcEF1dGhvci0+TW92ZShyY0F1dGhvciwgVFJVRSwgRkFMU0UpOworCQltX3BBdXRob3ItPk1vdmUocmNBdXRob3IsIHRydWUsIGZhbHNlKTsKIAkJbV9wQXV0aG9yLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNBdXRob3IpKTsKIAogCQlDUERGX1JlY3QgcmNMQkJveCA9IHJjQ2xpZW50OwogCQlyY0xCQm94LnRvcCA9IHJjTEJCb3guYm90dG9tICsgNy4wZjsKIAkJcmNMQkJveC5yaWdodCA9IHJjTEJCb3gubGVmdCArIDcuMGY7CiAJCXJjTEJCb3guTm9ybWFsaXplKCk7Ci0JCW1fcExCQm94LT5Nb3ZlKHJjTEJCb3gsIFRSVUUsIEZBTFNFKTsKKwkJbV9wTEJCb3gtPk1vdmUocmNMQkJveCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BMQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjTEJCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNSQkJveCA9IHJjQ2xpZW50OwogCQlyY1JCQm94LnRvcCA9IHJjUkJCb3guYm90dG9tICsgNy4wZjsKIAkJcmNSQkJveC5sZWZ0ID0gcmNSQkJveC5yaWdodCAtIDcuMGY7CiAJCXJjUkJCb3guTm9ybWFsaXplKCk7Ci0JCW1fcFJCQm94LT5Nb3ZlKHJjUkJCb3gsIFRSVUUsIEZBTFNFKTsKKwkJbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgdHJ1ZSwgZmFsc2UpOwogCQltX3BSQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjUkJCb3gpKTsKIAogCQlDUERGX1JlY3QgcmNDb250ZW50cyA9IHJjQ2xpZW50OwpAQCAtMTM5NiwyMCArMTM5NiwyMCBAQAogCQkJcmNDb250ZW50cy5yaWdodCAtPSBQV0xfU0NST0xMQkFSX1dJRFRIOwogCQlyY0NvbnRlbnRzLmJvdHRvbSArPSAxNC4wZjsKIAkJcmNDb250ZW50cy5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgRkFMU0UsIEZBTFNFKTsKKwkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgZmFsc2UsIGZhbHNlKTsKIAkJbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAKIAkJQ1BERl9SZWN0IHJjQ29udGVudHNCYXIgPSByY0NvbnRlbnRzOwogCQlyY0NvbnRlbnRzQmFyLnJpZ2h0ID0gcmNDbGllbnQucmlnaHQgLSAzLjBmOwogCQlyY0NvbnRlbnRzQmFyLmxlZnQgPSByY0NvbnRlbnRzQmFyLnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9XSURUSDsKIAkJcmNDb250ZW50c0Jhci5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHNCYXItPk1vdmUocmNDb250ZW50c0JhciwgVFJVRSwgRkFMU0UpOworCQltX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCB0cnVlLCBmYWxzZSk7CiAKIAkJbV9yY0NhcHRpb24gPSByY0NsaWVudDsKIAkJbV9yY0NhcHRpb24uYm90dG9tID0gcmNDb250ZW50cy50b3A7CiAJfQogCi0JbV9iUmVzaXppbmcgPSBGQUxTRTsKKwltX2JSZXNpemluZyA9IGZhbHNlOwogfQogCiAvLzAtbm9ybWFsIC8gMS1jYXB0aW9uIC8gMi1sZWZ0Ym90dG9tIGNvcm5lciAvIDMtcmlnaHRib3R0b20gY29ybmVyIC8gNC1jbG9zZSAvIDUtb3B0aW9ucwpAQCAtMTUwNyw3ICsxNTA3LDcgQEAKIAlzY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZik7CiAJc2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19CQUNLR1JPVU5EOwogCW1fcENvbnRlbnRzQmFyLT5DcmVhdGUoc2NwKTsKLQltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcihUUlVFKTsKKwltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcih0cnVlKTsKIH0KIAogdm9pZCBDUFdMX05vdGU6OlNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKQEAgLTE1MzgsNyArMTUzOCw3IEBACiAJcmV0dXJuIEwiIjsKIH0KIAotRlhfQk9PTCBDUFdMX05vdGU6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfTm90ZTo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwogCUNQREZfUmVjdCByY1Njcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxBcmVhKCk7CkBAIC0xNTY2LDExICsxNTY2LDExIEBACiAJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAJCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiBUUlVFOworCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIENQV0xfTm90ZTo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCkBAIC0xNTkxLDcgKzE1OTEsNyBAQAogCiAJCQlpZiAoRlhTWVNfbWVtY21wKCZtX09sZFNjcm9sbEluZm8sICZzSW5mbywgc2l6ZW9mKFBXTF9TQ1JPTExfSU5GTykpICE9IDApCiAJCQl7Ci0JCQkJRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOworCQkJCWJvb2wgYlNjcm9sbENoYW5nZWQgPSBmYWxzZTsKIAogCQkJCWlmIChsUGFyYW0gPCAzKSAvL7fA1rnLwNGtu7cgbWFudGlzOjE1NzU5CiAJCQkJewpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIAkJbV9wUkJCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKIH0KIAotRlhfQk9PTAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7CkBAIC0xNzE3LDE0ICsxNzE3LDE0IEBACiAJCQlLaWxsRm9jdXMoKTsKIAkJCXBOb3RpZnktPk9uUG9wdXBNZW51KHgsIHkpOwogCi0JCQlyZXR1cm4gVFJVRTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJfQogCiAJcmV0dXJuIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKIH0KIAotRlhfQk9PTAlDUFdMX05vdGU6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sCUNQV0xfTm90ZTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlyZXR1cm4gQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIH0KQEAgLTE3NDgsMTIgKzE3NDgsMTIgQEAKIAkJbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KGJvb2wgYkVuYWJsZWQpCiB7CiAJbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCit2b2lkIENQV0xfTm90ZTo6RW5hYmxlUmVhZChib29sIGJFbmFibGVkKQogewogCW1fcENvbnRlbnRzLT5FbmFibGVSZWFkKGJFbmFibGVkKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcAppbmRleCA2ZDYxNzA1Li40Mjg3YmMyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAJfQogfQogCi1GWF9CT09MCVBXTF9GTE9BVFJBTkdFOjpJbihGWF9GTE9BVCB4KSBjb25zdAorYm9vbAlQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QKIHsKIAlyZXR1cm4gKElzRmxvYXRCaWdnZXIoeCxmTWluKSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1pbikpICYmCiAJCShJc0Zsb2F0U21hbGxlcih4LCBmTWF4KSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1heCkpOwpAQCAtOTksMTQgKzk5LDE0IEBACiAJZkJpZ1N0ZXAgPSBzdGVwOwogfQogCi1GWF9CT09MIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCitib29sIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCiB7CiAJaWYgKFNjcm9sbFJhbmdlLkluKHBvcykpCiAJewogCQlmU2Nyb2xsUG9zID0gcG9zOwotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkU21hbGwoKQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOwogCW1fZVNCQnV0dG9uVHlwZSA9IGVCdXR0b25UeXBlOwogCi0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiB9CiAKIENQV0xfU0JCdXR0b246On5DUFdMX1NCQnV0dG9uKCkKQEAgLTM1OSw3ICszNTksNyBAQAogCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7CiAKIAkJCQlpZiAoSXNFbmFibGVkKCkpCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCBUUlVFLCBGQUxTRSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHRydWUsIGZhbHNlLCByY0RyYXcsIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOwogCQkJCWVsc2UKIAkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSkpOwogCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJCQkvL2RyYXcgYmFja2dyb3VuZAogCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7CiAJCQkJaWYgKElzRW5hYmxlZCgpKQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgVFJVRSwgRkFMU0UsIHJjRHJhdywgblRyYW5zcGFyYW5jeSwgODAsIDIyMCk7CisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCB0cnVlLCBmYWxzZSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKIAkJCQllbHNlCiAJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpKTsKIApAQCAtNTY1LDMzICs1NjUsMzMgQEAKIAl9CiB9CiAKLUZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCiAJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLChpbnRwdHJfdCkmcG9pbnQpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKKwltX2JNb3VzZURvd24gPSB0cnVlOwogCVNldENhcHR1cmUoKTsKIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKIAogCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsKGludHB0cl90KSZwb2ludCk7CiAKLQltX2JNb3VzZURvd24gPSBGQUxTRTsKKwltX2JNb3VzZURvd24gPSBmYWxzZTsKIAlSZWxlYXNlQ2FwdHVyZSgpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsbkZsYWcpOwogCkBAIC02MDMsMTIgKzYwMywxMiBAQAogCQlpZiAobV9iTW91c2VEb3duICYmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NSU4gfHwgbV9lU0JCdXR0b25UeXBlID09IFBTQlRfTUFYKSkKIAkJewogCQkJaWYgKCFwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTixuRmxhZ3MsKGludHB0cl90KSZwb2ludCkpCi0JCQkJcmV0dXJuIEZBTFNFOworCQkJCXJldHVybiBmYWxzZTsKIAkJfQogCQkqLwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU2Nyb2xsQmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTYxOCw5ICs2MTgsOSBAQAogCW1fcE1pbkJ1dHRvbihOVUxMKSwKIAltX3BNYXhCdXR0b24oTlVMTCksCiAJbV9wUG9zQnV0dG9uKE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9iTWluT3JNYXgoRkFMU0UpLAotCW1fYk5vdGlmeUZvcmV2ZXIoVFJVRSkKKwltX2JNb3VzZURvd24oZmFsc2UpLAorCW1fYk1pbk9yTWF4KGZhbHNlKSwKKwltX2JOb3RpZnlGb3JldmVyKHRydWUpCiB7CiB9CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogCQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCxyY0NsaWVudC5ib3R0b20sCiAJCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7CiAJCQl9Ci0JCQllbHNlIFNldFZpc2libGUoRkFMU0UpOworCQkJZWxzZSBTZXRWaXNpYmxlKGZhbHNlKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNCVF9WU0NST0xMOgpAQCAtNjg3LDE2ICs2ODcsMTYgQEAKIAkJCQlyY01heEJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSwKIAkJCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQuYm90dG9tICsgZkJXaWR0aCk7CiAJCQl9Ci0JCQllbHNlIFNldFZpc2libGUoRkFMU0UpOworCQkJZWxzZSBTZXRWaXNpYmxlKGZhbHNlKTsKIAkJfQogCQlicmVhazsKIAl9CiAKICAgICBpZiAobV9wTWluQnV0dG9uKQotICAgICAgICBtX3BNaW5CdXR0b24tPk1vdmUocmNNaW5CdXR0b24sIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgbV9wTWluQnV0dG9uLT5Nb3ZlKHJjTWluQnV0dG9uLCB0cnVlLCBmYWxzZSk7CiAgICAgaWYgKG1fcE1heEJ1dHRvbikKLSAgICAgICAgbV9wTWF4QnV0dG9uLT5Nb3ZlKHJjTWF4QnV0dG9uLCBUUlVFLCBGQUxTRSk7Ci0gICAgTW92ZVBvc0J1dHRvbihGQUxTRSk7CisgICAgICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgdHJ1ZSwgZmFsc2UpOworICAgIE1vdmVQb3NCdXR0b24oZmFsc2UpOwogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQpAQCAtNzA4LDcgKzcwOCw3IEBACiAJCUNGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOwogCiAJCXNCdXR0b24gPDwgInFcbiI7Ci0JCXNCdXR0b24gPDwgIjAgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCYWNrZ3JvdW5kQ29sb3IoKSxUUlVFKTsKKwkJc0J1dHRvbiA8PCAiMCB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJhY2tncm91bmRDb2xvcigpLHRydWUpOwogCQlzQnV0dG9uIDw8IHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC5ib3R0b20gPDwgIiAiCiAJCQkJPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA8PCAiIHJlIGIgUVxuIjsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJfQogfQogCi1GWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwogCkBAIC03NzcsMjIgKzc3NywyMiBAQAogCQlpZiAocmNNaW5BcmVhLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSkpCiAJCXsKIAkJCW1fc0RhdGEuU3ViQmlnKCk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOworCQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCQl9CiAKIAkJaWYgKHJjTWF4QXJlYS5Db250YWlucyhwb2ludC54LHBvaW50LnkpKQogCQl7CiAJCQltX3NEYXRhLkFkZEJpZygpOwotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJCU1vdmVQb3NCdXR0b24odHJ1ZSk7CiAJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAkJfQogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKIAlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOwogCkBAIC04MDYsOSArODA2LDkgQEAKIAl9CiAKIAlFbmRUaW1lcigpOwotCW1fYk1vdXNlRG93biA9IEZBTFNFOworCW1fYk1vdXNlRG93biA9IGZhbHNlOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQpAQCAtOTIyLDcgKzkyMiw3IEBACiAJaWYgKCFtX3BQb3NCdXR0b24pCiAJewogCQltX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX1BPUyk7Ci0JCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7CisJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCW1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7CiAJfQogfQpAQCAtOTQzLDEyICs5NDMsMTIgQEAKIAogCQlpZiAoSXNGbG9hdFNtYWxsZXIobV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpLCAwLjBmKSkKIAkJewotCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKEZBTFNFKTsKKwkJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQltX3BQb3NCdXR0b24tPlNldFZpc2libGUoVFJVRSk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOworCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKHRydWUpOworCQkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAkJfQogCX0KIH0KQEAgLTk2MCw3ICs5NjAsNyBAQAogCW1fc0RhdGEuU2V0UG9zKGZQb3MpOwogCiAJaWYgKCFJc0Zsb2F0RXF1YWwobV9zRGF0YS5mU2Nyb2xsUG9zLCBmT2xkUG9zKSkKLQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIH0KIAogdm9pZCBDUFdMX1Njcm9sbEJhcjo6U2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCxGWF9GTE9BVCBmU21hbGxTdGVwKQpAQCAtOTY5LDcgKzk2OSw3IEBACiAJbV9zRGF0YS5TZXRTbWFsbFN0ZXAoZlNtYWxsU3RlcCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oRlhfQk9PTCBiUmVmcmVzaCkKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oYm9vbCBiUmVmcmVzaCkKIHsKIAlBU1NFUlQgKG1fcFBvc0J1dHRvbiAhPSBOVUxMKTsKIAlBU1NFUlQgKG1fcE1pbkJ1dHRvbiAhPSBOVUxMKTsKQEAgLTEwMzEsMTcgKzEwMzEsMTcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJbV9wUG9zQnV0dG9uLT5Nb3ZlKHJjUG9zQnV0dG9uLFRSVUUsYlJlZnJlc2gpOworCQltX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sdHJ1ZSxiUmVmcmVzaCk7CiAJfQogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiB7CiAJbV9zRGF0YS5TdWJTbWFsbCgpOwotCU1vdmVQb3NCdXR0b24oVFJVRSk7CisJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAotCW1fYk1pbk9yTWF4ID0gVFJVRTsKKwltX2JNaW5Pck1heCA9IHRydWU7CiAKIAlFbmRUaW1lcigpOwogCUJlZ2luVGltZXIoMTAwKTsKQEAgLTEwNTgsMTAgKzEwNTgsMTAgQEAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKIHsKIAltX3NEYXRhLkFkZFNtYWxsKCk7Ci0JTW92ZVBvc0J1dHRvbihUUlVFKTsKKwlNb3ZlUG9zQnV0dG9uKHRydWUpOwogCU5vdGlmeVNjcm9sbFdpbmRvdygpOwogCi0JbV9iTWluT3JNYXggPSBGQUxTRTsKKwltX2JNaW5Pck1heCA9IGZhbHNlOwogCiAJRW5kVGltZXIoKTsKIAlCZWdpblRpbWVyKDEwMCk7CkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiB7Ci0JbV9iTW91c2VEb3duID0gVFJVRTsKKwltX2JNb3VzZURvd24gPSB0cnVlOwogCiAJaWYgKG1fcFBvc0J1dHRvbikKIAl7CkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCQlpZiAoIW1fYk5vdGlmeUZvcmV2ZXIpCiAJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAl9Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7CisJbV9iTW91c2VEb3duID0gZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKQEAgLTExNjMsNyArMTE2Myw3IEBACiAKIAkJaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkKIAkJewotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJCU1vdmVQb3NCdXR0b24odHJ1ZSk7CiAKIAkJCWlmIChtX2JOb3RpZnlGb3JldmVyKQogCQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwpAQCAtMTI5Nyw3ICsxMjk3LDcgQEAKIAogCWlmIChGWFNZU19tZW1jbXAoJm1fc0RhdGEsICZzVGVtcCwgc2l6ZW9mKFBXTF9TQ1JPTExfUFJJVkFURURBVEEpKSAhPSAwKQogCXsKLQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKKwkJTW92ZVBvc0J1dHRvbih0cnVlKTsKIAkJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwCmluZGV4IDc2YjJiZDMuLjIzYmU3MWEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5jcHAKQEAgLTcwLDkgKzcwLDkgQEAKIAltX3BUZXh0KE5VTEwpLAogCW1fcERlc2NyaXB0aW9uKE5VTEwpLAogCW1fcEltYWdlKE5VTEwpLAotCW1fYlRleHRFeGlzdChUUlVFKSwKLQltX2JJbWFnZUV4aXN0KEZBTFNFKSwKLQltX2JGbGFnRXhpc3QoVFJVRSkKKwltX2JUZXh0RXhpc3QodHJ1ZSksCisJbV9iSW1hZ2VFeGlzdChmYWxzZSksCisJbV9iRmxhZ0V4aXN0KHRydWUpCiB7CiB9CiAKQEAgLTgwLDIxICs4MCwyMSBAQAogewogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0RmxhZyhGWF9CT09MIGJUZXh0RXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0RmxhZyhib29sIGJUZXh0RXhpc3QpCiB7CiAJbV9iVGV4dEV4aXN0ID0gYlRleHRFeGlzdDsKIAogCVJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2VGbGFnKEZYX0JPT0wgYkltYWdlRXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZUZsYWcoYm9vbCBiSW1hZ2VFeGlzdCkKIHsKIAltX2JJbWFnZUV4aXN0ID0gYkltYWdlRXhpc3Q7CiAKIAlSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpCit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRGb3hpdEZsYWcoYm9vbCBiRmxhZ0V4aXN0KQogewogCW1fYkZsYWdFeGlzdCA9IGJGbGFnRXhpc3Q7CiB9CkBAIC0xMzUsNyArMTM1LDcgQEAKIAlDUERGX1JlY3QgcmNUZXh0ID0gcmNDbGllbnQ7CiAJQ1BERl9SZWN0IHJjRGVzY3JpcHRpb24gPSByY0NsaWVudDsKIAotCUZYX0JPT0wgYlRleHRWaXNpYmxlID0gbV9iVGV4dEV4aXN0ICYmIG1fcFRleHQtPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDA7CisJYm9vbCBiVGV4dFZpc2libGUgPSBtX2JUZXh0RXhpc3QgJiYgbV9wVGV4dC0+R2V0VGV4dCgpLkdldExlbmd0aCgpID4gMDsKIAogCWlmICgoYlRleHRWaXNpYmxlIHx8IG1fYkltYWdlRXhpc3QpICYmCiAJCW1fcERlc2NyaXB0aW9uLT5HZXRUZXh0KCkuR2V0TGVuZ3RoKCkgPiAwKQpAQCAtMTU1LDkgKzE1NSw5IEBACiAJbV9wVGV4dC0+U2V0VmlzaWJsZShiVGV4dFZpc2libGUpOwogCW1fcEltYWdlLT5TZXRWaXNpYmxlKG1fYkltYWdlRXhpc3QpOwogCi0JbV9wVGV4dC0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKLQltX3BJbWFnZS0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKLQltX3BEZXNjcmlwdGlvbi0+TW92ZShyY0Rlc2NyaXB0aW9uLCBUUlVFLCBGQUxTRSk7CisJbV9wVGV4dC0+TW92ZShyY1RleHQsIHRydWUsIGZhbHNlKTsKKwltX3BJbWFnZS0+TW92ZShyY1RleHQsIHRydWUsIGZhbHNlKTsKKwltX3BEZXNjcmlwdGlvbi0+TW92ZShyY0Rlc2NyaXB0aW9uLCB0cnVlLCBmYWxzZSk7CiB9CiAKIHZvaWQgQ1BXTF9TaWduYXR1cmU6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKaW5kZXggOTBmYThmOC4uN2JiMzhjNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NoZWNrQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChGQUxTRSkKK0NQV0xfQ2hlY2tCb3g6OkNQV0xfQ2hlY2tCb3goKSA6IG1fYkNoZWNrZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTQ1LDMzICs0NSwzMyBAQAogCXJldHVybiAiQ1BXTF9DaGVja0JveCI7CiB9CiAKLXZvaWQgQ1BXTF9DaGVja0JveDo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spCit2b2lkIENQV0xfQ2hlY2tCb3g6OlNldENoZWNrKGJvb2wgYkNoZWNrKQogewogCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKK2Jvb2wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQogewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKKwlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gZmFsc2U7CiAKIAlTZXRDaGVjayghSXNDaGVja2VkKCkpOwotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCi1GWF9CT09MIENQV0xfQ2hlY2tCb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKK2Jvb2wgQ1BXTF9DaGVja0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQogewogCVNldENoZWNrKCFJc0NoZWNrZWQoKSk7Ci0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1JhZGlvQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9SYWRpb0J1dHRvbjo6Q1BXTF9SYWRpb0J1dHRvbigpIDogbV9iQ2hlY2tlZChGQUxTRSkKK0NQV0xfUmFkaW9CdXR0b246OkNQV0xfUmFkaW9CdXR0b24oKSA6IG1fYkNoZWNrZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTg0LDI3ICs4NCwyNyBAQAogCXJldHVybiAiQ1BXTF9SYWRpb0J1dHRvbiI7CiB9CiAKLUZYX0JPT0wJQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKK2Jvb2wJQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKLQlpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gRkFMU0U7CisJaWYgKElzUmVhZE9ubHkoKSkgcmV0dXJuIGZhbHNlOwogCi0JU2V0Q2hlY2soVFJVRSk7Ci0JcmV0dXJuIFRSVUU7CisJU2V0Q2hlY2sodHJ1ZSk7CisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQ1BXTF9SYWRpb0J1dHRvbjo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spCit2b2lkIENQV0xfUmFkaW9CdXR0b246OlNldENoZWNrKGJvb2wgYkNoZWNrKQogewogCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLUZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKK2Jvb2wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKIHsKIAlyZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotRlhfQk9PTCBDUFdMX1JhZGlvQnV0dG9uOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCitib29sIENQV0xfUmFkaW9CdXR0b246Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKIHsKLQlTZXRDaGVjayhUUlVFKTsKLQlyZXR1cm4gVFJVRTsKKwlTZXRDaGVjayh0cnVlKTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAppbmRleCBiOWJhNzY2Li40ZTRhYzk0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcApAQCAtODcsMTMgKzg3LDEzIEBACiAJCXJlY3QucmlnaHQgKyB4LHJlY3QudG9wICsgeSk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkKK2Jvb2wgQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkKIHsKIAlyZXR1cm4gcmNDaGlsZC5sZWZ0ID49IHJjUGFyZW50LmxlZnQgJiYgcmNDaGlsZC5ib3R0b20gPj0gcmNQYXJlbnQuYm90dG9tICYmCiAJCQlyY0NoaWxkLnJpZ2h0IDw9IHJjUGFyZW50LnJpZ2h0ICYmIHJjQ2hpbGQudG9wIDw9IHJjUGFyZW50LnRvcDsKIH0KIAotRlhfQk9PTCBDUFdMX1V0aWxzOjpJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpCitib29sIENQV0xfVXRpbHM6OkludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0MikKIHsKIAlGWF9GTE9BVCBsZWZ0ID0gcmVjdDEubGVmdCA+IHJlY3QyLmxlZnQgPyByZWN0MS5sZWZ0IDogcmVjdDIubGVmdDsKIAlGWF9GTE9BVCByaWdodCA9IHJlY3QxLnJpZ2h0IDwgcmVjdDIucmlnaHQgPyByZWN0MS5yaWdodCA6IHJlY3QyLnJpZ2h0OwpAQCAtNDIwLDcgKzQyMCw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKKwlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcix0cnVlKTsKIAlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAl7CiAJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yOwpAQCAtNDM1LDcgKzQzNSw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKKwlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcix0cnVlKTsKIAlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAl7CiAJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiZlxuUVxuIjsKQEAgLTQ1OCw3ICs0NTgsNyBAQAogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkKQorCQkJCQkJCQkJCQkJCQlib29sIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQpCiB7CiAJcmV0dXJuIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShwRWRpdCxwdE9mZnNldCxwUmFuZ2UsYkNvbnRpbnVvdXMsU3ViV29yZCk7CiB9CkBAIC00OTgsNyArNDk4LDcgQEAKIAlGWF9GTE9BVCBmWSA9IDAuMGY7CiAJRlhfRkxPQVQgZlN0ZXAgPSAwLjBmOwogCi0JRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsKKwlib29sIGJCcmVhayA9IGZhbHNlOwogCiAJaWYgKHBJdGVyYXRvcikKIAl7CkBAIC01MzgsNyArNTM4LDcgQEAKIAkJCQkJZkVuZFggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CiAJCQkJfQogCi0JCQkJYkJyZWFrID0gVFJVRTsKKwkJCQliQnJlYWsgPSB0cnVlOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCXsKIAkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CiAKLQkJCUZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOworCQkJYm9vbCBiTGF0aW5Xb3JkID0gZmFsc2U7CiAJCQlDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKIAkJCUNGWF9CeXRlU3RyaW5nIHNXb3JkOwogCkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCQkJCWlmICghYkxhdGluV29yZCkKIAkJCQkJCXsKIAkJCQkJCQl3cFdvcmRTdGFydCA9IHBsYWNlOwotCQkJCQkJCWJMYXRpbldvcmQgPSBUUlVFOworCQkJCQkJCWJMYXRpbldvcmQgPSB0cnVlOwogCQkJCQkJfQogCiAJCQkJCQlzV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CkBAIC02MDIsNyArNjAyLDcgQEAKIAkJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CiAJCQkJCQkJCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwogCQkJCQkJCX0KLQkJCQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CisJCQkJCQkJYkxhdGluV29yZCA9IGZhbHNlOwogCQkJCQkJfQogCiAJCQkJCQlzV29yZC5FbXB0eSgpOwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJCQkJCXsKIAkJCQkJCWlmICghcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzV29yZCkpCiAJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7Ci0JCQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CisJCQkJCQliTGF0aW5Xb3JkID0gZmFsc2U7CiAJCQkJCQlzV29yZC5FbXB0eSgpOwogCQkJCQl9CiAJCQkJfQpAQCAtNjI1LDcgKzYyNSw3IEBACiAJCQkJaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKIAkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CiAKLQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7CisJCQkJYkxhdGluV29yZCA9IGZhbHNlOwogCQkJCXNXb3JkLkVtcHR5KCk7CiAJCQl9CiAJCX0KQEAgLTYzNiw3ICs2MzYsNyBAQAogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRUZXh0QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCxJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsCiAJCQkJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nICYgc1RleHQsIGludDMyX3QgbkFsaWdubWVudEgsIGludDMyX3QgbkFsaWdubWVudFYsCi0JCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiTXVsdGlMaW5lLCBGWF9CT09MIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQorCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIGJvb2wgYk11bHRpTGluZSwgYm9vbCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc1JldDsKIApAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCXBFZGl0LT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7CiAJCXBFZGl0LT5TZXRBdXRvUmV0dXJuKGJBdXRvUmV0dXJuKTsKIAkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOworCQkJcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKIAkJZWxzZQogCQkJcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKQEAgLTY4MywxMCArNjgzLDEwIEBACiAJCXBFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKIAkJcEVkaXQtPlNldEFsaWdubWVudEgoMSk7CiAJCXBFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOwotCQlwRWRpdC0+U2V0TXVsdGlMaW5lKEZBTFNFKTsKLQkJcEVkaXQtPlNldEF1dG9SZXR1cm4oRkFMU0UpOworCQlwRWRpdC0+U2V0TXVsdGlMaW5lKGZhbHNlKTsKKwkJcEVkaXQtPlNldEF1dG9SZXR1cm4oZmFsc2UpOwogCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCXBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisJCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKHRydWUpOwogCQllbHNlCiAJCQlwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIApAQCAtODkyLDcgKzg5Miw3IEBACiAKIAkJaWYgKCFyY0ljb24uSXNFbXB0eSgpKQogCQl7Ci0JCQlJY29uLk1vdmUocmNJY29uLCBGQUxTRSwgRkFMU0UpOworCQkJSWNvbi5Nb3ZlKHJjSWNvbiwgZmFsc2UsIGZhbHNlKTsKIAkJCXNUZW1wIDw8IEljb24uR2V0SW1hZ2VBcHBTdHJlYW0oKTsKIAkJfQogCkBAIC05MjMsNyArOTIzLDcgQEAKIAlyZXR1cm4gIiI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBib29sICYgYkZpbGxPclN0cm9rZSkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwogCkBAIC05NjcsNyArOTY3LDcgQEAKIAkJewogCQlkZWZhdWx0OgogCQljYXNlIFBCU19TT0xJRDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsdHJ1ZSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEJTX0RBU0g6Ci0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CisJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixmYWxzZSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTk5Miw3ICs5OTIsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgUEJTX0JFVkVMRUQ6CiAJCWNhc2UgUEJTX0lOU0VUOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLHRydWUpOwogCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAJCQl7CiAJCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7CkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwogCQkJfQogCi0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSx0cnVlKTsKIAkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJewogCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CiAJCQl9CiAKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLFRSVUUpOworCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsdHJ1ZSk7CiAJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCXsKIAkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKQEAgLTEwMjYsNyArMTAyNiw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQQlNfVU5ERVJMSU5FRDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKKwkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKIAkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJewogCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkJY2FzZSBQQlNfU09MSUQ6CiAJCWNhc2UgUEJTX1VOREVSTElORUQ6CiAJCQl7Ci0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKQEAgLTEwNzYsNyArMTA3Niw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBQQlNfREFTSDoKIAkJCXsKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CisJCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmV2lkdGggPDwgIiB3XG4iCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCQkJewogCQkJCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLGZhbHNlKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKQEAgLTEwOTgsNyArMTA5OCw3IEBACiAJCQkJCQk8PCAiIFNcblFcbiI7CiAJCQkJfQogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLEZBTFNFKTsKKwkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIAkJCQkJCTw8ICIgU1xuUVxuIjsKIAkJCQl9CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLEZBTFNFKTsKKwkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLGZhbHNlKTsKIAkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKIAkJCQl7CiAJCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKQEAgLTExMTksNyArMTExOSw3IEBACiAJCQl7CiAJCQkJRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7CisJCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkJCQkJCTw8ICIgU1xuUVxuIjsKIAkJCQl9CiAKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxmYWxzZSk7CiAJCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCiAJCQkJewogCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCQkJCQkJPDwgIiBTXG5RXG4iOwogCQkJCX0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sRkFMU0UpOworCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sZmFsc2UpOwogCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQogCQkJCXsKIAkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgpAQCAtMTIwOCw0MiArMTIwOCw0MiBAQAogQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NoZWNrKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKIHsKIAlDRlhfQnl0ZVRleHRCdWYgc0FQOwotCXNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2hlY2socmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKHJjQkJveCkgPDwgImZcblFcbiI7CiAJcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKIENGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxUUlVFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyY0JCb3gpIDw8ICJmXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxGQUxTRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MocmNCQm94KSA8PCAiU1xuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LGZhbHNlKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9Dcm9zcyhyY0JCb3gpIDw8ICJTXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbjEgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOworCXNBUCA8PCAicVxuMSB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCx0cnVlKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9EaWFtb25kKHJjQkJveCkgPDwgImZcblFcbiI7CiAJcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKIENGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQogewogCUNGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0Jc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxUUlVFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShyY0JCb3gpIDw8ICJmXG5RXG4iOwogCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKKwlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LHRydWUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKIAlyZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIApAQCAtMTI5OSw3ICsxMjk5LDcgQEAKIAogCWlmICghcmNCQm94LklzRW1wdHkoKSkKIAl7Ci0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDIyMC4wZi8yNTUuMGYsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmKSxUUlVFKTsKKwkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpLHRydWUpOwogCQlzQXBwU3RyZWFtIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgogCQkJCTw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbSA8PCAiIHJlIGZcbiI7CiAJCXNBcHBTdHJlYW0gPDwgIlFcbiI7CkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogfQogCiB2b2lkIENQV0xfVXRpbHM6OkRyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiVmVydGljYWwsIEZYX0JPT0wgYkhvcml6b250YWwsIENQREZfUmVjdCByZWN0LAorCQkJCQkJCQkJCQkJCQlib29sIGJWZXJ0aWNhbCwgYm9vbCBiSG9yaXpvbnRhbCwgQ1BERl9SZWN0IHJlY3QsCiAJCQkJCQkJCQkJCQkJCWludDMyX3QgblRyYW5zcGFyYW5jeSwgaW50MzJfdCBuU3RhcnRHcmF5LCBpbnQzMl90IG5FbmRHcmF5KQogewogCUZYX0ZMT0FUIGZTdGVwR3JheSA9IDEuMGY7CkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogCUZYX0ZMT0FUIGZZID0gMC4wZjsKIAlGWF9GTE9BVCBmU3RlcCA9IDAuMGY7CiAKLQlGWF9CT09MIGJCcmVhayA9IEZBTFNFOworCWJvb2wgYkJyZWFrID0gZmFsc2U7CiAKIAlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQogCXsKQEAgLTE2NzgsNyArMTY3OCw3IEBACiAJCQkJCWZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwogCQkJCX0KIAotCQkJCWJCcmVhayA9IFRSVUU7CisJCQkJYkJyZWFrID0gdHJ1ZTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKQEAgLTE3MDAsNyArMTcwMCw3IEBACiAJY29uc3QgRlhfQ09MT1JSRUYgY3JTcGVsbCA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwwLDApOwogCiAJLy9mb3Igc3BlbGxjaGVjawotCUZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOworCWJvb2wgYkxhdGluV29yZCA9IGZhbHNlOwogCUNQVlRfV29yZFBsYWNlIHdwV29yZFN0YXJ0OwogCUNGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7CiAKQEAgLTE3NDQsNyArMTc0NCw3IEBACiAJCQkJCQlpZiAoIWJMYXRpbldvcmQpCiAJCQkJCQl7CiAJCQkJCQkJd3BXb3JkU3RhcnQgPSBwbGFjZTsKLQkJCQkJCQliTGF0aW5Xb3JkID0gVFJVRTsKKwkJCQkJCQliTGF0aW5Xb3JkID0gdHJ1ZTsKIAkJCQkJCX0KIAogCQkJCQkJc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CkBAIC0xNzYxLDcgKzE3NjEsNyBAQAogCQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOworCQkJCQkJCWJMYXRpbldvcmQgPSBmYWxzZTsKIAkJCQkJCX0KIAogCQkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwpAQCAtMTc4MSw3ICsxNzgxLDcgQEAKIAkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOworCQkJCQkJYkxhdGluV29yZCA9IGZhbHNlOwogCQkJCQl9CiAKIAkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwpAQCAtMTgwNiwxMiArMTgwNiwxMiBAQAogCXBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi1GWF9CT09MIENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQorYm9vbCBDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZShjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKIHsKIAlzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpCiAJewogCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIAljYXNlIENPTE9SVFlQRV9HUkFZOgogCQlyZXR1cm4gY29sb3IuZkNvbG9yMSA8IDAuNWY7CiAJY2FzZSBDT0xPUlRZUEVfUkdCOgpAQCAtMTgyMCw3ICsxODIwLDcgQEAKIAkJcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyArIGNvbG9yLmZDb2xvcjQgPiAyLjBmOwogCX0KIAotCXJldHVybiBUUlVFOworCXJldHVybiB0cnVlOwogfQogCiBDUFdMX0NvbG9yIENQV0xfVXRpbHM6OkdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKQEAgLTE4NTEsOCArMTg1MSw4IEBACiBDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRJY29uQXBwU3RyZWFtKGludDMyX3QgblR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmVjdCwgY29uc3QgQ1BXTF9Db2xvciYgY3JGaWxsLAogCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpCiB7Ci0JQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBGQUxTRSk7Ci0Jc0FwcFN0cmVhbSArPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckZpbGwsIFRSVUUpOworCUNGWF9CeXRlU3RyaW5nIHNBcHBTdHJlYW0gPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclN0cm9rZSwgZmFsc2UpOworCXNBcHBTdHJlYW0gKz0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JGaWxsLCB0cnVlKTsKIAogCUNGWF9CeXRlU3RyaW5nIHNQYXRoOwogCUNGWF9QYXRoRGF0YSBwYXRoOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwCmluZGV4IDQzM2IzYzYuLmYyMTRmYjMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfV25kLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKQEAgLTEyMyw0MCArMTIzLDQwIEBACiAgICAgICAgIG1fcE1haW5LZXlib2FyZFduZCA9IE5VTEw7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc1duZENyZWF0ZWQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNXbmRDcmVhdGVkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BDcmVhdGVkV25kID09IHBXbmQ7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc01haW5DYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNNYWluQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5Nb3VzZVduZDsKICAgICB9CiAKLSAgICBGWF9CT09MIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKKyAgICBib29sIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChwV25kKQogICAgICAgICAgICAgZm9yKCBpbnQzMl90IGk9MCxzej1tX2FNb3VzZVBhdGguR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKG1fYU1vdXNlUGF0aC5HZXRBdChpKSA9PSBwV25kKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgRlhfQk9PTCBJc01haW5DYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNNYWluQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5LZXlib2FyZFduZDsKICAgICB9CiAKIAotICAgIEZYX0JPT0wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorICAgIGJvb2wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKHBXbmQpCiAgICAgICAgICAgICBmb3IoIGludDMyX3QgaT0wLHN6PW1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCk7IGk8c3o7IGkrKykKICAgICAgICAgICAgICAgICBpZiAobV9hS2V5Ym9hcmRQYXRoLkdldEF0KGkpID09IHBXbmQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2b2lkIFNldEZvY3VzKENQV0xfV25kICogcFduZCkKQEAgLTIyNSwxNiArMjI1LDE2IEBACiAgICAgbV9wVlNjcm9sbEJhcihOVUxMKSwKICAgICBtX3JjV2luZG93KCksCiAgICAgbV9yY0NsaXAoKSwKLSAgICBtX2JDcmVhdGVkKEZBTFNFKSwKLSAgICBtX2JWaXNpYmxlKEZBTFNFKSwKLSAgICBtX2JOb3RpZnlpbmcoRkFMU0UpLAotICAgIG1fYkVuYWJsZWQoVFJVRSkKKyAgICBtX2JDcmVhdGVkKGZhbHNlKSwKKyAgICBtX2JWaXNpYmxlKGZhbHNlKSwKKyAgICBtX2JOb3RpZnlpbmcoZmFsc2UpLAorICAgIG1fYkVuYWJsZWQodHJ1ZSkKIHsKIH0KIAogQ1BXTF9XbmQ6On5DUFdMX1duZCgpCiB7Ci0gICAgQVNTRVJUKG1fYkNyZWF0ZWQgPT0gRkFMU0UpOworICAgIEFTU0VSVChtX2JDcmVhdGVkID09IGZhbHNlKTsKIH0KIAogQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9XbmQ6OkdldENsYXNzTmFtZSgpIGNvbnN0CkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICAgICAgT25DcmVhdGVkKCk7CiAKICAgICAgICAgUmVQb3NDaGlsZFduZCgpOwotICAgICAgICBtX2JDcmVhdGVkID0gVFJVRTsKKyAgICAgICAgbV9iQ3JlYXRlZCA9IHRydWU7CiAgICAgfQogfQogCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogICAgICAgICBpZiAobV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQpCiAgICAgICAgICAgICBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+T25Ob3RpZnkodGhpcywgUE5NX1JFTU9WRUNISUxEKTsKLSAgICAgICAgbV9iQ3JlYXRlZCA9IEZBTFNFOworICAgICAgICBtX2JDcmVhdGVkID0gZmFsc2U7CiAgICAgfQogCiAgICAgRGVzdHJveU1zZ0NvbnRyb2woKTsKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgIG1fcFZTY3JvbGxCYXIgPSBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LCBGWF9CT09MIGJSZXNldCxGWF9CT09MIGJSZWZyZXNoKQordm9pZCBDUFdMX1duZDo6TW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldywgYm9vbCBiUmVzZXQsYm9vbCBiUmVmcmVzaCkKIHsKICAgICBpZiAoSXNWYWxpZCgpKQogICAgIHsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogfQogCiAjZGVmaW5lIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChrZXlfbWV0aG9kX25hbWUpXAotRlhfQk9PTCBDUFdMX1duZDo6a2V5X21ldGhvZF9uYW1lKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKVwKK2Jvb2wgQ1BXTF9XbmQ6OmtleV9tZXRob2RfbmFtZShGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZylcCiB7XAogICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpXAogICAgIHtcCkBAIC01MTIsMTEgKzUxMiwxMSBAQAogICAgICAgICAgICAgfVwKICAgICAgICAgfVwKICAgICB9XAotICAgIHJldHVybiBGQUxTRTtcCisgICAgcmV0dXJuIGZhbHNlO1wKIH0KIAogI2RlZmluZSBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChtb3VzZV9tZXRob2RfbmFtZSlcCi1GWF9CT09MIENQV0xfV25kOjptb3VzZV9tZXRob2RfbmFtZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKVwKK2Jvb2wgQ1BXTF9XbmQ6Om1vdXNlX21ldGhvZF9uYW1lKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpXAoge1wKICAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKVwKICAgICB7XApAQCAtNTUwLDcgKzU1MCw3IEBACiAgICAgICAgICAgICAgICAgU2V0Q3Vyc29yKCk7XAogICAgICAgICB9XAogICAgIH1cCi0gICAgcmV0dXJuIEZBTFNFO1wKKyAgICByZXR1cm4gZmFsc2U7XAogfQogCiBQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25LZXlEb3duKQpAQCAtNTY3LDcgKzU2Nyw3IEBACiBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQogCi1GWF9CT09MIENQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQorYm9vbCBDUFdMX1duZDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKIHsKICAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKQogICAgIHsKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkFkZENoaWxkKENQV0xfV25kICogcFduZCkKQEAgLTYyNCw3ICs2MjQsNyBAQAogICAgIH0KIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNWYWxpZCgpIGNvbnN0Citib29sIENQV0xfV25kOjpJc1ZhbGlkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9iQ3JlYXRlZDsKIH0KQEAgLTY3Nyw3ICs2NzcsNyBAQAogICAgIHJldHVybiBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLDAuMWYpKTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdAogewogICAgIHJldHVybiAobV9zUHJpdmF0ZVBhcmFtLmR3RmxhZ3MgJiBkd0ZsYWdzKSAhPSAwOwogfQpAQCAtODY1LDEyICs4NjUsMTIgQEAKIHsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6V25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Citib29sIENQV0xfV25kOjpXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKIHsKICAgICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldFdpbmRvd1JlY3QoKS5Db250YWlucyhwb2ludC54LHBvaW50LnkpOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKK2Jvb2wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAogewogICAgIHJldHVybiBJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgR2V0Q2xpZW50UmVjdCgpLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSk7CiB9CkBAIC04ODMsNyArODgzLDcgQEAKICAgICByZXR1cm4gdGhpczsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKQordm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShib29sIGJWaXNpYmxlKQogewogICAgIGlmIChJc1ZhbGlkKCkpCiAgICAgewpAQCAtOTE1LDcgKzkxNSw3IEBACiAgICAgcmV0dXJuIG1fcmNDbGlwOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc1JlYWRPbmx5KCkgY29uc3QKK2Jvb2wgQ1BXTF9XbmQ6OklzUmVhZE9ubHkoKSBjb25zdAogewogICAgIHJldHVybiBIYXNGbGFnKFBXU19SRUFET05MWSk7CiB9CkBAIC05MzEsNyArOTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQtMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQudG9wKTsKIAotICAgIGlmIChwVlNCKSBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCxUUlVFLEZBTFNFKTsKKyAgICBpZiAocFZTQikgcFZTQi0+TW92ZShyY1ZTY3JvbGwsdHJ1ZSxmYWxzZSk7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQpAQCAtOTY4LDMzICs5NjgsMzMgQEAKICAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBNc2dDb250cm9sOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0Citib29sIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIElzV25kQ2FwdHVyZU1vdXNlKHRoaXMpOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Citib29sIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0CiB7CiAgICAgaWYgKENQV0xfTXNnQ29udHJvbCAqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQogICAgICAgICByZXR1cm4gcEN0cmwtPklzV25kQ2FwdHVyZU1vdXNlKHBXbmQpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAogewogICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKICAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc1duZENhcHR1cmVLZXlib2FyZChwV25kKTsKIAotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OklzRm9jdXNlZCgpIGNvbnN0Citib29sIENQV0xfV25kOjpJc0ZvY3VzZWQoKSBjb25zdAogewogICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKICAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc01haW5DYXB0dXJlS2V5Ym9hcmQodGhpcyk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0CkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpFbmFibGVXaW5kb3coRlhfQk9PTCBiRW5hYmxlKQordm9pZCBDUFdMX1duZDo6RW5hYmxlV2luZG93KGJvb2wgYkVuYWJsZSkKIHsKICAgICBpZiAobV9iRW5hYmxlZCAhPSBiRW5hYmxlKQogICAgIHsKQEAgLTEyMzgsNyArMTIzOCw3IEBACiAgICAgfQogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc0VuYWJsZWQoKQorYm9vbCBDUFdMX1duZDo6SXNFbmFibGVkKCkKIHsKICAgICByZXR1cm4gbV9iRW5hYmxlZDsKIH0KQEAgLTEyNTEsNDIgKzEyNTEsNDIgQEAKIHsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNDVFJMcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKK2Jvb2wgQ1BXTF9XbmQ6OklzQ1RSTHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0CiB7CiAgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkKICAgICB7CiAgICAgICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNDVFJMS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0Citib29sIENQV0xfV25kOjpJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKIHsKICAgICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogewogICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCiAgICAgewogICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQUxUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAorYm9vbCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAogewogICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCiAgICAgewogICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzSU5TRVJUS2V5RG93bihuRmxhZyk7CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0K