From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Alex Riesen" Subject: CFT: merge-recursive in C (updated) Date: Tue, 27 Jun 2006 17:48:32 +0200 Message-ID: <81b0412b0606270848v2253209aw52466de632ab25c1@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_16751_33390419.1151423312352" Cc: "Junio C Hamano" , "Fredrik Kuivinen" , "Johannes Schindelin" , "Linus Torvalds" X-From: git-owner@vger.kernel.org Tue Jun 27 17:49:13 2006 Return-path: Envelope-to: gcvg-git@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FvFo7-0000F0-TC for gcvg-git@gmane.org; Tue, 27 Jun 2006 17:48:56 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161121AbWF0Psi (ORCPT ); Tue, 27 Jun 2006 11:48:38 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1161124AbWF0Psi (ORCPT ); Tue, 27 Jun 2006 11:48:38 -0400 Received: from ug-out-1314.google.com ([66.249.92.174]:4984 "EHLO ug-out-1314.google.com") by vger.kernel.org with ESMTP id S1161121AbWF0Pse (ORCPT ); Tue, 27 Jun 2006 11:48:34 -0400 Received: by ug-out-1314.google.com with SMTP id a2so2661589ugf for ; Tue, 27 Jun 2006 08:48:32 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:cc:mime-version:content-type; b=Eu4p0aYDUzxe8iKOu+CqmOI6w831yN4eUNTEzHFnrC2wnBf0NhtCMAxRa9iUhVxbiziLqqpS+6xqTuigsmIdSI8GhU0kATbMHl930BviZ/adSxhs3nQKsPCjzdOCaJthVEQmFnXwJ/eNRI3b+fkU0otIxSG+34RON02ogEC41ZY= Received: by 10.78.159.7 with SMTP id h7mr2552786hue; Tue, 27 Jun 2006 08:48:32 -0700 (PDT) Received: by 10.78.37.7 with HTTP; Tue, 27 Jun 2006 08:48:32 -0700 (PDT) To: git@vger.kernel.org Sender: git-owner@vger.kernel.org Precedence: bulk X-Mailing-List: git@vger.kernel.org Archived-At: ------=_Part_16751_33390419.1151423312352 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Following many useful suggestions I updated the patch a little: - use run_command (and hope that whatever libc on windows does the quoting correctly) - use diffcore api instead of running git-diff-tree - use a pipe to "git-update-index --index-info" instead of using command line Thanks Junio for the careful explanations, Johannes for his example and Linus for inspiration :) Good news is that it is faster: 6min vs 10min. Bad news is that it is still not enough for me and it is only on Linux (Windows will be slower, still testing), uses an awful lot of memory and CPU. --- Path list optimization should be next (and I'll be glad if someone does this before me). Also graph algos have a greate optimization potential (intersection, all parents of a node, node_by_sha). Sorry for attachment, still at work. ------=_Part_16751_33390419.1151423312352 Content-Type: text/x-patch; name=merge-rec.patch; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_eoyf0zy2 Content-Disposition: attachment; filename="merge-rec.patch" ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggY2RlNjE5Yy4uNjYwZjA5YiAx MDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTE2Myw3ICsxNjMsOCBAQCBQ Uk9HUkFNUyA9IFwKIAlnaXQtdXBsb2FkLXBhY2skWCBnaXQtdmVyaWZ5LXBhY2skWCBcCiAJZ2l0 LXN5bWJvbGljLXJlZiRYIFwKIAlnaXQtbmFtZS1yZXYkWCBnaXQtcGFjay1yZWR1bmRhbnQkWCBn aXQtcmVwby1jb25maWckWCBnaXQtdmFyJFggXAotCWdpdC1kZXNjcmliZSRYIGdpdC1tZXJnZS10 cmVlJFggZ2l0LWJsYW1lJFggZ2l0LWltYXAtc2VuZCRYCisJZ2l0LWRlc2NyaWJlJFggZ2l0LW1l cmdlLXRyZWUkWCBnaXQtYmxhbWUkWCBnaXQtaW1hcC1zZW5kJFggXAorCWdpdC1tZXJnZS1yZWN1 ciRYCiAKIEJVSUxUX0lOUyA9IGdpdC1sb2ckWCBnaXQtd2hhdGNoYW5nZWQkWCBnaXQtc2hvdyRY IGdpdC11cGRhdGUtcmVmJFggXAogCWdpdC1jb3VudC1vYmplY3RzJFggZ2l0LWRpZmYkWCBnaXQt cHVzaCRYIGdpdC1tYWlsc3BsaXQkWCBcCkBAIC01OTUsNiArNTk2LDEwIEBAIGdpdC1odHRwLXB1 c2gkWDogcmV2aXNpb24ubyBodHRwLm8gaHR0cC0KIAkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRA ICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgXAogCQkkKExJQlMpICQoQ1VSTF9MSUJD VVJMKSAkKEVYUEFUX0xJQkVYUEFUKQogCitnaXQtbWVyZ2UtcmVjdXIkWDogbWVyZ2UtcmVjdXJz aXZlLm8gZ3JhcGgubyBwYXRoLWxpc3QubyAkKExJQl9GSUxFKQorCSQoQ0MpICQoQUxMX0NGTEFH UykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSBcCisJCSQoTElCUykKKwog JChMSUJfT0JKUykgJChCVUlMVElOX09CSlMpOiAkKExJQl9IKQogJChwYXRzdWJzdCBnaXQtJSRY LCUubywkKFBST0dSQU1TKSk6ICQoTElCX0gpICQod2lsZGNhcmQgKi8qLmgpCiAkKERJRkZfT0JK Uyk6IGRpZmZjb3JlLmgKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS5zaCBiL2dpdC1tZXJnZS5zaApp bmRleCBkYTU2NTdlLi4wNGZhYzE1IDEwMDc1NQotLS0gYS9naXQtbWVyZ2Uuc2gKKysrIGIvZ2l0 LW1lcmdlLnNoCkBAIC0xMCw3ICsxMCw3IEBAIFVTQUdFPSdbLW5dIFstLW5vLWNvbW1pdF0gWy1z IDxzdHJhdGVneT4KIExGPScKICcKIAotYWxsX3N0cmF0ZWdpZXM9J3JlY3Vyc2l2ZSBvY3RvcHVz IHJlc29sdmUgc3R1cGlkIG91cnMnCithbGxfc3RyYXRlZ2llcz0ncmVjdXIgcmVjdXJzaXZlIG9j dG9wdXMgcmVzb2x2ZSBzdHVwaWQgb3VycycKIGRlZmF1bHRfdHdvaGVhZF9zdHJhdGVnaWVzPSdy ZWN1cnNpdmUnCiBkZWZhdWx0X29jdG9wdXNfc3RyYXRlZ2llcz0nb2N0b3B1cycKIG5vX3RyaXZp YWxfbWVyZ2Vfc3RyYXRlZ2llcz0nb3VycycKQEAgLTE4LDcgKzE4LDcgQEAgdXNlX3N0cmF0ZWdp ZXM9CiAKIGluZGV4X21lcmdlPXQKIGlmIHRlc3QgIkBATk9fUFlUSE9OQEAiOyB0aGVuCi0JYWxs X3N0cmF0ZWdpZXM9J3Jlc29sdmUgb2N0b3B1cyBzdHVwaWQgb3VycycKKwlhbGxfc3RyYXRlZ2ll cz0ncmVjdXIgcmVzb2x2ZSBvY3RvcHVzIHN0dXBpZCBvdXJzJwogCWRlZmF1bHRfdHdvaGVhZF9z dHJhdGVnaWVzPSdyZXNvbHZlJwogZmkKIApkaWZmIC0tZ2l0IGEvZ3JhcGguYyBiL2dyYXBoLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1ODkzMAotLS0gL2Rldi9udWxs CisrKyBiL2dyYXBoLmMKQEAgLTAsMCArMSwzNDYgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNp bmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgImNhY2hl LmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZ3JhcGguaCIKKworLy8gZG9lcyBu b3QgYmVsb25nIGhlcmUKK3N0cnVjdCB0cmVlICpnaXRfd3JpdGVfdHJlZSgpCit7CisjaWYgMAor CWZwcmludGYoc3RkZXJyLCAiR0lUX0lOREVYX0ZJTEU9JyVzJyBnaXQtd3JpdGUtdHJlZVxuIiwK KwkJZ2V0ZW52KCJHSVRfSU5ERVhfRklMRSIpKTsKKyNlbmRpZgorCUZJTEUgKmZwID0gcG9wZW4o ImdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsIiwgInIiKTsKKwljaGFyIGJ1Zls0MV07CisJdW5z aWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgY2g7CisJdW5zaWduZWQgaSA9IDA7CisJd2hpbGUg KCAoY2ggPSBmZ2V0YyhmcCkpICE9IEVPRiApCisJCWlmICggaSA8IHNpemVvZihidWYpLTEgJiYg Y2ggPj0gJzAnICYmIGNoIDw9ICdmJyApCisJCQlidWZbaSsrXSA9IGNoOworCQllbHNlCisJCQli cmVhazsKKwlpbnQgcmMgPSBwY2xvc2UoZnApOworCWlmICggcmMgPT0gLTEgfHwgV0VYSVRTVEFU VVMocmMpICkKKwkJcmV0dXJuIE5VTEw7CisJYnVmW2ldID0gJ1wwJzsKKwlpZiAoIGdldF9zaGEx KGJ1Ziwgc2hhMSkgIT0gMCApCisJCXJldHVybiBOVUxMOworCXJldHVybiBsb29rdXBfdHJlZShz aGExKTsKK30KKworY29uc3QgY2hhciAqbm9kZV90aXRsZShzdHJ1Y3Qgbm9kZSAqbm9kZSwgaW50 ICpsZW4pCit7CisJY29uc3QgY2hhciAqcyA9ICIobnVsbCBjb21taXQpIjsKKwkqbGVuID0gc3Ry bGVuKHMpOworCisJaWYgKCBub2RlLT52aXJ0dWFsICkgeworCQlzID0gbm9kZS0+Y29tbWVudDsK KwkJKmxlbiA9IHN0cmxlbihzKTsKKwl9IGVsc2UgaWYgKCBub2RlLT5jb21taXQgKSB7CisJCWlm ICggcGFyc2VfY29tbWl0KG5vZGUtPmNvbW1pdCkgIT0gMCApIHsKKwkJCXMgPSAiKGJhZCBjb21t aXQpIjsKKwkJCSpsZW4gPSBzdHJsZW4ocyk7CisJCX0gZWxzZSB7CisJCQlzID0gbm9kZS0+Y29t bWl0LT5idWZmZXI7CisJCQljaGFyIHByZXYgPSAnXDAnOworCQkJd2hpbGUgKCAqcyApIHsKKwkJ CQlpZiAoICdcbicgPT0gcHJldiAmJiAnXG4nID09ICpzICkgeworCQkJCQkrK3M7CisJCQkJCWJy ZWFrOworCQkJCX0KKwkJCQlwcmV2ID0gKnMrKzsKKwkJCX0KKwkJCSpsZW4gPSAwOworCQkJd2hp bGUgKCBzWypsZW5dICYmICdcbicgIT0gc1sqbGVuXSApCisJCQkJKysoKmxlbik7CisJCX0KKwl9 CisJcmV0dXJuIHM7Cit9CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKm5vZGVfc2hhKGNvbnN0IHN0 cnVjdCBub2RlICpub2RlKQoreworCXJldHVybiBub2RlLT5jb21taXQtPm9iamVjdC5zaGExOwor fQorCitjb25zdCBjaGFyICpub2RlX2hleF9zaGExKGNvbnN0IHN0cnVjdCBub2RlICpub2RlKQor eworCXJldHVybiBub2RlLT5jb21taXQgPyAgc2hhMV90b19oZXgobm9kZS0+Y29tbWl0LT5vYmpl Y3Quc2hhMSk6CisJCW5vZGUtPnZpcnR1YWwgPyAidmlydHVhbCI6ICJ1bmRlZmluZWQiOworfQor CitzdGF0aWMgaW50IHNoYV9lcShjb25zdCB1bnNpZ25lZCBjaGFyICphLCBjb25zdCB1bnNpZ25l ZCBjaGFyICpiKQoreworCWlmICggIWEgJiYgIWIgKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gYSAm JiBiICYmIG1lbWNtcChhLCBiLCAyMCkgPT0gMDsKK30KKworc3RhdGljIHN0cnVjdCBub2RlX2xp c3QgKm5vZGVfbGlzdF9wb29sID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBub2RlX2xpc3RfcG9v bF9zaXplID0gMDsKKwordW5zaWduZWQgbm9kZV9saXN0X2NvdW50KGNvbnN0IHN0cnVjdCBub2Rl X2xpc3QgKmwpCit7CisJdW5zaWduZWQgYyA9IDA7CisJd2hpbGUgKCBsICkgeworCQkrK2M7CisJ CWwgPSBsLT5uZXh0OworCX0KKwlyZXR1cm4gYzsKK30KKworc3RydWN0IG5vZGVfbGlzdCAqbm9k ZV9saXN0X2luc2VydChzdHJ1Y3Qgbm9kZSAqbm9kZSwgc3RydWN0IG5vZGVfbGlzdCAqKmxpc3Qp Cit7CisJc3RydWN0IG5vZGVfbGlzdCAqZTsKKwlpZiAoIG5vZGVfbGlzdF9wb29sICkKKwkJZSA9 IG5vZGVfbGlzdF9zaGlmdCgmbm9kZV9saXN0X3Bvb2wpOworCWVsc2UKKwkJZSA9IG1hbGxvYyhz aXplb2Yoc3RydWN0IG5vZGVfbGlzdCkpOworCWUtPm5leHQgPSAqbGlzdDsKKwllLT5ub2RlID0g bm9kZTsKKwkqbGlzdCA9IGU7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBub2RlX2xpc3QgKm5v ZGVfbGlzdF9mcmVlMShzdHJ1Y3Qgbm9kZV9saXN0ICpsaXN0LCBpbnQgZnJlZV9ub2RlcykKK3sK KwlzdHJ1Y3Qgbm9kZV9saXN0ICpuZXh0ID0gbGlzdC0+bmV4dDsKKwlpZiAoIGZyZWVfbm9kZXMg KQorCQlmcmVlKGxpc3QtPm5vZGUpOworCisJaWYgKCBub2RlX2xpc3RfcG9vbF9zaXplIDwgMTAw MCApIHsKKwkJbGlzdC0+bm9kZSA9IE5VTEw7CisJCWxpc3QtPm5leHQgPSBub2RlX2xpc3RfcG9v bDsKKwkJbm9kZV9saXN0X3Bvb2wgPSBsaXN0OworCX0gZWxzZQorCQlmcmVlKGxpc3QpOworCXJl dHVybiBuZXh0OworfQorCit2b2lkIG5vZGVfbGlzdF9mcmVlKHN0cnVjdCBub2RlX2xpc3QgKips aXN0LCBpbnQgZnJlZV9ub2RlcykKK3sKKwl3aGlsZSAoICpsaXN0ICkKKwkJbm9kZV9saXN0X2Zy ZWUxKG5vZGVfbGlzdF9zaGlmdChsaXN0KSwgZnJlZV9ub2Rlcyk7Cit9CisKK3N0cnVjdCBub2Rl ICpub2RlX2FsbG9jKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3Qgbm9kZSAqbm9k ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKKwlub2RlLT5wYXJlbnRzID0gTlVMTDsK Kwlub2RlLT5wYXJlbnRzX2NvdW50ID0gMDsKKwlub2RlLT5jaGlsZHJlbiA9IE5VTEw7CisJbm9k ZS0+dmlydHVhbCA9IDA7CisJbm9kZS0+Y29tbWl0ID0gY29tbWl0OworCWlmICggcGFyc2VfY29t bWl0KGNvbW1pdCkgPT0gMCApCisJCW5vZGUtPnRyZWUgPSBjb21taXQtPnRyZWU7CisJZWxzZQor CQlkaWUoImZhaWxlZCB0byBwYXJzZSBjb21taXQgJXMiLCBzaGExX3RvX2hleChjb21taXQtPm9i amVjdC5zaGExKSk7CisKKwlyZXR1cm4gbm9kZTsKK30KKworc3RydWN0IG5vZGUgKm5vZGVfYWxs b2NfdmlydHVhbChzdHJ1Y3QgdHJlZSAqdHJlZSwgY29uc3QgY2hhciAqY29tbWVudCkKK3sKKwlz dHJ1Y3Qgbm9kZSAqbm9kZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKKwlub2RlLT5w YXJlbnRzID0gTlVMTDsKKwlub2RlLT5jaGlsZHJlbiA9IE5VTEw7CisJbm9kZS0+Y29tbWl0ID0g TlVMTDsKKwlub2RlLT50cmVlID0gdHJlZTsKKwlub2RlLT52aXJ0dWFsID0gMTsKKwlzdGF0aWMg dW5zaWduZWQgdmlydHVhbF9pZCA9IDA7CisJbm9kZS0+dmlydHVhbF9pZCA9IHZpcnR1YWxfaWQr KzsKKwlub2RlLT5jb21tZW50ID0gY29tbWVudDsKKwlyZXR1cm4gbm9kZTsKK30KKwordm9pZCBu b2RlX3NldF9wYXJlbnRzKHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3Qgbm9kZV9saXN0ICpwYXJl bnRzKQoreworCXN0cnVjdCBub2RlX2xpc3QgKnA7CisJbm9kZS0+cGFyZW50c19jb3VudCA9IDA7 CisJZm9yX2VhY2hfbm9kZV9saXN0KHAsIG5vZGUtPnBhcmVudHMgPSBwYXJlbnRzKSB7CisJCW5v ZGVfbGlzdF9pbnNlcnQobm9kZSwgJnAtPm5vZGUtPmNoaWxkcmVuKTsKKwkJbm9kZS0+cGFyZW50 c19jb3VudCsrOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgbm9kZV9lcShjb25zdCBzdHJ1 Y3Qgbm9kZSAqYSwgY29uc3Qgc3RydWN0IG5vZGUgKmIpCit7CisJaWYgKCBhID09IGIgKQorCQly ZXR1cm4gMTsKKwlpZiAoIGEtPnZpcnR1YWwgIT0gYi0+dmlydHVhbCApCisJCXJldHVybiAwOwor CWlmICggYS0+dmlydHVhbCApCisJCXJldHVybiBhLT52aXJ0dWFsX2lkID09IGItPnZpcnR1YWxf aWQ7CisJaWYgKCBhLT5jb21taXQgPT0gYi0+Y29tbWl0ICkKKwkJcmV0dXJuIDE7CisJcmV0dXJu IHNoYV9lcShhLT5jb21taXQtPm9iamVjdC5zaGExLCBiLT5jb21taXQtPm9iamVjdC5zaGExKTsK K30KKworc3RydWN0IG5vZGVfbGlzdCAqbm9kZV9saXN0X2ZpbmRfbm9kZShjb25zdCBzdHJ1Y3Qg bm9kZSAqbm9kZSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgbm9kZV9saXN0ICpsaXN0KQorewor CWNvbnN0IHN0cnVjdCBub2RlX2xpc3QgKnA7CisJZm9yX2VhY2hfbm9kZV9saXN0KHAsIGxpc3Qp CisJCWlmICggbm9kZV9lcShwLT5ub2RlLCBub2RlKSApCisJCQlicmVhazsKKwlyZXR1cm4gKHN0 cnVjdCBub2RlX2xpc3QqKXA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm9kZV9saXN0ICpub2RlX2Fs bF9wYXJlbnRzKHN0cnVjdCBub2RlICpub2RlKQoreworCXN0cnVjdCBub2RlX2xpc3QgKnBhcmVu dHMgPSBOVUxMLCAqKnNldCA9ICZwYXJlbnRzOworCXN0cnVjdCBub2RlX2xpc3QgKnN0YWNrID0g TlVMTDsKKwlub2RlX2xpc3RfaW5zZXJ0KG5vZGUsICZzdGFjayk7CisJd2hpbGUgKCBzdGFjayAp IHsKKwkJc3RydWN0IG5vZGVfbGlzdCAqZWwgPSBub2RlX2xpc3Rfc2hpZnQoJnN0YWNrKTsKKwor CQlub2RlX2xpc3RfaW5zZXJ0KGVsLT5ub2RlLCBzZXQpOworCQlzZXQgPSAmKCpzZXQpLT5uZXh0 OworCisJCXN0cnVjdCBub2RlX2xpc3QgKnAgPSBlbC0+bm9kZS0+cGFyZW50czsKKwkJd2hpbGUg KCBwICkgeworCQkJaWYgKCAhbm9kZV9saXN0X2ZpbmRfbm9kZShwLT5ub2RlLCBwYXJlbnRzKSAp CisJCQkJbm9kZV9saXN0X2luc2VydChwLT5ub2RlLCAmc3RhY2spOworCQkJcCA9IHAtPm5leHQ7 CisJCX0KKwkJbm9kZV9saXN0X2ZyZWUxKGVsLCAwKTsKKwl9CisJcmV0dXJuIHBhcmVudHM7Cit9 CisKKy8vIGEgJiBiLiBhIGFuZCBhcmUgaW52YWxpZCBhZnRlciB0aGUgY2FsbCwKKy8vIHRoZSBy ZXN1bHQgd2lsbCBjb250YWluIGFsbCB0aGUgY29tbW9uIG5vZGVzCitzdHJ1Y3Qgbm9kZV9saXN0 ICpub2RlX2xpc3RfaW50ZXJzZWN0KHN0cnVjdCBub2RlX2xpc3QgKmEsCisJCQkJICAgICAgc3Ry dWN0IG5vZGVfbGlzdCAqYikKK3sKKwlzdHJ1Y3Qgbm9kZV9saXN0ICpyZXN1bHQgPSBOVUxMOwor CXN0cnVjdCBub2RlX2xpc3QgKnAgPSBhOworCXdoaWxlICggcCApIHsKKwkJc3RydWN0IG5vZGVf bGlzdCAqbmV4dCA9IHAtPm5leHQ7CisJCXN0cnVjdCBub2RlX2xpc3QgKmJuID0gbm9kZV9saXN0 X2ZpbmRfbm9kZShwLT5ub2RlLCBiKTsKKwkJaWYgKCBibiApIHsKKwkJCXAtPm5leHQgPSByZXN1 bHQ7CisJCQlyZXN1bHQgPSBwOworCQl9IGVsc2UKKwkJCW5vZGVfbGlzdF9mcmVlMShwLCAwKTsK KwkJcCA9IG5leHQ7CisJfQorCW5vZGVfbGlzdF9mcmVlKCZiLCAwKTsKKwlyZXR1cm4gcmVzdWx0 OworfQorCitzdHJ1Y3Qgbm9kZSAqZ3JhcGhfYWRkX25vZGUoc3RydWN0IGdyYXBoICpncmFwaCwg c3RydWN0IG5vZGUgKm5vZGUpCit7CisJc3RydWN0IG5vZGVfbGlzdCAqKmJ1Y2tldDsKKwlpZiAo IG5vZGUtPnZpcnR1YWwgKQorCQkvLyB2aXJ0dWFsIG5vZGVzIGhhc2hlZCBieSBsb3dlc3QgYnl0 ZSBvZiB2aXJ0dWFsX2lkCisJCWJ1Y2tldCA9IGdyYXBoLT5jb21taXRzICsgKG5vZGUtPnZpcnR1 YWxfaWQgJiAweGZmKTsKKwllbHNlCisJCWJ1Y2tldCA9IGdyYXBoLT5jb21taXRzICsgbm9kZS0+ Y29tbWl0LT5vYmplY3Quc2hhMVswXTsKKwlub2RlX2xpc3RfaW5zZXJ0KG5vZGUsIGJ1Y2tldCk7 CisJcmV0dXJuIG5vZGU7Cit9CisKK3N0cnVjdCBub2RlICpncmFwaF9ub2RlX2J5c2hhKGNvbnN0 IHN0cnVjdCBncmFwaCAqZ3JhcGgsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGEp Cit7CisJY29uc3Qgc3RydWN0IG5vZGVfbGlzdCAqaGVhZCA9ICooZ3JhcGgtPmNvbW1pdHMgKyBz aGFbMF0pOworCXdoaWxlICggaGVhZCApIHsKKwkJaWYgKCAhaGVhZC0+bm9kZS0+dmlydHVhbCAm JgorCQkgICAgIHNoYV9lcShoZWFkLT5ub2RlLT5jb21taXQtPm9iamVjdC5zaGExLCBzaGEpICkg eworCQkJcmV0dXJuIGhlYWQtPm5vZGU7CisJCX0KKwkJaGVhZCA9IGhlYWQtPm5leHQ7CisJfQor CXJldHVybiBOVUxMOworfQorCisvLyBzZXR1cCBhbiBlbXB0eSB0cmVlIGluIHJlcG9zaXRvcnkg YW5kIHJldHVybnMgaXQKK3N0YXRpYyBzdHJ1Y3QgdHJlZSAqZ2V0X2VtcHR5X3RyZWUoKQorewor CXN0YXRpYyBzdHJ1Y3QgdHJlZSAqdHJlZSA9IE5VTEw7CisJaWYgKCAhdHJlZSApIHsKKwkJY2hh ciAqdG1waW5kZXggPSBnaXRfcGF0aCgiL21lcmdlLXRtcC1pbmRleCIpOworCQlzZXRlbnYoSU5E RVhfRU5WSVJPTk1FTlQsIHRtcGluZGV4LCAxKTsKKwkJdW5saW5rKHRtcGluZGV4KTsKKwkJdHJl ZSA9IGdpdF93cml0ZV90cmVlKCk7CisJCXVubGluayh0bXBpbmRleCk7CisJCWlmICggIXRyZWUg KQorCQkJZGllKCJmYWlsZWQgdG8gc2V0dXAgYW4gZW1wdHkgdHJlZSIpOworCX0KKwlyZXR1cm4g dHJlZTsKK30KKworc3RhdGljIHN0cnVjdCBub2RlICphZGRDb21tb25Sb290KHN0cnVjdCBncmFw aCAqZ3JhcGgpCit7CisJc3RydWN0IG5vZGVfbGlzdCAqcm9vdHMgPSBOVUxMOworCXN0cnVjdCBu b2RlX2xpc3QgKnA7CisJdW5zaWduZWQgYjsKKwlmb3IgKGIgPSAwOyBiIDwgc2l6ZW9mKGdyYXBo LT5jb21taXRzKS9zaXplb2YoZ3JhcGgtPmNvbW1pdHNbMF0pOyArK2IpIHsKKwkJZm9yX2VhY2hf bm9kZV9saXN0KHAsIGdyYXBoLT5jb21taXRzW2JdKQorCQkJaWYgKCBwLT5ub2RlLT5wYXJlbnRz X2NvdW50ICkKKwkJCQlub2RlX2xpc3RfaW5zZXJ0KHAtPm5vZGUsICZyb290cyk7CisJfQorCXN0 cnVjdCBub2RlICpzdXBlciA9IG5vZGVfYWxsb2NfdmlydHVhbChnZXRfZW1wdHlfdHJlZSgpLCAi Um9vdCIpOworCWZvcl9lYWNoX25vZGVfbGlzdChwLCByb290cykgeworCQlzdHJ1Y3Qgbm9kZV9s aXN0ICpsaXN0ID0gTlVMTDsKKwkJbm9kZV9saXN0X2luc2VydChzdXBlciwgJmxpc3QpOworCQlu b2RlX3NldF9wYXJlbnRzKHAtPm5vZGUsIGxpc3QpOworCX0KKwlncmFwaF9hZGRfbm9kZShncmFw aCwgc3VwZXIpOworCXJldHVybiBzdXBlcjsKK30KKworLy8gZ2V0Q29tbW9uQW5jZXN0b3JzOiBG aW5kIHRoZSBjb21tb24gYW5jZXN0b3JzIGZvciBjb21taXQxIGFuZCBjb21taXQyCitzdHJ1Y3Qg bm9kZV9saXN0ICpncmFwaF9jb21tb25fYW5jZXN0b3JzKHN0cnVjdCBncmFwaCAqZ3JhcGgsCisJ CQkJCSBzdHJ1Y3Qgbm9kZSAqY29tbWl0MSwKKwkJCQkJIHN0cnVjdCBub2RlICpjb21taXQyKQor eworCXN0cnVjdCBub2RlX2xpc3QgKnNoYXJlZDsKKwlzaGFyZWQgPSBub2RlX2xpc3RfaW50ZXJz ZWN0KG5vZGVfYWxsX3BhcmVudHMoY29tbWl0MSksCisJCQkJICAgICBub2RlX2FsbF9wYXJlbnRz KGNvbW1pdDIpKTsKKwlpZiAoICFzaGFyZWQgKQorCQlub2RlX2xpc3RfaW5zZXJ0KGFkZENvbW1v blJvb3QoZ3JhcGgpLCAmc2hhcmVkKTsKKworCS8qCisJICAgZm9yIHMgaW4gc2hhcmVkOgorCSAg IGlmIGxlbihbYyBmb3IgYyBpbiBzLmNoaWxkcmVuIGlmIGMgaW4gc2hhcmVkXSkgPT0gMDoKKwkg ICByZXMuYWRkKHMpCisJICAgcmV0dXJuIGxpc3QocmVzKQorCSAgICovCisJc3RydWN0IG5vZGVf bGlzdCAqY2EgPSBOVUxMLCAqKnBjYSA9ICZjYTsKKwlzdHJ1Y3Qgbm9kZV9saXN0ICpzOworCWZv cl9lYWNoX25vZGVfbGlzdChzLCBzaGFyZWQpIHsKKwkJdW5zaWduZWQgbiA9IDA7CisJCXN0cnVj dCBub2RlX2xpc3QgKmM7CisJCWZvcl9lYWNoX25vZGVfbGlzdChjLCBzLT5ub2RlLT5jaGlsZHJl bikKKwkJCWlmICggbm9kZV9saXN0X2ZpbmRfbm9kZShjLT5ub2RlLCBzaGFyZWQpICkgeworCQkJ CSsrbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKCBuID09IDAgKSB7CisJCQlub2RlX2xpc3Rf aW5zZXJ0KHMtPm5vZGUsIHBjYSk7CisJCQlwY2EgPSAmKCpwY2EpLT5uZXh0OworCQl9CisJfQor CW5vZGVfbGlzdF9mcmVlKCZzaGFyZWQsIDApOworCXJldHVybiBjYTsKK30KKworI2lmIDAKK3Zv aWQgbm9kZV9saXN0X3ByaW50KGNvbnN0IGNoYXIgKm1zZywgY29uc3Qgc3RydWN0IG5vZGVfbGlz dCAqbGlzdCkKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgbm9kZV9saXN0ICpwOworICAgIHByaW50Zigi JXNcbiIsIG1zZyk7CisgICAgZm9yX2VhY2hfbm9kZV9saXN0KHAsIGxpc3QpIHsKKwlpbnQgbGVu OworCWNvbnN0IGNoYXIgKm1zZyA9IG5vZGVfdGl0bGUocC0+bm9kZSwgJmxlbik7CisJcHJpbnRm KCJcdCVzICUuKnNcbiIsIG5vZGVfaGV4X3NoYTEocC0+bm9kZSksIGxlbiwgbXNnKTsKKyAgICB9 Cit9CisjZW5kaWYKKworLy8gdmltOiBzdz04IG5vZXQKZGlmZiAtLWdpdCBhL2dyYXBoLmggYi9n cmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGJkOTYKLS0tIC9k ZXYvbnVsbAorKysgYi9ncmFwaC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX0dSQVBIX0hf CisjZGVmaW5lIF9HUkFQSF9IXworCitzdHJ1Y3Qgbm9kZTsKK3N0cnVjdCBncmFwaDsKK3N0cnVj dCBjb21taXQ7CitzdHJ1Y3QgdHJlZTsKK3N0cnVjdCBjb21taXRfbGlzdDsKKworc3RydWN0IG5v ZGVfbGlzdAoreworCXN0cnVjdCBub2RlX2xpc3QgKm5leHQ7CisJc3RydWN0IG5vZGUgKm5vZGU7 Cit9OworCitzdHJ1Y3Qgbm9kZQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qg dHJlZSAqdHJlZTsKKworCXVuc2lnbmVkIHBhcmVudHNfY291bnQ7CisJc3RydWN0IG5vZGVfbGlz dCAqcGFyZW50czsKKwlzdHJ1Y3Qgbm9kZV9saXN0ICpjaGlsZHJlbjsKKworCXVuc2lnbmVkIHZp cnR1YWw6MTsKKwl1bnNpZ25lZCB2aXJ0dWFsX2lkOworCWNvbnN0IGNoYXIgKmNvbW1lbnQ7Cit9 OworCitzdHJ1Y3Qgbm9kZV9saXN0ICpub2RlX2xpc3RfaW5zZXJ0KHN0cnVjdCBub2RlICpub2Rl LCBzdHJ1Y3Qgbm9kZV9saXN0ICoqbGlzdCk7Cit2b2lkIG5vZGVfbGlzdF9mcmVlKHN0cnVjdCBu b2RlX2xpc3QgKipsaXN0LCBpbnQgZnJlZV9ub2Rlcyk7CitzdHJ1Y3Qgbm9kZV9saXN0ICpub2Rl X2xpc3RfZnJlZTEoc3RydWN0IG5vZGVfbGlzdCAqbGlzdCwgaW50IGZyZWVfbm9kZSk7CisKK3N0 YXRpYyBpbmxpbmUgc3RydWN0IG5vZGVfbGlzdCAqbm9kZV9saXN0X3NoaWZ0KHN0cnVjdCBub2Rl X2xpc3QgKipsaXN0KQoreworCXN0cnVjdCBub2RlX2xpc3QgKmhlYWQgPSAqbGlzdDsKKwkqbGlz dCA9IGhlYWQtPm5leHQ7CisJcmV0dXJuIGhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0 IG5vZGUgKm5vZGVfbGlzdF9zaGlmdF9ub2RlKHN0cnVjdCBub2RlX2xpc3QgKipsaXN0KQorewor CXN0cnVjdCBub2RlICpub2RlID0gKCpsaXN0KS0+bm9kZTsKKwkqbGlzdCA9IG5vZGVfbGlzdF9m cmVlMSgqbGlzdCwgMCk7CisJcmV0dXJuIG5vZGU7Cit9CisKK3N0cnVjdCBub2RlICpub2RlX2Fs bG9jKHN0cnVjdCBjb21taXQgKik7CitzdHJ1Y3Qgbm9kZSAqbm9kZV9hbGxvY192aXJ0dWFsKHN0 cnVjdCB0cmVlICosIGNvbnN0IGNoYXIgKmNvbW1lbnQpOworCit2b2lkIG5vZGVfc2V0X3BhcmVu dHMoc3RydWN0IG5vZGUgKm5vZGUsIHN0cnVjdCBub2RlX2xpc3QgKnBhcmVudHMpOwordW5zaWdu ZWQgbm9kZV9saXN0X2NvdW50KGNvbnN0IHN0cnVjdCBub2RlX2xpc3QgKik7CisKK3N0cnVjdCBu b2RlX2xpc3QgKm5vZGVfbGlzdF9maW5kX25vZGUoY29uc3Qgc3RydWN0IG5vZGUgKm5vZGUsCisJ CQkJICAgICAgY29uc3Qgc3RydWN0IG5vZGVfbGlzdCAqbGlzdCk7CisKKworLy8gZmluZCB0aGUg Y29tbW9uIGFuY2VzdG9ycyBmb3IgY29tbWl0MSBhbmQgY29tbWl0Mgorc3RydWN0IG5vZGVfbGlz dCAqZ3JhcGhfY29tbW9uX2FuY2VzdG9ycyhzdHJ1Y3QgZ3JhcGggKmdyYXBoLAorCQkJCQkgc3Ry dWN0IG5vZGUgKmNvbW1pdDEsCisJCQkJCSBzdHJ1Y3Qgbm9kZSAqY29tbWl0Mik7CisKK3N0cnVj dCBncmFwaAoreworCS8vIGhhc2hlZCBieSBmaXJzdCBieXRlIG9mIFNIQS0xIG9yIGxvdyBieXRl IG9mIHZpcnR1YWxfaWQKKwlzdHJ1Y3Qgbm9kZV9saXN0ICpjb21taXRzWzI1Nl07Cit9OworCitz dHJ1Y3Qgbm9kZSAqZ3JhcGhfYWRkX25vZGUoc3RydWN0IGdyYXBoICpncmFwaCwgc3RydWN0IG5v ZGUgKm5vZGUpOworc3RydWN0IG5vZGUgKmdyYXBoX25vZGVfYnlzaGEoY29uc3Qgc3RydWN0IGdy YXBoICpncmFwaCwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYSk7CisKKyNkZWZp bmUgZm9yX2VhY2hfbm9kZV9saXN0KHAsbGlzdCkgXAorCWZvciAoIHAgPSAobGlzdCk7IHA7IHAg PSBwLT5uZXh0ICkKKworY29uc3QgY2hhciAqbm9kZV90aXRsZShzdHJ1Y3Qgbm9kZSAqLCBpbnQg Kmxlbik7Citjb25zdCB1bnNpZ25lZCBjaGFyICpub2RlX3NoYShjb25zdCBzdHJ1Y3Qgbm9kZSAq KTsKK2NvbnN0IGNoYXIgKm5vZGVfaGV4X3NoYTEoY29uc3Qgc3RydWN0IG5vZGUgKik7Cit2b2lk IG5vZGVfbGlzdF9wcmludChjb25zdCBjaGFyICptc2csIGNvbnN0IHN0cnVjdCBub2RlX2xpc3Qg Kmxpc3QpOworCitzdHJ1Y3QgdHJlZSAqZ2l0X3dyaXRlX3RyZWUoKTsKKworI2VuZGlmIC8qIF9H UkFQSF9IXyAqLworCisvLyB2aW06IHN3PTggbm9ldApkaWZmIC0tZ2l0IGEvbWVyZ2UtcmVjdXJz aXZlLmMgYi9tZXJnZS1yZWN1cnNpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi41NDcxNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVyZ2UtcmVjdXJzaXZlLmMKQEAgLTAs MCArMSwxNTYzIEBACisvLworLy8gUmVjdXJzaXZlIE1lcmdlIGFsZ29yaXRobSBzdG9sZW4gZnJv bSBnaXQtbWVyZ2UtcmVjdXJzaXZlLnB5IGJ5CisvLyBGcmVkcmlrIEt1aXZpbmVuLgorLy8KKyNp bmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQu aD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1 ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIK KyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiZGlm Zi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKwor I2luY2x1ZGUgImdyYXBoLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisKKyNkZWZpbmUgZm9y X2VhY2hfY29tbWl0KHAsbGlzdCkgZm9yICggcCA9IChsaXN0KTsgcDsgcCA9IHAtPm5leHQgKQor CitzdHJ1Y3QgbWVyZ2VfcmVzdWx0Cit7CisJc3RydWN0IG5vZGUgKmNvbW1pdDsKKwl1bnNpZ25l ZCBjbGVhbjoxOworfTsKKworc3RydWN0IG1lcmdlX3RyZWVfcmVzdWx0Cit7CisJc3RydWN0IHRy ZWUgKnRyZWU7CisJdW5zaWduZWQgY2xlYW46MTsKK307CisKK3N0cnVjdCBpbmRleF9lbnRyeQor eworCXN0cnVjdCBpbmRleF9lbnRyeSAqbmV4dDsKKwlzdHJ1Y3QKKwl7CisJCXVuc2lnbmVkIG1v ZGU7CisJCXVuc2lnbmVkIGNoYXIgc2hhWzIwXTsKKwl9IHN0YWdlc1s0XTsKKwl1bnNpZ25lZCBw cm9jZXNzZWQ6MTsKKwljaGFyIHBhdGhbMV07Cit9OworCitzdHJ1Y3QgaW5kZXhfZW50cnkgKmlu ZGV4X2VudHJ5X2FsbG9jKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc2l6ZV90IG4gPSBzdHJsZW4o cGF0aCk7IC8vIGluZGV4X2VudHJ5OjpwYXRoIGhhcyByb29tIGZvciBcMAorCXN0cnVjdCBpbmRl eF9lbnRyeSAqcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbmRleF9lbnRyeSkgKyBuKTsKKwlp ZiAoICFwICkKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KHAtPnBhdGgsIHBhdGgsIG4gKyAxKTsK KwlwLT5uZXh0ID0gTlVMTDsKKwlwLT5wcm9jZXNzZWQgPSAwOworCXJldHVybiBwOworfQorCisj aWYgMAorc3RhdGljCit2b2lkIHByaW50X2luZGV4X2VudHJ5KGNvbnN0IGNoYXIgKnRleHQsIGNv bnN0IHN0cnVjdCBpbmRleF9lbnRyeSAqZSkKK3sKKyAgICBwcmludGYoIiVzJXMgbmV4dDogJXAg JXNcbiIsIHRleHQsCisJICAgZSA/IGUtPnBhdGg6IE5VTEwsCisJICAgZSA/IGUtPm5leHQ6IE5V TEwsCisJICAgZSAmJiBlLT5wcm9jZXNzZWQgPyAicHJvY2Vzc2VkIjogIiIpOworICAgIGlmICgg ZSApIHsKKwlpbnQgaTsKKwlmb3IgKCBpID0gMTsgaSA8IDQ7ICsraSApCisJICAgIHByaW50Zigi XHRzdGFnZVslZF06ICUwNm8gJXNcbiIsIGksCisJCSAgIGUtPnN0YWdlc1tpXS5tb2RlLAorCQkg ICBzaGExX3RvX2hleChlLT5zdGFnZXNbaV0uc2hhKSk7CisgICAgfQorfQorI2VuZGlmCisKK3N0 YXRpYyBzdHJ1Y3QgcGF0aF9saXN0ICpjdXJyZW50RmlsZVNldDsKK3N0YXRpYyBzdHJ1Y3QgcGF0 aF9saXN0ICpjdXJyZW50RGlyZWN0b3J5U2V0OworCitzdGF0aWMgaW50IG91dHB1dF9pbmRlbnQg PSAwOworCitzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFf bGlzdCBhcmdzOworCWludCBpOworCWZvciAoIGkgPSBvdXRwdXRfaW5kZW50OyBpLS07ICkKKwkJ ZnB1dHMoIiAgIiwgc3Rkb3V0KTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZmcHJpbnRmKHN0 ZG91dCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJZnB1dGMoJ1xuJywgc3Rkb3V0KTsK K30KKworc3RhdGljIGNvbnN0IGNoYXIgKm9yaWdpbmFsX2luZGV4X2ZpbGU7CitzdGF0aWMgY29u c3QgY2hhciAqdGVtcG9yYXJ5X2luZGV4X2ZpbGU7CisKK3N0YXRpYyB2b2lkIHNldHVwX2luZGV4 KGludCB0ZW1wKQoreworCWNvbnN0IGNoYXIgKmlkeCA9IHRlbXAgPyB0ZW1wb3JhcnlfaW5kZXhf ZmlsZTogb3JpZ2luYWxfaW5kZXhfZmlsZTsKKwl1bmxpbmsodGVtcG9yYXJ5X2luZGV4X2ZpbGUp OworCXNldGVudigiR0lUX0lOREVYX0ZJTEUiLCBpZHgsIDEpOworfQorCisvLyBUaGlzIGlzIGEg Z2xvYmFsIHZhcmlhYmxlIHdoaWNoIGlzIHVzZWQgaW4gYSBudW1iZXIgb2YgcGxhY2VzIGJ1dAor Ly8gb25seSB3cml0dGVuIHRvIGluIHRoZSAnbWVyZ2UnIGZ1bmN0aW9uLgorCisvLyBpbmRleF9v bmx5ID09IDEgICAgPT4gRG9uJ3QgbGVhdmUgYW55IG5vbi1zdGFnZSAwIGVudHJpZXMgaW4gdGhl IGNhY2hlIGFuZAorLy8gICAgICAgICAgICAgICAgICAgICAgIGRvbid0IHVwZGF0ZSB0aGUgd29y a2luZyBkaXJlY3RvcnkuCisvLyAgICAgICAgICAgICAgIDAgICAgPT4gTGVhdmUgdW5tZXJnZWQg ZW50cmllcyBpbiB0aGUgY2FjaGUgYW5kIHVwZGF0ZQorLy8gICAgICAgICAgICAgICAgICAgICAg IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KK3N0YXRpYyBpbnQgaW5kZXhfb25seSA9IDA7IC8vIGNh Y2hlT25seQorCitzdGF0aWMgaW50IGdpdF9yZWFkX3RyZWUoY29uc3Qgc3RydWN0IHRyZWUgKnRy ZWUpCit7CisjaWYgMAorCWZwcmludGYoc3RkZXJyLCAiR0lUX0lOREVYX0ZJTEU9JyVzJyBnaXQt cmVhZC10cmVlICVzXG4iLAorCQlnZXRlbnYoIkdJVF9JTkRFWF9GSUxFIiksCisJCXNoYTFfdG9f aGV4KHRyZWUtPm9iamVjdC5zaGExKSk7CisjZW5kaWYKKwljb25zdCBjaGFyICphcmd2W10gPSB7 ICJnaXQtcmVhZC10cmVlIiwgTlVMTCwgTlVMTCwgfTsKKwlhcmd2WzFdID0gc2hhMV90b19oZXgo dHJlZS0+b2JqZWN0LnNoYTEpOworCWludCByYyA9IHJ1bl9jb21tYW5kX3YoMiwgYXJndik7CisJ cmV0dXJuIHJjIDwgMCA/IC0xOiByYzsKK30KKworc3RhdGljIGludCBnaXRfbWVyZ2VfdHJlZXMo Y29uc3QgY2hhciAqdXBkYXRlX2FyZywKKwkJCSAgIHN0cnVjdCB0cmVlICpjb21tb24sCisJCQkg ICBzdHJ1Y3QgdHJlZSAqaGVhZCwKKwkJCSAgIHN0cnVjdCB0cmVlICptZXJnZSkKK3sKKyNpZiAw CisJZnByaW50ZihzdGRlcnIsICJHSVRfSU5ERVhfRklMRT0nJXMnIGdpdC1yZWFkLXRyZWUgJXMg LW0gJXMgJXMgJXNcbiIsCisJCWdldGVudigiR0lUX0lOREVYX0ZJTEUiKSwKKwkJdXBkYXRlX2Fy ZywKKwkJc2hhMV90b19oZXgoY29tbW9uLT5vYmplY3Quc2hhMSksCisJCXNoYTFfdG9faGV4KGhl YWQtPm9iamVjdC5zaGExKSwKKwkJc2hhMV90b19oZXgobWVyZ2UtPm9iamVjdC5zaGExKSk7Cisj ZW5kaWYKKwljb25zdCBjaGFyICphcmd2W10gPSB7CisJCSJnaXQtcmVhZC10cmVlIiwgTlVMTCwg Ii1tIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwKKwl9OworCWFyZ3ZbMV0gPSB1cGRhdGVf YXJnOworCWFyZ3ZbM10gPSBzaGExX3RvX2hleChjb21tb24tPm9iamVjdC5zaGExKTsKKwlhcmd2 WzRdID0gc2hhMV90b19oZXgoaGVhZC0+b2JqZWN0LnNoYTEpOworCWFyZ3ZbNV0gPSBzaGExX3Rv X2hleChtZXJnZS0+b2JqZWN0LnNoYTEpOworCWludCByYyA9IHJ1bl9jb21tYW5kX3YoNiwgYXJn dik7CisJcmV0dXJuIHJjIDwgMCA/IC0xOiByYzsKK30KKworc3RydWN0IG1lcmdlX3RyZWVfcmVz dWx0IG1lcmdlX3RyZWVzKHN0cnVjdCB0cmVlICpoZWFkLAorCQkJCSAgICAgc3RydWN0IHRyZWUg Km1lcmdlLAorCQkJCSAgICAgc3RydWN0IHRyZWUgKmNvbW1vbiwKKwkJCQkgICAgIGNvbnN0IGNo YXIgKmJyYW5jaDFOYW1lLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnJhbmNoMk5hbWUpOworCisK Ky8vIFRoZSBlbnRyeSBwb2ludCB0byB0aGUgbWVyZ2UgY29kZQorCisvLyBNZXJnZSB0aGUgY29t bWl0cyBoMSBhbmQgaDIsIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpcnR1YWwKKy8vIGNvbW1pdCBv YmplY3QgYW5kIGEgZmxhZyBpbmRpY2F0aW5nIHRoZSBjbGVhbmVzcyBvZiB0aGUgbWVyZ2UuCitz dGF0aWMKK3N0cnVjdCBtZXJnZV9yZXN1bHQgbWVyZ2Uoc3RydWN0IG5vZGUgKmgxLAorCQkJICBz dHJ1Y3Qgbm9kZSAqaDIsCisJCQkgIGNvbnN0IGNoYXIgKmJyYW5jaDFOYW1lLAorCQkJICBjb25z dCBjaGFyICpicmFuY2gyTmFtZSwKKwkJCSAgc3RydWN0IGdyYXBoICpncmFwaCwKKwkJCSAgaW50 IGNhbGxEZXB0aCAvKiA9MCAqLywKKwkJCSAgc3RydWN0IG5vZGUgKmFuY2VzdG9yIC8qID1Ob25l ICovKQoreworCXN0cnVjdCBtZXJnZV9yZXN1bHQgcmVzdWx0ID0geyBOVUxMLCAwIH07CisKKwlj b25zdCBjaGFyICptc2c7CisJaW50IG1zZ2xlbjsKKwlvdXRwdXQoIk1lcmdpbmc6Iik7CisJbXNn ID0gbm9kZV90aXRsZShoMSwgJm1zZ2xlbik7CisJb3V0cHV0KCIlcyAlLipzIiwgbm9kZV9oZXhf c2hhMShoMSksIG1zZ2xlbiwgbXNnKTsKKwltc2cgPSBub2RlX3RpdGxlKGgyLCAmbXNnbGVuKTsK KwlvdXRwdXQoIiVzICUuKnMiLCBub2RlX2hleF9zaGExKGgyKSwgbXNnbGVuLCBtc2cpOworCWlm ICggIWFuY2VzdG9yICYmICFncmFwaCApCisJCWRpZSgiZ3JhcGggaXMgbm90IGluaXRpYWxpemVk Iik7CisJc3RydWN0IG5vZGVfbGlzdCAqY2EgPSBOVUxMOworCWlmICggYW5jZXN0b3IgKQorCQlu b2RlX2xpc3RfaW5zZXJ0KGFuY2VzdG9yLCAmY2EpOworCWVsc2UKKwkJY2EgPSBncmFwaF9jb21t b25fYW5jZXN0b3JzKGdyYXBoLCBoMSwgaDIpOworCisJb3V0cHV0KCJmb3VuZCAldSBjb21tb24g YW5jZXN0b3Iocyk6Iiwgbm9kZV9saXN0X2NvdW50KGNhKSk7CisJc3RydWN0IG5vZGVfbGlzdCAq eDsKKwlmb3JfZWFjaF9ub2RlX2xpc3QoeCxjYSkgeworCQltc2cgPSBub2RlX3RpdGxlKHgtPm5v ZGUsICZtc2dsZW4pOworCQlvdXRwdXQoIiVzICUuKnMiLCBub2RlX2hleF9zaGExKHgtPm5vZGUp LCBtc2dsZW4sIG1zZyk7CisJfQorCisJc3RydWN0IG5vZGUgKm1lcmdlZENBID0gbm9kZV9saXN0 X3NoaWZ0X25vZGUoJmNhKTsKKworCXN0cnVjdCBub2RlX2xpc3QgKmg7CisJZm9yX2VhY2hfY29t bWl0KGgsY2EpIHsKKwkJb3V0cHV0X2luZGVudCA9IGNhbGxEZXB0aCArIDE7CisJCXJlc3VsdCA9 IG1lcmdlKG1lcmdlZENBLCBoLT5ub2RlLAorCQkJICAgICAgICJUZW1wb3JhcnkgbWVyZ2UgYnJh bmNoIDEiLAorCQkJICAgICAgICJUZW1wb3JhcnkgbWVyZ2UgYnJhbmNoIDIiLAorCQkJICAgICAg IGdyYXBoLAorCQkJICAgICAgIGNhbGxEZXB0aCArIDEsCisJCQkgICAgICAgTlVMTCk7CisJCW1l cmdlZENBID0gcmVzdWx0LmNvbW1pdDsKKwkJb3V0cHV0X2luZGVudCA9IGNhbGxEZXB0aDsKKwor CQlpZiAoICFtZXJnZWRDQSApCisJCQlkaWUoIm1lcmdlIHJldHVybmVkIG5vIGNvbW1pdCIpOwor CX0KKworCWlmICggY2FsbERlcHRoID09IDAgKSB7CisJCXNldHVwX2luZGV4KDApOworCQlpbmRl eF9vbmx5ID0gMDsKKwl9IGVsc2UgeworCQlzZXR1cF9pbmRleCgxKTsKKwkJZ2l0X3JlYWRfdHJl ZShoMS0+dHJlZSk7CisJCWluZGV4X29ubHkgPSAxOworCX0KKworCXN0cnVjdCBtZXJnZV90cmVl X3Jlc3VsdCBtdHI7CisJbXRyID0gbWVyZ2VfdHJlZXMoaDEtPnRyZWUsIGgyLT50cmVlLAorCQkJ ICBtZXJnZWRDQS0+dHJlZSwgYnJhbmNoMU5hbWUsIGJyYW5jaDJOYW1lKTsKKworCWlmICggZ3Jh cGggJiYgKG10ci5jbGVhbiB8fCBpbmRleF9vbmx5KSApIHsKKwkJcmVzdWx0LmNvbW1pdCA9IG5v ZGVfYWxsb2NfdmlydHVhbChtdHIudHJlZSwgIm1lcmdlZCB0cmVlIik7CisJCXN0cnVjdCBub2Rl X2xpc3QgKnBhcmVudHMgPSBOVUxMOworCQlub2RlX2xpc3RfaW5zZXJ0KGgxLCAmcGFyZW50cyk7 CisJCW5vZGVfbGlzdF9pbnNlcnQoaDIsICZwYXJlbnRzLT5uZXh0KTsKKwkJbm9kZV9zZXRfcGFy ZW50cyhyZXN1bHQuY29tbWl0LCBwYXJlbnRzKTsKKwkJZ3JhcGhfYWRkX25vZGUoZ3JhcGgsIHJl c3VsdC5jb21taXQpOworCX0gZWxzZQorCQlyZXN1bHQuY29tbWl0ID0gTlVMTDsKKworCXJlc3Vs dC5jbGVhbiA9IG10ci5jbGVhbjsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIFJFQURf VFJFRV9GT1VORCAyCit0eXBlZGVmIGludCAoKnJlYWRfdHJlZV9ydF9mbl90KShjb25zdCBjaGFy ICpzaGExLAorCQkJCSBjb25zdCBjaGFyICpwYXRoLAorCQkJCSB1bnNpZ25lZCBtb2RlLAorCQkJ CSB2b2lkICpkYXRhKTsKKworLy8gZ2l0LWxzLXRyZWUgLXIgLXQgPHRyZWU+CitzdGF0aWMgaW50 IHJlYWRfdHJlZV9ydChzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsCisJ CQlpbnQgYmFzZWxlbiwKKwkJCXJlYWRfdHJlZV9ydF9mbl90IGZuLAorCQkJdm9pZCAqZGF0YSkK K3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisK KwlpZiAocGFyc2VfdHJlZSh0cmVlKSkKKwkJcmV0dXJuIC0xOworCisJZGVzYy5idWYgPSB0cmVl LT5idWZmZXI7CisJZGVzYy5zaXplID0gdHJlZS0+c2l6ZTsKKworCXdoaWxlICggdHJlZV9lbnRy eSgmZGVzYywgJmVudHJ5KSApIHsKKwkJaW50IHJldHZhbDsKKwkJY2hhciAqcGF0aCA9IHhtYWxs b2MoYmFzZWxlbiArIGVudHJ5LnBhdGhsZW4gKyAyKTsKKwkJbWVtY3B5KHBhdGgsIGJhc2UsIGJh c2VsZW4pOworCQltZW1jcHkocGF0aCArIGJhc2VsZW4sIGVudHJ5LnBhdGgsIGVudHJ5LnBhdGhs ZW4pOworCQlwYXRoW2Jhc2VsZW4gKyBlbnRyeS5wYXRobGVuXSA9ICdcMCc7CisKKwkJc3dpdGNo ICggcmV0dmFsID0gZm4oZW50cnkuc2hhMSwgcGF0aCwgZW50cnkubW9kZSwgZGF0YSkgKSB7CisJ CWNhc2UgUkVBRF9UUkVFX1JFQ1VSU0lWRToKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlmcmVl KHBhdGgpOworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQlmcmVlKHBhdGgpOworCQkJcmV0 dXJuIHJldHZhbDsKKwkJfQorCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJcGF0aFti YXNlbGVuICsgZW50cnkucGF0aGxlbl0gPSAnLyc7CisJCQlwYXRoW2Jhc2VsZW4gKyBlbnRyeS5w YXRobGVuICsgMV0gPSAnXDAnOworCQkJcmV0dmFsID0gcmVhZF90cmVlX3J0KGxvb2t1cF90cmVl KGVudHJ5LnNoYTEpLAorCQkJCQkgICAgICBwYXRoLAorCQkJCQkgICAgICBiYXNlbGVuICsgZW50 cnkucGF0aGxlbiArIDEsCisJCQkJCSAgICAgIGZuLCBkYXRhKTsKKwkJCXBhdGhbYmFzZWxlbiAr IGVudHJ5LnBhdGhsZW5dID0gJ1wwJzsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlmcmVlKHBhdGgp OworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwkJZnJlZShwYXRoKTsKKwl9CisJcmV0 dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlc19hbmRfZGlycworeworCXN0cnVjdCBwYXRoX2xpc3Qg KipmaWxlczsKKwlzdHJ1Y3QgcGF0aF9saXN0ICoqZGlyczsKK307CisKK3N0YXRpYyBpbnQgc2F2 ZV9maWxlc19kaXJzKGNvbnN0IGNoYXIgKnNoYTEsCisJCQkgICBjb25zdCBjaGFyICpwYXRoXywK KwkJCSAgIHVuc2lnbmVkIG1vZGUsCisJCQkgICB2b2lkICpkYXRhXykKK3sKKwlzdHJ1Y3QgZmls ZXNfYW5kX2RpcnMgKmRhdGEgPSBkYXRhXzsKKwljaGFyICpwYXRoID0gc3RyZHVwKHBhdGhfKTsK KworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCXBhdGhfbGlzdF9pbnNlcnQocGF0aCwgZGF0YS0+ ZGlycyk7CisJCWRhdGEtPmRpcnMgPSAmKCpkYXRhLT5kaXJzKS0+bmV4dDsKKwl9IGVsc2Ugewor CQlwYXRoX2xpc3RfaW5zZXJ0KHBhdGgsIGRhdGEtPmZpbGVzKTsKKwkJZGF0YS0+ZmlsZXMgPSAm KCpkYXRhLT5maWxlcyktPm5leHQ7CisJfQorCXJldHVybiBSRUFEX1RSRUVfUkVDVVJTSVZFOwor fQorCitpbnQgZ2V0RmlsZXNBbmREaXJzKHN0cnVjdCB0cmVlICp0cmVlLAorCQkgICAgc3RydWN0 IHBhdGhfbGlzdCAqKmZpbGVzLAorCQkgICAgc3RydWN0IHBhdGhfbGlzdCAqKmRpcnMpCit7CisJ c3RydWN0IGZpbGVzX2FuZF9kaXJzIGRhdGE7CisJcGF0aF9saXN0X2NsZWFyKGZpbGVzLCAxKTsK KwlwYXRoX2xpc3RfY2xlYXIoZGlycywgMSk7CisJZGF0YS5maWxlcyA9IGZpbGVzOworCWRhdGEu ZGlycyA9IGRpcnM7CisJaWYgKCByZWFkX3RyZWVfcnQodHJlZSwgIiIsIDAsIHNhdmVfZmlsZXNf ZGlycywgJmRhdGEpICE9IDAgKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcGF0aF9saXN0X2NvdW50 KCpmaWxlcykgKyBwYXRoX2xpc3RfY291bnQoKmRpcnMpOworfQorCitzdHJ1Y3QgaW5kZXhfZW50 cnkgKmluZGV4X2VudHJ5X2ZpbmQoc3RydWN0IGluZGV4X2VudHJ5ICplbnRzLCBjb25zdCBjaGFy ICpwYXRoKQoreworCXN0cnVjdCBpbmRleF9lbnRyeSAqZTsKKwlmb3IgKCBlID0gZW50czsgZTsg ZSA9IGUtPm5leHQgKQorCQlpZiAoIHN0cmNtcChlLT5wYXRoLCBwYXRoKSA9PSAwICkKKwkJCWJy ZWFrOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgaW5kZXhfZW50cnkgKmluZGV4X2VudHJ5X2dl dChzdHJ1Y3QgaW5kZXhfZW50cnkgKiplbnRzLCBjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVj dCBpbmRleF9lbnRyeSAqZSwgKip0YWlsID0gZW50czsKKwlmb3IgKCBlID0gKmVudHM7IGU7IGUg PSBlLT5uZXh0ICkgeworCQlpZiAoIHN0cmNtcChlLT5wYXRoLCBwYXRoKSA9PSAwICkKKwkJCXJl dHVybiBlOworCQl0YWlsID0gJmUtPm5leHQ7CisJfQorCWUgPSBpbmRleF9lbnRyeV9hbGxvYyhw YXRoKTsKKwltZW1zZXQoZS0+c3RhZ2VzLCAwLCBzaXplb2YoZS0+c3RhZ2VzKSk7CisJcmV0dXJu ICp0YWlsID0gZTsKK30KKworc3RydWN0IGZpbmRfZW50cnkKK3sKKwljb25zdCBjaGFyICpwYXRo OworCXVuc2lnbmVkIGNoYXIgKnNoYTsKKwl1bnNpZ25lZCAqbW9kZTsKK307CisKK3N0YXRpYyBp bnQgZmluZF9lbnRyeShjb25zdCBjaGFyICpzaGEsCisJCSAgICAgIGNvbnN0IGNoYXIgKnBhdGgs CisJCSAgICAgIHVuc2lnbmVkIG1vZGUsCisJCSAgICAgIHZvaWQgKmRhdGFfKQoreworCXN0cnVj dCBmaW5kX2VudHJ5ICpkYXRhID0gZGF0YV87CisJaWYgKCBzdHJjbXAocGF0aCwgZGF0YS0+cGF0 aCkgPT0gMCApIHsKKwkJbWVtY3B5KGRhdGEtPnNoYSwgc2hhLCAyMCk7CisJCSpkYXRhLT5tb2Rl ID0gbW9kZTsKKwkJcmV0dXJuIFJFQURfVFJFRV9GT1VORDsKKwl9CisJcmV0dXJuIFJFQURfVFJF RV9SRUNVUlNJVkU7Cit9CisKKy8vIFJldHVybnMgYSBDYWNoZUVudHJ5IG9iamVjdCB3aGljaCBk b2Vzbid0IGhhdmUgdG8gY29ycmVzcG9uZCB0bworLy8gYSByZWFsIGNhY2hlIGVudHJ5IGluIEdp dCdzIGluZGV4Lgorc3RydWN0IGluZGV4X2VudHJ5ICppbmRleF9lbnRyeV9mcm9tX2RiKGNvbnN0 IGNoYXIgKnBhdGgsCisJCQkJCXN0cnVjdCB0cmVlICpvLAorCQkJCQlzdHJ1Y3QgdHJlZSAqYSwK KwkJCQkJc3RydWN0IHRyZWUgKmIpCit7CisJc3RydWN0IGluZGV4X2VudHJ5ICplID0gaW5kZXhf ZW50cnlfYWxsb2MocGF0aCk7CisJc3RydWN0IGZpbmRfZW50cnkgZGF0YTsKKwlkYXRhLnBhdGgg PSBwYXRoOworCWRhdGEuc2hhID0gZS0+c3RhZ2VzWzFdLnNoYTsKKwlkYXRhLm1vZGUgPSAmZS0+ c3RhZ2VzWzFdLm1vZGU7CisJaWYgKCByZWFkX3RyZWVfcnQobywgIiIsIDAsIGZpbmRfZW50cnks ICZkYXRhKSAhPSBSRUFEX1RSRUVfRk9VTkQgKSB7CisJCS8vIGZwcmludGYoc3RkZXJyLCAiMTog JXM6JXMgbm90IGZvdW5kXG4iLAorCQkvLyAJc2hhMV90b19oZXgoby0+b2JqZWN0LnNoYTEpLCBw YXRoKTsKKwkJbWVtY3B5KGUtPnN0YWdlc1sxXS5zaGEsIG51bGxfc2hhMSwgMjApOworCQllLT5z dGFnZXNbMV0ubW9kZSA9IDA7CisJfQorCWRhdGEuc2hhID0gZS0+c3RhZ2VzWzJdLnNoYTsKKwlk YXRhLm1vZGUgPSAmZS0+c3RhZ2VzWzJdLm1vZGU7CisJaWYgKCByZWFkX3RyZWVfcnQoYSwgIiIs IDAsIGZpbmRfZW50cnksICZkYXRhKSAhPSBSRUFEX1RSRUVfRk9VTkQgKSB7CisJCS8vIGZwcmlu dGYoc3RkZXJyLCAiMjogJXM6JXMgbm90IGZvdW5kXG4iLAorCQkvLyAJc2hhMV90b19oZXgoYS0+ b2JqZWN0LnNoYTEpLCBwYXRoKTsKKwkJbWVtY3B5KGUtPnN0YWdlc1syXS5zaGEsIG51bGxfc2hh MSwgMjApOworCQllLT5zdGFnZXNbMl0ubW9kZSA9IDA7CisJfQorCWRhdGEuc2hhID0gZS0+c3Rh Z2VzWzNdLnNoYTsKKwlkYXRhLm1vZGUgPSAmZS0+c3RhZ2VzWzNdLm1vZGU7CisJaWYgKCByZWFk X3RyZWVfcnQoYiwgIiIsIDAsIGZpbmRfZW50cnksICZkYXRhKSAhPSBSRUFEX1RSRUVfRk9VTkQg KSB7CisJCS8vIGZwcmludGYoc3RkZXJyLCAiMzogJXM6JXMgbm90IGZvdW5kXG4iLAorCQkvLyAJ c2hhMV90b19oZXgoYi0+b2JqZWN0LnNoYTEpLCBwYXRoKTsKKwkJbWVtY3B5KGUtPnN0YWdlc1sz XS5zaGEsIG51bGxfc2hhMSwgMjApOworCQllLT5zdGFnZXNbM10ubW9kZSA9IDA7CisJfQorCXJl dHVybiBlOworfQorCit2b2lkIGZyZWVfaW5kZXhfZW50cmllcyhzdHJ1Y3QgaW5kZXhfZW50cnkg KiplbnRzKQoreworCXdoaWxlICggKmVudHMgKSB7CisJCXN0cnVjdCBpbmRleF9lbnRyeSAqbmV4 dCA9ICgqZW50cyktPm5leHQ7CisJCWZyZWUoKmVudHMpOworCQkqZW50cyA9IG5leHQ7CisJfQor fQorCitzdGF0aWMgaW50IGZnZXRfbW9kZSh1bnNpZ25lZCAqbW9kZSwgRklMRSAqZnAsIGludCAq Y2gpCit7CisJaW50IHA7CisJY2hhciBidWZbOF07CisJZm9yICggcCA9IDA7ICgqY2ggPSBmZ2V0 YyhmcCkpICE9IEVPRiAmJiBwIDwgNjsgKSB7CisJCWlmICggKmNoID09ICdceDIwJyB8fCAqY2gg PT0gJ1x0JyB8fCAqY2ggPT0gJ1xuJyB8fCAqY2ggPT0gJ1xyJyApCisJCQlicmVhazsKKwkJaWYg KCAqY2ggPCAnMCcgfHwgKmNoID4gJzcnICkKKwkJCXJldHVybiAtMTsKKwkJYnVmW3ArK10gPSAq Y2g7CisJfQorCWJ1ZltwXSA9ICdcMCc7CisJKm1vZGUgPSBzdHJ0b3VsKGJ1ZiwgMCwgOCk7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmdldF9zaGExKHVuc2lnbmVkIGNoYXIgKnNoYSwg RklMRSAqZnAsIGludCAqY2gpCit7CisJY2hhciBidWZbNDBdOworCWludCBwOworCWZvciAoIHAg PSAwOyAoKmNoID0gZmdldGMoZnApKSAhPSBFT0YgJiYgcCA8IDQwOyApIHsKKwkJaWYgKCAoJzAn IDw9ICpjaCAmJiAqY2ggPD0gJzknKSB8fAorCQkgICAgICgnYScgPD0gKmNoICYmICpjaCA8PSAn ZicpIHx8CisJCSAgICAgKCdBJyA8PSAqY2ggJiYgKmNoIDw9ICdGJykgKQorCQkJYnVmW3ArK10g PSAqY2g7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKwl9CisJaWYgKCBwICE9IDQwIHx8IGdldF9z aGExX2hleChidWYsIHNoYSkgPT0gLTEgKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9Cisv LyBDcmVhdGUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZSBuYW1lcyB0byBDYWNoZUVudHJ5IG9i amVjdHMuIFRoZQorLy8gZGljdGlvbmFyeSBjb250YWlucyBvbmUgZW50cnkgZm9yIGV2ZXJ5IHBh dGggd2l0aCBhIG5vbi16ZXJvIHN0YWdlIGVudHJ5Lgorc3RydWN0IGluZGV4X2VudHJ5ICp1bm1l cmdlZENhY2hlRW50cmllcygpCit7CisJc3RydWN0IGluZGV4X2VudHJ5ICp1bm1lcmdlZCA9IE5V TEw7CisJRklMRSAqZnAgPSBwb3BlbigiZ2l0LWxzLWZpbGVzIC16IC0tdW5tZXJnZWQiLCAiciIp OworCWlmICggIWZwICkKKwkJcmV0dXJuIE5VTEw7CisJaW50IGNoOworCXdoaWxlICggIWZlb2Yo ZnApICkgeworCQl1bnNpZ25lZCBtb2RlOworCQl1bnNpZ25lZCBjaGFyIHNoYVsyMF07CisJCWNo YXIgc3RhZ2UgPSAnMCc7CisJCWNoYXIgcGF0aFtQQVRIX01BWF07CisJCWludCBwOworCQkvLyBt b2RlCisJCWlmICggZmdldF9tb2RlKCZtb2RlLCBmcCwgJmNoKSApCisJCQlnb3RvIHdhaXRfZW9s OworCQlpZiAoICdceDIwJyAhPSBjaCApCisJCQlnb3RvIHdhaXRfZW9sOworCQkvLyBTSEExCisJ CWlmICggZmdldF9zaGExKHNoYSwgZnAsICZjaCkgKQorCQkJZ290byB3YWl0X2VvbDsKKwkJaWYg KCAnXHgyMCcgIT0gY2ggKQorCQkJZ290byB3YWl0X2VvbDsKKwkJLy8gc3RhZ2UKKwkJaWYgKCAo Y2ggPSBmZ2V0YyhmcCkpICE9IEVPRiApIHsKKwkJCXN0YWdlID0gY2g7CisJCQlpZiAoIGNoIDwg JzEnIHx8IGNoID4gJzMnICkKKwkJCQlnb3RvIHdhaXRfZW9sOworCQl9CisJCWlmICggKGNoID0g ZmdldGMoZnApKSA9PSBFT0YgfHwgJ1x0JyAhPSBjaCApCisJCQlnb3RvIHdhaXRfZW9sOworCQkv LyBwYXRoCisJCWZvciAoIHAgPSAwOyAoY2ggPSBmZ2V0YyhmcCkpICE9IEVPRjsgKytwICkgewor CQkJcGF0aFtwXSA9IGNoOworCQkJaWYgKCAhY2ggKQorCQkJCWJyZWFrOworCQkJaWYgKCBwID09 IHNpemVvZihwYXRoKSAtIDEgKSB7CisJCQkJcGF0aFtwXSA9ICdcMCc7CisJCQkJZXJyb3IoInBh dGggdG9vIGxvbmc6ICVzIiwgcGF0aCk7CisJCQkJZ290byB3YWl0X2VvbDsKKwkJCX0KKwkJfQor CQlpZiAoIGNoICkKKwkJCWdvdG8gd2FpdF9lb2w7CisJCS8vIHByaW50ZigidW5tZXJnZWQgJTA4 byAlcyAlYyAlc1xuIixtb2RlLHNoYTFfdG9faGV4KHNoYSksc3RhZ2UscGF0aCk7CisJCXN0cnVj dCBpbmRleF9lbnRyeSAqZSA9IGluZGV4X2VudHJ5X2dldCgmdW5tZXJnZWQsIHBhdGgpOworCQll LT5zdGFnZXNbc3RhZ2UgLSAnMScgKyAxXS5tb2RlID0gbW9kZTsKKwkJbWVtY3B5KGUtPnN0YWdl c1tzdGFnZSAtICcxJyArIDFdLnNoYSwgc2hhLCAyMCk7CisJCWNvbnRpbnVlOworCXdhaXRfZW9s OgorCQl3aGlsZSAoIChjaCA9IGZnZXRjKGZwKSkgIT0gRU9GICYmIGNoICk7CisJfQorCXBjbG9z ZShmcCk7CisJcmV0dXJuIHVubWVyZ2VkOworfQorCitzdHJ1Y3QgcmVuYW1lX2VudHJ5Cit7CisJ c3RydWN0IHJlbmFtZV9lbnRyeSAqbmV4dDsKKworCWNoYXIgKnNyYzsKKwl1bnNpZ25lZCBjaGFy IHNyY19zaGFbMjBdOworCXVuc2lnbmVkIHNyY19tb2RlOworCXN0cnVjdCBpbmRleF9lbnRyeSAq c3JjX2VudHJ5OworCisJY2hhciAqZHN0OworCXVuc2lnbmVkIGNoYXIgZHN0X3NoYVsyMF07CisJ dW5zaWduZWQgZHN0X21vZGU7CisJc3RydWN0IGluZGV4X2VudHJ5ICpkc3RfZW50cnk7CisKKwl1 bnNpZ25lZCBzY29yZTsKKwl1bnNpZ25lZCBwcm9jZXNzZWQ6MTsKK307CisKK3N0cnVjdCByZW5h bWVfZW50cnkgKmZpbmRfcmVuYW1lX2J5c3JjKHN0cnVjdCByZW5hbWVfZW50cnkgKmUsCisJCQkJ ICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJd2hpbGUgKCBlICkgeworCQlpZiAoIHN0cmNt cChlLT5zcmMsIG5hbWUpID09IDAgKQorCQkJYnJlYWs7CisJCWUgPSBlLT5uZXh0OworCX0KKwly ZXR1cm4gZTsKK30KKworc3RydWN0IHJlbmFtZV9lbnRyeSAqZmluZF9yZW5hbWVfYnlkc3Qoc3Ry dWN0IHJlbmFtZV9lbnRyeSAqZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl3 aGlsZSAoIGUgKSB7CisJCWlmICggc3RyY21wKGUtPmRzdCwgbmFtZSkgPT0gMCApCisJCQlicmVh azsKKwkJZSA9IGUtPm5leHQ7CisJfQorCXJldHVybiBlOworfQorCit2b2lkIHJlbmFtZV9lbnRy eV9mcmVlKHN0cnVjdCByZW5hbWVfZW50cnkgKnApCit7CisJZnJlZShwLT5zcmMpOworCWZyZWUo cC0+ZHN0KTsKKwlmcmVlKHApOworfQorCit2b2lkIGZyZWVfcmVuYW1lX2VudHJpZXMoc3RydWN0 IHJlbmFtZV9lbnRyeSAqKmxpc3QpCit7CisJd2hpbGUgKCAqbGlzdCApIHsKKwkJc3RydWN0IHJl bmFtZV9lbnRyeSAqbmV4dCA9ICgqbGlzdCktPm5leHQ7CisJCXJlbmFtZV9lbnRyeV9mcmVlKCps aXN0KTsKKwkJKmxpc3QgPSBuZXh0OworCX0KK30KKworLy8gR2V0IGluZm9ybWF0aW9uIG9mIGFs bCByZW5hbWVzIHdoaWNoIG9jY3VyZWQgYmV0d2VlbiAnb1RyZWUnIGFuZAorLy8gJ3RyZWUnLiBX ZSBuZWVkIHRoZSB0aHJlZSB0cmVlcyBpbiB0aGUgbWVyZ2UgKCdvVHJlZScsICdhVHJlZScgYW5k CisvLyAnYlRyZWUnKSB0byBiZSBhYmxlIHRvIGFzc29jaWF0ZSB0aGUgY29ycmVjdCBjYWNoZSBl bnRyaWVzIHdpdGgKKy8vIHRoZSByZW5hbWUgaW5mb3JtYXRpb24uICd0cmVlJyBpcyBhbHdheXMg ZXF1YWwgdG8gZWl0aGVyIGFUcmVlIG9yIGJUcmVlLgorc3RydWN0IHJlbmFtZV9lbnRyeSAqZ2V0 UmVuYW1lcyhzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCQlzdHJ1Y3QgdHJlZSAqb1RyZWUsCisJCQkJ c3RydWN0IHRyZWUgKmFUcmVlLAorCQkJCXN0cnVjdCB0cmVlICpiVHJlZSwKKwkJCQlzdHJ1Y3Qg aW5kZXhfZW50cnkgKiplbnRyaWVzKQoreworCXN0cnVjdCByZW5hbWVfZW50cnkgKnJlbmFtZXMg PSBOVUxMOworCXN0cnVjdCByZW5hbWVfZW50cnkgKipycHRyID0gJnJlbmFtZXM7CisJc3RydWN0 IGRpZmZfb3B0aW9ucyBvcHRzOworCWRpZmZfc2V0dXAoJm9wdHMpOworCW9wdHMucmVjdXJzaXZl ID0gMTsKKwlvcHRzLmRldGVjdF9yZW5hbWUgPSBESUZGX0RFVEVDVF9SRU5BTUU7CisJb3B0cy5v dXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCWlmIChkaWZmX3NldHVwX2Rv bmUoJm9wdHMpIDwgMCkKKwkJZGllKCJkaWZmIHNldHVwIGZhaWxlZCIpOworCWRpZmZfdHJlZV9z aGExKG9UcmVlLT5vYmplY3Quc2hhMSwgdHJlZS0+b2JqZWN0LnNoYTEsICIiLCAmb3B0cyk7CisJ ZGlmZmNvcmVfc3RkKCZvcHRzKTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlmZl9xdWV1 ZWRfZGlmZi5ucjsgKytpKSB7CisJCXN0cnVjdCByZW5hbWVfZW50cnkgKnJlOworCQlzdHJ1Y3Qg ZGlmZl9maWxlcGFpciAqcGFpciA9IGRpZmZfcXVldWVkX2RpZmYucXVldWVbaV07CisJCWlmIChw YWlyLT5zdGF0dXMgIT0gJ1InKQorCQkJY29udGludWU7CisJCXJlID0geG1hbGxvYyhzaXplb2Yo KnJlKSk7CisJCXJlLT5uZXh0ID0gTlVMTDsKKwkJcmUtPnByb2Nlc3NlZCA9IDA7CisJCXJlLT5z Y29yZSA9IHBhaXItPnNjb3JlOworCQltZW1jcHkocmUtPnNyY19zaGEsIHBhaXItPm9uZS0+c2hh MSwgMjApOworCQlyZS0+c3JjID0gc3RyZHVwKHBhaXItPm9uZS0+cGF0aCk7CisJCXJlLT5zcmNf bW9kZSA9IHBhaXItPm9uZS0+bW9kZTsKKwkJbWVtY3B5KHJlLT5kc3Rfc2hhLCBwYWlyLT50d28t PnNoYTEsIDIwKTsKKwkJcmUtPmRzdCA9IHN0cmR1cChwYWlyLT50d28tPnBhdGgpOworCQlyZS0+ ZHN0X21vZGUgPSBwYWlyLT50d28tPm1vZGU7CisJCXJlLT5zcmNfZW50cnkgPSBpbmRleF9lbnRy eV9maW5kKCplbnRyaWVzLCByZS0+c3JjKTsKKwkJaWYgKCAhcmUtPnNyY19lbnRyeSApIHsKKwkJ CXJlLT5zcmNfZW50cnkgPSBpbmRleF9lbnRyeV9mcm9tX2RiKHJlLT5zcmMsIG9UcmVlLCBhVHJl ZSwgYlRyZWUpOworCQkJcmUtPnNyY19lbnRyeS0+bmV4dCA9ICplbnRyaWVzOworCQkJKmVudHJp ZXMgPSByZS0+c3JjX2VudHJ5OworCQl9CisJCXJlLT5kc3RfZW50cnkgPSBpbmRleF9lbnRyeV9m aW5kKCplbnRyaWVzLCByZS0+ZHN0KTsKKwkJaWYgKCAhcmUtPmRzdF9lbnRyeSApIHsKKwkJCXJl LT5kc3RfZW50cnkgPSBpbmRleF9lbnRyeV9mcm9tX2RiKHJlLT5kc3QsIG9UcmVlLCBhVHJlZSwg YlRyZWUpOworCQkJcmUtPmRzdF9lbnRyeS0+bmV4dCA9ICplbnRyaWVzOworCQkJKmVudHJpZXMg PSByZS0+ZHN0X2VudHJ5OworCQl9CisJCSpycHRyID0gcmU7CisJCXJwdHIgPSAmcmUtPm5leHQ7 CisJfQorCW9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwlkaWZm X2ZsdXNoKCZvcHRzKTsKKwlyZXR1cm4gcmVuYW1lczsKK30KKworc3RhdGljIEZJTEUgKmdpdF91 cGRhdGVfaW5kZXhfcGlwZSgpCit7CisJcmV0dXJuIHBvcGVuKCJnaXQtdXBkYXRlLWluZGV4IC16 IC0taW5kZXgtaW5mbyIsICJ3Iik7Cit9CisKK2ludCBzZXRJbmRleFN0YWdlcyhGSUxFICpmcCwK KwkJICAgY29uc3QgY2hhciAqcGF0aCwKKwkJICAgdW5zaWduZWQgY2hhciAqb3NoYSwgdW5zaWdu ZWQgb21vZGUsCisJCSAgIHVuc2lnbmVkIGNoYXIgKmFzaGEsIHVuc2lnbmVkIGFtb2RlLAorCQkg ICB1bnNpZ25lZCBjaGFyICpic2hhLCB1bnNpZ25lZCBibW9kZSwKKwkJICAgaW50IGNsZWFyIC8q ID1UcnVlICovKQoreworCWlmICggIWZwICkKKwkJcmV0dXJuIC0xOworCWlmICggY2xlYXIgKSB7 CisJCWZwcmludGYoZnAsICIwICVzXHQlcyIsIHNoYTFfdG9faGV4KG51bGxfc2hhMSksIHBhdGgp OworCQlmcHV0YygnXDAnLCBmcCk7CisJfQorCWlmICggb21vZGUgKSB7CisJCWZwcmludGYoZnAs ICIwJW8gJXMgMVx0JXMiLCBvbW9kZSwgc2hhMV90b19oZXgob3NoYSksIHBhdGgpOworCQlmcHV0 YygnXDAnLCBmcCk7CisJfQorCWlmICggYW1vZGUgKSB7CisJCWZwcmludGYoZnAsICIwJW8gJXMg Mlx0JXMiLCBhbW9kZSwgc2hhMV90b19oZXgoYXNoYSksIHBhdGgpOworCQlmcHV0YygnXDAnLCBm cCk7CisJfQorCWlmICggYm1vZGUgKSB7CisJCWZwcmludGYoZnAsICIwJW8gJXMgM1x0JXMiLCBi bW9kZSwgc2hhMV90b19oZXgoYnNoYSksIHBhdGgpOworCQlmcHV0YygnXDAnLCBmcCk7CisJfQor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9wYXRoKGNvbnN0IGNoYXIgKm5hbWUp Cit7CisJaW50IHJldDsKKwljaGFyICpzbGFzaDsKKworCXJldCA9IHVubGluayhuYW1lKTsKKwlp ZiAoIHJldCApCisJCXJldHVybiByZXQ7CisJaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKKwljaGFy ICpkaXJzID0gbWFsbG9jKGxlbisxKTsKKwltZW1jcHkoZGlycywgbmFtZSwgbGVuKTsKKwlkaXJz W2xlbl0gPSAnXDAnOworCXdoaWxlICggKHNsYXNoID0gc3RycmNocihuYW1lLCAnLycpKSApIHsK KwkJKnNsYXNoID0gJ1wwJzsKKwkJbGVuID0gc2xhc2ggLSBuYW1lOworCQlpZiAoIHJtZGlyKG5h bWUpICE9IDAgKQorCQkJYnJlYWs7CisJfQorCWZyZWUoZGlycyk7CisJcmV0dXJuIHJldDsKK30K KworaW50IHJlbW92ZUZpbGUoRklMRSAqZnAsIGludCBjbGVhbiwgY29uc3QgY2hhciAqcGF0aCkK K3sKKwlpbnQgdXBkYXRlQ2FjaGUgPSBpbmRleF9vbmx5IHx8IGNsZWFuOworCWludCB1cGRhdGVX ZCA9ICFpbmRleF9vbmx5OworCisJaWYgKCB1cGRhdGVDYWNoZSApIHsKKwkJaWYgKCAhZnAgKQor CQkJcmV0dXJuIC0xOworCQlmcHJpbnRmKGZwLCAiMCAlc1x0JXMiLCBzaGExX3RvX2hleChudWxs X3NoYTEpLCBwYXRoKTsKKwkJZnB1dGMoJ1wwJywgZnApOworCQlyZXR1cm4gMDsKKwl9CisJaWYg KCB1cGRhdGVXZCApCisJeworCQl1bmxpbmsocGF0aCk7CisJCWlmICggZXJybm8gIT0gRU5PRU5U IHx8IGVycm5vICE9IEVJU0RJUiApCisJCQlyZXR1cm4gLTE7CisJCXJlbW92ZV9wYXRoKHBhdGgp OworCX0KKwlyZXR1cm4gMDsKK30KKworY2hhciAqdW5pcXVlUGF0aChjb25zdCBjaGFyICpwYXRo LCBjb25zdCBjaGFyICpicmFuY2gpCit7CisJY2hhciAqbmV3cGF0aCA9IHhtYWxsb2Moc3RybGVu KHBhdGgpICsgMSArIHN0cmxlbihicmFuY2gpICsgOCArIDEpOworCXN0cmNweShuZXdwYXRoLCBw YXRoKTsKKwlzdHJjYXQobmV3cGF0aCwgIn4iKTsKKwljaGFyICpwID0gbmV3cGF0aCArIHN0cmxl bihuZXdwYXRoKTsKKwlzdHJjcHkocCwgYnJhbmNoKTsKKwlmb3IgKCA7ICpwOyArK3AgKQorCQlp ZiAoICcvJyA9PSAqcCApCisJCQkqcCA9ICdfJzsKKwlpbnQgc3VmZml4ID0gMDsKKwlzdHJ1Y3Qg c3RhdCBzdDsKKwl3aGlsZSAoIHBhdGhfbGlzdF9oYXNfcGF0aChjdXJyZW50RmlsZVNldCwgbmV3 cGF0aCkgfHwKKwkJcGF0aF9saXN0X2hhc19wYXRoKGN1cnJlbnREaXJlY3RvcnlTZXQsIG5ld3Bh dGgpIHx8CisJCWxzdGF0KG5ld3BhdGgsICZzdCkgPT0gMCApIHsKKwkJc3ByaW50ZihwLCAiXyVk Iiwgc3VmZml4KyspOworCX0KKwlwYXRoX2xpc3RfaW5zZXJ0KG5ld3BhdGgsICZjdXJyZW50Rmls ZVNldCk7CisJcmV0dXJuIG5ld3BhdGg7Cit9CisKK2ludCBta2Rpcl9wKGNvbnN0IGNoYXIgKnBh dGgsIHVuc2lnbmVkIGxvbmcgbW9kZSwgaW50IGNyZWF0ZV9sYXN0KQoreworCWNoYXIgKmJ1ZiA9 IHN0cmR1cChwYXRoKTsKKwljaGFyICpwOworCisJZm9yICggcCA9IGJ1ZjsgKnA7ICsrcCApIHsK KwkJaWYgKCAqcCAhPSAnLycgKQorCQkJY29udGludWU7CisJCSpwID0gJ1wwJzsKKwkJaWYgKG1r ZGlyKGJ1ZiwgbW9kZSkpIHsKKwkJCWludCBlID0gZXJybm87CisJCQlpZiAoIGUgPT0gRUVYSVNU ICkgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWlmICggIXN0YXQoYnVmLCAmc3QpICYmIFNf SVNESVIoc3Quc3RfbW9kZSkgKQorCQkJCQlnb3RvIG5leHQ7IC8qIG9rICovCisJCQkJZXJybm8g PSBlOworCQkJfQorCQkJZnJlZShidWYpOworCQkJcmV0dXJuIC0xOworCQl9CisJbmV4dDoKKwkJ KnAgPSAnLyc7CisJfQorCWZyZWUoYnVmKTsKKwlpZiAoIGNyZWF0ZV9sYXN0ICYmIG1rZGlyKHBh dGgsIG1vZGUpICkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKiBzdG9sZW4gZnJv bSBidWlsdGluLWNhdC1maWxlLmMgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcihpbnQgZmQs IGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXdoaWxlIChzaXplID4g MCkgeworCQlsb25nIHJldCA9IHh3cml0ZShmZCwgYnVmLCBzaXplKTsKKwkJaWYgKHJldCA8IDAp IHsKKwkJCS8qIElnbm9yZSBlcGlwZSAqLworCQkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJCWJy ZWFrOworCQkJZGllKCJnaXQtY2F0LWZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBl bHNlIGlmICghcmV0KSB7CisJCQlkaWUoImdpdC1jYXQtZmlsZTogZGlzayBmdWxsPyIpOworCQl9 CisJCXNpemUgLT0gcmV0OworCQlidWYgKz0gcmV0OworCX0KK30KKwordm9pZCB1cGRhdGVGaWxl RXh0KEZJTEUgKmZwLAorCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGEsCisJCSAgIHVuc2ln bmVkIG1vZGUsCisJCSAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgIGludCB1cGRhdGVDYWNoZSwK KwkJICAgaW50IHVwZGF0ZVdkKQoreworCWlmICggaW5kZXhfb25seSApCisJCXVwZGF0ZVdkID0g MDsKKworCWlmICggdXBkYXRlV2QgKSB7CisJCWNoYXIgdHlwZVsyMF07CisJCXZvaWQgKmJ1ZjsK KwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYSwgdHlw ZSwgJnNpemUpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgiY2Fubm90IHJlYWQgb2JqZWN0ICVzICcl cyciLCBzaGExX3RvX2hleChzaGEpLCBwYXRoKTsKKwkJaWYgKCBzdHJjbXAodHlwZSwgYmxvYl90 eXBlKSAhPSAwICkKKwkJCWRpZSgiYmxvYiBleHBlY3RlZCBmb3IgJXMgJyVzJyIsIHNoYTFfdG9f aGV4KHNoYSksIHBhdGgpOworCisJCWlmICggU19JU1JFRyhtb2RlKSApIHsKKwkJCWlmICggbWtk aXJfcChwYXRoLCAwNzc3LCAwIC8qIGRvbid0IGNyZWF0ZSBsYXN0IGVsZW1lbnQgKi8pICkKKwkJ CQlkaWUoImZhaWxlZCB0byBjcmVhdGUgcGF0aCAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJu bykpOworCQkJdW5saW5rKHBhdGgpOworCQkJaWYgKCBtb2RlICYgMDEwMCApCisJCQkJbW9kZSA9 IDA3Nzc7CisJCQllbHNlCisJCQkJbW9kZSA9IDA2NjY7CisJCQlpbnQgZmQgPSBvcGVuKHBhdGgs IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQsIG1vZGUpOworCQkJaWYgKCBmZCA8IDAgKQor CQkJCWRpZSgiZmFpbGVkIHRvIG9wZW4gJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsK KwkJCWZsdXNoX2J1ZmZlcihmZCwgYnVmLCBzaXplKTsKKwkJCWNsb3NlKGZkKTsKKwkJfSBlbHNl IGlmICggU19JU0xOSyhtb2RlKSApIHsKKwkJCWNoYXIgKmxpbmtUYXJnZXQgPSBtYWxsb2Moc2l6 ZSArIDEpOworCQkJbWVtY3B5KGxpbmtUYXJnZXQsIGJ1Ziwgc2l6ZSk7CisJCQlsaW5rVGFyZ2V0 W3NpemVdID0gJ1wwJzsKKwkJCW1rZGlyX3AocGF0aCwgMDc3NywgMCk7CisJCQlzeW1saW5rKGxp bmtUYXJnZXQsIHBhdGgpOworCQl9IGVsc2UKKwkJCWRpZSgiZG8gbm90IGtub3cgd2hhdCB0byBk byB3aXRoICUwNm8gJXMgJyVzJyIsCisJCQkgICAgbW9kZSwgc2hhMV90b19oZXgoc2hhKSwgcGF0 aCk7CisJfQorCWlmICggdXBkYXRlQ2FjaGUgKQorCXsKKwkJLy8gWFhYIGp1c3QgYWx3YXlzIHVz ZSAiZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8iPworCQlmcHJpbnRmKGZwLCAiJTA2byAl c1x0JXMiLCBtb2RlLCBzaGExX3RvX2hleChzaGEpLCBwYXRoKTsKKwkJZnB1dGMoJ1wwJywgZnAp OworCX0KK30KKwordm9pZCB1cGRhdGVGaWxlKEZJTEUgKmZwLAorCQlpbnQgY2xlYW4sCisJCWNv bnN0IHVuc2lnbmVkIGNoYXIgKnNoYSwKKwkJdW5zaWduZWQgbW9kZSwKKwkJY29uc3QgY2hhciAq cGF0aCkKK3sKKwl1cGRhdGVGaWxlRXh0KGZwLCBzaGEsIG1vZGUsIHBhdGgsIGluZGV4X29ubHkg fHwgY2xlYW4sICFpbmRleF9vbmx5KTsKK30KKworLy8gTG93IGxldmVsIGZpbGUgbWVyZ2luZywg dXBkYXRlIGFuZCByZW1vdmFsCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KK3N0cnVjdCBtZXJnZV9maWxlX2luZm8KK3sKKwl1bnNpZ25lZCBjaGFyIHNoYVsy MF07CisJdW5zaWduZWQgbW9kZTsKKwl1bnNpZ25lZCBjbGVhbjoxOworCXVuc2lnbmVkIG1lcmdl OjE7Cit9OworCitzdGF0aWMgY2hhciAqZ2l0X3VucGFja19maWxlKHVuc2lnbmVkIGNoYXIgKnNo YTEsIGNoYXIgKnBhdGgpCit7CisJdm9pZCAqYnVmOworCWNoYXIgdHlwZVsyMF07CisJdW5zaWdu ZWQgbG9uZyBzaXplOworCWludCBmZDsKKworCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIHR5 cGUsICZzaXplKTsKKwlpZiAoIWJ1ZiB8fCBzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkKKwkJZGll KCJ1bmFibGUgdG8gcmVhZCBibG9iIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwor CXN0cmNweShwYXRoLCAiLm1lcmdlX2ZpbGVfWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKHBhdGgp OworCWlmIChmZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSB0ZW1wLWZpbGUiKTsKKwlp ZiAod3JpdGUoZmQsIGJ1Ziwgc2l6ZSkgIT0gc2l6ZSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUg dGVtcC1maWxlIik7CisJY2xvc2UoZmQpOworCXJldHVybiBwYXRoOworfQorCitzdHJ1Y3QgbWVy Z2VfZmlsZV9pbmZvCittZXJnZUZpbGUoY29uc3QgY2hhciAqb1BhdGgsIHVuc2lnbmVkIGNoYXIg Km9TaGEsIHVuc2lnbmVkIG9Nb2RlLAorCSAgY29uc3QgY2hhciAqYVBhdGgsIHVuc2lnbmVkIGNo YXIgKmFTaGEsIHVuc2lnbmVkIGFNb2RlLAorCSAgY29uc3QgY2hhciAqYlBhdGgsIHVuc2lnbmVk IGNoYXIgKmJTaGEsIHVuc2lnbmVkIGJNb2RlLAorCSAgY29uc3QgY2hhciAqYnJhbmNoMU5hbWUs IGNvbnN0IGNoYXIgKmJyYW5jaDJOYW1lKQoreworCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gcmVz dWx0OworCXJlc3VsdC5tZXJnZSA9IDA7CisJcmVzdWx0LmNsZWFuID0gMTsKKworCWlmICggKFNf SUZNVCAmIGFNb2RlKSAhPSAoU19JRk1UICYgYk1vZGUpICkgeworCQlyZXN1bHQuY2xlYW4gPSAw OworCQlpZiAoIFNfSVNSRUcoYU1vZGUpICkgeworCQkJcmVzdWx0Lm1vZGUgPSBhTW9kZTsKKwkJ CW1lbWNweShyZXN1bHQuc2hhLCBhU2hhLCAyMCk7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQubW9k ZSA9IGJNb2RlOworCQkJbWVtY3B5KHJlc3VsdC5zaGEsIGJTaGEsIDIwKTsKKwkJfQorCX0gZWxz ZSB7CisJCWlmICggbWVtY21wKGFTaGEsIG9TaGEsIDIwKSAhPSAwICYmIG1lbWNtcChiU2hhLCBv U2hhLCAyMCkgIT0gMCApCisJCQlyZXN1bHQubWVyZ2UgPSAxOworCisJCXJlc3VsdC5tb2RlID0g YU1vZGUgPT0gb01vZGUgPyBiTW9kZTogYU1vZGU7CisKKwkJaWYgKCBtZW1jbXAoYVNoYSwgb1No YSwgMjApID09IDAgKQorCQkJbWVtY3B5KHJlc3VsdC5zaGEsIGJTaGEsIDIwKTsKKwkJZWxzZSBp ZiAoIG1lbWNtcChiU2hhLCBvU2hhLCAyMCkgPT0gMCApCisJCQltZW1jcHkocmVzdWx0LnNoYSwg YVNoYSwgMjApOworCQllbHNlIGlmICggU19JU1JFRyhhTW9kZSkgKSB7CisKKwkJCWludCBjb2Rl ID0gMTsKKwkJCWNoYXIgb3JpZ1tQQVRIX01BWF07CisJCQljaGFyIHNyYzFbUEFUSF9NQVhdOwor CQkJY2hhciBzcmMyW1BBVEhfTUFYXTsKKworCQkJZ2l0X3VucGFja19maWxlKG9TaGEsIG9yaWcp OworCQkJZ2l0X3VucGFja19maWxlKGFTaGEsIHNyYzEpOworCQkJZ2l0X3VucGFja19maWxlKGJT aGEsIHNyYzIpOworCisJCQljb25zdCBjaGFyICphcmd2W10gPSB7CisJCQkJIm1lcmdlIiwgIi1M IiwgTlVMTCwgIi1MIiwgTlVMTCwgIi1MIiwgTlVMTCwKKwkJCQlzcmMxLCBvcmlnLCBzcmMyLAor CQkJCU5VTEwKKwkJCX07CisJCQljaGFyICpsYSwgKmxiLCAqbG87CisJCQlhcmd2WzJdID0gbGEg PSBtYWxsb2Moc3RybGVuKGJyYW5jaDFOYW1lKSArIDIgKyBzdHJsZW4oYVBhdGgpKTsKKwkJCXN0 cmNhdChzdHJjYXQoc3RyY3B5KGxhLCBicmFuY2gxTmFtZSksICIvIiksIGFQYXRoKTsKKwkJCWFy Z3ZbNl0gPSBsYiA9IG1hbGxvYyhzdHJsZW4oYnJhbmNoMk5hbWUpICsgMiArIHN0cmxlbihiUGF0 aCkpOworCQkJc3RyY2F0KHN0cmNhdChzdHJjcHkobGIsIGJyYW5jaDJOYW1lKSwgIi8iKSwgYlBh dGgpOworCQkJYXJndls0XSA9IGxvID0gbWFsbG9jKDcgKyBzdHJsZW4ob1BhdGgpKTsKKwkJCXN0 cmNhdChzdHJjcHkobG8sICJvcmlnLyIpLCBvUGF0aCk7CisKKyNpZiAwCisJCQlwcmludGYoIiVz ICVzICVzICVzICVzICVzICVzICVzICVzICVzXG4iLAorCQkJICAgICAgIGFyZ3ZbMF0sIGFyZ3Zb MV0sIGFyZ3ZbMl0sIGFyZ3ZbM10sIGFyZ3ZbNF0sCisJCQkgICAgICAgYXJndls1XSwgYXJndls2 XSwgYXJndls3XSwgYXJndls4XSwgYXJndls5XSk7CisjZW5kaWYKKwkJCWNvZGUgPSBydW5fY29t bWFuZF92KDEwLCBhcmd2KTsKKworCQkJZnJlZShsYSk7CisJCQlmcmVlKGxiKTsKKwkJCWZyZWUo bG8pOworCQkJaWYgKCBjb2RlICYmIGNvZGUgPCAtMjU2ICkgeworCQkJCWRpZSgiRmFpbGVkIHRv IGV4ZWN1dGUgJ21lcmdlJy4gbWVyZ2UoMSkgaXMgdXNlZCBhcyB0aGUgIgorCQkJCSAgICAiZmls ZS1sZXZlbCBtZXJnZSB0b29sLiBJcyAnbWVyZ2UnIGluIHlvdXIgcGF0aD8iKTsKKwkJCX0KKwkJ CWNoYXIgY21kW1BBVEhfTUFYXTsKKwkJCXNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICJnaXQt aGFzaC1vYmplY3QgLXQgYmxvYiAtdyAlcyIsIHNyYzEpOworCQkJRklMRSAqZnAgPSBwb3Blbihj bWQsICJyIik7CisJCQlpZiAoICFmcCApCisJCQkJZGllKCJjYW5ub3QgcnVuIGdpdC1oYXNoLW9i amVjdDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJaW50IGNoOworCQkJaWYgKCBmZ2V0X3No YTEocmVzdWx0LnNoYSwgZnAsICZjaCkgKQorCQkJCWRpZSgiaW52YWxpZCBvdXRwdXQgZnJvbSBn aXQtaGFzaC1vYmplY3QiKTsKKwkJCXBjbG9zZShmcCk7CisKKwkJCXVubGluayhvcmlnKTsKKwkJ CXVubGluayhzcmMxKTsKKwkJCXVubGluayhzcmMyKTsKKworCQkJcmVzdWx0LmNsZWFuID0gV0VY SVRTVEFUVVMoY29kZSkgPT0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICggIShTX0lTTE5LKGFNb2Rl KSB8fCBTX0lTTE5LKGJNb2RlKSkgKQorCQkJCWRpZSgiY2Fubm90IG1lcmdlIG1vZGVzPyIpOwor CisJCQltZW1jcHkocmVzdWx0LnNoYSwgYVNoYSwgMjApOworCisJCQlpZiAoIG1lbWNtcChhU2hh LCBiU2hhLCAyMCkgIT0gMCApCisJCQkJcmVzdWx0LmNsZWFuID0gMDsKKwkJfQorCX0KKworCXJl dHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lbXN3cCh2b2lkICpwMSwgdm9pZCAqcDIs IHVuc2lnbmVkIG4pCit7CisJdW5zaWduZWQgY2hhciAqYSA9IHAxLCAqYiA9IHAyOworCXdoaWxl ICggbi0tICkgeworCQkqYSBePSAqYjsKKwkJKmIgXj0gKmE7CisJCSphIF49ICpiOworCQkrK2E7 CisJCSsrYjsKKwl9Cit9CisKK2ludCBwcm9jZXNzUmVuYW1lcyhzdHJ1Y3QgcmVuYW1lX2VudHJ5 ICpyZW5hbWVzQSwKKwkJICAgc3RydWN0IHJlbmFtZV9lbnRyeSAqcmVuYW1lc0IsCisJCSAgIGNv bnN0IGNoYXIgKmJyYW5jaE5hbWVBLAorCQkgICBjb25zdCBjaGFyICpicmFuY2hOYW1lQikKK3sK KwlpbnQgY2xlYW5NZXJnZSA9IDE7CisJLy8gICAgcHJpbnRmKCJwcm9jZXNzIHJlbmFtZXMgJXM6 JXMgLT4gJXM6JXNcbiIsCisJLy8JICAgYnJhbmNoTmFtZUEsIHJlbmFtZXNBID8gcmVuYW1lc0Et PnNyYzogIihub25lKSIsCisJLy8JICAgYnJhbmNoTmFtZUIsIHJlbmFtZXNCID8gcmVuYW1lc0It PmRzdDogIihub25lKSIpOworCisJc3RydWN0IHBhdGhfbGlzdCAqc3JjTmFtZXMgPSBOVUxMOwor CWNvbnN0IHN0cnVjdCByZW5hbWVfZW50cnkgKnNyZTsKKworCWZvciAoc3JlID0gcmVuYW1lc0E7 IHNyZTsgc3JlID0gc3JlLT5uZXh0KQorCQlpZiAoIXBhdGhfbGlzdF9oYXNfcGF0aChzcmNOYW1l cywgc3JlLT5zcmMpKQorCQkJcGF0aF9saXN0X2luc2VydChzcmUtPnNyYywgJnNyY05hbWVzKTsK Kwlmb3IgKHNyZSA9IHJlbmFtZXNCOyBzcmU7IHNyZSA9IHNyZS0+bmV4dCkKKwkJaWYgKCFwYXRo X2xpc3RfaGFzX3BhdGgoc3JjTmFtZXMsIHNyZS0+c3JjKSkKKwkJCXBhdGhfbGlzdF9pbnNlcnQo c3JlLT5zcmMsICZzcmNOYW1lcyk7CisKKwlGSUxFICpmcCA9IGdpdF91cGRhdGVfaW5kZXhfcGlw ZSgpOworCXN0cnVjdCBwYXRoX2xpc3QgKnNyYzsKKwlmb3JfZWFjaF9wYXRoKHNyYyxzcmNOYW1l cykgeworCQlzdHJ1Y3QgcmVuYW1lX2VudHJ5ICpyZW5hbWVzMSwgKnJlbmFtZXMyLCAqcmVuMSwg KnJlbjI7CisJCWNvbnN0IGNoYXIgKmJyYW5jaE5hbWUxLCAqYnJhbmNoTmFtZTI7CisJCXJlbjEg PSBmaW5kX3JlbmFtZV9ieXNyYyhyZW5hbWVzQSwgc3JjLT5wYXRoKTsKKwkJcmVuMiA9IGZpbmRf cmVuYW1lX2J5c3JjKHJlbmFtZXNCLCBzcmMtPnBhdGgpOworCQlpZiAoIHJlbjEgKSB7CisJCQly ZW5hbWVzMSA9IHJlbmFtZXNBOworCQkJcmVuYW1lczIgPSByZW5hbWVzQjsKKwkJCWJyYW5jaE5h bWUxID0gYnJhbmNoTmFtZUE7CisJCQlicmFuY2hOYW1lMiA9IGJyYW5jaE5hbWVCOworCQl9IGVs c2UgeworCQkJcmVuYW1lczEgPSByZW5hbWVzQjsKKwkJCXJlbmFtZXMyID0gcmVuYW1lc0E7CisJ CQlicmFuY2hOYW1lMSA9IGJyYW5jaE5hbWVCOworCQkJYnJhbmNoTmFtZTIgPSBicmFuY2hOYW1l QTsKKwkJCXN0cnVjdCByZW5hbWVfZW50cnkgKnRtcCA9IHJlbjI7CisJCQlyZW4yID0gcmVuMTsK KwkJCXJlbjEgPSB0bXA7CisJCX0KKworCQlyZW4xLT5kc3RfZW50cnktPnByb2Nlc3NlZCA9IDE7 CisJCXJlbjEtPnNyY19lbnRyeS0+cHJvY2Vzc2VkID0gMTsKKworCQlpZiAoIHJlbjEtPnByb2Nl c3NlZCApCisJCQljb250aW51ZTsKKwkJcmVuMS0+cHJvY2Vzc2VkID0gMTsKKworCQlpZiAoIHJl bjIgKSB7CisJCQkvLyBSZW5hbWVkIGluIDEgYW5kIHJlbmFtZWQgaW4gMgorCQkJaWYgKCBzdHJj bXAocmVuMS0+c3JjLCByZW4yLT5zcmMpICE9IDAgKQorCQkJCWRpZSgicmVuMS5zcmNOYW1lICE9 IHJlbjIuc3JjTmFtZSIpOworCQkJcmVuMi0+ZHN0X2VudHJ5LT5wcm9jZXNzZWQgPSAxOworCQkJ cmVuMi0+cHJvY2Vzc2VkID0gMTsKKwkJCWlmICggc3RyY21wKHJlbjEtPmRzdCwgcmVuMi0+ZHN0 KSAhPSAwICkgeworCQkJCW91dHB1dCgiQ09ORkxJQ1QgKHJlbmFtZS9yZW5hbWUpOiAiCisJCQkJ ICAgICAgICJSZW5hbWUgJXMtPiVzIGluIGJyYW5jaCAlcyAiCisJCQkJICAgICAgICJyZW5hbWUg JXMtPiVzIGluICVzIiwKKwkJCQkgICAgICAgc3JjLT5wYXRoLCByZW4xLT5kc3QsIGJyYW5jaE5h bWUxLAorCQkJCSAgICAgICBzcmMtPnBhdGgsIHJlbjItPmRzdCwgYnJhbmNoTmFtZTIpOworCQkJ CWNsZWFuTWVyZ2UgPSAwOworCQkJCWNoYXIgKmRzdE5hbWUxID0gcmVuMS0+ZHN0LCAqZHN0TmFt ZTIgPSByZW4yLT5kc3Q7CisJCQkJaWYgKCBwYXRoX2xpc3RfaGFzX3BhdGgoY3VycmVudERpcmVj dG9yeVNldCwgcmVuMS0+ZHN0KSApIHsKKwkJCQkJZHN0TmFtZTEgPSB1bmlxdWVQYXRoKHJlbjEt PmRzdCwgYnJhbmNoTmFtZTEpOworCQkJCQlvdXRwdXQoIiVzIGlzIGEgZGlyZWN0b3J5IGluICVz IGFkZGluZyBhcyAlcyBpbnN0ZWFkIiwKKwkJCQkJICAgICAgIHJlbjEtPmRzdCwgYnJhbmNoTmFt ZTIsIGRzdE5hbWUxKTsKKwkJCQkJcmVtb3ZlRmlsZShmcCwgMCwgcmVuMS0+ZHN0KTsKKwkJCQl9 CisJCQkJaWYgKCBwYXRoX2xpc3RfaGFzX3BhdGgoY3VycmVudERpcmVjdG9yeVNldCwgcmVuMi0+ ZHN0KSApIHsKKwkJCQkJZHN0TmFtZTIgPSB1bmlxdWVQYXRoKHJlbjItPmRzdCwgYnJhbmNoTmFt ZTIpOworCQkJCQlvdXRwdXQoIiVzIGlzIGEgZGlyZWN0b3J5IGluICVzIGFkZGluZyBhcyAlcyBp bnN0ZWFkIiwKKwkJCQkJICAgICAgIHJlbjItPmRzdCwgYnJhbmNoTmFtZTEsIGRzdE5hbWUyKTsK KwkJCQkJcmVtb3ZlRmlsZShmcCwgMCwgcmVuMi0+ZHN0KTsKKwkJCQl9CisJCQkJc2V0SW5kZXhT dGFnZXMoZnAsIGRzdE5hbWUxLAorCQkJCQkgICAgICAgTlVMTCwgMCwKKwkJCQkJICAgICAgIHJl bjEtPmRzdF9zaGEsIHJlbjEtPmRzdF9tb2RlLAorCQkJCQkgICAgICAgTlVMTCwgMCwKKwkJCQkJ ICAgICAgIDEgLyogY2xlYXIgKi8pOworCQkJCXNldEluZGV4U3RhZ2VzKGZwLCBkc3ROYW1lMiwK KwkJCQkJICAgICAgIE5VTEwsIDAsCisJCQkJCSAgICAgICBOVUxMLCAwLAorCQkJCQkgICAgICAg cmVuMi0+ZHN0X3NoYSwgcmVuMi0+ZHN0X21vZGUsCisJCQkJCSAgICAgICAxIC8qIGNsZWFyICov KTsKKwkJCX0gZWxzZSB7CisJCQkJcmVtb3ZlRmlsZShmcCwgMSwgcmVuMS0+c3JjKTsKKwkJCQlz dHJ1Y3QgbWVyZ2VfZmlsZV9pbmZvIG1maTsKKwkJCQltZmkgPSBtZXJnZUZpbGUocmVuMS0+c3Jj LCByZW4xLT5zcmNfc2hhLCByZW4xLT5zcmNfbW9kZSwKKwkJCQkJCXJlbjEtPmRzdCwgcmVuMS0+ ZHN0X3NoYSwgcmVuMS0+ZHN0X21vZGUsCisJCQkJCQlyZW4yLT5kc3QsIHJlbjItPmRzdF9zaGEs IHJlbjItPmRzdF9tb2RlLAorCQkJCQkJYnJhbmNoTmFtZTEsIGJyYW5jaE5hbWUyKTsKKwkJCQlp ZiAoIG1maS5tZXJnZSB8fCAhbWZpLmNsZWFuICkKKwkJCQkJb3V0cHV0KCJSZW5hbWluZyAlcy0+ JXMiLCBzcmMtPnBhdGgsIHJlbjEtPmRzdCk7CisKKwkJCQlpZiAoIG1maS5tZXJnZSApCisJCQkJ CW91dHB1dCgiQXV0by1tZXJnaW5nICVzIiwgcmVuMS0+ZHN0KTsKKworCQkJCWlmICggIW1maS5j bGVhbiApIHsKKwkJCQkJb3V0cHV0KCJDT05GTElDVCAoY29udGVudCk6IG1lcmdlIGNvbmZsaWN0 IGluICVzIiwKKwkJCQkJICAgICAgIHJlbjEtPmRzdCk7CisJCQkJCWNsZWFuTWVyZ2UgPSAwOwor CisJCQkJCWlmICggIWluZGV4X29ubHkgKQorCQkJCQkJc2V0SW5kZXhTdGFnZXMoZnAsCisJCQkJ CQkJICAgICAgIHJlbjEtPmRzdCwKKwkJCQkJCQkgICAgICAgcmVuMS0+c3JjX3NoYSwgcmVuMS0+ c3JjX21vZGUsCisJCQkJCQkJICAgICAgIHJlbjEtPmRzdF9zaGEsIHJlbjEtPmRzdF9tb2RlLAor CQkJCQkJCSAgICAgICByZW4yLT5kc3Rfc2hhLCByZW4yLT5kc3RfbW9kZSwKKwkJCQkJCQkgICAg ICAgMSAvKiBjbGVhciAqLyk7CisJCQkJfQorCQkJCXVwZGF0ZUZpbGUoZnAsIG1maS5jbGVhbiwg bWZpLnNoYSwgbWZpLm1vZGUsIHJlbjEtPmRzdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBS ZW5hbWVkIGluIDEsIG1heWJlIGNoYW5nZWQgaW4gMgorCQkJcmVtb3ZlRmlsZShmcCwgMSwgcmVu MS0+c3JjKTsKKworCQkJdW5zaWduZWQgY2hhciBzcmNTaGFPdGhlckJyYW5jaFsyMF0sIGRzdFNo YU90aGVyQnJhbmNoWzIwXTsKKwkJCXVuc2lnbmVkIHNyY01vZGVPdGhlckJyYW5jaCwgZHN0TW9k ZU90aGVyQnJhbmNoOworCisJCQlpbnQgc3RhZ2UgPSByZW5hbWVzQSA9PSByZW5hbWVzMSA/IDM6 IDI7CisKKwkJCW1lbWNweShzcmNTaGFPdGhlckJyYW5jaCwgcmVuMS0+c3JjX2VudHJ5LT5zdGFn ZXNbc3RhZ2VdLnNoYSwgMjApOworCQkJc3JjTW9kZU90aGVyQnJhbmNoID0gcmVuMS0+c3JjX2Vu dHJ5LT5zdGFnZXNbc3RhZ2VdLm1vZGU7CisKKwkJCW1lbWNweShkc3RTaGFPdGhlckJyYW5jaCwg cmVuMS0+ZHN0X2VudHJ5LT5zdGFnZXNbc3RhZ2VdLnNoYSwgMjApOworCQkJZHN0TW9kZU90aGVy QnJhbmNoID0gcmVuMS0+ZHN0X2VudHJ5LT5zdGFnZXNbc3RhZ2VdLm1vZGU7CisKKwkJCWludCB0 cnlNZXJnZSA9IDA7CisJCQljaGFyICpuZXdQYXRoOworCQkJc3RydWN0IHJlbmFtZV9lbnRyeSAq ZHN0MjsKKworCQkJaWYgKCBwYXRoX2xpc3RfaGFzX3BhdGgoY3VycmVudERpcmVjdG9yeVNldCwg cmVuMS0+ZHN0KSApIHsKKwkJCQluZXdQYXRoID0gdW5pcXVlUGF0aChyZW4xLT5kc3QsIGJyYW5j aE5hbWUxKTsKKwkJCQlvdXRwdXQoIkNPTkZMSUNUIChyZW5hbWUvZGlyZWN0b3J5KTogUmVuYW1l ICVzLT4lcyBpbiAlcyAiCisJCQkJICAgICAgICIgZGlyZWN0b3J5ICVzIGFkZGVkIGluICVzIiwK KwkJCQkgICAgICAgcmVuMS0+c3JjLCByZW4xLT5kc3QsIGJyYW5jaE5hbWUxLAorCQkJCSAgICAg ICByZW4xLT5kc3QsIGJyYW5jaE5hbWUyKTsKKwkJCQlvdXRwdXQoIlJlbmFtaW5nICVzIHRvICVz IGluc3RlYWQiLCByZW4xLT5zcmMsIG5ld1BhdGgpOworCQkJCWNsZWFuTWVyZ2UgPSAwOworCQkJ CXJlbW92ZUZpbGUoZnAsIDAsIHJlbjEtPmRzdCk7CisJCQkJdXBkYXRlRmlsZShmcCwgMCwgcmVu MS0+ZHN0X3NoYSwgcmVuMS0+ZHN0X21vZGUsIG5ld1BhdGgpOworCQkJfSBlbHNlIGlmICggbWVt Y21wKHNyY1NoYU90aGVyQnJhbmNoLCBudWxsX3NoYTEsIDIwKSA9PSAwICkgeworCQkJCW91dHB1 dCgiQ09ORkxJQ1QgKHJlbmFtZS9kZWxldGUpOiBSZW5hbWUgJXMtPiVzIGluICVzICIKKwkJCQkg ICAgICAgImFuZCBkZWxldGVkIGluICVzIiwKKwkJCQkgICAgICAgcmVuMS0+c3JjLCByZW4xLT5k c3QsIGJyYW5jaE5hbWUxLAorCQkJCSAgICAgICBicmFuY2hOYW1lMik7CisJCQkJY2xlYW5NZXJn ZSA9IDA7CisJCQkJdXBkYXRlRmlsZShmcCwgMCwgcmVuMS0+ZHN0X3NoYSwgcmVuMS0+ZHN0X21v ZGUsIHJlbjEtPmRzdCk7CisJCQl9IGVsc2UgaWYgKCBtZW1jbXAoZHN0U2hhT3RoZXJCcmFuY2gs IG51bGxfc2hhMSwgMjApICE9IDAgKSB7CisJCQkJbmV3UGF0aCA9IHVuaXF1ZVBhdGgocmVuMS0+ ZHN0LCBicmFuY2hOYW1lMik7CisJCQkJb3V0cHV0KCJDT05GTElDVCAocmVuYW1lL2FkZCk6IFJl bmFtZSAlcy0+JXMgaW4gJXMuICIKKwkJCQkgICAgICAgIiVzIGFkZGVkIGluICVzIiwKKwkJCQkg ICAgICAgcmVuMS0+c3JjLCByZW4xLT5kc3QsIGJyYW5jaE5hbWUxLAorCQkJCSAgICAgICByZW4x LT5kc3QsIGJyYW5jaE5hbWUyKTsKKwkJCQlvdXRwdXQoIkFkZGluZyBhcyAlcyBpbnN0ZWFkIiwg bmV3UGF0aCk7CisJCQkJdXBkYXRlRmlsZShmcCwgMCwgZHN0U2hhT3RoZXJCcmFuY2gsIGRzdE1v ZGVPdGhlckJyYW5jaCwgbmV3UGF0aCk7CisJCQkJY2xlYW5NZXJnZSA9IDA7CisJCQkJdHJ5TWVy Z2UgPSAxOworCQkJfSBlbHNlIGlmICggKGRzdDIgPSBmaW5kX3JlbmFtZV9ieWRzdChyZW5hbWVz MiwgcmVuMS0+ZHN0KSkgKSB7CisJCQkJY2hhciAqbmV3UGF0aDEgPSB1bmlxdWVQYXRoKHJlbjEt PmRzdCwgYnJhbmNoTmFtZTEpOworCQkJCWNoYXIgKm5ld1BhdGgyID0gdW5pcXVlUGF0aChkc3Qy LT5kc3QsIGJyYW5jaE5hbWUyKTsKKwkJCQlvdXRwdXQoIkNPTkZMSUNUIChyZW5hbWUvcmVuYW1l KTogUmVuYW1lICVzLT4lcyBpbiAlcy4gIgorCQkJCSAgICAgICAiUmVuYW1lICVzLT4lcyBpbiAl cyIsCisJCQkJICAgICAgIHJlbjEtPnNyYywgcmVuMS0+ZHN0LCBicmFuY2hOYW1lMSwKKwkJCQkg ICAgICAgZHN0Mi0+c3JjLCBkc3QyLT5kc3QsIGJyYW5jaE5hbWUyKTsKKwkJCQlvdXRwdXQoIlJl bmFtaW5nICVzIHRvICVzIGFuZCAlcyB0byAlcyBpbnN0ZWFkIiwKKwkJCQkgICAgICAgcmVuMS0+ c3JjLCBuZXdQYXRoMSwgZHN0Mi0+c3JjLCBuZXdQYXRoMik7CisJCQkJcmVtb3ZlRmlsZShmcCwg MCwgcmVuMS0+ZHN0KTsKKwkJCQl1cGRhdGVGaWxlKGZwLCAwLCByZW4xLT5kc3Rfc2hhLCByZW4x LT5kc3RfbW9kZSwgbmV3UGF0aDEpOworCQkJCXVwZGF0ZUZpbGUoZnAsIDAsIGRzdDItPmRzdF9z aGEsIGRzdDItPmRzdF9tb2RlLCBuZXdQYXRoMik7CisJCQkJZHN0Mi0+cHJvY2Vzc2VkID0gMTsK KwkJCQljbGVhbk1lcmdlID0gMDsKKwkJCX0gZWxzZQorCQkJCXRyeU1lcmdlID0gMTsKKworCQkJ aWYgKCB0cnlNZXJnZSApIHsKKwkJCQljaGFyICpvbmFtZSA9IHJlbjEtPnNyYzsKKwkJCQljaGFy ICphbmFtZSA9IHJlbjEtPmRzdDsKKwkJCQljaGFyICpibmFtZSA9IHJlbjEtPnNyYzsKKwkJCQl1 bnNpZ25lZCBjaGFyIG9zaGFbMjBdLCBhc2hhWzIwXSwgYnNoYVsyMF07CisJCQkJdW5zaWduZWQg b21vZGUgPSByZW4xLT5zcmNfbW9kZTsKKwkJCQl1bnNpZ25lZCBhbW9kZSA9IHJlbjEtPmRzdF9t b2RlOworCQkJCXVuc2lnbmVkIGJtb2RlID0gc3JjTW9kZU90aGVyQnJhbmNoOworCQkJCW1lbWNw eShvc2hhLCByZW4xLT5zcmNfc2hhLCAyMCk7CisJCQkJbWVtY3B5KGFzaGEsIHJlbjEtPmRzdF9z aGEsIDIwKTsKKwkJCQltZW1jcHkoYnNoYSwgc3JjU2hhT3RoZXJCcmFuY2gsIDIwKTsKKwkJCQlj b25zdCBjaGFyICphQnJhbmNoID0gYnJhbmNoTmFtZTE7CisJCQkJY29uc3QgY2hhciAqYkJyYW5j aCA9IGJyYW5jaE5hbWUyOworCisJCQkJaWYgKCByZW5hbWVzQSAhPSByZW5hbWVzMSApIHsKKwkJ CQkJbWVtc3dwKCZhbmFtZSwgJmJuYW1lLCBzaXplb2YoYW5hbWUpKTsKKwkJCQkJbWVtc3dwKGFz aGEsIGJzaGEsIDIwKTsKKwkJCQkJbWVtc3dwKCZhQnJhbmNoLCAmYkJyYW5jaCwgc2l6ZW9mKGFC cmFuY2gpKTsKKwkJCQl9CisJCQkJc3RydWN0IG1lcmdlX2ZpbGVfaW5mbyBtZmk7CisJCQkJbWZp ID0gbWVyZ2VGaWxlKG9uYW1lLCBvc2hhLCBvbW9kZSwKKwkJCQkJCWFuYW1lLCBhc2hhLCBhbW9k ZSwKKwkJCQkJCWJuYW1lLCBic2hhLCBibW9kZSwKKwkJCQkJCWFCcmFuY2gsIGJCcmFuY2gpOwor CisJCQkJaWYgKCBtZmkubWVyZ2UgfHwgIW1maS5jbGVhbiApCisJCQkJCW91dHB1dCgiUmVuYW1p bmcgJXMgPT4gJXMiLCByZW4xLT5zcmMsIHJlbjEtPmRzdCk7CisJCQkJaWYgKCBtZmkubWVyZ2Ug KQorCQkJCQlvdXRwdXQoIkF1dG8tbWVyZ2luZyAlcyIsIHJlbjEtPmRzdCk7CisJCQkJaWYgKCAh bWZpLmNsZWFuICkgeworCQkJCQlvdXRwdXQoIkNPTkZMSUNUIChyZW5hbWUvbW9kaWZ5KTogTWVy Z2UgY29uZmxpY3QgaW4gJXMiLAorCQkJCQkgICAgICAgcmVuMS0+ZHN0KTsKKwkJCQkJY2xlYW5N ZXJnZSA9IDA7CisKKwkJCQkJaWYgKCAhaW5kZXhfb25seSApCisJCQkJCQlzZXRJbmRleFN0YWdl cyhmcCwKKwkJCQkJCQkgICAgICAgcmVuMS0+ZHN0LAorCQkJCQkJCSAgICAgICBvc2hhLCBvbW9k ZSwKKwkJCQkJCQkgICAgICAgYXNoYSwgYW1vZGUsCisJCQkJCQkJICAgICAgIGJzaGEsIGJtb2Rl LAorCQkJCQkJCSAgICAgICAxIC8qIGNsZWFyICovKTsKKwkJCQl9CisJCQkJdXBkYXRlRmlsZShm cCwgbWZpLmNsZWFuLCBtZmkuc2hhLCBtZmkubW9kZSwgcmVuMS0+ZHN0KTsKKwkJCX0KKwkJfQor CX0KKwlwYXRoX2xpc3RfY2xlYXIoJnNyY05hbWVzLCAwKTsKKwlpZiAocGNsb3NlKGZwKSkgewor CQlkaWUoImdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvIGZhaWxlZCIpOworCX0KKwlyZXR1 cm4gY2xlYW5NZXJnZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmhhc19zaGEoY29uc3Qg dW5zaWduZWQgY2hhciAqc2hhKQoreworCXJldHVybiBtZW1jbXAoc2hhLCBudWxsX3NoYTEsIDIw KSA9PSAwID8gTlVMTDogKHVuc2lnbmVkIGNoYXIgKilzaGE7Cit9CisKK3N0YXRpYyBpbnQgc2hh X2VxKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIpCit7CisJ aWYgKCAhYSAmJiAhYiApCisJCXJldHVybiAyOworCXJldHVybiBhICYmIGIgJiYgbWVtY21wKGEs IGIsIDIwKSA9PSAwOworfQorCisvLyBQZXIgZW50cnkgbWVyZ2UgZnVuY3Rpb24KKy8vIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVyZ2Ugb25lIGNhY2hlIGVudHJ5LgoraW50IHByb2Nl c3NFbnRyeShzdHJ1Y3QgaW5kZXhfZW50cnkgKmVudHJ5LAorCQkgY29uc3QgY2hhciAqYnJhbmNo MU5hbWUsCisJCSBjb25zdCBjaGFyICpicmFuY2gyTmFtZSkKK3sKKwkvLyAgICBwcmludGYoInBy b2Nlc3NpbmcgZW50cnksIGNsZWFuIGNhY2hlOiAlc1xuIiwgaW5kZXhfb25seSA/ICJ5ZXMiOiAi bm8iKTsKKwkvLyAgICBwcmludF9pbmRleF9lbnRyeSgiXHRwYXRoOiAiLCBlbnRyeSk7CisJaW50 IGNsZWFuTWVyZ2UgPSAxOworCWNvbnN0IGNoYXIgKnBhdGggPSBlbnRyeS0+cGF0aDsKKwl1bnNp Z25lZCBjaGFyICpvU2hhID0gaGFzX3NoYShlbnRyeS0+c3RhZ2VzWzFdLnNoYSk7CisJdW5zaWdu ZWQgY2hhciAqYVNoYSA9IGhhc19zaGEoZW50cnktPnN0YWdlc1syXS5zaGEpOworCXVuc2lnbmVk IGNoYXIgKmJTaGEgPSBoYXNfc2hhKGVudHJ5LT5zdGFnZXNbM10uc2hhKTsKKwl1bnNpZ25lZCBv TW9kZSA9IGVudHJ5LT5zdGFnZXNbMV0ubW9kZTsKKwl1bnNpZ25lZCBhTW9kZSA9IGVudHJ5LT5z dGFnZXNbMl0ubW9kZTsKKwl1bnNpZ25lZCBiTW9kZSA9IGVudHJ5LT5zdGFnZXNbM10ubW9kZTsK KwlGSUxFICpmcCA9IGdpdF91cGRhdGVfaW5kZXhfcGlwZSgpOworCisJaWYgKCBvU2hhICYmICgh YVNoYSB8fCAhYlNoYSkgKSB7CisJCS8vCisJCS8vIENhc2UgQTogRGVsZXRlZCBpbiBvbmUKKwkJ Ly8KKwkJaWYgKCAoIWFTaGEgJiYgIWJTaGEpIHx8CisJCSAgICAgKHNoYV9lcShhU2hhLCBvU2hh KSAmJiAhYlNoYSkgfHwKKwkJICAgICAoIWFTaGEgJiYgc2hhX2VxKGJTaGEsIG9TaGEpKSApIHsK KwkJCS8vIERlbGV0ZWQgaW4gYm90aCBvciBkZWxldGVkIGluIG9uZSBhbmQgdW5jaGFuZ2VkIGlu IHRoZSBvdGhlcgorCQkJaWYgKCBhU2hhICkKKwkJCQlvdXRwdXQoIlJlbW92aW5nICVzIiwgcGF0 aCk7CisJCQlyZW1vdmVGaWxlKGZwLCAxLCBwYXRoKTsKKwkJfSBlbHNlIHsKKwkJCS8vIERlbGV0 ZWQgaW4gb25lIGFuZCBjaGFuZ2VkIGluIHRoZSBvdGhlcgorCQkJY2xlYW5NZXJnZSA9IDA7CisJ CQlpZiAoICFhU2hhICkgeworCQkJCW91dHB1dCgiQ09ORkxJQ1QgKGRlbGV0ZS9tb2RpZnkpOiAl cyBkZWxldGVkIGluICVzICIKKwkJCQkgICAgICAgImFuZCBtb2RpZmllZCBpbiAlcy4gVmVyc2lv biAlcyBvZiAlcyBsZWZ0IGluIHRyZWUuIiwKKwkJCQkgICAgICAgcGF0aCwgYnJhbmNoMU5hbWUs CisJCQkJICAgICAgIGJyYW5jaDJOYW1lLCBicmFuY2gyTmFtZSwgcGF0aCk7CisJCQkJdXBkYXRl RmlsZShmcCwgMCwgYlNoYSwgYk1vZGUsIHBhdGgpOworCQkJfSBlbHNlIHsKKwkJCQlvdXRwdXQo IkNPTkZMSUNUIChkZWxldGUvbW9kaWZ5KTogJXMgZGVsZXRlZCBpbiAlcyAiCisJCQkJICAgICAg ICJhbmQgbW9kaWZpZWQgaW4gJXMuIFZlcnNpb24gJXMgb2YgJXMgbGVmdCBpbiB0cmVlLiIsCisJ CQkJICAgICAgIHBhdGgsIGJyYW5jaDJOYW1lLAorCQkJCSAgICAgICBicmFuY2gxTmFtZSwgYnJh bmNoMU5hbWUsIHBhdGgpOworCQkJCXVwZGF0ZUZpbGUoZnAsIDAsIGFTaGEsIGFNb2RlLCBwYXRo KTsKKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmICggKCFvU2hhICYmIGFTaGEgJiYgIWJTaGEpIHx8 CisJCSAgICAoIW9TaGEgJiYgIWFTaGEgJiYgYlNoYSkgKSB7CisJCS8vCisJCS8vIENhc2UgQjog QWRkZWQgaW4gb25lLgorCQkvLworCQljb25zdCBjaGFyICphZGRCcmFuY2g7CisJCWNvbnN0IGNo YXIgKm90aGVyQnJhbmNoOworCQl1bnNpZ25lZCBtb2RlOworCQljb25zdCB1bnNpZ25lZCBjaGFy ICpzaGE7CisJCWNvbnN0IGNoYXIgKmNvbmY7CisKKwkJaWYgKCBhU2hhICkgeworCQkJYWRkQnJh bmNoID0gYnJhbmNoMU5hbWU7CisJCQlvdGhlckJyYW5jaCA9IGJyYW5jaDJOYW1lOworCQkJbW9k ZSA9IGFNb2RlOworCQkJc2hhID0gYVNoYTsKKwkJCWNvbmYgPSAiZmlsZS9kaXJlY3RvcnkiOwor CQl9IGVsc2UgeworCQkJYWRkQnJhbmNoID0gYnJhbmNoMk5hbWU7CisJCQlvdGhlckJyYW5jaCA9 IGJyYW5jaDFOYW1lOworCQkJbW9kZSA9IGJNb2RlOworCQkJc2hhID0gYlNoYTsKKwkJCWNvbmYg PSAiZGlyZWN0b3J5L2ZpbGUiOworCQl9CisJCWlmICggcGF0aF9saXN0X2hhc19wYXRoKGN1cnJl bnREaXJlY3RvcnlTZXQsIHBhdGgpICkgeworCQkJY2xlYW5NZXJnZSA9IDA7CisJCQljb25zdCBj aGFyICpuZXdQYXRoID0gdW5pcXVlUGF0aChwYXRoLCBhZGRCcmFuY2gpOworCQkJb3V0cHV0KCJD T05GTElDVCAoJXMpOiBUaGVyZSBpcyBhIGRpcmVjdG9yeSB3aXRoIG5hbWUgJXMgaW4gJXMuICIK KwkJCSAgICAgICAiQWRkaW5nICVzIGFzICVzIiwKKwkJCSAgICAgICBjb25mLCBwYXRoLCBvdGhl ckJyYW5jaCwgcGF0aCwgbmV3UGF0aCk7CisJCQlyZW1vdmVGaWxlKGZwLCAwLCBwYXRoKTsKKwkJ CXVwZGF0ZUZpbGUoZnAsIDAsIHNoYSwgbW9kZSwgbmV3UGF0aCk7CisJCX0gZWxzZSB7CisJCQlv dXRwdXQoIkFkZGluZyAlcyIsIHBhdGgpOworCQkJdXBkYXRlRmlsZShmcCwgMSwgc2hhLCBtb2Rl LCBwYXRoKTsKKwkJfQorCX0gZWxzZSBpZiAoICFvU2hhICYmIGFTaGEgJiYgYlNoYSApIHsKKwkJ Ly8KKwkJLy8gQ2FzZSBDOiBBZGRlZCBpbiBib3RoIChjaGVjayBmb3Igc2FtZSBwZXJtaXNzaW9u cykuCisJCS8vCisJCWlmICggc2hhX2VxKGFTaGEsIGJTaGEpICkgeworCQkJaWYgKCBhTW9kZSAh PSBiTW9kZSApIHsKKwkJCQljbGVhbk1lcmdlID0gMDsKKwkJCQlvdXRwdXQoIkNPTkZMSUNUOiBG aWxlICVzIGFkZGVkIGlkZW50aWNhbGx5IGluIGJvdGggYnJhbmNoZXMsICIKKwkJCQkgICAgICAg ImJ1dCBwZXJtaXNzaW9ucyBjb25mbGljdCAlMDZvLT4lMDZvIiwKKwkJCQkgICAgICAgcGF0aCwg YU1vZGUsIGJNb2RlKTsKKwkJCQlvdXRwdXQoIkNPTkZMSUNUOiBhZGRpbmcgd2l0aCBwZXJtaXNz aW9uOiAlMDZvIiwgYU1vZGUpOworCQkJCXVwZGF0ZUZpbGUoZnAsIDAsIGFTaGEsIGFNb2RlLCBw YXRoKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gVGhpcyBjYXNlIGlzIGhhbmRsZWQgYnkgZ2l0LXJl YWQtdHJlZQorCQkJCWFzc2VydCgwICYmICJUaGlzIGNhc2UgbXVzdCBiZSBoYW5kbGVkIGJ5IGdp dC1yZWFkLXRyZWUiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNsZWFuTWVyZ2UgPSAwOworCQkJ Y29uc3QgY2hhciAqbmV3UGF0aDEgPSB1bmlxdWVQYXRoKHBhdGgsIGJyYW5jaDFOYW1lKTsKKwkJ CWNvbnN0IGNoYXIgKm5ld1BhdGgyID0gdW5pcXVlUGF0aChwYXRoLCBicmFuY2gyTmFtZSk7CisJ CQlvdXRwdXQoIkNPTkZMSUNUIChhZGQvYWRkKTogRmlsZSAlcyBhZGRlZCBub24taWRlbnRpY2Fs bHkgIgorCQkJICAgICAgICJpbiBib3RoIGJyYW5jaGVzLiBBZGRpbmcgYXMgJXMgYW5kICVzIGlu c3RlYWQuIiwKKwkJCSAgICAgICBwYXRoLCBuZXdQYXRoMSwgbmV3UGF0aDIpOworCQkJcmVtb3Zl RmlsZShmcCwgMCwgcGF0aCk7CisJCQl1cGRhdGVGaWxlKGZwLCAwLCBhU2hhLCBhTW9kZSwgbmV3 UGF0aDEpOworCQkJdXBkYXRlRmlsZShmcCwgMCwgYlNoYSwgYk1vZGUsIG5ld1BhdGgyKTsKKwkJ fQorCisJfSBlbHNlIGlmICggb1NoYSAmJiBhU2hhICYmIGJTaGEgKSB7CisJCS8vCisJCS8vIGNh c2UgRDogTW9kaWZpZWQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LgorCQkvLworCQlvdXRwdXQo IkF1dG8tbWVyZ2luZyAlc1xuIiwgcGF0aCk7CisJCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gbWZp OworCQltZmkgPSBtZXJnZUZpbGUocGF0aCwgb1NoYSwgb01vZGUsCisJCQkJcGF0aCwgYVNoYSwg YU1vZGUsCisJCQkJcGF0aCwgYlNoYSwgYk1vZGUsCisJCQkJYnJhbmNoMU5hbWUsIGJyYW5jaDJO YW1lKTsKKworCQlpZiAoIG1maS5jbGVhbiApCisJCQl1cGRhdGVGaWxlKGZwLCAxLCBtZmkuc2hh LCBtZmkubW9kZSwgcGF0aCk7CisJCWVsc2UgeworCQkJY2xlYW5NZXJnZSA9IDA7CisJCQlvdXRw dXQoIkNPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4gJXMiLCBwYXRoKTsKKwor CQkJaWYgKCBpbmRleF9vbmx5ICkKKwkJCQl1cGRhdGVGaWxlKGZwLCAwLCBtZmkuc2hhLCBtZmku bW9kZSwgcGF0aCk7CisJCQllbHNlCisJCQkJdXBkYXRlRmlsZUV4dChmcCwgbWZpLnNoYSwgbWZp Lm1vZGUsIHBhdGgsCisJCQkJCSAgICAgIDAgLyogdXBkYXRlQ2FjaGUgKi8sIDEgLyogdXBkYXRl V2QgKi8pOworCQl9CisJfSBlbHNlCisJCWRpZSgiRmF0YWwgbWVyZ2UgZmFpbHVyZSwgc2hvdWxk bid0IGhhcHBlbi4iKTsKKworCWlmIChwY2xvc2UoZnApKQorCQlkaWUoInVwZGF0aW5nIGVudHJ5 IGZhaWxlZCBpbiBnaXQgdXBkYXRlLWluZGV4Iik7CisJcmV0dXJuIGNsZWFuTWVyZ2U7Cit9CisK K3N0cnVjdCBtZXJnZV90cmVlX3Jlc3VsdCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZSAqaGVhZCwK KwkJCQkgICAgIHN0cnVjdCB0cmVlICptZXJnZSwKKwkJCQkgICAgIHN0cnVjdCB0cmVlICpjb21t b24sCisJCQkJICAgICBjb25zdCBjaGFyICpicmFuY2gxTmFtZSwKKwkJCQkgICAgIGNvbnN0IGNo YXIgKmJyYW5jaDJOYW1lKQoreworCWludCBjb2RlOworCXN0cnVjdCBtZXJnZV90cmVlX3Jlc3Vs dCByZXN1bHQgPSB7IE5VTEwsIDAgfTsKKwlpZiAoICFtZW1jbXAoY29tbW9uLT5vYmplY3Quc2hh MSwgbWVyZ2UtPm9iamVjdC5zaGExLCAyMCkgKSB7CisJCW91dHB1dCgiQWxyZWFkeSB1cHRvZGF0 ZSEiKTsKKwkJcmVzdWx0LnRyZWUgPSBoZWFkOworCQlyZXN1bHQuY2xlYW4gPSAxOworCQlyZXR1 cm4gcmVzdWx0OworCX0KKworCWNvZGUgPSBnaXRfbWVyZ2VfdHJlZXMoaW5kZXhfb25seSA/ICIt aSI6ICItdSIsIGNvbW1vbiwgaGVhZCwgbWVyZ2UpOworCisJaWYgKCBjb2RlICE9IDAgKQorCQlk aWUoIm1lcmdpbmcgb2YgdHJlZXMgJXMgYW5kICVzIGZhaWxlZCIsCisJCSAgICBzaGExX3RvX2hl eChoZWFkLT5vYmplY3Quc2hhMSksCisJCSAgICBzaGExX3RvX2hleChtZXJnZS0+b2JqZWN0LnNo YTEpKTsKKworCXJlc3VsdC50cmVlID0gZ2l0X3dyaXRlX3RyZWUoKTsKKworCWlmICggIXJlc3Vs dC50cmVlICkgeworCQlzdHJ1Y3QgcGF0aF9saXN0ICpmaWxlc00gPSBOVUxMLCAqZGlyc00gPSBO VUxMOworCisJCWdldEZpbGVzQW5kRGlycyhoZWFkLCAmY3VycmVudEZpbGVTZXQsICZjdXJyZW50 RGlyZWN0b3J5U2V0KTsKKwkJZ2V0RmlsZXNBbmREaXJzKG1lcmdlLCAmZmlsZXNNLCAmZGlyc00p OworCisJCXBhdGhfbGlzdF91bmlvbl91cGRhdGUoJmN1cnJlbnRGaWxlU2V0LCBmaWxlc00pOwor CQlwYXRoX2xpc3RfdW5pb25fdXBkYXRlKCZjdXJyZW50RGlyZWN0b3J5U2V0LCBkaXJzTSk7CisK KwkJc3RydWN0IGluZGV4X2VudHJ5ICplbnRyaWVzID0gdW5tZXJnZWRDYWNoZUVudHJpZXMoKTsK KwkJc3RydWN0IHJlbmFtZV9lbnRyeSAqcmVuYW1lc0hlYWQsICpyZW5hbWVzTWVyZ2U7CisJCXJl bmFtZXNIZWFkICA9IGdldFJlbmFtZXMoaGVhZCwgY29tbW9uLCBoZWFkLCBtZXJnZSwgJmVudHJp ZXMpOworCQlyZW5hbWVzTWVyZ2UgPSBnZXRSZW5hbWVzKG1lcmdlLCBjb21tb24sIGhlYWQsIG1l cmdlLCAmZW50cmllcyk7CisJCXJlc3VsdC5jbGVhbiA9IHByb2Nlc3NSZW5hbWVzKHJlbmFtZXNI ZWFkLCByZW5hbWVzTWVyZ2UsCisJCQkJCSAgICAgIGJyYW5jaDFOYW1lLCBicmFuY2gyTmFtZSk7 CisJCXN0cnVjdCBpbmRleF9lbnRyeSAqZTsKKwkJZm9yICggZSA9IGVudHJpZXM7IGU7IGUgPSBl LT5uZXh0ICkgeworCQkJaWYgKCBlLT5wcm9jZXNzZWQgKQorCQkJCWNvbnRpbnVlOworCQkJaWYg KCAhcHJvY2Vzc0VudHJ5KGUsIGJyYW5jaDFOYW1lLCBicmFuY2gyTmFtZSkgKQorCQkJCXJlc3Vs dC5jbGVhbiA9IDA7CisJCQlpZiAoIHJlc3VsdC5jbGVhbiB8fCBpbmRleF9vbmx5ICkKKwkJCQly ZXN1bHQudHJlZSA9IGdpdF93cml0ZV90cmVlKCk7CisJCQllbHNlCisJCQkJcmVzdWx0LnRyZWUg PSBOVUxMOworCQl9CisJCWZyZWVfcmVuYW1lX2VudHJpZXMoJnJlbmFtZXNNZXJnZSk7CisJCWZy ZWVfcmVuYW1lX2VudHJpZXMoJnJlbmFtZXNIZWFkKTsKKwkJZnJlZV9pbmRleF9lbnRyaWVzKCZl bnRyaWVzKTsKKwl9IGVsc2UgeworCQlyZXN1bHQuY2xlYW4gPSAxOworCQlwcmludGYoIm1lcmdp bmcgb2YgdHJlZXMgJXMgYW5kICVzIHJlc3VsdGVkIGluICVzXG4iLAorCQkgICAgICAgc2hhMV90 b19oZXgoaGVhZC0+b2JqZWN0LnNoYTEpLAorCQkgICAgICAgc2hhMV90b19oZXgobWVyZ2UtPm9i amVjdC5zaGExKSwKKwkJICAgICAgIHNoYTFfdG9faGV4KHJlc3VsdC50cmVlLT5vYmplY3Quc2hh MSkpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxlY3Rfbm9k ZXMoc3RydWN0IG5vZGUgKm5vZGUsIHN0cnVjdCBub2RlX2xpc3QgKipyZXMpCit7CisgICAgbm9k ZV9saXN0X2luc2VydChub2RlLCByZXMpOworICAgIHN0cnVjdCBub2RlX2xpc3QgKnA7CisgICAg Zm9yICggcCA9IG5vZGUtPnBhcmVudHM7IHA7IHAgPSBwLT5uZXh0ICkKKwljb2xsZWN0X25vZGVz KG5vZGUsIHJlcyk7Cit9CisKK3N0cnVjdCBub2RlX2xpc3QgKnJlYWNoYWJsZV9ub2RlcyhzdHJ1 Y3Qgbm9kZSAqbjEsIHN0cnVjdCBub2RlICpuMikKK3sKKyAgICBzdHJ1Y3Qgbm9kZV9saXN0ICpy ZXMgPSBOVUxMOworICAgIGNvbGxlY3Rfbm9kZXMobjEsICZyZXMpOworICAgIGNvbGxlY3Rfbm9k ZXMobjIsICZyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0cnVjdCBncmFwaCAqZ3JhcGhf YnVpbGQoc3RydWN0IG5vZGVfbGlzdCAqY29tbWl0cykKK3sKKwlzdHJ1Y3QgZ3JhcGggKmdyYXBo ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JhcGgpKTsKKwltZW1zZXQoZ3JhcGgtPmNvbW1pdHMs IDAsIHNpemVvZihncmFwaC0+Y29tbWl0cykpOworCisJY2hhciBjbWRbMjU2XTsKKwlzdHJjcHko Y21kLCAiZ2l0LXJldi1saXN0IC0tcGFyZW50cyIpOworCXN0cnVjdCBub2RlX2xpc3QgKmNwOwor CWZvcl9lYWNoX25vZGVfbGlzdChjcCxjb21taXRzKSB7CisJCWdyYXBoX2FkZF9ub2RlKGdyYXBo LCBjcC0+bm9kZSk7CisJCXN0cmNhdChjbWQsICIgIik7CisJCXN0cmNhdChjbWQsIG5vZGVfaGV4 X3NoYTEoY3AtPm5vZGUpKTsKKwl9CisJYXNzZXJ0KHN0cmxlbihjbWQpIDwgc2l6ZW9mKGNtZCkp OworCisJRklMRSAqZnAgPSBwb3BlbihjbWQsICJyIik7CisJaWYgKCFmcCkKKwkJZGllKCIlcyBm YWlsZWQ6ICVzIiwgY21kLCBzdHJlcnJvcihlcnJubykpOworCXdoaWxlICghZmVvZihmcCkpIHsK KwkJdW5zaWduZWQgY2hhciBzaGFbMjBdOworCQlpbnQgY2g7CisJCWlmIChmZ2V0X3NoYTEoc2hh LCBmcCwgJmNoKSkKKwkJCWJyZWFrOworCQlpZiAoRU9GID09IGNoKQorCQkJYnJlYWs7CisJCS8v IGEgY29tbWl0CisJCXN0cnVjdCBub2RlICpub2RlID0gZ3JhcGhfbm9kZV9ieXNoYShncmFwaCwg c2hhKTsKKwkJaWYgKCFub2RlKQorCQl7CisJCQlub2RlID0gbm9kZV9hbGxvYyhsb29rdXBfY29t bWl0KHNoYSkpOworCQkJZ3JhcGhfYWRkX25vZGUoZ3JhcGgsIG5vZGUpOworCQl9CisJCS8vIC4u LmFuZCBpdHMgcGFyZW50cy4gSSBhc3N1bWUgYSBwYXJlbnQgY2Fubm90IGJlIG1lbnRpb25lZAor CQkvLyBiZWZvcmUgdGhlIGNoaWxkcmVuLgorCQlzdHJ1Y3Qgbm9kZV9saXN0ICpwYXJlbnRzID0g TlVMTDsKKwkJd2hpbGUgKCdcbicgIT0gY2gpIHsKKwkJCWlmIChmZ2V0X3NoYTEoc2hhLCBmcCwg JmNoKSkgeworCQkJCWRpZSgiaW52YWxpZCBvdXRwdXQgZnJvbSAlcywgIgorCQkJCSAgICAic2hh MSAocGFyZW50cykgZXhwZWN0ZWQiLAorCQkJCSAgICBjbWQpOworCQkJCWJyZWFrOworCQkJfQor CQkJaWYgKEVPRiA9PSBjaCkKKwkJCQlicmVhazsKKwkJCXN0cnVjdCBub2RlICpwbiA9IGdyYXBo X25vZGVfYnlzaGEoZ3JhcGgsIHNoYSk7CisJCQlpZiAoIXBuKSB7CisJCQkJcG4gPSBub2RlX2Fs bG9jKGxvb2t1cF9jb21taXQoc2hhKSk7CisJCQkJZ3JhcGhfYWRkX25vZGUoZ3JhcGgsIHBuKTsK KwkJCX0KKwkJCW5vZGVfbGlzdF9pbnNlcnQocG4sICZwYXJlbnRzKTsKKwkJfQorCQlub2RlX3Nl dF9wYXJlbnRzKG5vZGUsIHBhcmVudHMpOworCX0KKwlwY2xvc2UoZnApOworCXJldHVybiBncmFw aDsKK30KKworc3RhdGljIGludCBnZXRfc2hhMV8wKGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQg Y2hhciAqc2hhKQoreworCXNpemVfdCBuID0gc3RybGVuKHJlZik7CisJY2hhciAqdCA9IHhtYWxs b2MobiArIDQpOworCW1lbWNweSh0LCByZWYsIG4pOworCXN0cmNweSh0ICsgbiwgIl4wIik7CisJ aW50IHJjID0gZ2V0X3NoYTEodCwgc2hhKTsKKwlmcmVlKHQpOworCXJldHVybiByYzsKK30KKwor aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAq YmFzZXNbMl07CisJc3RhdGljIHVuc2lnbmVkIGJhc2VzX2NvdW50ID0gMDsKKworCW9yaWdpbmFs X2luZGV4X2ZpbGUgPSBnZXRlbnYoIkdJVF9JTkRFWF9GSUxFIik7CisKKwlpZiAoIW9yaWdpbmFs X2luZGV4X2ZpbGUpCisJCW9yaWdpbmFsX2luZGV4X2ZpbGUgPSBzdHJkdXAoZ2l0X3BhdGgoImlu ZGV4IikpOworCisJdGVtcG9yYXJ5X2luZGV4X2ZpbGUgPSBzdHJkdXAoZ2l0X3BhdGgoIm1yZy1y Y3Jzdi10bXAtaWR4IikpOworCisJaWYgKGFyZ2MgPCA0KQorCQlkaWUoIlVzYWdlOiAlcyA8YmFz ZT4uLi4gLS0gPGhlYWQ+IDxyZW1vdGU+IC4uLlxuIiwgYXJndlswXSk7CisKKwlpbnQgaTsKKwlm b3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIp KQorCQkJYnJlYWs7CisJCWlmIChiYXNlc19jb3VudCA8IHNpemVvZihiYXNlcykvc2l6ZW9mKCpi YXNlcykpCisJCQliYXNlc1tiYXNlc19jb3VudCsrXSA9IGFyZ3ZbaV07CisJfQorCWlmIChhcmdj IC0gaSAhPSAzKSAvKiAiLS0iICI8aGVhZD4iICI8cmVtb3RlPiIgKi8KKwkJZGllKCJOb3QgaGFu ZGxpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiB0d28gaGVhZHMgbWVyZ2UuIik7CisKKwl1bnNpZ25l ZCBjaGFyIHNoYTFbMjBdLCBzaGEyWzIwXTsKKwljb25zdCBjaGFyICpicmFuY2gxLCAqYnJhbmNo MjsKKworCWJyYW5jaDEgPSBhcmd2WysraV07CisJaWYgKGdldF9zaGExXzAoYnJhbmNoMSwgc2hh MSkgIT0gMCkKKwkJZGllKCJpbnZhbGlkIGZpcnN0IGJyYW5jaCAlcyIsIGJyYW5jaDEpOworCisJ YnJhbmNoMiA9IGFyZ3ZbKytpXTsKKwlpZiAoZ2V0X3NoYTFfMChicmFuY2gyLCBzaGEyKSAhPSAw KQorCQlkaWUoImludmFsaWQgc2Vjb25kIGJyYW5jaCAlcyIsIGJyYW5jaDIpOworCisJcHJpbnRm KCJNZXJnaW5nICVzIHdpdGggJXNcbiIsIGJyYW5jaDEsIGJyYW5jaDIpOworCisJc3RydWN0IG1l cmdlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IG5vZGUgKmgxID0gbm9kZV9hbGxvYyhsb29rdXBf Y29tbWl0KHNoYTEpKTsKKwlzdHJ1Y3Qgbm9kZSAqaDIgPSBub2RlX2FsbG9jKGxvb2t1cF9jb21t aXQoc2hhMikpOworCisJaWYgKGJhc2VzX2NvdW50ID09IDEpIHsKKwkJdW5zaWduZWQgY2hhciBz aGFiYXNlWzIwXTsKKwkJaWYgKGdldF9zaGExXzAoYmFzZXNbMF0sIHNoYWJhc2UpICE9IDApCisJ CQlkaWUoImludmFsaWQgYmFzZSBjb21taXQgJXMiLCBiYXNlc1swXSk7CisJCXN0cnVjdCBub2Rl ICphbmNlc3RvciA9IG5vZGVfYWxsb2MobG9va3VwX2NvbW1pdChzaGFiYXNlKSk7CisJCXJlc3Vs dCA9IG1lcmdlKGgxLCBoMiwgYnJhbmNoMSwgYnJhbmNoMiwgTlVMTCwgMCwgYW5jZXN0b3IpOwor CX0gZWxzZSB7CisJCXN0cnVjdCBub2RlX2xpc3QgKmNvbW1pdHMgPSBOVUxMOworCQlub2RlX2xp c3RfaW5zZXJ0KGgxLCAmY29tbWl0cyk7CisJCW5vZGVfbGlzdF9pbnNlcnQoaDIsICZjb21taXRz LT5uZXh0KTsKKwkJc3RydWN0IGdyYXBoICpncmFwaCA9IGdyYXBoX2J1aWxkKGNvbW1pdHMpOwor CQlyZXN1bHQgPSBtZXJnZShoMSwgaDIsIGJyYW5jaDEsIGJyYW5jaDIsIGdyYXBoLCAwLCBOVUxM KTsKKwl9CisJcmV0dXJuIHJlc3VsdC5jbGVhbiA/IDA6IDE7Cit9CisKKy8vIHZpbTogc3c9OCBu b2V0CmRpZmYgLS1naXQgYS9wYXRoLWxpc3QuYyBiL3BhdGgtbGlzdC5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjkxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRoLWxp c3QuYwpAQCAtMCwwICsxLDY4IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjYWNo ZS5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorCitzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCAq cGF0aF9saXN0X3Bvb2wgPSBOVUxMOworCitzdHJ1Y3QgcGF0aF9saXN0ICpwYXRoX2xpc3RfaW5z ZXJ0KGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKipsaXN0KQoreworICAgIHN0cnVjdCBw YXRoX2xpc3QgKmU7CisgICAgaWYgKCBwYXRoX2xpc3RfcG9vbCApIHsKKyAgICAgICAgZSA9IHBh dGhfbGlzdF9wb29sOworICAgICAgICBwYXRoX2xpc3RfcG9vbCA9IHBhdGhfbGlzdF9wb29sLT5u ZXh0OworICAgIH0gZWxzZQorICAgICAgICBlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBhdGhf bGlzdCkpOworICAgIGUtPm5leHQgPSAqbGlzdDsKKyAgICBlLT5wYXRoID0gcGF0aDsKKyAgICAq bGlzdCA9IGU7CisgICAgcmV0dXJuIGU7Cit9CisKK3ZvaWQgcGF0aF9saXN0X2NsZWFyKHN0cnVj dCBwYXRoX2xpc3QgKipsaXN0LCBpbnQgZnJlZV9wYXRoKQoreworICAgIHdoaWxlICggKmxpc3Qg KSB7CisgICAgICAgIHN0cnVjdCBwYXRoX2xpc3QgKm5leHQgPSAoKmxpc3QpLT5uZXh0OworCWlm IChmcmVlX3BhdGgpCisJICAgIGZyZWUoKCpsaXN0KS0+cGF0aCk7CisgICAgICAgICgqbGlzdCkt PnBhdGggPSBOVUxMOworICAgICAgICAoKmxpc3QpLT5uZXh0ID0gcGF0aF9saXN0X3Bvb2w7Cisg ICAgICAgIHBhdGhfbGlzdF9wb29sID0gKmxpc3Q7CisgICAgICAgICpsaXN0ID0gbmV4dDsKKyAg ICB9Cit9CisKK2ludCBwYXRoX2xpc3RfY291bnQoY29uc3Qgc3RydWN0IHBhdGhfbGlzdCAqbGlz dCkKK3sKKyAgICBpbnQgbiA9IDA7CisgICAgZm9yICggOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4 dCApCisgICAgICAgICsrbjsKKyAgICByZXR1cm4gbjsKK30KKworaW50IHBhdGhfbGlzdF9oYXNf cGF0aChjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICpwYXRoKQorewor ICAgIGZvciAoIDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQgKQorICAgICAgICBpZiAoIHN0cmNt cChwYXRoLCBsaXN0LT5wYXRoKSA9PSAwICkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJl dHVybiAwOworfQorCisvLyBpbiBwbGFjZQordm9pZCBwYXRoX2xpc3RfdW5pb25fdXBkYXRlKHN0 cnVjdCBwYXRoX2xpc3QgKipkc3QsIGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKnNyYykKK3sKKyAg ICBjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICppID0gc3JjOworICAgIHdoaWxlICggaSApIHsKKyAg ICAgICAgaWYgKCAhcGF0aF9saXN0X2hhc19wYXRoKCpkc3QsIGktPnBhdGgpICkKKwkgICAgcGF0 aF9saXN0X2luc2VydChpLT5wYXRoLCBkc3QpOworCWkgPSBpLT5uZXh0OworICAgIH0KK30KKwor dm9pZCBwcmludF9wYXRoX2xpc3QoY29uc3QgY2hhciAqdGV4dCwgY29uc3Qgc3RydWN0IHBhdGhf bGlzdCAqcCkKK3sKKyAgICBpZiAoIHRleHQgKQorICAgICAgICBwcmludGYoIiVzXG4iLCB0ZXh0 KTsKKyAgICBmb3IgKCA7IHA7IHAgPSBwLT5uZXh0ICkKKyAgICAgICAgcHJpbnRmKCIlc1xuIiwg cC0+cGF0aCk7Cit9CisKZGlmZiAtLWdpdCBhL3BhdGgtbGlzdC5oIGIvcGF0aC1saXN0LmgKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3OWYxNwotLS0gL2Rldi9udWxsCisr KyBiL3BhdGgtbGlzdC5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX1BBVEhfTElTVF9IXwor I2RlZmluZSBfUEFUSF9MSVNUX0hfCisKK3N0cnVjdCBwYXRoX2xpc3QKK3sKKyAgICBzdHJ1Y3Qg cGF0aF9saXN0ICpuZXh0OworICAgIGNoYXIgKnBhdGg7Cit9OworCisjZGVmaW5lIGZvcl9lYWNo X3BhdGgocCxsaXN0KSBmb3IgKCBwID0gKGxpc3QpOyBwOyBwID0gcC0+bmV4dCApCisKK3ZvaWQg cHJpbnRfcGF0aF9saXN0KGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IHN0cnVjdCBwYXRoX2xpc3Qg KnApOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYXRoX2xpc3QgKnBhdGhfbGlzdF9zaGlmdChz dHJ1Y3QgcGF0aF9saXN0ICoqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgcGF0aF9saXN0ICpjdXIgPSAq bGlzdDsKKyAgICAqbGlzdCA9IGN1ci0+bmV4dDsKKyAgICByZXR1cm4gY3VyOworfQorCitpbnQg cGF0aF9saXN0X2NvdW50KGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpOworaW50IHBhdGhf bGlzdF9oYXNfcGF0aChjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICpw YXRoKTsKK3ZvaWQgcGF0aF9saXN0X3VuaW9uX3VwZGF0ZShzdHJ1Y3QgcGF0aF9saXN0ICoqZHN0 LCBjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpzcmMpOwordm9pZCBwYXRoX2xpc3RfY2xlYXIoc3Ry dWN0IHBhdGhfbGlzdCAqKmxpc3QsIGludCBmcmVlX3BhdGgpOworc3RhdGljIGlubGluZSB2b2lk IHBhdGhfbGlzdF9mcmVlKHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisgICAgcGF0aF9saXN0 X2NsZWFyKCZsaXN0LCAxKTsKK30KK3N0cnVjdCBwYXRoX2xpc3QgKnBhdGhfbGlzdF9pbnNlcnQo Y2hhciAqcGF0aCwgc3RydWN0IHBhdGhfbGlzdCAqKmxpc3QpOworCisjZW5kaWYgLyogX1BBVEhf TElTVF9IXyAqLwo= ------=_Part_16751_33390419.1151423312352--