ZGlmZiAtLWdpdCBhL0luY2x1ZGUvc3RyaW5nb2JqZWN0LmggYi9JbmNsdWRlL3N0cmluZ29iamVjdC5oCmluZGV4IGFiYzhmYWQuLmZkMGY0OWEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc3RyaW5nb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zdHJpbmdvYmplY3QuaApAQCAtNTMsNiArNTMsNyBAQAogCQkJCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CiBQeUFQSV9GVU5DKGludCkgUHlTdHJpbmdfU2l6ZShQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoY2hhciAqKSBQeVN0cmluZ19Bc1N0cmluZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfUmVwcihQeU9iamVjdCAqLCBpbnQpOwogUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19Db25jYXQoUHlPYmplY3QgKiosIFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19Db25jYXRBbmREZWwoUHlPYmplY3QgKiosIFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhpbnQpIF9QeVN0cmluZ19SZXNpemUoUHlPYmplY3QgKiosIGludCk7CkBAIC02MCw2ICs2MSw5IEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0Zvcm1hdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U3RyaW5nX0Zvcm1hdExvbmcoUHlPYmplY3QqLCBpbnQsIGludCwKIAkJCQkJCSAgaW50LCBjaGFyKiosIGludCopOworZXh0ZXJuIERMX0lNUE9SVChQeU9iamVjdCAqKSBQeVN0cmluZ19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqLCBpbnQsIAorCQkJCQkJICAgY29uc3QgY2hhciAqLCBpbnQsCisJCQkJCQkgICBjb25zdCBjaGFyICopOwogCiBQeUFQSV9GVU5DKHZvaWQpIFB5U3RyaW5nX0ludGVybkluUGxhY2UoUHlPYmplY3QgKiopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKik7CmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHkgYi9MaWIvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5YTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weQpAQCAtMCwwICsxLDIzIEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisiIiIgUHl0aG9uICdlc2NhcGUnIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZW5jb2RlID0gY29kZWNzLmVzY2FwZV9lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworICAgICAgICAKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorCisgICAgcmV0dXJuIChDb2RlYy5lbmNvZGUsQ29kZWMuZGVjb2RlLFN0cmVhbVJlYWRlcixTdHJlYW1Xcml0ZXIpCmRpZmYgLS1naXQgYS9MaWIvcGlja2xlLnB5IGIvTGliL3BpY2tsZS5weQppbmRleCBhNTA3NTk1Li40YmM1NGVjIDEwMDY0NAotLS0gYS9MaWIvcGlja2xlLnB5CisrKyBiL0xpYi9waWNrbGUucHkKQEAgLTEyNiw2ICsxMjYsOCBAQAogX19hbGxfXy5leHRlbmQoW3ggZm9yIHggaW4gZGlyKCkgaWYgcmUubWF0Y2goIltBLVpdW0EtWjAtOV9dKyQiLHgpXSkKIGRlbCB4CiAKK19xdW90ZXMgPSBbIiciLCAnIiddCisKIGNsYXNzIFBpY2tsZXI6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgYmluID0gMCk6CkBAIC03NDAsMTAgKzc0MiwxNSBAQAogCiAgICAgZGVmIGxvYWRfc3RyaW5nKHNlbGYpOgogICAgICAgICByZXAgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQotICAgICAgICBpZiBub3Qgc2VsZi5faXNfc3RyaW5nX3NlY3VyZShyZXApOgorICAgICAgICBmb3IgcSBpbiBfcXVvdGVzOgorICAgICAgICAgICAgaWYgcmVwLnN0YXJ0c3dpdGgocSk6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlcC5lbmRzd2l0aChxKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImluc2VjdXJlIHN0cmluZyBwaWNrbGUiCisgICAgICAgICAgICAgICAgcmVwID0gcmVwW2xlbihxKTotbGVuKHEpXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW5zZWN1cmUgc3RyaW5nIHBpY2tsZSIKLSAgICAgICAgc2VsZi5hcHBlbmQoZXZhbChyZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeydfX2J1aWx0aW5zX18nOiB7fX0pKSAjIExldCdzIGJlIGNhcmVmdWwKKyAgICAgICAgc2VsZi5hcHBlbmQocmVwLmRlY29kZSgic3RyaW5nLWVzY2FwZSIpKQogICAgIGRpc3BhdGNoW1NUUklOR10gPSBsb2FkX3N0cmluZwogCiAgICAgZGVmIF9pc19zdHJpbmdfc2VjdXJlKHNlbGYsIHMpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IGViOTdhOWMuLjNkYzc5MDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTE5NSwxMyArMTk1LDEzIEBACiAKICAgICBkZWYgdGVzdF9pbnNlY3VyZV9zdHJpbmdzKHNlbGYpOgogICAgICAgICBpbnNlY3VyZSA9IFsiYWJjIiwgIjIgKyAyIiwgIyBub3QgcXVvdGVkCi0gICAgICAgICAgICAgICAgICAgICInYWJjJyArICdkZWYnIiwgIyBub3QgYSBzaW5nbGUgcXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgICAgICAjIidhYmMnICsgJ2RlZiciLCAjIG5vdCBhIHNpbmdsZSBxdW90ZWQgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICInYWJjIiwgIyBxdW90ZSBpcyBub3QgY2xvc2VkCiAgICAgICAgICAgICAgICAgICAgICInYWJjXCIiLCAjIG9wZW4gcXVvdGUgYW5kIGNsb3NlIHF1b3RlIGRvbid0IG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICInYWJjJyAgID8iLCAjIGp1bmsgYWZ0ZXIgY2xvc2UgcXVvdGUKICAgICAgICAgICAgICAgICAgICAgIyBzb21lIHRlc3RzIG9mIHRoZSBxdW90aW5nIHJ1bGVzCi0gICAgICAgICAgICAgICAgICAgICInYWJjXCJcJyciLAotICAgICAgICAgICAgICAgICAgICAiJ1xcXFxhXCdcJ1wnXFxcJ1xcXFxcJyciLAorICAgICAgICAgICAgICAgICAgICAjIidhYmNcIlwnJyIsCisgICAgICAgICAgICAgICAgICAgICMiJ1xcXFxhXCdcJ1wnXFxcJ1xcXFxcJyciLAogICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciBzIGluIGluc2VjdXJlOgogICAgICAgICAgICAgYnVmID0gIlMiICsgcyArICJcMDEycDBcMDEyLiIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggZDY2MzI5My4uMWUzZmM1ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTcxLDcgKzcxLDYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIC8qIC0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMKQEAgLTk3LDYgKzk2LDQ5IEBACiAgICAgcmV0dXJuIHY7CiB9CiAKKy8qIC0tLSBTdHJpbmcgY29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIFB5T2JqZWN0ICoKK2VzY2FwZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCisJICAgICAgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpkYXRhOworICAgIGludCBzaXplOworICAgIAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8ejplc2NhcGVfZGVjb2RlIiwKKwkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzKSkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGRhdGEsIHNpemUsIGVycm9ycywgMCwgTlVMTCksIAorCQkgICAgICAgc2l6ZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitlc2NhcGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAorCSAgICAgIFB5T2JqZWN0ICphcmdzKQoreworCVB5T2JqZWN0ICpzdHI7CisJY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKKwljaGFyICpidWY7CisJaW50IGxlbjsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8ejplc2NhcGVfZW5jb2RlIiwKKwkJCSAgICAgICZQeVN0cmluZ19UeXBlLCAmc3RyLCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdHIgPSBQeVN0cmluZ19SZXByKHN0ciwgMCk7CisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCisJLyogVGhlIHN0cmluZyB3aWxsIGJlIHF1b3RlZC4gVW5xdW90ZSwgc2ltaWxhciB0byB1bmljb2RlLWVzY2FwZS4gKi8KKwlidWYgPSBQeVN0cmluZ19BU19TVFJJTkcgKHN0cik7CisJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUgKHN0cik7CisJbWVtbW92ZShidWYsIGJ1ZisxLCBsZW4tMik7CisJX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4tMik7CisJCisJcmV0dXJuIGNvZGVjX3R1cGxlKHN0ciwgUHlTdHJpbmdfU2l6ZShzdHIpKTsKK30KKworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIC8qIC0tLSBEZWNvZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjY5LDYgKzcxMSw4IEBACiBzdGF0aWMgUHlNZXRob2REZWYgX2NvZGVjc19mdW5jdGlvbnNbXSA9IHsKICAgICB7InJlZ2lzdGVyIiwJCWNvZGVjcmVnaXN0ZXIsCQkJTUVUSF9WQVJBUkdTfSwKICAgICB7Imxvb2t1cCIsCQkJY29kZWNsb29rdXAsIAkJCU1FVEhfVkFSQVJHU30sCisgICAgeyJlc2NhcGVfZW5jb2RlIiwJCWVzY2FwZV9lbmNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKKyAgICB7ImVzY2FwZV9kZWNvZGUiLAkJZXNjYXBlX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgICB7InV0Zl84X2VuY29kZSIsCQl1dGZfOF9lbmNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKICAgICB7InV0Zl84X2RlY29kZSIsCQl1dGZfOF9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvY1BpY2tsZS5jIGIvTW9kdWxlcy9jUGlja2xlLmMKaW5kZXggZDFmNzg2Ny4uMTQ5MzZhNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jUGlja2xlLmMKKysrIGIvTW9kdWxlcy9jUGlja2xlLmMKQEAgLTI4NjQsNDYgKzI4NjQsMzUgQEAKIGxvYWRfc3RyaW5nKFVucGlja2xlcm9iamVjdCAqc2VsZikgCiB7CiAJUHlPYmplY3QgKnN0ciA9IDA7Ci0JaW50IGxlbiwgcmVzID0gLTEsIG5zbGFzaDsKLQljaGFyICpzLCBxLCAqcDsKLQotCXN0YXRpYyBQeU9iamVjdCAqZXZhbF9kaWN0ID0gMDsKKwlpbnQgbGVuLCByZXMgPSAtMTsKKwljaGFyICpzLCAqcDsKIAogCWlmICgobGVuID0gKCpzZWxmLT5yZWFkbGluZV9mdW5jKShzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwogCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CiAJaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CiAKLQkvKiBDaGVjayBmb3IgdW5xdW90ZWQgcXVvdGVzIChldmlsIHN0cmluZ3MpICovCi0JcT0qczsKLQlpZiAocSAhPSAnIicgJiYgcSAhPSAnXCcnKSBnb3RvIGluc2VjdXJlOwotCWZvciAocD1zKzEsIG5zbGFzaD0wOyAqcDsgcCsrKSB7Ci0JCWlmICgqcD09cSAmJiBuc2xhc2glMj09MCkgYnJlYWs7Ci0JCWlmICgqcD09J1xcJykgbnNsYXNoKys7Ci0JCWVsc2UgbnNsYXNoPTA7Ci0JfQotCWlmICgqcCA9PSBxKSB7Ci0JCWZvciAocCsrOyAqcDsgcCsrKQotCQkJaWYgKCoodW5zaWduZWQgY2hhciAqKXAgPiAnICcpCi0JCQkJZ290byBpbnNlY3VyZTsKLQl9Ci0JZWxzZQorCisJLyogU3RyaXAgb3V0ZXJtb3N0IHF1b3RlcyAqLworCXdoaWxlIChzW2xlbi0xXSA8PSAnICcpCisJCWxlbi0tOworCWlmKHNbMF09PSciJyAmJiBzW2xlbi0xXT09JyInKXsKKwkJc1tsZW4tMV0gPSAnXDAnOworCQlwID0gcyArIDEgOworCQlsZW4gLT0gMjsKKwl9IGVsc2UgaWYoc1swXT09J1wnJyAmJiBzW2xlbi0xXT09J1wnJyl7CisJCXNbbGVuLTFdID0gJ1wwJzsKKwkJcCA9IHMgKyAxIDsKKwkJbGVuIC09IDI7CisJfSBlbHNlCiAJCWdvdG8gaW5zZWN1cmU7CiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JaWYgKCEoIGV2YWxfZGljdCApKSAKLQkJaWYgKCEoIGV2YWxfZGljdCA9IFB5X0J1aWxkVmFsdWUoIntze319IiwgIl9fYnVpbHRpbnNfXyIpKSkgCi0JCQlnb3RvIGZpbmFsbHk7Ci0KLQlpZiAoISggc3RyID0gUHlSdW5fU3RyaW5nKHMsIFB5X2V2YWxfaW5wdXQsIGV2YWxfZGljdCwgZXZhbF9kaWN0KSkpIAotCQlnb3RvIGZpbmFsbHk7Ci0KKwlzdHIgPSBQeVN0cmluZ19EZWNvZGVFc2NhcGUocCwgbGVuLCBOVUxMLCAwLCBOVUxMKTsKKwlpZiAoc3RyKSB7CisJCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHN0ciwgLTEpOworCQlyZXMgPSAwOworCX0KIAlmcmVlKHMpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHN0ciwgLTEpOwotCXJldHVybiAwOwotCi0gIGZpbmFsbHk6Ci0JZnJlZShzKTsKLQogCXJldHVybiByZXM7CiAKICAgaW5zZWN1cmU6CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ29iamVjdC5jIGIvT2JqZWN0cy9zdHJpbmdvYmplY3QuYwppbmRleCAxYmJkMjAxLi4xOWMyODM0IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ29iamVjdC5jCisrKyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKQEAgLTQ4OSw2ICs0ODksMTUyIEBACiAJb3AtPm9iX3R5cGUtPnRwX2ZyZWUob3ApOwogfQogCisvKiBVbmVzY2FwZSBhIGJhY2tzbGFzaC1lc2NhcGVkIHN0cmluZy4gSWYgdW5pY29kZSBpcyBub24temVybywKKyAgIHRoZSBzdHJpbmcgaXMgYSB1LWxpdGVyYWwuIElmIHJlY29kZV9lbmNvZGluZyBpcyBub24temVybywKKyAgIHRoZSBzdHJpbmcgaXMgVVRGLTggZW5jb2RlZCBhbmQgc2hvdWxkIGJlIHJlLWVuY29kZWQgaW4gdGhlCisgICBzcGVjaWZpZWQgZW5jb2RpbmcuICAqLworCitQeU9iamVjdCAqUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKnMsCisJCQkJaW50IGxlbiwKKwkJCQljb25zdCBjaGFyICplcnJvcnMsCisJCQkJaW50IHVuaWNvZGUsCisJCQkJY29uc3QgY2hhciAqcmVjb2RlX2VuY29kaW5nKQoreworCWludCBjOworCWNoYXIgKnAsICpidWY7CisJY29uc3QgY2hhciAqZW5kOworCVB5T2JqZWN0ICp2OworCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIAorCQkJCSAgICAgICByZWNvZGVfZW5jb2RpbmcgPyA0KmxlbjpsZW4pOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXAgPSBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKwllbmQgPSBzICsgbGVuOworCXdoaWxlIChzIDwgZW5kKSB7CisJCWlmICgqcyAhPSAnXFwnKSB7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorCQkJaWYgKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkgeworCQkJCVB5T2JqZWN0ICp1LCAqdzsKKwkJCQljaGFyICpyOworCQkJCWNvbnN0IGNoYXIqIHQ7CisJCQkJaW50IHJuOworCQkJCXQgPSBzOworCQkJCS8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCisJCQkJd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpIHQrKzsKKwkJCQl1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgdCAtIHMsIGVycm9ycyk7CisJCQkJaWYoIXUpIGdvdG8gZmFpbGVkOworCisJCQkJLyogUmVjb2RlIHRoZW0gaW4gdGFyZ2V0IGVuY29kaW5nLiAqLworCQkJCXcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorCQkJCQl1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7CisJCQkJUHlfREVDUkVGKHUpOworCQkJCWlmICghdykJZ290byBmYWlsZWQ7CisKKwkJCQkvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KKwkJCQlyID0gUHlTdHJpbmdfQXNTdHJpbmcodyk7CisJCQkJcm4gPSBQeVN0cmluZ19TaXplKHcpOworCQkJCW1lbWNweShwLCByLCBybik7CisJCQkJcCArPSBybjsKKwkJCQlQeV9ERUNSRUYodyk7CisJCQkJcyA9IHQ7CisJCQl9IGVsc2UgeworCQkJCSpwKysgPSAqcysrOworCQkJfQorI2Vsc2UKKwkJCSpwKysgPSAqcysrOworI2VuZGlmCisJCQljb250aW51ZTsKKwkJfQorCQlzKys7CisJCXN3aXRjaCAoKnMrKykgeworCQkvKiBYWFggVGhpcyBhc3N1bWVzIEFTQ0lJISAqLworCQljYXNlICdcbic6IGJyZWFrOworCQljYXNlICdcXCc6ICpwKysgPSAnXFwnOyBicmVhazsKKwkJY2FzZSAnXCcnOiAqcCsrID0gJ1wnJzsgYnJlYWs7CisJCWNhc2UgJ1wiJzogKnArKyA9ICdcIic7IGJyZWFrOworCQljYXNlICdiJzogKnArKyA9ICdcYic7IGJyZWFrOworCQljYXNlICdmJzogKnArKyA9ICdcMDE0JzsgYnJlYWs7IC8qIEZGICovCisJCWNhc2UgJ3QnOiAqcCsrID0gJ1x0JzsgYnJlYWs7CisJCWNhc2UgJ24nOiAqcCsrID0gJ1xuJzsgYnJlYWs7CisJCWNhc2UgJ3InOiAqcCsrID0gJ1xyJzsgYnJlYWs7CisJCWNhc2UgJ3YnOiAqcCsrID0gJ1wwMTMnOyBicmVhazsgLyogVlQgKi8KKwkJY2FzZSAnYSc6ICpwKysgPSAnXDAwNyc7IGJyZWFrOyAvKiBCRUwsIG5vdCBjbGFzc2ljIEMgKi8KKwkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6CisJCWNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgorCQkJYyA9IHNbLTFdIC0gJzAnOworCQkJaWYgKCcwJyA8PSAqcyAmJiAqcyA8PSAnNycpIHsKKwkJCQljID0gKGM8PDMpICsgKnMrKyAtICcwJzsKKwkJCQlpZiAoJzAnIDw9ICpzICYmICpzIDw9ICc3JykKKwkJCQkJYyA9IChjPDwzKSArICpzKysgLSAnMCc7CisJCQl9CisJCQkqcCsrID0gYzsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCWlmIChpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzBdKSkgCisJCQkgICAgJiYgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1sxXSkpKSB7CisJCQkJdW5zaWduZWQgaW50IHggPSAwOworCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7CisJCQkJcysrOworCQkJCWlmIChpc2RpZ2l0KGMpKQorCQkJCQl4ID0gYyAtICcwJzsKKwkJCQllbHNlIGlmIChpc2xvd2VyKGMpKQorCQkJCQl4ID0gMTAgKyBjIC0gJ2EnOworCQkJCWVsc2UKKwkJCQkJeCA9IDEwICsgYyAtICdBJzsKKwkJCQl4ID0geCA8PCA0OworCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7CisJCQkJcysrOworCQkJCWlmIChpc2RpZ2l0KGMpKQorCQkJCQl4ICs9IGMgLSAnMCc7CisJCQkJZWxzZSBpZiAoaXNsb3dlcihjKSkKKwkJCQkJeCArPSAxMCArIGMgLSAnYSc7CisJCQkJZWxzZQorCQkJCQl4ICs9IDEwICsgYyAtICdBJzsKKwkJCQkqcCsrID0geDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZXJyb3JzIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKSB7CisJCQkJUHlfREVDUkVGKHYpOworCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKKwkJCQkJCSJpbnZhbGlkIFxceCBlc2NhcGUiKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApIHsKKwkJCQkqcCsrID0gJz8nOworCQkJfSBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkKKwkJCQkvKiBkbyBub3RoaW5nICovOworCQkJZWxzZSB7CisJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkJCSAgICAgImRlY29kaW5nIGVycm9yOyAiCisJCQkJCSAgICAgInVua25vd24gZXJyb3IgaGFuZGxpbmcgY29kZTogJS40MDBzIiwKKwkJCQkJICAgICBlcnJvcnMpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCisJCWNhc2UgJ3UnOgorCQljYXNlICdVJzoKKwkJY2FzZSAnTic6CisJCQlpZiAodW5pY29kZSkgeworCQkJCVB5X0RFQ1JFRih2KTsKKwkJCQljb21fZXJyb3IoY29tLCBQeUV4Y19WYWx1ZUVycm9yLAorCQkJCQkgICJVbmljb2RlIGVzY2FwZXMgbm90IGxlZ2FsICIKKwkJCQkJICAid2hlbiBVbmljb2RlIGRpc2FibGVkIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCSpwKysgPSAnXFwnOworCQkJKnArKyA9IHNbLTFdOworCQkJYnJlYWs7CisJCX0KKwl9CisJX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKGludCkocCAtIGJ1ZikpOworCXJldHVybiB2OworICBmYWlsZWQ6CisJUHlfREVDUkVGKHYpOworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW50CiBzdHJpbmdfZ2V0c2l6ZShyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7CkBAIC02MTQsOSArNzYwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1zdHJpbmdfcmVwcihyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3ApCitQeU9iamVjdCAqCitQeVN0cmluZ19SZXByKFB5T2JqZWN0ICpvYmosIGludCBzbWFydHF1b3RlcykKIHsKKwlyZWdpc3RlciBQeVN0cmluZ09iamVjdCogb3AgPSAoUHlTdHJpbmdPYmplY3QqKSBvYmo7CiAJc2l6ZV90IG5ld3NpemUgPSAyICsgNCAqIG9wLT5vYl9zaXplICogc2l6ZW9mKGNoYXIpOwogCVB5T2JqZWN0ICp2OwogCWlmIChuZXdzaXplID4gSU5UX01BWCkgewpAQCAtNjM1LDcgKzc4Miw4IEBACiAKIAkJLyogZmlndXJlIG91dCB3aGljaCBxdW90ZSB0byB1c2U7IHNpbmdsZSBpcyBwcmVmZXJyZWQgKi8KIAkJcXVvdGUgPSAnXCcnOwotCQlpZiAobWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBvcC0+b2Jfc2l6ZSkgJiYKKwkJaWYgKHNtYXJ0cXVvdGVzICYmIAorCQkgICAgbWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBvcC0+b2Jfc2l6ZSkgJiYKIAkJICAgICFtZW1jaHIob3AtPm9iX3N2YWwsICciJywgb3AtPm9iX3NpemUpKQogCQkJcXVvdGUgPSAnIic7CiAKQEAgLTY3NCw2ICs4MjIsMTIgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKK3N0cmluZ19yZXByKFB5T2JqZWN0ICpvcCkKK3sKKwlyZXR1cm4gUHlTdHJpbmdfUmVwcihvcCwgMSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc3RyKFB5T2JqZWN0ICpzKQogewogCWFzc2VydChQeVN0cmluZ19DaGVjayhzKSk7CmRpZmYgLS1naXQgYS9QeXRob24vY29tcGlsZS5jIGIvUHl0aG9uL2NvbXBpbGUuYwppbmRleCBiMTYwZjczLi5kMTY1NWU5IDEwMDY0NAotLS0gYS9QeXRob24vY29tcGlsZS5jCisrKyBiL1B5dGhvbi9jb21waWxlLmMKQEAgLTEyMjYsOSArMTIyNiw3IEBACiAJY2hhciAqYnVmOwogCWNoYXIgKnA7CiAJY2hhciAqZW5kOwotCWludCBjOwotCWludCBmaXJzdCA9ICpzOwotCWludCBxdW90ZSA9IGZpcnN0OworCWludCBxdW90ZSA9ICpzOwogCWludCByYXdtb2RlID0gMDsKIAljaGFyKiBlbmNvZGluZyA9ICgoY29tID09IE5VTEwpID8gTlVMTCA6IGNvbS0+Y19lbmNvZGluZyk7CiAJaW50IG5lZWRfZW5jb2Rpbmc7CkBAIC0xMzQ3LDEwMiArMTM0NSwxMSBAQAogCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CiAJCX0KIAl9Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgLyogWFhYIDQgaXMgZW5vdWdoPyAqLwotCQkJCSAgICAgICBuZWVkX2VuY29kaW5nID8gbGVuICogNCA6IGxlbik7CisKKwl2ID0gUHlTdHJpbmdfRGVjb2RlRXNjYXBlKHMsIGxlbiwgTlVMTCwgdW5pY29kZSwKKwkJCQkgIG5lZWRfZW5jb2RpbmcgPyBlbmNvZGluZyA6IE5VTEwpOwogCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAgPSBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQllbmQgPSBzICsgbGVuOwotCXdoaWxlIChzIDwgZW5kKSB7Ci0JCWlmICgqcyAhPSAnXFwnKSB7Ci0JCSAgT1JESU5BTDogCi0JCQlpZiAobmVlZF9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkgewotCQkJCWNoYXIgKnI7Ci0JCQkJaW50IHJuOwotCQkJCVB5T2JqZWN0KiB3ID0gZGVjb2RlX3V0ZjgoJnMsIGVuZCwgZW5jb2RpbmcpOwotCQkJCWlmICh3ID09IE5VTEwpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCXIgPSBQeVN0cmluZ19Bc1N0cmluZyh3KTsKLQkJCQlybiA9IFB5U3RyaW5nX1NpemUodyk7Ci0JCQkJbWVtY3B5KHAsIHIsIHJuKTsKLQkJCQlwICs9IHJuOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJKnArKyA9ICpzKys7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlzKys7Ci0JCXN3aXRjaCAoKnMrKykgewotCQkvKiBYWFggVGhpcyBhc3N1bWVzIEFTQ0lJISAqLwotCQljYXNlICdcbic6IGJyZWFrOwotCQljYXNlICdcXCc6ICpwKysgPSAnXFwnOyBicmVhazsKLQkJY2FzZSAnXCcnOiAqcCsrID0gJ1wnJzsgYnJlYWs7Ci0JCWNhc2UgJ1wiJzogKnArKyA9ICdcIic7IGJyZWFrOwotCQljYXNlICdiJzogKnArKyA9ICdcYic7IGJyZWFrOwotCQljYXNlICdmJzogKnArKyA9ICdcMDE0JzsgYnJlYWs7IC8qIEZGICovCi0JCWNhc2UgJ3QnOiAqcCsrID0gJ1x0JzsgYnJlYWs7Ci0JCWNhc2UgJ24nOiAqcCsrID0gJ1xuJzsgYnJlYWs7Ci0JCWNhc2UgJ3InOiAqcCsrID0gJ1xyJzsgYnJlYWs7Ci0JCWNhc2UgJ3YnOiAqcCsrID0gJ1wwMTMnOyBicmVhazsgLyogVlQgKi8KLQkJY2FzZSAnYSc6ICpwKysgPSAnXDAwNyc7IGJyZWFrOyAvKiBCRUwsIG5vdCBjbGFzc2ljIEMgKi8KLQkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JCWNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCQkJYyA9IHNbLTFdIC0gJzAnOwotCQkJaWYgKCcwJyA8PSAqcyAmJiAqcyA8PSAnNycpIHsKLQkJCQljID0gKGM8PDMpICsgKnMrKyAtICcwJzsKLQkJCQlpZiAoJzAnIDw9ICpzICYmICpzIDw9ICc3JykKLQkJCQkJYyA9IChjPDwzKSArICpzKysgLSAnMCc7Ci0JCQl9Ci0JCQkqcCsrID0gYzsKLQkJCWJyZWFrOwotCQljYXNlICd4JzoKLQkJCWlmIChpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzBdKSkgCi0JCQkgICAgJiYgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1sxXSkpKSB7Ci0JCQkJdW5zaWduZWQgaW50IHggPSAwOwotCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7Ci0JCQkJcysrOwotCQkJCWlmIChpc2RpZ2l0KGMpKQotCQkJCQl4ID0gYyAtICcwJzsKLQkJCQllbHNlIGlmIChpc2xvd2VyKGMpKQotCQkJCQl4ID0gMTAgKyBjIC0gJ2EnOwotCQkJCWVsc2UKLQkJCQkJeCA9IDEwICsgYyAtICdBJzsKLQkJCQl4ID0geCA8PCA0OwotCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7Ci0JCQkJcysrOwotCQkJCWlmIChpc2RpZ2l0KGMpKQotCQkJCQl4ICs9IGMgLSAnMCc7Ci0JCQkJZWxzZSBpZiAoaXNsb3dlcihjKSkKLQkJCQkJeCArPSAxMCArIGMgLSAnYSc7Ci0JCQkJZWxzZQotCQkJCQl4ICs9IDEwICsgYyAtICdBJzsKLQkJCQkqcCsrID0geDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWNvbV9lcnJvcihjb20sIFB5RXhjX1ZhbHVlRXJyb3IsIAotCQkJCSAgImludmFsaWQgXFx4IGVzY2FwZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0jaWZuZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJY2FzZSAndSc6Ci0JCWNhc2UgJ1UnOgotCQljYXNlICdOJzoKLQkJCWlmICh1bmljb2RlKSB7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCWNvbV9lcnJvcihjb20sIFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSAgIlVuaWNvZGUgZXNjYXBlcyBub3QgbGVnYWwgIgotCQkJCQkgICJ3aGVuIFVuaWNvZGUgZGlzYWJsZWQiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLSNlbmRpZgotCQlkZWZhdWx0OgotCQkJKnArKyA9ICdcXCc7Ci0JCQlzLS07Ci0JCQlnb3RvIE9SRElOQUw7Ci0JCX0KLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKGludCkocCAtIGJ1ZikpOworCQlQeUVycl9TeW50YXhMb2NhdGlvbihjb20tPmNfZmlsZW5hbWUsIGNvbS0+Y19saW5lbm8pOwogCXJldHVybiB2OwogfQogCg==