From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH 17/29] xl: split out scheduler related code Date: Fri, 24 Feb 2017 16:13:02 +0000 Message-ID: <20170224161314.22154-18-wei.liu2@citrix.com> References: <20170224161314.22154-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1chIY0-0006pE-Q1 for xen-devel@lists.xenproject.org; Fri, 24 Feb 2017 16:16:45 +0000 In-Reply-To: <20170224161314.22154-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: Wei Liu , Ian Jackson List-Id: xen-devel@lists.xenproject.org U2lnbmVkLW9mZi1ieTogV2VpIExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KLS0tCiB0b29scy94 bC9NYWtlZmlsZSAgICAgfCAgIDEgKwogdG9vbHMveGwveGxfY21kaW1wbC5jIHwgODU2IC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdG9vbHMveGwveGxf c2NoZWQuYyAgIHwgODg4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDg4OSBpbnNlcnRpb25zKCspLCA4NTYgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMveGwveGxfc2NoZWQuYwoKZGlmZiAtLWdp dCBhL3Rvb2xzL3hsL01ha2VmaWxlIGIvdG9vbHMveGwvTWFrZWZpbGUKaW5kZXggNDVkZGMyNTVm NS4uOGFhMjk0ZDVhMCAxMDA2NDQKLS0tIGEvdG9vbHMveGwvTWFrZWZpbGUKKysrIGIvdG9vbHMv eGwvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAgQ0ZMQUdTX1hMICs9IC1Xc2hhZG93CiBYTF9P QkpTID0geGwubyB4bF9jbWRpbXBsLm8geGxfY21kdGFibGUubyB4bF9zeHAubyB4bF91dGlscy5v CiBYTF9PQkpTICs9IHhsX3RtZW0ubyB4bF9wYXJzZS5vIHhsX2NwdXBvb2wubyB4bF9mbGFzay5v CiBYTF9PQkpTICs9IHhsX3Z0cG0ubyB4bF9ibG9jay5vIHhsX25pYy5vIHhsX3VzYi5vCitYTF9P QkpTICs9IHhsX3NjaGVkLm8KIAogJChYTF9PQkpTKTogQ0ZMQUdTICs9ICQoQ0ZMQUdTX2xpYnhl bnRvb2xsb2cpCiAkKFhMX09CSlMpOiBDRkxBR1MgKz0gJChDRkxBR1NfWEwpCmRpZmYgLS1naXQg YS90b29scy94bC94bF9jbWRpbXBsLmMgYi90b29scy94bC94bF9jbWRpbXBsLmMKaW5kZXggMzg2 Zjk2YjRjYy4uN2Q2ZGUzOTU3ZSAxMDA2NDQKLS0tIGEvdG9vbHMveGwveGxfY21kaW1wbC5jCisr KyBiL3Rvb2xzL3hsL3hsX2NtZGltcGwuYwpAQCAtMzc1Nyw4NjIgKzM3NTcsNiBAQCBpbnQgbWFp bl9zaGFyaW5nKGludCBhcmdjLCBjaGFyICoqYXJndikKICAgICByZXR1cm4gRVhJVF9TVUNDRVNT OwogfQogCi1zdGF0aWMgaW50IHNjaGVkX2RvbWFpbl9nZXQobGlieGxfc2NoZWR1bGVyIHNjaGVk LCBpbnQgZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZG9tYWluX3Nj aGVkX3BhcmFtcyAqc2NpbmZvKQotewotICAgIGlmIChsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1z X2dldChjdHgsIGRvbWlkLCBzY2luZm8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibGli eGxfZG9tYWluX3NjaGVkX3BhcmFtc19nZXQgZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiAx OwotICAgIH0KLSAgICBpZiAoc2NpbmZvLT5zY2hlZCAhPSBzY2hlZCkgewotICAgICAgICBmcHJp bnRmKHN0ZGVyciwgImxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfZ2V0IHJldHVybmVkICVzIG5v dCAlcy5cbiIsCi0gICAgICAgICAgICAgICAgbGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhzY2lu Zm8tPnNjaGVkKSwKLSAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZHVsZXJfdG9fc3RyaW5nKHNj aGVkKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1z dGF0aWMgaW50IHNjaGVkX2RvbWFpbl9zZXQoaW50IGRvbWlkLCBjb25zdCBsaWJ4bF9kb21haW5f c2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgaWYgKGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJh bXNfc2V0KGN0eCwgZG9taWQsIHNjaW5mbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJs aWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zX3NldCBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJu IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRfdmNwdV9n ZXQobGlieGxfc2NoZWR1bGVyIHNjaGVkLCBpbnQgZG9taWQsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgaW50IHJjOwot Ci0gICAgcmMgPSBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19nZXQoY3R4LCBkb21pZCwgc2NpbmZv KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF92Y3B1X3Nj aGVkX3BhcmFtc19nZXQgZmFpbGVkLlxuIik7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsK LSAgICB9Ci0gICAgaWYgKHNjaW5mby0+c2NoZWQgIT0gc2NoZWQpIHsKLSAgICAgICAgZnByaW50 ZihzdGRlcnIsICJsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19nZXQgcmV0dXJuZWQgJXMgbm90ICVz LlxuIiwKLSAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZHVsZXJfdG9fc3RyaW5nKHNjaW5mby0+ c2NoZWQpLAotICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcoc2NoZWQp KTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgc2NoZWRfdmNwdV9nZXRfYWxsKGxpYnhsX3NjaGVkdWxlciBzY2hlZCwgaW50IGRvbWlk LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMg KnNjaW5mbykKLXsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGxpYnhsX3ZjcHVfc2NoZWRfcGFy YW1zX2dldF9hbGwoY3R4LCBkb21pZCwgc2NpbmZvKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAg ZnByaW50ZihzdGRlcnIsICJsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19nZXRfYWxsIGZhaWxlZC5c biIpOwotICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAgIGlmIChzY2luZm8t PnNjaGVkICE9IHNjaGVkKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlieGxfdmNwdV9z Y2hlZF9wYXJhbXNfZ2V0X2FsbCByZXR1cm5lZCAlcyBub3QgJXMuXG4iLAotICAgICAgICAgICAg ICAgIGxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcoc2NpbmZvLT5zY2hlZCksCi0gICAgICAgICAg ICAgICAgbGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhzY2hlZCkpOwotICAgICAgICByZXR1cm4g MTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzY2hlZF92Y3B1X3Nl dChpbnQgZG9taWQsIGNvbnN0IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0g ICAgaW50IHJjOwotCi0gICAgcmMgPSBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19zZXQoY3R4LCBk b21pZCwgc2NpbmZvKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJs aWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19zZXQgZmFpbGVkLlxuIik7Ci0gICAgICAgIGV4aXQoRVhJ VF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzY2hl ZF92Y3B1X3NldF9hbGwoaW50IGRvbWlkLCBjb25zdCBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAq c2NpbmZvKQotewotICAgIGludCByYzsKLQotICAgIHJjID0gbGlieGxfdmNwdV9zY2hlZF9wYXJh bXNfc2V0X2FsbChjdHgsIGRvbWlkLCBzY2luZm8pOwotICAgIGlmIChyYykgewotICAgICAgICBm cHJpbnRmKHN0ZGVyciwgImxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX3NldF9hbGwgZmFpbGVkLlxu Iik7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsK LX0KLQotc3RhdGljIGludCBzY2hlZF9jcmVkaXRfcGFyYW1zX3NldChpbnQgcG9vbGlkLCBsaWJ4 bF9zY2hlZF9jcmVkaXRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgaWYgKGxpYnhsX3NjaGVkX2Ny ZWRpdF9wYXJhbXNfc2V0KGN0eCwgcG9vbGlkLCBzY2luZm8pKSB7Ci0gICAgICAgIGZwcmludGYo c3RkZXJyLCAibGlieGxfc2NoZWRfY3JlZGl0X3BhcmFtc19zZXQgZmFpbGVkLlxuIik7Ci0gICAg ICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNj aGVkX2NyZWRpdF9wYXJhbXNfZ2V0KGludCBwb29saWQsIGxpYnhsX3NjaGVkX2NyZWRpdF9wYXJh bXMgKnNjaW5mbykKLXsKLSAgICBpZiAobGlieGxfc2NoZWRfY3JlZGl0X3BhcmFtc19nZXQoY3R4 LCBwb29saWQsIHNjaW5mbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF9zY2hl ZF9jcmVkaXRfcGFyYW1zX2dldCBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAg fQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRfY3JlZGl0X2RvbWFpbl9v dXRwdXQoaW50IGRvbWlkKQotewotICAgIGNoYXIgKmRvbW5hbWU7Ci0gICAgbGlieGxfZG9tYWlu X3NjaGVkX3BhcmFtcyBzY2luZm87Ci0KLSAgICBpZiAoZG9taWQgPCAwKSB7Ci0gICAgICAgIHBy aW50ZigiJS0zM3MgJTRzICU2cyAlNHNcbiIsICJOYW1lIiwgIklEIiwgIldlaWdodCIsICJDYXAi KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbGlieGxfZG9tYWluX3NjaGVkX3Bh cmFtc19pbml0KCZzY2luZm8pOwotICAgIGlmIChzY2hlZF9kb21haW5fZ2V0KExJQlhMX1NDSEVE VUxFUl9DUkVESVQsIGRvbWlkLCAmc2NpbmZvKSkgewotICAgICAgICBsaWJ4bF9kb21haW5fc2No ZWRfcGFyYW1zX2Rpc3Bvc2UoJnNjaW5mbyk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAg ICBkb21uYW1lID0gbGlieGxfZG9taWRfdG9fbmFtZShjdHgsIGRvbWlkKTsKLSAgICBwcmludGYo IiUtMzNzICU0ZCAlNmQgJTRkXG4iLAotICAgICAgICBkb21uYW1lLAotICAgICAgICBkb21pZCwK LSAgICAgICAgc2NpbmZvLndlaWdodCwKLSAgICAgICAgc2NpbmZvLmNhcCk7Ci0gICAgZnJlZShk b21uYW1lKTsKLSAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zX2Rpc3Bvc2UoJnNjaW5mbyk7 Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRfY3JlZGl0X3Bvb2xfb3V0cHV0 KHVpbnQzMl90IHBvb2xpZCkKLXsKLSAgICBsaWJ4bF9zY2hlZF9jcmVkaXRfcGFyYW1zIHNjcGFy YW07Ci0gICAgY2hhciAqcG9vbG5hbWU7Ci0KLSAgICBwb29sbmFtZSA9IGxpYnhsX2NwdXBvb2xp ZF90b19uYW1lKGN0eCwgcG9vbGlkKTsKLSAgICBpZiAoc2NoZWRfY3JlZGl0X3BhcmFtc19nZXQo cG9vbGlkLCAmc2NwYXJhbSkpIHsKLSAgICAgICAgcHJpbnRmKCJDcHVwb29sICVzOiBbc2NoZWQg cGFyYW1zIHVuYXZhaWxhYmxlXVxuIiwKLSAgICAgICAgICAgICAgIHBvb2xuYW1lKTsKLSAgICB9 IGVsc2UgewotICAgICAgICBwcmludGYoIkNwdXBvb2wgJXM6IHRzbGljZT0lZG1zIHJhdGVsaW1p dD0lZHVzXG4iLAotICAgICAgICAgICAgICAgcG9vbG5hbWUsCi0gICAgICAgICAgICAgICBzY3Bh cmFtLnRzbGljZV9tcywKLSAgICAgICAgICAgICAgIHNjcGFyYW0ucmF0ZWxpbWl0X3VzKTsKLSAg ICB9Ci0gICAgZnJlZShwb29sbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQg c2NoZWRfY3JlZGl0Ml9wYXJhbXNfc2V0KGludCBwb29saWQsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZF9jcmVkaXQyX3BhcmFtcyAqc2NpbmZvKQotewot ICAgIGlmIChsaWJ4bF9zY2hlZF9jcmVkaXQyX3BhcmFtc19zZXQoY3R4LCBwb29saWQsIHNjaW5m bykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF9zY2hlZF9jcmVkaXQyX3BhcmFt c19zZXQgZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVy biAwOwotfQotCi1zdGF0aWMgaW50IHNjaGVkX2NyZWRpdDJfcGFyYW1zX2dldChpbnQgcG9vbGlk LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfc2NoZWRfY3JlZGl0 Ml9wYXJhbXMgKnNjaW5mbykKLXsKLSAgICBpZiAobGlieGxfc2NoZWRfY3JlZGl0Ml9wYXJhbXNf Z2V0KGN0eCwgcG9vbGlkLCBzY2luZm8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibGli eGxfc2NoZWRfY3JlZGl0Ml9wYXJhbXNfZ2V0IGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4g MTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzY2hlZF9jcmVkaXQy X2RvbWFpbl9vdXRwdXQoaW50IGRvbWlkKQotewotICAgIGNoYXIgKmRvbW5hbWU7Ci0gICAgbGli eGxfZG9tYWluX3NjaGVkX3BhcmFtcyBzY2luZm87Ci0KLSAgICBpZiAoZG9taWQgPCAwKSB7Ci0g ICAgICAgIHByaW50ZigiJS0zM3MgJTRzICU2c1xuIiwgIk5hbWUiLCAiSUQiLCAiV2VpZ2h0Iik7 Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJh bXNfaW5pdCgmc2NpbmZvKTsKLSAgICBpZiAoc2NoZWRfZG9tYWluX2dldChMSUJYTF9TQ0hFRFVM RVJfQ1JFRElUMiwgZG9taWQsICZzY2luZm8pKSB7Ci0gICAgICAgIGxpYnhsX2RvbWFpbl9zY2hl ZF9wYXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAg IGRvbW5hbWUgPSBsaWJ4bF9kb21pZF90b19uYW1lKGN0eCwgZG9taWQpOwotICAgIHByaW50Zigi JS0zM3MgJTRkICU2ZFxuIiwKLSAgICAgICAgZG9tbmFtZSwKLSAgICAgICAgZG9taWQsCi0gICAg ICAgIHNjaW5mby53ZWlnaHQpOwotICAgIGZyZWUoZG9tbmFtZSk7Ci0gICAgbGlieGxfZG9tYWlu X3NjaGVkX3BhcmFtc19kaXNwb3NlKCZzY2luZm8pOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0 aWMgaW50IHNjaGVkX2NyZWRpdDJfcG9vbF9vdXRwdXQodWludDMyX3QgcG9vbGlkKQotewotICAg IGxpYnhsX3NjaGVkX2NyZWRpdDJfcGFyYW1zIHNjcGFyYW07Ci0gICAgY2hhciAqcG9vbG5hbWUg PSBsaWJ4bF9jcHVwb29saWRfdG9fbmFtZShjdHgsIHBvb2xpZCk7Ci0KLSAgICBpZiAoc2NoZWRf Y3JlZGl0Ml9wYXJhbXNfZ2V0KHBvb2xpZCwgJnNjcGFyYW0pKQotICAgICAgICBwcmludGYoIkNw dXBvb2wgJXM6IFtzY2hlZCBwYXJhbXMgdW5hdmFpbGFibGVdXG4iLCBwb29sbmFtZSk7Ci0gICAg ZWxzZQotICAgICAgICBwcmludGYoIkNwdXBvb2wgJXM6IHJhdGVsaW1pdD0lZHVzXG4iLAotICAg ICAgICAgICAgICAgcG9vbG5hbWUsIHNjcGFyYW0ucmF0ZWxpbWl0X3VzKTsKLQotICAgIGZyZWUo cG9vbG5hbWUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRfcnRkc19k b21haW5fb3V0cHV0KAotICAgIGludCBkb21pZCkKLXsKLSAgICBjaGFyICpkb21uYW1lOwotICAg IGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXMgc2NpbmZvOwotCi0gICAgaWYgKGRvbWlkIDwgMCkg ewotICAgICAgICBwcmludGYoIiUtMzNzICU0cyAlOXMgJTlzXG4iLCAiTmFtZSIsICJJRCIsICJQ ZXJpb2QiLCAiQnVkZ2V0Iik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGxpYnhs X2RvbWFpbl9zY2hlZF9wYXJhbXNfaW5pdCgmc2NpbmZvKTsKLSAgICBpZiAoc2NoZWRfZG9tYWlu X2dldChMSUJYTF9TQ0hFRFVMRVJfUlREUywgZG9taWQsICZzY2luZm8pKSB7Ci0gICAgICAgIGxp YnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKLSAgICAgICAgcmV0dXJu IDE7Ci0gICAgfQotCi0gICAgZG9tbmFtZSA9IGxpYnhsX2RvbWlkX3RvX25hbWUoY3R4LCBkb21p ZCk7Ci0gICAgcHJpbnRmKCIlLTMzcyAlNGQgJTlkICU5ZFxuIiwKLSAgICAgICAgZG9tbmFtZSwK LSAgICAgICAgZG9taWQsCi0gICAgICAgIHNjaW5mby5wZXJpb2QsCi0gICAgICAgIHNjaW5mby5i dWRnZXQpOwotICAgIGZyZWUoZG9tbmFtZSk7Ci0gICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFt c19kaXNwb3NlKCZzY2luZm8pOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNjaGVk X3J0ZHNfdmNwdV9vdXRwdXQoaW50IGRvbWlkLCBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAqc2Np bmZvKQotewotICAgIGNoYXIgKmRvbW5hbWU7Ci0gICAgaW50IHJjID0gMDsKLSAgICBpbnQgaTsK LQotICAgIGlmIChkb21pZCA8IDApIHsKLSAgICAgICAgcHJpbnRmKCIlLTMzcyAlNHMgJTRzICU5 cyAlOXNcbiIsICJOYW1lIiwgIklEIiwKLSAgICAgICAgICAgICAgICJWQ1BVIiwgIlBlcmlvZCIs ICJCdWRnZXQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmMgPSBzY2hlZF92 Y3B1X2dldChMSUJYTF9TQ0hFRFVMRVJfUlREUywgZG9taWQsIHNjaW5mbyk7Ci0gICAgaWYgKHJj KQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGRvbW5hbWUgPSBsaWJ4bF9kb21pZF90b19uYW1l KGN0eCwgZG9taWQpOwotICAgIGZvciAoIGkgPSAwOyBpIDwgc2NpbmZvLT5udW1fdmNwdXM7IGkr KyApIHsKLSAgICAgICAgcHJpbnRmKCIlLTMzcyAlNGQgJTRkICU5IlBSSXUzMiIgJTkiUFJJdTMy IlxuIiwKLSAgICAgICAgICAgICAgIGRvbW5hbWUsCi0gICAgICAgICAgICAgICBkb21pZCwKLSAg ICAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0udmNwdWlkLAotICAgICAgICAgICAgICAgc2Np bmZvLT52Y3B1c1tpXS5wZXJpb2QsCi0gICAgICAgICAgICAgICBzY2luZm8tPnZjcHVzW2ldLmJ1 ZGdldCk7Ci0gICAgfQotICAgIGZyZWUoZG9tbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyBpbnQgc2NoZWRfcnRkc192Y3B1X291dHB1dF9hbGwoaW50IGRvbWlkLAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAqc2Np bmZvKQotewotICAgIGNoYXIgKmRvbW5hbWU7Ci0gICAgaW50IHJjID0gMDsKLSAgICBpbnQgaTsK LQotICAgIGlmIChkb21pZCA8IDApIHsKLSAgICAgICAgcHJpbnRmKCIlLTMzcyAlNHMgJTRzICU5 cyAlOXNcbiIsICJOYW1lIiwgIklEIiwKLSAgICAgICAgICAgICAgICJWQ1BVIiwgIlBlcmlvZCIs ICJCdWRnZXQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2NpbmZvLT5udW1f dmNwdXMgPSAwOwotICAgIHJjID0gc2NoZWRfdmNwdV9nZXRfYWxsKExJQlhMX1NDSEVEVUxFUl9S VERTLCBkb21pZCwgc2NpbmZvKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybiAxOwotCi0g ICAgZG9tbmFtZSA9IGxpYnhsX2RvbWlkX3RvX25hbWUoY3R4LCBkb21pZCk7Ci0gICAgZm9yICgg aSA9IDA7IGkgPCBzY2luZm8tPm51bV92Y3B1czsgaSsrICkgewotICAgICAgICBwcmludGYoIiUt MzNzICU0ZCAlNGQgJTkiUFJJdTMyIiAlOSJQUkl1MzIiXG4iLAotICAgICAgICAgICAgICAgZG9t bmFtZSwKLSAgICAgICAgICAgICAgIGRvbWlkLAotICAgICAgICAgICAgICAgc2NpbmZvLT52Y3B1 c1tpXS52Y3B1aWQsCi0gICAgICAgICAgICAgICBzY2luZm8tPnZjcHVzW2ldLnBlcmlvZCwKLSAg ICAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0uYnVkZ2V0KTsKLSAgICB9Ci0gICAgZnJlZShk b21uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzY2hlZF9ydGRzX3Bvb2xf b3V0cHV0KHVpbnQzMl90IHBvb2xpZCkKLXsKLSAgICBjaGFyICpwb29sbmFtZTsKLQotICAgIHBv b2xuYW1lID0gbGlieGxfY3B1cG9vbGlkX3RvX25hbWUoY3R4LCBwb29saWQpOwotICAgIHByaW50 ZigiQ3B1cG9vbCAlczogc2NoZWQ9UlREU1xuIiwgcG9vbG5hbWUpOwotCi0gICAgZnJlZShwb29s bmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRfZG9tYWluX291dHB1 dChsaWJ4bF9zY2hlZHVsZXIgc2NoZWQsIGludCAoKm91dHB1dCkoaW50KSwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbnQgKCpwb29sb3V0cHV0KSh1aW50MzJfdCksIGNvbnN0IGNo YXIgKmNwdXBvb2wpCi17Ci0gICAgbGlieGxfZG9taW5mbyAqaW5mbzsKLSAgICBsaWJ4bF9jcHVw b29saW5mbyAqcG9vbGluZm8gPSBOVUxMOwotICAgIHVpbnQzMl90IHBvb2xpZDsKLSAgICBpbnQg bmJfZG9tYWluLCBuX3Bvb2xzID0gMCwgaSwgcDsKLSAgICBpbnQgcmMgPSAwOwotCi0gICAgaWYg KGNwdXBvb2wpIHsKLSAgICAgICAgaWYgKGxpYnhsX2NwdXBvb2xfcXVhbGlmaWVyX3RvX2NwdXBv b2xpZChjdHgsIGNwdXBvb2wsICZwb29saWQsIE5VTEwpIHx8Ci0gICAgICAgICAgICAhbGlieGxf Y3B1cG9vbGlkX2lzX3ZhbGlkKGN0eCwgcG9vbGlkKSkgewotICAgICAgICAgICAgZnByaW50Zihz dGRlcnIsICJ1bmtub3duIGNwdXBvb2wgXCclc1wnXG4iLCBjcHVwb29sKTsKLSAgICAgICAgICAg IHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW5mbyA9IGxpYnhsX2xpc3RfZG9t YWluKGN0eCwgJm5iX2RvbWFpbik7Ci0gICAgaWYgKCFpbmZvKSB7Ci0gICAgICAgIGZwcmludGYo c3RkZXJyLCAibGlieGxfbGlzdF9kb21haW4gZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiAx OwotICAgIH0KLSAgICBwb29saW5mbyA9IGxpYnhsX2xpc3RfY3B1cG9vbChjdHgsICZuX3Bvb2xz KTsKLSAgICBpZiAoIXBvb2xpbmZvKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3Ig Z2V0dGluZyBjcHVwb29sIGluZm9cbiIpOwotICAgICAgICBsaWJ4bF9kb21pbmZvX2xpc3RfZnJl ZShpbmZvLCBuYl9kb21haW4pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBmb3Ig KHAgPSAwOyAhcmMgJiYgKHAgPCBuX3Bvb2xzKTsgcCsrKSB7Ci0gICAgICAgIGlmICgocG9vbGlu Zm9bcF0uc2NoZWQgIT0gc2NoZWQpIHx8Ci0gICAgICAgICAgICAoY3B1cG9vbCAmJiAocG9vbGlk ICE9IHBvb2xpbmZvW3BdLnBvb2xpZCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg ICAgcG9vbG91dHB1dChwb29saW5mb1twXS5wb29saWQpOwotCi0gICAgICAgIG91dHB1dCgtMSk7 Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9kb21haW47IGkrKykgewotICAgICAgICAgICAg aWYgKGluZm9baV0uY3B1cG9vbCAhPSBwb29saW5mb1twXS5wb29saWQpCi0gICAgICAgICAgICAg ICAgY29udGludWU7Ci0gICAgICAgICAgICByYyA9IG91dHB1dChpbmZvW2ldLmRvbWlkKTsKLSAg ICAgICAgICAgIGlmIChyYykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg IH0KLQotICAgIGxpYnhsX2NwdXBvb2xpbmZvX2xpc3RfZnJlZShwb29saW5mbywgbl9wb29scyk7 Ci0gICAgbGlieGxfZG9taW5mb19saXN0X2ZyZWUoaW5mbywgbmJfZG9tYWluKTsKLSAgICByZXR1 cm4gMDsKLX0KLQotc3RhdGljIGludCBzY2hlZF92Y3B1X291dHB1dChsaWJ4bF9zY2hlZHVsZXIg c2NoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKm91dHB1dCkoaW50LCBs aWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aW50ICgqcG9vbG91dHB1dCkodWludDMyX3QpLCBjb25zdCBjaGFyICpjcHVwb29sKQotewotICAg IGxpYnhsX2RvbWluZm8gKmluZm87Ci0gICAgbGlieGxfY3B1cG9vbGluZm8gKnBvb2xpbmZvID0g TlVMTDsKLSAgICB1aW50MzJfdCBwb29saWQ7Ci0gICAgaW50IG5iX2RvbWFpbiwgbl9wb29scyA9 IDAsIGksIHA7Ci0gICAgaW50IHJjID0gMDsKLQotICAgIGlmIChjcHVwb29sKSB7Ci0gICAgICAg IGlmIChsaWJ4bF9jcHVwb29sX3F1YWxpZmllcl90b19jcHVwb29saWQoY3R4LCBjcHVwb29sLCAm cG9vbGlkLCBOVUxMKQotICAgICAgICAgICAgfHwgIWxpYnhsX2NwdXBvb2xpZF9pc192YWxpZChj dHgsIHBvb2xpZCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBjcHVw b29sIFwnJXNcJ1xuIiwgY3B1cG9vbCk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAg fQotICAgIH0KLQotICAgIGluZm8gPSBsaWJ4bF9saXN0X2RvbWFpbihjdHgsICZuYl9kb21haW4p OwotICAgIGlmICghaW5mbykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnhsX2xpc3Rf ZG9tYWluIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcG9vbGlu Zm8gPSBsaWJ4bF9saXN0X2NwdXBvb2woY3R4LCAmbl9wb29scyk7Ci0gICAgaWYgKCFwb29saW5m bykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGdldHRpbmcgY3B1cG9vbCBpbmZv XG4iKTsKLSAgICAgICAgbGlieGxfZG9taW5mb19saXN0X2ZyZWUoaW5mbywgbmJfZG9tYWluKTsK LSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgZm9yIChwID0gMDsgIXJjICYmIChwIDwg bl9wb29scyk7IHArKykgewotICAgICAgICBpZiAoKHBvb2xpbmZvW3BdLnNjaGVkICE9IHNjaGVk KSB8fAotICAgICAgICAgICAgKGNwdXBvb2wgJiYgKHBvb2xpZCAhPSBwb29saW5mb1twXS5wb29s aWQpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHBvb2xvdXRwdXQocG9vbGlu Zm9bcF0ucG9vbGlkKTsKLQotICAgICAgICBvdXRwdXQoLTEsIE5VTEwpOwotICAgICAgICBmb3Ig KGkgPSAwOyBpIDwgbmJfZG9tYWluOyBpKyspIHsKLSAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2No ZWRfcGFyYW1zIHNjaW5mbzsKLSAgICAgICAgICAgIGlmIChpbmZvW2ldLmNwdXBvb2wgIT0gcG9v bGluZm9bcF0ucG9vbGlkKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg bGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfaW5pdCgmc2NpbmZvKTsKLSAgICAgICAgICAgIHJjID0g b3V0cHV0KGluZm9baV0uZG9taWQsICZzY2luZm8pOwotICAgICAgICAgICAgbGlieGxfdmNwdV9z Y2hlZF9wYXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKLSAgICAgICAgICAgIGlmIChyYykKLSAgICAg ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxpYnhsX2NwdXBvb2xp bmZvX2xpc3RfZnJlZShwb29saW5mbywgbl9wb29scyk7Ci0gICAgbGlieGxfZG9taW5mb19saXN0 X2ZyZWUoaW5mbywgbmJfZG9tYWluKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIDxub3Ro aW5nPiAgICAgICAgICAgICA6IExpc3QgYWxsIGRvbWFpbiBwYXJhbXMgYW5kIHNjaGVkIHBhcmFt cyBmcm9tIGFsbCBwb29scwotICogLWQgW2RvbWlkXSAgICAgICAgICAgIDogTGlzdCBkb21haW4g cGFyYW1zIGZvciBkb21haW4KLSAqIC1kIFtkb21pZF0gW3BhcmFtc10gICA6IFNldCBkb21haW4g cGFyYW1zIGZvciBkb21haW4KLSAqIC1wIFtwb29sXSAgICAgICAgICAgICA6IGxpc3QgYWxsIGRv bWFpbnMgYW5kIHNjaGVkIHBhcmFtcyBmb3IgcG9vbAotICogLXMgICAgICAgICAgICAgICAgICAg IDogTGlzdCBzY2hlZCBwYXJhbXMgZm9yIHBvb2xpZCAwCi0gKiAtcyBbcGFyYW1zXSAgICAgICAg ICAgOiBTZXQgc2NoZWQgcGFyYW1zIGZvciBwb29saWQgMAotICogLXAgW3Bvb2xdIC1zICAgICAg ICAgIDogTGlzdCBzY2hlZCBwYXJhbXMgZm9yIHBvb2wKLSAqIC1wIFtwb29sXSAtcyBbcGFyYW1z XSA6IFNldCBzY2hlZCBwYXJhbXMgZm9yIHBvb2wKLSAqIC1wIFtwb29sXSAtZC4uLiAgICAgICA6 IElsbGVnYWwKLSAqLwotaW50IG1haW5fc2NoZWRfY3JlZGl0KGludCBhcmdjLCBjaGFyICoqYXJn dikKLXsKLSAgICBjb25zdCBjaGFyICpkb20gPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmNwdXBv b2wgPSBOVUxMOwotICAgIGludCB3ZWlnaHQgPSAyNTYsIGNhcCA9IDA7Ci0gICAgaW50IHRzbGlj ZSA9IDAsIHJhdGVsaW1pdCA9IDA7Ci0gICAgYm9vbCBvcHRfdyA9IGZhbHNlLCBvcHRfYyA9IGZh bHNlOwotICAgIGJvb2wgb3B0X3QgPSBmYWxzZSwgb3B0X3IgPSBmYWxzZTsKLSAgICBib29sIG9w dF9zID0gZmFsc2U7Ci0gICAgaW50IG9wdCwgcmM7Ci0gICAgc3RhdGljIHN0cnVjdCBvcHRpb24g b3B0c1tdID0gewotICAgICAgICB7ImRvbWFpbiIsIDEsIDAsICdkJ30sCi0gICAgICAgIHsid2Vp Z2h0IiwgMSwgMCwgJ3cnfSwKLSAgICAgICAgeyJjYXAiLCAxLCAwLCAnYyd9LAotICAgICAgICB7 InNjaGVkcGFyYW0iLCAwLCAwLCAncyd9LAotICAgICAgICB7InRzbGljZV9tcyIsIDEsIDAsICd0 J30sCi0gICAgICAgIHsicmF0ZWxpbWl0X3VzIiwgMSwgMCwgJ3InfSwKLSAgICAgICAgeyJjcHVw b29sIiwgMSwgMCwgJ3AnfSwKLSAgICAgICAgQ09NTU9OX0xPTkdfT1BUUwotICAgIH07Ci0KLSAg ICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiZDp3OmM6cDp0OnI6cyIsIG9wdHMsICJzY2hlZC1j cmVkaXQiLCAwKSB7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICAgIGRvbSA9IG9wdGFyZzsKLSAgICAg ICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgICAgIHdlaWdodCA9IHN0cnRvbChvcHRhcmcs IE5VTEwsIDEwKTsKLSAgICAgICAgb3B0X3cgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBj YXNlICdjJzoKLSAgICAgICAgY2FwID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOwotICAgICAg ICBvcHRfYyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3QnOgotICAgICAgICB0 c2xpY2UgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7Ci0gICAgICAgIG9wdF90ID0gdHJ1ZTsK LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICAgIHJhdGVsaW1pdCA9IHN0cnRv bChvcHRhcmcsIE5VTEwsIDEwKTsKLSAgICAgICAgb3B0X3IgPSB0cnVlOwotICAgICAgICBicmVh azsKLSAgICBjYXNlICdzJzoKLSAgICAgICAgb3B0X3MgPSB0cnVlOwotICAgICAgICBicmVhazsK LSAgICBjYXNlICdwJzoKLSAgICAgICAgY3B1cG9vbCA9IG9wdGFyZzsKLSAgICAgICAgYnJlYWs7 Ci0gICAgfQotCi0gICAgaWYgKChjcHVwb29sIHx8IG9wdF9zKSAmJiAoZG9tIHx8IG9wdF93IHx8 IG9wdF9jKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNwZWNpZnlpbmcgYSBjcHVwb29s IG9yIHNjaGVkcGFyYW0gaXMgbm90ICIKLSAgICAgICAgICAgICAgICAiYWxsb3dlZCB3aXRoIGRv bWFpbiBvcHRpb25zLlxuIik7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQot ICAgIGlmICghZG9tICYmIChvcHRfdyB8fCBvcHRfYykpIHsKLSAgICAgICAgZnByaW50ZihzdGRl cnIsICJNdXN0IHNwZWNpZnkgYSBkb21haW4uXG4iKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJ TFVSRTsKLSAgICB9Ci0gICAgaWYgKCFvcHRfcyAmJiAob3B0X3QgfHwgb3B0X3IpKSB7Ci0gICAg ICAgIGZwcmludGYoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IHNjaGVkcGFyYW0gdG8gc2V0IHNjaGVk dWxlICIKLSAgICAgICAgICAgICAgICAicGFyYW1ldGVyIHZhbHVlcy5cbiIpOwotICAgICAgICBy ZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIGlmIChvcHRfcykgewotICAgICAgICBs aWJ4bF9zY2hlZF9jcmVkaXRfcGFyYW1zIHNjcGFyYW07Ci0gICAgICAgIHVpbnQzMl90IHBvb2xp ZCA9IDA7Ci0KLSAgICAgICAgaWYgKGNwdXBvb2wpIHsKLSAgICAgICAgICAgIGlmIChsaWJ4bF9j cHVwb29sX3F1YWxpZmllcl90b19jcHVwb29saWQoY3R4LCBjcHVwb29sLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9vbGlkLCBOVUxMKSB8 fAotICAgICAgICAgICAgICAgICFsaWJ4bF9jcHVwb29saWRfaXNfdmFsaWQoY3R4LCBwb29saWQp KSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGNwdXBvb2wgXCcl c1wnXG4iLCBjcHVwb29sKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwot ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvcHRfdCAmJiAhb3B0X3Ip IHsgLyogT3V0cHV0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgaWYgKHNj aGVkX2NyZWRpdF9wb29sX291dHB1dChwb29saWQpKQotICAgICAgICAgICAgICAgIHJldHVybiBF WElUX0ZBSUxVUkU7Ci0gICAgICAgIH0gZWxzZSB7IC8qIFNldCBzY2hlZHVsaW5nIHBhcmFtZXRl cnMqLwotICAgICAgICAgICAgaWYgKHNjaGVkX2NyZWRpdF9wYXJhbXNfZ2V0KHBvb2xpZCwgJnNj cGFyYW0pKQotICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0KLSAgICAgICAg ICAgIGlmIChvcHRfdCkKLSAgICAgICAgICAgICAgICBzY3BhcmFtLnRzbGljZV9tcyA9IHRzbGlj ZTsKLQotICAgICAgICAgICAgaWYgKG9wdF9yKQotICAgICAgICAgICAgICAgIHNjcGFyYW0ucmF0 ZWxpbWl0X3VzID0gcmF0ZWxpbWl0OwotCi0gICAgICAgICAgICBpZiAoc2NoZWRfY3JlZGl0X3Bh cmFtc19zZXQocG9vbGlkLCAmc2NwYXJhbSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRf RkFJTFVSRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIWRvbSkgeyAvKiBsaXN0IGFsbCBk b21haW4ncyBjcmVkaXQgc2NoZWR1bGVyIGluZm8gKi8KLSAgICAgICAgaWYgKHNjaGVkX2RvbWFp bl9vdXRwdXQoTElCWExfU0NIRURVTEVSX0NSRURJVCwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2NoZWRfY3JlZGl0X2RvbWFpbl9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNjaGVkX2NyZWRpdF9wb29sX291dHB1dCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY3B1cG9vbCkpCi0gICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJF OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IGRvbWlkID0geGZpbmRfZG9tYWluKGRv bSk7Ci0KLSAgICAgICAgaWYgKCFvcHRfdyAmJiAhb3B0X2MpIHsgLyogb3V0cHV0IGNyZWRpdCBz Y2hlZHVsZXIgaW5mbyAqLwotICAgICAgICAgICAgc2NoZWRfY3JlZGl0X2RvbWFpbl9vdXRwdXQo LTEpOwotICAgICAgICAgICAgaWYgKHNjaGVkX2NyZWRpdF9kb21haW5fb3V0cHV0KGRvbWlkKSkK LSAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICB9IGVsc2UgeyAv KiBzZXQgY3JlZGl0IHNjaGVkdWxlciBwYXJhbWF0ZXJzICovCi0gICAgICAgICAgICBsaWJ4bF9k b21haW5fc2NoZWRfcGFyYW1zIHNjaW5mbzsKLSAgICAgICAgICAgIGxpYnhsX2RvbWFpbl9zY2hl ZF9wYXJhbXNfaW5pdCgmc2NpbmZvKTsKLSAgICAgICAgICAgIHNjaW5mby5zY2hlZCA9IExJQlhM X1NDSEVEVUxFUl9DUkVESVQ7Ci0gICAgICAgICAgICBpZiAob3B0X3cpCi0gICAgICAgICAgICAg ICAgc2NpbmZvLndlaWdodCA9IHdlaWdodDsKLSAgICAgICAgICAgIGlmIChvcHRfYykKLSAgICAg ICAgICAgICAgICBzY2luZm8uY2FwID0gY2FwOwotICAgICAgICAgICAgcmMgPSBzY2hlZF9kb21h aW5fc2V0KGRvbWlkLCAmc2NpbmZvKTsKLSAgICAgICAgICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9w YXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKLSAgICAgICAgICAgIGlmIChyYykKLSAgICAgICAgICAg ICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu IEVYSVRfU1VDQ0VTUzsKLX0KLQotaW50IG1haW5fc2NoZWRfY3JlZGl0MihpbnQgYXJnYywgY2hh ciAqKmFyZ3YpCi17Ci0gICAgY29uc3QgY2hhciAqZG9tID0gTlVMTDsKLSAgICBjb25zdCBjaGFy ICpjcHVwb29sID0gTlVMTDsKLSAgICBpbnQgcmF0ZWxpbWl0ID0gMDsKLSAgICBpbnQgd2VpZ2h0 ID0gMjU2OwotICAgIGJvb2wgb3B0X3MgPSBmYWxzZTsKLSAgICBib29sIG9wdF9yID0gZmFsc2U7 Ci0gICAgYm9vbCBvcHRfdyA9IGZhbHNlOwotICAgIGludCBvcHQsIHJjOwotICAgIHN0YXRpYyBz dHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKLSAgICAgICAgeyJkb21haW4iLCAxLCAwLCAnZCd9LAot ICAgICAgICB7IndlaWdodCIsIDEsIDAsICd3J30sCi0gICAgICAgIHsic2NoZWRwYXJhbSIsIDAs IDAsICdzJ30sCi0gICAgICAgIHsicmF0ZWxpbWl0X3VzIiwgMSwgMCwgJ3InfSwKLSAgICAgICAg eyJjcHVwb29sIiwgMSwgMCwgJ3AnfSwKLSAgICAgICAgQ09NTU9OX0xPTkdfT1BUUwotICAgIH07 Ci0KLSAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiZDp3OnA6cjpzIiwgb3B0cywgInNjaGVk LWNyZWRpdDIiLCAwKSB7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICAgIGRvbSA9IG9wdGFyZzsKLSAg ICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgICAgIHdlaWdodCA9IHN0cnRvbChvcHRh cmcsIE5VTEwsIDEwKTsKLSAgICAgICAgb3B0X3cgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAg ICBjYXNlICdzJzoKLSAgICAgICAgb3B0X3MgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBj YXNlICdyJzoKLSAgICAgICAgcmF0ZWxpbWl0ID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOwot ICAgICAgICBvcHRfciA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgotICAg ICAgICBjcHVwb29sID0gb3B0YXJnOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAo Y3B1cG9vbCAmJiAoZG9tIHx8IG9wdF93KSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNw ZWNpZnlpbmcgYSBjcHVwb29sIGlzIG5vdCBhbGxvd2VkIHdpdGggb3RoZXIgIgotICAgICAgICAg ICAgICAgICJvcHRpb25zLlxuIik7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAg fQotICAgIGlmICghZG9tICYmIG9wdF93KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTXVz dCBzcGVjaWZ5IGEgZG9tYWluLlxuIik7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0g ICAgfQotCi0gICAgaWYgKG9wdF9zKSB7Ci0gICAgICAgIGxpYnhsX3NjaGVkX2NyZWRpdDJfcGFy YW1zIHNjcGFyYW07Ci0gICAgICAgIHVpbnQzMl90IHBvb2xpZCA9IDA7Ci0KLSAgICAgICAgaWYg KGNwdXBvb2wpIHsKLSAgICAgICAgICAgIGlmIChsaWJ4bF9jcHVwb29sX3F1YWxpZmllcl90b19j cHVwb29saWQoY3R4LCBjcHVwb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAmcG9vbGlkLCBOVUxMKSB8fAotICAgICAgICAgICAgICAgICFs aWJ4bF9jcHVwb29saWRfaXNfdmFsaWQoY3R4LCBwb29saWQpKSB7Ci0gICAgICAgICAgICAgICAg ZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGNwdXBvb2wgXCclc1wnXG4iLCBjcHVwb29sKTsKLSAg ICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICAgICAgfQotICAgICAg ICB9Ci0KLSAgICAgICAgaWYgKCFvcHRfcikgeyAvKiBPdXRwdXQgc2NoZWR1bGluZyBwYXJhbWV0 ZXJzICovCi0gICAgICAgICAgICBpZiAoc2NoZWRfY3JlZGl0Ml9wb29sX291dHB1dChwb29saWQp KQotICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgICAgIH0gZWxzZSB7 ICAgICAgLyogU2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyAoc28gZmFyLCBqdXN0IHJhdGVsaW1p dCkgKi8KLSAgICAgICAgICAgIHNjcGFyYW0ucmF0ZWxpbWl0X3VzID0gcmF0ZWxpbWl0OwotICAg ICAgICAgICAgaWYgKHNjaGVkX2NyZWRpdDJfcGFyYW1zX3NldChwb29saWQsICZzY3BhcmFtKSkK LSAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICB9Ci0gICAgfSBl bHNlIGlmICghZG9tKSB7IC8qIGxpc3QgYWxsIGRvbWFpbidzIGNyZWRpdCBzY2hlZHVsZXIgaW5m byAqLwotICAgICAgICBpZiAoc2NoZWRfZG9tYWluX291dHB1dChMSUJYTF9TQ0hFRFVMRVJfQ1JF RElUMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWRfY3JlZGl0Ml9kb21h aW5fb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZF9jcmVkaXQy X3Bvb2xfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVwb29sKSkK LSAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg dWludDMyX3QgZG9taWQgPSB4ZmluZF9kb21haW4oZG9tKTsKLQotICAgICAgICBpZiAoIW9wdF93 KSB7IC8qIG91dHB1dCBjcmVkaXQyIHNjaGVkdWxlciBpbmZvICovCi0gICAgICAgICAgICBzY2hl ZF9jcmVkaXQyX2RvbWFpbl9vdXRwdXQoLTEpOwotICAgICAgICAgICAgaWYgKHNjaGVkX2NyZWRp dDJfZG9tYWluX291dHB1dChkb21pZCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJ TFVSRTsKLSAgICAgICAgfSBlbHNlIHsgLyogc2V0IGNyZWRpdDIgc2NoZWR1bGVyIHBhcmFtYXRl cnMgKi8KLSAgICAgICAgICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXMgc2NpbmZvOwotICAg ICAgICAgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFtc19pbml0KCZzY2luZm8pOwotICAgICAg ICAgICAgc2NpbmZvLnNjaGVkID0gTElCWExfU0NIRURVTEVSX0NSRURJVDI7Ci0gICAgICAgICAg ICBpZiAob3B0X3cpCi0gICAgICAgICAgICAgICAgc2NpbmZvLndlaWdodCA9IHdlaWdodDsKLSAg ICAgICAgICAgIHJjID0gc2NoZWRfZG9tYWluX3NldChkb21pZCwgJnNjaW5mbyk7Ci0gICAgICAg ICAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zX2Rpc3Bvc2UoJnNjaW5mbyk7Ci0gICAgICAg ICAgICBpZiAocmMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAg ICAgfQotICAgIH0KLQotICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19Ci0KLS8qCi0gKiA8bm90 aGluZz4gICAgICAgICAgICA6IExpc3QgYWxsIGRvbWFpbiBwYXJhbXRlcnMgYW5kIHNjaGVkIHBh cmFtcwotICogLWQgW2RvbWlkXSAgICAgICAgICAgOiBMaXN0IGRlZmF1bHQgZG9tYWluIHBhcmFt cyBmb3IgZG9tYWluCi0gKiAtZCBbZG9taWRdIFtwYXJhbXNdICA6IFNldCBkb21haW4gcGFyYW1z IGZvciBkb21haW4KLSAqIC1kIFtkb21pZF0gLXYgW3ZjcHVpZCAxXSAtdiBbdmNwdWlkIDJdIC4u LiAgOgotICogTGlzdCBwZXItVkNQVSBwYXJhbXMgZm9yIGRvbWFpbgotICogLWQgW2RvbWlkXSAt diBhbGwgIDogTGlzdCBhbGwgcGVyLVZDUFUgcGFyYW1zIGZvciBkb21haW4KLSAqIC12IGFsbCAg OiBMaXN0IGFsbCBwZXItVkNQVSBwYXJhbXMgZm9yIGFsbCBkb21haW5zCi0gKiAtZCBbZG9taWRd IC12IFt2Y3B1aWQgMV0gW3BhcmFtc10gLXYgW3ZjcHVpZCAyXSBbcGFyYW1zXSAuLi4gIDoKLSAq IFNldCBwZXItVkNQVSBwYXJhbXMgZm9yIGRvbWFpbgotICogLWQgW2RvbWlkXSAtdiBhbGwgW3Bh cmFtc10gIDogU2V0IGFsbCBwZXItVkNQVSBwYXJhbXMgZm9yIGRvbWFpbgotICovCi1pbnQgbWFp bl9zY2hlZF9ydGRzKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBjb25zdCBjaGFyICpk b20gPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmNwdXBvb2wgPSBOVUxMOwotICAgIGludCAqdmNw dXMgPSAoaW50ICopeG1hbGxvYyhzaXplb2YoaW50KSk7IC8qIElEcyBvZiBWQ1BVcyB0aGF0IGNo YW5nZSAqLwotICAgIGludCAqcGVyaW9kcyA9IChpbnQgKil4bWFsbG9jKHNpemVvZihpbnQpKTsg LyogcGVyaW9kIGlzIGluIG1pY3Jvc2Vjb25kICovCi0gICAgaW50ICpidWRnZXRzID0gKGludCAq KXhtYWxsb2Moc2l6ZW9mKGludCkpOyAvKiBidWRnZXQgaXMgaW4gbWljcm9zZWNvbmQgKi8KLSAg ICBpbnQgdl9zaXplID0gMTsgLyogc2l6ZSBvZiB2Y3B1cyBhcnJheSAqLwotICAgIGludCBwX3Np emUgPSAxOyAvKiBzaXplIG9mIHBlcmlvZHMgYXJyYXkgKi8KLSAgICBpbnQgYl9zaXplID0gMTsg Lyogc2l6ZSBvZiBidWRnZXRzIGFycmF5ICovCi0gICAgaW50IHZfaW5kZXggPSAwOyAvKiBpbmRl eCBpbiB2Y3B1cyBhcnJheSAqLwotICAgIGludCBwX2luZGV4ID0wOyAvKiBpbmRleCBpbiBwZXJp b2RzIGFycmF5ICovCi0gICAgaW50IGJfaW5kZXggPTA7IC8qIGluZGV4IGZvciBpbiBidWRnZXRz IGFycmF5ICovCi0gICAgYm9vbCBvcHRfcCA9IGZhbHNlOwotICAgIGJvb2wgb3B0X2IgPSBmYWxz ZTsKLSAgICBib29sIG9wdF92ID0gZmFsc2U7Ci0gICAgYm9vbCBvcHRfYWxsID0gZmFsc2U7IC8q IG91dHB1dCBwZXItZG9tIHBhcmFtZXRlcnMgKi8KLSAgICBpbnQgb3B0LCBpLCByYywgcjsKLSAg ICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7Ci0gICAgICAgIHsiZG9tYWluIiwgMSwg MCwgJ2QnfSwKLSAgICAgICAgeyJwZXJpb2QiLCAxLCAwLCAncCd9LAotICAgICAgICB7ImJ1ZGdl dCIsIDEsIDAsICdiJ30sCi0gICAgICAgIHsidmNwdWlkIiwxLCAwLCAndid9LAotICAgICAgICB7 ImNwdXBvb2wiLCAxLCAwLCAnYyd9LAotICAgICAgICBDT01NT05fTE9OR19PUFRTCi0gICAgfTsK LQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICJkOnA6Yjp2OmMiLCBvcHRzLCAic2NoZWQt cnRkcyIsIDApIHsKLSAgICBjYXNlICdkJzoKLSAgICAgICAgZG9tID0gb3B0YXJnOwotICAgICAg ICBicmVhazsKLSAgICBjYXNlICdwJzoKLSAgICAgICAgaWYgKHBfaW5kZXggPj0gcF9zaXplKSB7 Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogcGVyaW9kcyBhcnJheSBpcyBmdWxsCi0g ICAgICAgICAgICAgKiBkb3VibGUgdGhlIGFycmF5IHNpemUgZm9yIG5ldyBlbGVtZW50cwotICAg ICAgICAgICAgICovCi0gICAgICAgICAgICBwX3NpemUgKj0gMjsKLSAgICAgICAgICAgIHBlcmlv ZHMgPSB4cmVhbGxvYyhwZXJpb2RzLCBwX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmlv ZHNbcF9pbmRleCsrXSA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKLSAgICAgICAgb3B0X3Ag PSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgICAgaWYgKGJfaW5kZXgg Pj0gYl9zaXplKSB7IC8qIGJ1ZGdldHMgYXJyYXkgaXMgZnVsbCAqLwotICAgICAgICAgICAgYl9z aXplICo9IDI7Ci0gICAgICAgICAgICBidWRnZXRzID0geHJlYWxsb2MoYnVkZ2V0cywgYl9zaXpl KTsKLSAgICAgICAgfQotICAgICAgICBidWRnZXRzW2JfaW5kZXgrK10gPSBzdHJ0b2wob3B0YXJn LCBOVUxMLCAxMCk7Ci0gICAgICAgIG9wdF9iID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2Fz ZSAndic6Ci0gICAgICAgIGlmICghc3RyY21wKG9wdGFyZywgImFsbCIpKSB7IC8qIGdldCBvciBz ZXQgYWxsIHZjcHVzIG9mIGEgZG9tYWluICovCi0gICAgICAgICAgICBvcHRfYWxsID0gMTsKLSAg ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2X2luZGV4ID49IHZfc2l6 ZSkgeyAvKiB2Y3B1cyBhcnJheSBpcyBmdWxsICovCi0gICAgICAgICAgICB2X3NpemUgKj0gMjsK LSAgICAgICAgICAgIHZjcHVzID0geHJlYWxsb2ModmNwdXMsIHZfc2l6ZSk7Ci0gICAgICAgIH0K LSAgICAgICAgdmNwdXNbdl9pbmRleCsrXSA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKLSAg ICAgICAgb3B0X3YgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgICAg Y3B1cG9vbCA9IG9wdGFyZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGNwdXBv b2wgJiYgKGRvbSB8fCBvcHRfcCB8fCBvcHRfYiB8fCBvcHRfdiB8fCBvcHRfYWxsKSkgewotICAg ICAgICBmcHJpbnRmKHN0ZGVyciwgIlNwZWNpZnlpbmcgYSBjcHVwb29sIGlzIG5vdCBhbGxvd2Vk IHdpdGggIgotICAgICAgICAgICAgICAgICJvdGhlciBvcHRpb25zLlxuIik7Ci0gICAgICAgIHIg PSBFWElUX0ZBSUxVUkU7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoIWRvbSAm JiAob3B0X3AgfHwgb3B0X2IgfHwgb3B0X3YpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAi TWlzc2luZyBwYXJhbWV0ZXJzLlxuIik7Ci0gICAgICAgIHIgPSBFWElUX0ZBSUxVUkU7Ci0gICAg ICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoZG9tICYmICFvcHRfdiAmJiAhb3B0X2FsbCAm JiAob3B0X3AgfHwgb3B0X2IpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTXVzdCBzcGVj aWZ5IFZDUFUuXG4iKTsKLSAgICAgICAgciA9IEVYSVRfRkFJTFVSRTsKLSAgICAgICAgZ290byBv dXQ7Ci0gICAgfQotICAgIGlmIChvcHRfdiAmJiBvcHRfYWxsKSB7Ci0gICAgICAgIGZwcmludGYo c3RkZXJyLCAiSW5jb3JyZWN0IFZDUFUgSURzLlxuIik7Ci0gICAgICAgIHIgPSBFWElUX0ZBSUxV UkU7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCh2X2luZGV4ID4gYl9pbmRl eCkgJiYgb3B0X2IpIHx8ICgodl9pbmRleCA+IHBfaW5kZXgpICYmIG9wdF9wKQotICAgICAgICB8 fCBwX2luZGV4ICE9IGJfaW5kZXgpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbmNvcnJl Y3QgbnVtYmVyIG9mIHBlcmlvZCBhbmQgYnVkZ2V0XG4iKTsKLSAgICAgICAgciA9IEVYSVRfRkFJ TFVSRTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgaWYgKCghZG9tKSAmJiBvcHRf YWxsKSB7Ci0gICAgICAgIC8qIGdldCBhbGwgZG9tYWluJ3MgcGVyLXZjcHUgcnRkcyBzY2hlZHVs ZXIgcGFyYW1ldGVycyAqLwotICAgICAgICByYyA9IC1zY2hlZF92Y3B1X291dHB1dChMSUJYTF9T Q0hFRFVMRVJfUlREUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWRfcnRk c192Y3B1X291dHB1dF9hbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVk X3J0ZHNfcG9vbF9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdXBv b2wpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIHIgPSBFWElUX0ZBSUxVUkU7Ci0g ICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIWRvbSAmJiAh b3B0X2FsbCkgewotICAgICAgICAvKiBsaXN0IGFsbCBkb21haW4ncyBkZWZhdWx0IHNjaGVkdWxp bmcgcGFyYW1ldGVycyAqLwotICAgICAgICByYyA9IC1zY2hlZF9kb21haW5fb3V0cHV0KExJQlhM X1NDSEVEVUxFUl9SVERTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVk X3J0ZHNfZG9tYWluX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz Y2hlZF9ydGRzX3Bvb2xfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNwdXBvb2wpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIHIgPSBFWElUX0ZBSUxV UkU7Ci0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAg ICAgIHVpbnQzMl90IGRvbWlkID0geGZpbmRfZG9tYWluKGRvbSk7Ci0gICAgICAgIGlmICghb3B0 X3YgJiYgIW9wdF9hbGwpIHsgLyogb3V0cHV0IGRlZmF1bHQgc2NoZWR1bGluZyBwYXJhbWV0ZXJz ICovCi0gICAgICAgICAgICBzY2hlZF9ydGRzX2RvbWFpbl9vdXRwdXQoLTEpOwotICAgICAgICAg ICAgcmMgPSAtc2NoZWRfcnRkc19kb21haW5fb3V0cHV0KGRvbWlkKTsKLSAgICAgICAgICAgIGlm IChyYykgewotICAgICAgICAgICAgICAgIHIgPSBFWElUX0ZBSUxVUkU7Ci0gICAgICAgICAgICAg ICAgZ290byBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW9wdF9wICYm ICFvcHRfYikgewotICAgICAgICAgICAgLyogZ2V0IHBlci12Y3B1IHJ0ZHMgc2NoZWR1bGluZyBw YXJhbWV0ZXJzICovCi0gICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyBzY2luZm87 Ci0gICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19pbml0KCZzY2luZm8pOwotICAg ICAgICAgICAgc2NoZWRfcnRkc192Y3B1X291dHB1dCgtMSwgJnNjaW5mbyk7Ci0gICAgICAgICAg ICBzY2luZm8ubnVtX3ZjcHVzID0gdl9pbmRleDsKLSAgICAgICAgICAgIGlmICh2X2luZGV4ID4g MCkgewotICAgICAgICAgICAgICAgIHNjaW5mby52Y3B1cyA9IChsaWJ4bF9zY2hlZF9wYXJhbXMg KikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWFsbG9jKHNpemVvZihsaWJ4bF9z Y2hlZF9wYXJhbXMpICogKHZfaW5kZXgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBp IDwgdl9pbmRleDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBzY2luZm8udmNwdXNbaV0udmNw dWlkID0gdmNwdXNbaV07Ci0gICAgICAgICAgICAgICAgcmMgPSAtc2NoZWRfcnRkc192Y3B1X291 dHB1dChkb21pZCwgJnNjaW5mbyk7Ci0gICAgICAgICAgICB9IGVsc2UgLyogZ2V0IHBhcmFtcyBm b3IgYWxsIHZjcHVzICovCi0gICAgICAgICAgICAgICAgcmMgPSAtc2NoZWRfcnRkc192Y3B1X291 dHB1dF9hbGwoZG9taWQsICZzY2luZm8pOwotICAgICAgICAgICAgbGlieGxfdmNwdV9zY2hlZF9w YXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKLSAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAg ICAgICAgIHIgPSBFWElUX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAg ICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvcHRfdiB8fCBvcHRfYWxsKSB7Ci0gICAgICAgICAg ICAvKiBzZXQgcGVyLXZjcHUgcnRkcyBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKi8KLSAgICAgICAg ICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zIHNjaW5mbzsKLSAgICAgICAgICAgIGxpYnhsX3Zj cHVfc2NoZWRfcGFyYW1zX2luaXQoJnNjaW5mbyk7Ci0gICAgICAgICAgICBzY2luZm8uc2NoZWQg PSBMSUJYTF9TQ0hFRFVMRVJfUlREUzsKLSAgICAgICAgICAgIGlmICh2X2luZGV4ID4gMCkgewot ICAgICAgICAgICAgICAgIHNjaW5mby5udW1fdmNwdXMgPSB2X2luZGV4OwotICAgICAgICAgICAg ICAgIHNjaW5mby52Y3B1cyA9IChsaWJ4bF9zY2hlZF9wYXJhbXMgKikKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB4bWFsbG9jKHNpemVvZihsaWJ4bF9zY2hlZF9wYXJhbXMpICogKHZf aW5kZXgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdl9pbmRleDsgaSsrKSB7 Ci0gICAgICAgICAgICAgICAgICAgIHNjaW5mby52Y3B1c1tpXS52Y3B1aWQgPSB2Y3B1c1tpXTsK LSAgICAgICAgICAgICAgICAgICAgc2NpbmZvLnZjcHVzW2ldLnBlcmlvZCA9IHBlcmlvZHNbaV07 Ci0gICAgICAgICAgICAgICAgICAgIHNjaW5mby52Y3B1c1tpXS5idWRnZXQgPSBidWRnZXRzW2ld OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByYyA9IHNjaGVkX3ZjcHVfc2V0 KGRvbWlkLCAmc2NpbmZvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8qIHNldCBwYXJhbXMgZm9y IGFsbCB2Y3B1cyAqLwotICAgICAgICAgICAgICAgIHNjaW5mby5udW1fdmNwdXMgPSAxOwotICAg ICAgICAgICAgICAgIHNjaW5mby52Y3B1cyA9IChsaWJ4bF9zY2hlZF9wYXJhbXMgKikKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB4bWFsbG9jKHNpemVvZihsaWJ4bF9zY2hlZF9wYXJh bXMpKTsKLSAgICAgICAgICAgICAgICBzY2luZm8udmNwdXNbMF0ucGVyaW9kID0gcGVyaW9kc1sw XTsKLSAgICAgICAgICAgICAgICBzY2luZm8udmNwdXNbMF0uYnVkZ2V0ID0gYnVkZ2V0c1swXTsK LSAgICAgICAgICAgICAgICByYyA9IHNjaGVkX3ZjcHVfc2V0X2FsbChkb21pZCwgJnNjaW5mbyk7 Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2Rp c3Bvc2UoJnNjaW5mbyk7Ci0gICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICBy ID0gRVhJVF9GQUlMVVJFOwotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICAgICAg fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgciA9IEVYSVRfU1VDQ0VTUzsKLW91dDoKLSAgICBm cmVlKHZjcHVzKTsKLSAgICBmcmVlKHBlcmlvZHMpOwotICAgIGZyZWUoYnVkZ2V0cyk7Ci0gICAg cmV0dXJuIHI7Ci19Ci0KIGludCBtYWluX2RvbWlkKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsK ICAgICB1aW50MzJfdCBkb21pZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3hsL3hsX3NjaGVkLmMgYi90 b29scy94bC94bF9zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAu LjUwYjI1NGRhODEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy94bC94bF9zY2hlZC5jCkBAIC0w LDAgKzEsODg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDktMjAxNyBDaXRyaXggTHRkIGFuZCBv dGhlciBjb250cmlidXRvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk CisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuMSBvbmx5LiB3 aXRoIHRoZSBzcGVjaWFsCisgKiBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmls ZSBMSUNFTlNFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNs dWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGlieGwu aD4KKyNpbmNsdWRlIDxsaWJ4bF91dGlscy5oPgorI2luY2x1ZGUgPGxpYnhsdXRpbC5oPgorCisj aW5jbHVkZSAieGwuaCIKKyNpbmNsdWRlICJ4bF91dGlscy5oIgorI2luY2x1ZGUgInhsX3BhcnNl LmgiCisKK3N0YXRpYyBpbnQgc2NoZWRfZG9tYWluX2dldChsaWJ4bF9zY2hlZHVsZXIgc2NoZWQs IGludCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9kb21haW5fc2No ZWRfcGFyYW1zICpzY2luZm8pCit7CisgICAgaWYgKGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNf Z2V0KGN0eCwgZG9taWQsIHNjaW5mbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4 bF9kb21haW5fc2NoZWRfcGFyYW1zX2dldCBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7 CisgICAgfQorICAgIGlmIChzY2luZm8tPnNjaGVkICE9IHNjaGVkKSB7CisgICAgICAgIGZwcmlu dGYoc3RkZXJyLCAibGlieGxfZG9tYWluX3NjaGVkX3BhcmFtc19nZXQgcmV0dXJuZWQgJXMgbm90 ICVzLlxuIiwKKyAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZHVsZXJfdG9fc3RyaW5nKHNjaW5m by0+c2NoZWQpLAorICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcoc2No ZWQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgc2NoZWRfZG9tYWluX3NldChpbnQgZG9taWQsIGNvbnN0IGxpYnhsX2RvbWFpbl9z Y2hlZF9wYXJhbXMgKnNjaW5mbykKK3sKKyAgICBpZiAobGlieGxfZG9tYWluX3NjaGVkX3BhcmFt c19zZXQoY3R4LCBkb21pZCwgc2NpbmZvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxp YnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfc2V0IGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4g MTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hlZF92Y3B1X2dl dChsaWJ4bF9zY2hlZHVsZXIgc2NoZWQsIGludCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykKK3sKKyAgICBpbnQgcmM7CisK KyAgICByYyA9IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2dldChjdHgsIGRvbWlkLCBzY2luZm8p OworICAgIGlmIChyYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnhsX3ZjcHVfc2No ZWRfcGFyYW1zX2dldCBmYWlsZWQuXG4iKTsKKyAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwor ICAgIH0KKyAgICBpZiAoc2NpbmZvLT5zY2hlZCAhPSBzY2hlZCkgeworICAgICAgICBmcHJpbnRm KHN0ZGVyciwgImxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2dldCByZXR1cm5lZCAlcyBub3QgJXMu XG4iLAorICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcoc2NpbmZvLT5z Y2hlZCksCisgICAgICAgICAgICAgICAgbGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhzY2hlZCkp OworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBzY2hlZF92Y3B1X2dldF9hbGwobGlieGxfc2NoZWR1bGVyIHNjaGVkLCBpbnQgZG9taWQs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAq c2NpbmZvKQoreworICAgIGludCByYzsKKworICAgIHJjID0gbGlieGxfdmNwdV9zY2hlZF9wYXJh bXNfZ2V0X2FsbChjdHgsIGRvbWlkLCBzY2luZm8pOworICAgIGlmIChyYykgeworICAgICAgICBm cHJpbnRmKHN0ZGVyciwgImxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2dldF9hbGwgZmFpbGVkLlxu Iik7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgaWYgKHNjaW5mby0+ c2NoZWQgIT0gc2NoZWQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF92Y3B1X3Nj aGVkX3BhcmFtc19nZXRfYWxsIHJldHVybmVkICVzIG5vdCAlcy5cbiIsCisgICAgICAgICAgICAg ICAgbGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhzY2luZm8tPnNjaGVkKSwKKyAgICAgICAgICAg ICAgICBsaWJ4bF9zY2hlZHVsZXJfdG9fc3RyaW5nKHNjaGVkKSk7CisgICAgICAgIHJldHVybiAx OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVkX3ZjcHVfc2V0 KGludCBkb21pZCwgY29uc3QgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykKK3sKKyAg ICBpbnQgcmM7CisKKyAgICByYyA9IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX3NldChjdHgsIGRv bWlkLCBzY2luZm8pOworICAgIGlmIChyYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxp YnhsX3ZjcHVfc2NoZWRfcGFyYW1zX3NldCBmYWlsZWQuXG4iKTsKKyAgICAgICAgZXhpdChFWElU X0ZBSUxVUkUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVk X3ZjcHVfc2V0X2FsbChpbnQgZG9taWQsIGNvbnN0IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpz Y2luZm8pCit7CisgICAgaW50IHJjOworCisgICAgcmMgPSBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFt c19zZXRfYWxsKGN0eCwgZG9taWQsIHNjaW5mbyk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIGZw cmludGYoc3RkZXJyLCAibGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfc2V0X2FsbCBmYWlsZWQuXG4i KTsKKyAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIHJldHVybiAwOwor fQorCitzdGF0aWMgaW50IHNjaGVkX2NyZWRpdF9wYXJhbXNfc2V0KGludCBwb29saWQsIGxpYnhs X3NjaGVkX2NyZWRpdF9wYXJhbXMgKnNjaW5mbykKK3sKKyAgICBpZiAobGlieGxfc2NoZWRfY3Jl ZGl0X3BhcmFtc19zZXQoY3R4LCBwb29saWQsIHNjaW5mbykpIHsKKyAgICAgICAgZnByaW50Zihz dGRlcnIsICJsaWJ4bF9zY2hlZF9jcmVkaXRfcGFyYW1zX3NldCBmYWlsZWQuXG4iKTsKKyAgICAg ICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2No ZWRfY3JlZGl0X3BhcmFtc19nZXQoaW50IHBvb2xpZCwgbGlieGxfc2NoZWRfY3JlZGl0X3BhcmFt cyAqc2NpbmZvKQoreworICAgIGlmIChsaWJ4bF9zY2hlZF9jcmVkaXRfcGFyYW1zX2dldChjdHgs IHBvb2xpZCwgc2NpbmZvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnhsX3NjaGVk X2NyZWRpdF9wYXJhbXNfZ2V0IGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9 CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hlZF9jcmVkaXRfZG9tYWluX291 dHB1dChpbnQgZG9taWQpCit7CisgICAgY2hhciAqZG9tbmFtZTsKKyAgICBsaWJ4bF9kb21haW5f c2NoZWRfcGFyYW1zIHNjaW5mbzsKKworICAgIGlmIChkb21pZCA8IDApIHsKKyAgICAgICAgcHJp bnRmKCIlLTMzcyAlNHMgJTZzICU0c1xuIiwgIk5hbWUiLCAiSUQiLCAiV2VpZ2h0IiwgIkNhcCIp OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFy YW1zX2luaXQoJnNjaW5mbyk7CisgICAgaWYgKHNjaGVkX2RvbWFpbl9nZXQoTElCWExfU0NIRURV TEVSX0NSRURJVCwgZG9taWQsICZzY2luZm8pKSB7CisgICAgICAgIGxpYnhsX2RvbWFpbl9zY2hl ZF9wYXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAg IGRvbW5hbWUgPSBsaWJ4bF9kb21pZF90b19uYW1lKGN0eCwgZG9taWQpOworICAgIHByaW50Zigi JS0zM3MgJTRkICU2ZCAlNGRcbiIsCisgICAgICAgIGRvbW5hbWUsCisgICAgICAgIGRvbWlkLAor ICAgICAgICBzY2luZm8ud2VpZ2h0LAorICAgICAgICBzY2luZm8uY2FwKTsKKyAgICBmcmVlKGRv bW5hbWUpOworICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsK KyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hlZF9jcmVkaXRfcG9vbF9vdXRwdXQo dWludDMyX3QgcG9vbGlkKQoreworICAgIGxpYnhsX3NjaGVkX2NyZWRpdF9wYXJhbXMgc2NwYXJh bTsKKyAgICBjaGFyICpwb29sbmFtZTsKKworICAgIHBvb2xuYW1lID0gbGlieGxfY3B1cG9vbGlk X3RvX25hbWUoY3R4LCBwb29saWQpOworICAgIGlmIChzY2hlZF9jcmVkaXRfcGFyYW1zX2dldChw b29saWQsICZzY3BhcmFtKSkgeworICAgICAgICBwcmludGYoIkNwdXBvb2wgJXM6IFtzY2hlZCBw YXJhbXMgdW5hdmFpbGFibGVdXG4iLAorICAgICAgICAgICAgICAgcG9vbG5hbWUpOworICAgIH0g ZWxzZSB7CisgICAgICAgIHByaW50ZigiQ3B1cG9vbCAlczogdHNsaWNlPSVkbXMgcmF0ZWxpbWl0 PSVkdXNcbiIsCisgICAgICAgICAgICAgICBwb29sbmFtZSwKKyAgICAgICAgICAgICAgIHNjcGFy YW0udHNsaWNlX21zLAorICAgICAgICAgICAgICAgc2NwYXJhbS5yYXRlbGltaXRfdXMpOworICAg IH0KKyAgICBmcmVlKHBvb2xuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBz Y2hlZF9jcmVkaXQyX3BhcmFtc19zZXQoaW50IHBvb2xpZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkX2NyZWRpdDJfcGFyYW1zICpzY2luZm8pCit7Cisg ICAgaWYgKGxpYnhsX3NjaGVkX2NyZWRpdDJfcGFyYW1zX3NldChjdHgsIHBvb2xpZCwgc2NpbmZv KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnhsX3NjaGVkX2NyZWRpdDJfcGFyYW1z X3NldCBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgc2NoZWRfY3JlZGl0Ml9wYXJhbXNfZ2V0KGludCBwb29saWQs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZF9jcmVkaXQy X3BhcmFtcyAqc2NpbmZvKQoreworICAgIGlmIChsaWJ4bF9zY2hlZF9jcmVkaXQyX3BhcmFtc19n ZXQoY3R4LCBwb29saWQsIHNjaW5mbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4 bF9zY2hlZF9jcmVkaXQyX3BhcmFtc19nZXQgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiAx OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVkX2NyZWRpdDJf ZG9tYWluX291dHB1dChpbnQgZG9taWQpCit7CisgICAgY2hhciAqZG9tbmFtZTsKKyAgICBsaWJ4 bF9kb21haW5fc2NoZWRfcGFyYW1zIHNjaW5mbzsKKworICAgIGlmIChkb21pZCA8IDApIHsKKyAg ICAgICAgcHJpbnRmKCIlLTMzcyAlNHMgJTZzXG4iLCAiTmFtZSIsICJJRCIsICJXZWlnaHQiKTsK KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFt c19pbml0KCZzY2luZm8pOworICAgIGlmIChzY2hlZF9kb21haW5fZ2V0KExJQlhMX1NDSEVEVUxF Ul9DUkVESVQyLCBkb21pZCwgJnNjaW5mbykpIHsKKyAgICAgICAgbGlieGxfZG9tYWluX3NjaGVk X3BhcmFtc19kaXNwb3NlKCZzY2luZm8pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAg ZG9tbmFtZSA9IGxpYnhsX2RvbWlkX3RvX25hbWUoY3R4LCBkb21pZCk7CisgICAgcHJpbnRmKCIl LTMzcyAlNGQgJTZkXG4iLAorICAgICAgICBkb21uYW1lLAorICAgICAgICBkb21pZCwKKyAgICAg ICAgc2NpbmZvLndlaWdodCk7CisgICAgZnJlZShkb21uYW1lKTsKKyAgICBsaWJ4bF9kb21haW5f c2NoZWRfcGFyYW1zX2Rpc3Bvc2UoJnNjaW5mbyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgc2NoZWRfY3JlZGl0Ml9wb29sX291dHB1dCh1aW50MzJfdCBwb29saWQpCit7CisgICAg bGlieGxfc2NoZWRfY3JlZGl0Ml9wYXJhbXMgc2NwYXJhbTsKKyAgICBjaGFyICpwb29sbmFtZSA9 IGxpYnhsX2NwdXBvb2xpZF90b19uYW1lKGN0eCwgcG9vbGlkKTsKKworICAgIGlmIChzY2hlZF9j cmVkaXQyX3BhcmFtc19nZXQocG9vbGlkLCAmc2NwYXJhbSkpCisgICAgICAgIHByaW50ZigiQ3B1 cG9vbCAlczogW3NjaGVkIHBhcmFtcyB1bmF2YWlsYWJsZV1cbiIsIHBvb2xuYW1lKTsKKyAgICBl bHNlCisgICAgICAgIHByaW50ZigiQ3B1cG9vbCAlczogcmF0ZWxpbWl0PSVkdXNcbiIsCisgICAg ICAgICAgICAgICBwb29sbmFtZSwgc2NwYXJhbS5yYXRlbGltaXRfdXMpOworCisgICAgZnJlZShw b29sbmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hlZF9ydGRzX2Rv bWFpbl9vdXRwdXQoCisgICAgaW50IGRvbWlkKQoreworICAgIGNoYXIgKmRvbW5hbWU7CisgICAg bGlieGxfZG9tYWluX3NjaGVkX3BhcmFtcyBzY2luZm87CisKKyAgICBpZiAoZG9taWQgPCAwKSB7 CisgICAgICAgIHByaW50ZigiJS0zM3MgJTRzICU5cyAlOXNcbiIsICJOYW1lIiwgIklEIiwgIlBl cmlvZCIsICJCdWRnZXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGlieGxf ZG9tYWluX3NjaGVkX3BhcmFtc19pbml0KCZzY2luZm8pOworICAgIGlmIChzY2hlZF9kb21haW5f Z2V0KExJQlhMX1NDSEVEVUxFUl9SVERTLCBkb21pZCwgJnNjaW5mbykpIHsKKyAgICAgICAgbGli eGxfZG9tYWluX3NjaGVkX3BhcmFtc19kaXNwb3NlKCZzY2luZm8pOworICAgICAgICByZXR1cm4g MTsKKyAgICB9CisKKyAgICBkb21uYW1lID0gbGlieGxfZG9taWRfdG9fbmFtZShjdHgsIGRvbWlk KTsKKyAgICBwcmludGYoIiUtMzNzICU0ZCAlOWQgJTlkXG4iLAorICAgICAgICBkb21uYW1lLAor ICAgICAgICBkb21pZCwKKyAgICAgICAgc2NpbmZvLnBlcmlvZCwKKyAgICAgICAgc2NpbmZvLmJ1 ZGdldCk7CisgICAgZnJlZShkb21uYW1lKTsKKyAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1z X2Rpc3Bvc2UoJnNjaW5mbyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NoZWRf cnRkc192Y3B1X291dHB1dChpbnQgZG9taWQsIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpzY2lu Zm8pCit7CisgICAgY2hhciAqZG9tbmFtZTsKKyAgICBpbnQgcmMgPSAwOworICAgIGludCBpOwor CisgICAgaWYgKGRvbWlkIDwgMCkgeworICAgICAgICBwcmludGYoIiUtMzNzICU0cyAlNHMgJTlz ICU5c1xuIiwgIk5hbWUiLCAiSUQiLAorICAgICAgICAgICAgICAgIlZDUFUiLCAiUGVyaW9kIiwg IkJ1ZGdldCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByYyA9IHNjaGVkX3Zj cHVfZ2V0KExJQlhMX1NDSEVEVUxFUl9SVERTLCBkb21pZCwgc2NpbmZvKTsKKyAgICBpZiAocmMp CisgICAgICAgIHJldHVybiAxOworCisgICAgZG9tbmFtZSA9IGxpYnhsX2RvbWlkX3RvX25hbWUo Y3R4LCBkb21pZCk7CisgICAgZm9yICggaSA9IDA7IGkgPCBzY2luZm8tPm51bV92Y3B1czsgaSsr ICkgeworICAgICAgICBwcmludGYoIiUtMzNzICU0ZCAlNGQgJTkiUFJJdTMyIiAlOSJQUkl1MzIi XG4iLAorICAgICAgICAgICAgICAgZG9tbmFtZSwKKyAgICAgICAgICAgICAgIGRvbWlkLAorICAg ICAgICAgICAgICAgc2NpbmZvLT52Y3B1c1tpXS52Y3B1aWQsCisgICAgICAgICAgICAgICBzY2lu Zm8tPnZjcHVzW2ldLnBlcmlvZCwKKyAgICAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0uYnVk Z2V0KTsKKyAgICB9CisgICAgZnJlZShkb21uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBzY2hlZF9ydGRzX3ZjcHVfb3V0cHV0X2FsbChpbnQgZG9taWQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpzY2lu Zm8pCit7CisgICAgY2hhciAqZG9tbmFtZTsKKyAgICBpbnQgcmMgPSAwOworICAgIGludCBpOwor CisgICAgaWYgKGRvbWlkIDwgMCkgeworICAgICAgICBwcmludGYoIiUtMzNzICU0cyAlNHMgJTlz ICU5c1xuIiwgIk5hbWUiLCAiSUQiLAorICAgICAgICAgICAgICAgIlZDUFUiLCAiUGVyaW9kIiwg IkJ1ZGdldCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzY2luZm8tPm51bV92 Y3B1cyA9IDA7CisgICAgcmMgPSBzY2hlZF92Y3B1X2dldF9hbGwoTElCWExfU0NIRURVTEVSX1JU RFMsIGRvbWlkLCBzY2luZm8pOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAg ICBkb21uYW1lID0gbGlieGxfZG9taWRfdG9fbmFtZShjdHgsIGRvbWlkKTsKKyAgICBmb3IgKCBp ID0gMDsgaSA8IHNjaW5mby0+bnVtX3ZjcHVzOyBpKysgKSB7CisgICAgICAgIHByaW50ZigiJS0z M3MgJTRkICU0ZCAlOSJQUkl1MzIiICU5IlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICBkb21u YW1lLAorICAgICAgICAgICAgICAgZG9taWQsCisgICAgICAgICAgICAgICBzY2luZm8tPnZjcHVz W2ldLnZjcHVpZCwKKyAgICAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0ucGVyaW9kLAorICAg ICAgICAgICAgICAgc2NpbmZvLT52Y3B1c1tpXS5idWRnZXQpOworICAgIH0KKyAgICBmcmVlKGRv bW5hbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVkX3J0ZHNfcG9vbF9v dXRwdXQodWludDMyX3QgcG9vbGlkKQoreworICAgIGNoYXIgKnBvb2xuYW1lOworCisgICAgcG9v bG5hbWUgPSBsaWJ4bF9jcHVwb29saWRfdG9fbmFtZShjdHgsIHBvb2xpZCk7CisgICAgcHJpbnRm KCJDcHVwb29sICVzOiBzY2hlZD1SVERTXG4iLCBwb29sbmFtZSk7CisKKyAgICBmcmVlKHBvb2xu YW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hlZF9kb21haW5fb3V0cHV0 KGxpYnhsX3NjaGVkdWxlciBzY2hlZCwgaW50ICgqb3V0cHV0KShpbnQpLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGludCAoKnBvb2xvdXRwdXQpKHVpbnQzMl90KSwgY29uc3QgY2hh ciAqY3B1cG9vbCkKK3sKKyAgICBsaWJ4bF9kb21pbmZvICppbmZvOworICAgIGxpYnhsX2NwdXBv b2xpbmZvICpwb29saW5mbyA9IE5VTEw7CisgICAgdWludDMyX3QgcG9vbGlkOworICAgIGludCBu Yl9kb21haW4sIG5fcG9vbHMgPSAwLCBpLCBwOworICAgIGludCByYyA9IDA7CisKKyAgICBpZiAo Y3B1cG9vbCkgeworICAgICAgICBpZiAobGlieGxfY3B1cG9vbF9xdWFsaWZpZXJfdG9fY3B1cG9v bGlkKGN0eCwgY3B1cG9vbCwgJnBvb2xpZCwgTlVMTCkgfHwKKyAgICAgICAgICAgICFsaWJ4bF9j cHVwb29saWRfaXNfdmFsaWQoY3R4LCBwb29saWQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0 ZGVyciwgInVua25vd24gY3B1cG9vbCBcJyVzXCdcbiIsIGNwdXBvb2wpOworICAgICAgICAgICAg cmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmZvID0gbGlieGxfbGlzdF9kb21h aW4oY3R4LCAmbmJfZG9tYWluKTsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgZnByaW50Zihz dGRlcnIsICJsaWJ4bF9saXN0X2RvbWFpbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7 CisgICAgfQorICAgIHBvb2xpbmZvID0gbGlieGxfbGlzdF9jcHVwb29sKGN0eCwgJm5fcG9vbHMp OworICAgIGlmICghcG9vbGluZm8pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBn ZXR0aW5nIGNwdXBvb2wgaW5mb1xuIik7CisgICAgICAgIGxpYnhsX2RvbWluZm9fbGlzdF9mcmVl KGluZm8sIG5iX2RvbWFpbik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZvciAo cCA9IDA7ICFyYyAmJiAocCA8IG5fcG9vbHMpOyBwKyspIHsKKyAgICAgICAgaWYgKChwb29saW5m b1twXS5zY2hlZCAhPSBzY2hlZCkgfHwKKyAgICAgICAgICAgIChjcHVwb29sICYmIChwb29saWQg IT0gcG9vbGluZm9bcF0ucG9vbGlkKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg ICBwb29sb3V0cHV0KHBvb2xpbmZvW3BdLnBvb2xpZCk7CisKKyAgICAgICAgb3V0cHV0KC0xKTsK KyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2RvbWFpbjsgaSsrKSB7CisgICAgICAgICAgICBp ZiAoaW5mb1tpXS5jcHVwb29sICE9IHBvb2xpbmZvW3BdLnBvb2xpZCkKKyAgICAgICAgICAgICAg ICBjb250aW51ZTsKKyAgICAgICAgICAgIHJjID0gb3V0cHV0KGluZm9baV0uZG9taWQpOworICAg ICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg fQorCisgICAgbGlieGxfY3B1cG9vbGluZm9fbGlzdF9mcmVlKHBvb2xpbmZvLCBuX3Bvb2xzKTsK KyAgICBsaWJ4bF9kb21pbmZvX2xpc3RfZnJlZShpbmZvLCBuYl9kb21haW4pOworICAgIHJldHVy biAwOworfQorCitzdGF0aWMgaW50IHNjaGVkX3ZjcHVfb3V0cHV0KGxpYnhsX3NjaGVkdWxlciBz Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqb3V0cHV0KShpbnQsIGxp YnhsX3ZjcHVfc2NoZWRfcGFyYW1zICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp bnQgKCpwb29sb3V0cHV0KSh1aW50MzJfdCksIGNvbnN0IGNoYXIgKmNwdXBvb2wpCit7CisgICAg bGlieGxfZG9taW5mbyAqaW5mbzsKKyAgICBsaWJ4bF9jcHVwb29saW5mbyAqcG9vbGluZm8gPSBO VUxMOworICAgIHVpbnQzMl90IHBvb2xpZDsKKyAgICBpbnQgbmJfZG9tYWluLCBuX3Bvb2xzID0g MCwgaSwgcDsKKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYgKGNwdXBvb2wpIHsKKyAgICAgICAg aWYgKGxpYnhsX2NwdXBvb2xfcXVhbGlmaWVyX3RvX2NwdXBvb2xpZChjdHgsIGNwdXBvb2wsICZw b29saWQsIE5VTEwpCisgICAgICAgICAgICB8fCAhbGlieGxfY3B1cG9vbGlkX2lzX3ZhbGlkKGN0 eCwgcG9vbGlkKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGNwdXBv b2wgXCclc1wnXG4iLCBjcHVwb29sKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9 CisgICAgfQorCisgICAgaW5mbyA9IGxpYnhsX2xpc3RfZG9tYWluKGN0eCwgJm5iX2RvbWFpbik7 CisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlieGxfbGlzdF9k b21haW4gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwb29saW5m byA9IGxpYnhsX2xpc3RfY3B1cG9vbChjdHgsICZuX3Bvb2xzKTsKKyAgICBpZiAoIXBvb2xpbmZv KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgZ2V0dGluZyBjcHVwb29sIGluZm9c biIpOworICAgICAgICBsaWJ4bF9kb21pbmZvX2xpc3RfZnJlZShpbmZvLCBuYl9kb21haW4pOwor ICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IgKHAgPSAwOyAhcmMgJiYgKHAgPCBu X3Bvb2xzKTsgcCsrKSB7CisgICAgICAgIGlmICgocG9vbGluZm9bcF0uc2NoZWQgIT0gc2NoZWQp IHx8CisgICAgICAgICAgICAoY3B1cG9vbCAmJiAocG9vbGlkICE9IHBvb2xpbmZvW3BdLnBvb2xp ZCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcG9vbG91dHB1dChwb29saW5m b1twXS5wb29saWQpOworCisgICAgICAgIG91dHB1dCgtMSwgTlVMTCk7CisgICAgICAgIGZvciAo aSA9IDA7IGkgPCBuYl9kb21haW47IGkrKykgeworICAgICAgICAgICAgbGlieGxfdmNwdV9zY2hl ZF9wYXJhbXMgc2NpbmZvOworICAgICAgICAgICAgaWYgKGluZm9baV0uY3B1cG9vbCAhPSBwb29s aW5mb1twXS5wb29saWQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBs aWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19pbml0KCZzY2luZm8pOworICAgICAgICAgICAgcmMgPSBv dXRwdXQoaW5mb1tpXS5kb21pZCwgJnNjaW5mbyk7CisgICAgICAgICAgICBsaWJ4bF92Y3B1X3Nj aGVkX3BhcmFtc19kaXNwb3NlKCZzY2luZm8pOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAg ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbGlieGxfY3B1cG9vbGlu Zm9fbGlzdF9mcmVlKHBvb2xpbmZvLCBuX3Bvb2xzKTsKKyAgICBsaWJ4bF9kb21pbmZvX2xpc3Rf ZnJlZShpbmZvLCBuYl9kb21haW4pOworICAgIHJldHVybiAwOworfQorCisvKgorICogPG5vdGhp bmc+ICAgICAgICAgICAgIDogTGlzdCBhbGwgZG9tYWluIHBhcmFtcyBhbmQgc2NoZWQgcGFyYW1z IGZyb20gYWxsIHBvb2xzCisgKiAtZCBbZG9taWRdICAgICAgICAgICAgOiBMaXN0IGRvbWFpbiBw YXJhbXMgZm9yIGRvbWFpbgorICogLWQgW2RvbWlkXSBbcGFyYW1zXSAgIDogU2V0IGRvbWFpbiBw YXJhbXMgZm9yIGRvbWFpbgorICogLXAgW3Bvb2xdICAgICAgICAgICAgIDogbGlzdCBhbGwgZG9t YWlucyBhbmQgc2NoZWQgcGFyYW1zIGZvciBwb29sCisgKiAtcyAgICAgICAgICAgICAgICAgICAg OiBMaXN0IHNjaGVkIHBhcmFtcyBmb3IgcG9vbGlkIDAKKyAqIC1zIFtwYXJhbXNdICAgICAgICAg ICA6IFNldCBzY2hlZCBwYXJhbXMgZm9yIHBvb2xpZCAwCisgKiAtcCBbcG9vbF0gLXMgICAgICAg ICAgOiBMaXN0IHNjaGVkIHBhcmFtcyBmb3IgcG9vbAorICogLXAgW3Bvb2xdIC1zIFtwYXJhbXNd IDogU2V0IHNjaGVkIHBhcmFtcyBmb3IgcG9vbAorICogLXAgW3Bvb2xdIC1kLi4uICAgICAgIDog SWxsZWdhbAorICovCitpbnQgbWFpbl9zY2hlZF9jcmVkaXQoaW50IGFyZ2MsIGNoYXIgKiphcmd2 KQoreworICAgIGNvbnN0IGNoYXIgKmRvbSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqY3B1cG9v bCA9IE5VTEw7CisgICAgaW50IHdlaWdodCA9IDI1NiwgY2FwID0gMDsKKyAgICBpbnQgdHNsaWNl ID0gMCwgcmF0ZWxpbWl0ID0gMDsKKyAgICBib29sIG9wdF93ID0gZmFsc2UsIG9wdF9jID0gZmFs c2U7CisgICAgYm9vbCBvcHRfdCA9IGZhbHNlLCBvcHRfciA9IGZhbHNlOworICAgIGJvb2wgb3B0 X3MgPSBmYWxzZTsKKyAgICBpbnQgb3B0LCByYzsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBv cHRzW10gPSB7CisgICAgICAgIHsiZG9tYWluIiwgMSwgMCwgJ2QnfSwKKyAgICAgICAgeyJ3ZWln aHQiLCAxLCAwLCAndyd9LAorICAgICAgICB7ImNhcCIsIDEsIDAsICdjJ30sCisgICAgICAgIHsi c2NoZWRwYXJhbSIsIDAsIDAsICdzJ30sCisgICAgICAgIHsidHNsaWNlX21zIiwgMSwgMCwgJ3Qn fSwKKyAgICAgICAgeyJyYXRlbGltaXRfdXMiLCAxLCAwLCAncid9LAorICAgICAgICB7ImNwdXBv b2wiLCAxLCAwLCAncCd9LAorICAgICAgICBDT01NT05fTE9OR19PUFRTCisgICAgfTsKKworICAg IFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICJkOnc6YzpwOnQ6cjpzIiwgb3B0cywgInNjaGVkLWNy ZWRpdCIsIDApIHsKKyAgICBjYXNlICdkJzoKKyAgICAgICAgZG9tID0gb3B0YXJnOworICAgICAg ICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgICAgd2VpZ2h0ID0gc3RydG9sKG9wdGFyZywg TlVMTCwgMTApOworICAgICAgICBvcHRfdyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNh c2UgJ2MnOgorICAgICAgICBjYXAgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7CisgICAgICAg IG9wdF9jID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgICAgIHRz bGljZSA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKKyAgICAgICAgb3B0X3QgPSB0cnVlOwor ICAgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgICAgcmF0ZWxpbWl0ID0gc3RydG9s KG9wdGFyZywgTlVMTCwgMTApOworICAgICAgICBvcHRfciA9IHRydWU7CisgICAgICAgIGJyZWFr OworICAgIGNhc2UgJ3MnOgorICAgICAgICBvcHRfcyA9IHRydWU7CisgICAgICAgIGJyZWFrOwor ICAgIGNhc2UgJ3AnOgorICAgICAgICBjcHVwb29sID0gb3B0YXJnOworICAgICAgICBicmVhazsK KyAgICB9CisKKyAgICBpZiAoKGNwdXBvb2wgfHwgb3B0X3MpICYmIChkb20gfHwgb3B0X3cgfHwg b3B0X2MpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU3BlY2lmeWluZyBhIGNwdXBvb2wg b3Igc2NoZWRwYXJhbSBpcyBub3QgIgorICAgICAgICAgICAgICAgICJhbGxvd2VkIHdpdGggZG9t YWluIG9wdGlvbnMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9Cisg ICAgaWYgKCFkb20gJiYgKG9wdF93IHx8IG9wdF9jKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVy ciwgIk11c3Qgc3BlY2lmeSBhIGRvbWFpbi5cbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlM VVJFOworICAgIH0KKyAgICBpZiAoIW9wdF9zICYmIChvcHRfdCB8fCBvcHRfcikpIHsKKyAgICAg ICAgZnByaW50ZihzdGRlcnIsICJNdXN0IHNwZWNpZnkgc2NoZWRwYXJhbSB0byBzZXQgc2NoZWR1 bGUgIgorICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgdmFsdWVzLlxuIik7CisgICAgICAgIHJl dHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKG9wdF9zKSB7CisgICAgICAgIGxp YnhsX3NjaGVkX2NyZWRpdF9wYXJhbXMgc2NwYXJhbTsKKyAgICAgICAgdWludDMyX3QgcG9vbGlk ID0gMDsKKworICAgICAgICBpZiAoY3B1cG9vbCkgeworICAgICAgICAgICAgaWYgKGxpYnhsX2Nw dXBvb2xfcXVhbGlmaWVyX3RvX2NwdXBvb2xpZChjdHgsIGNwdXBvb2wsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb29saWQsIE5VTEwpIHx8 CisgICAgICAgICAgICAgICAgIWxpYnhsX2NwdXBvb2xpZF9pc192YWxpZChjdHgsIHBvb2xpZCkp IHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCBcJyVz XCdcbiIsIGNwdXBvb2wpOworICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Cisg ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW9wdF90ICYmICFvcHRfcikg eyAvKiBPdXRwdXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAoc2No ZWRfY3JlZGl0X3Bvb2xfb3V0cHV0KHBvb2xpZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVY SVRfRkFJTFVSRTsKKyAgICAgICAgfSBlbHNlIHsgLyogU2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVy cyovCisgICAgICAgICAgICBpZiAoc2NoZWRfY3JlZGl0X3BhcmFtc19nZXQocG9vbGlkLCAmc2Nw YXJhbSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgICAgICAg ICAgaWYgKG9wdF90KQorICAgICAgICAgICAgICAgIHNjcGFyYW0udHNsaWNlX21zID0gdHNsaWNl OworCisgICAgICAgICAgICBpZiAob3B0X3IpCisgICAgICAgICAgICAgICAgc2NwYXJhbS5yYXRl bGltaXRfdXMgPSByYXRlbGltaXQ7CisKKyAgICAgICAgICAgIGlmIChzY2hlZF9jcmVkaXRfcGFy YW1zX3NldChwb29saWQsICZzY3BhcmFtKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9G QUlMVVJFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghZG9tKSB7IC8qIGxpc3QgYWxsIGRv bWFpbidzIGNyZWRpdCBzY2hlZHVsZXIgaW5mbyAqLworICAgICAgICBpZiAoc2NoZWRfZG9tYWlu X291dHB1dChMSUJYTF9TQ0hFRFVMRVJfQ1JFRElULAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzY2hlZF9jcmVkaXRfZG9tYWluX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2NoZWRfY3JlZGl0X3Bvb2xfb3V0cHV0LAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjcHVwb29sKSkKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7 CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgZG9taWQgPSB4ZmluZF9kb21haW4oZG9t KTsKKworICAgICAgICBpZiAoIW9wdF93ICYmICFvcHRfYykgeyAvKiBvdXRwdXQgY3JlZGl0IHNj aGVkdWxlciBpbmZvICovCisgICAgICAgICAgICBzY2hlZF9jcmVkaXRfZG9tYWluX291dHB1dCgt MSk7CisgICAgICAgICAgICBpZiAoc2NoZWRfY3JlZGl0X2RvbWFpbl9vdXRwdXQoZG9taWQpKQor ICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0gZWxzZSB7IC8q IHNldCBjcmVkaXQgc2NoZWR1bGVyIHBhcmFtYXRlcnMgKi8KKyAgICAgICAgICAgIGxpYnhsX2Rv bWFpbl9zY2hlZF9wYXJhbXMgc2NpbmZvOworICAgICAgICAgICAgbGlieGxfZG9tYWluX3NjaGVk X3BhcmFtc19pbml0KCZzY2luZm8pOworICAgICAgICAgICAgc2NpbmZvLnNjaGVkID0gTElCWExf U0NIRURVTEVSX0NSRURJVDsKKyAgICAgICAgICAgIGlmIChvcHRfdykKKyAgICAgICAgICAgICAg ICBzY2luZm8ud2VpZ2h0ID0gd2VpZ2h0OworICAgICAgICAgICAgaWYgKG9wdF9jKQorICAgICAg ICAgICAgICAgIHNjaW5mby5jYXAgPSBjYXA7CisgICAgICAgICAgICByYyA9IHNjaGVkX2RvbWFp bl9zZXQoZG9taWQsICZzY2luZm8pOworICAgICAgICAgICAgbGlieGxfZG9tYWluX3NjaGVkX3Bh cmFtc19kaXNwb3NlKCZzY2luZm8pOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAg ICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4g RVhJVF9TVUNDRVNTOworfQorCitpbnQgbWFpbl9zY2hlZF9jcmVkaXQyKGludCBhcmdjLCBjaGFy ICoqYXJndikKK3sKKyAgICBjb25zdCBjaGFyICpkb20gPSBOVUxMOworICAgIGNvbnN0IGNoYXIg KmNwdXBvb2wgPSBOVUxMOworICAgIGludCByYXRlbGltaXQgPSAwOworICAgIGludCB3ZWlnaHQg PSAyNTY7CisgICAgYm9vbCBvcHRfcyA9IGZhbHNlOworICAgIGJvb2wgb3B0X3IgPSBmYWxzZTsK KyAgICBib29sIG9wdF93ID0gZmFsc2U7CisgICAgaW50IG9wdCwgcmM7CisgICAgc3RhdGljIHN0 cnVjdCBvcHRpb24gb3B0c1tdID0geworICAgICAgICB7ImRvbWFpbiIsIDEsIDAsICdkJ30sCisg ICAgICAgIHsid2VpZ2h0IiwgMSwgMCwgJ3cnfSwKKyAgICAgICAgeyJzY2hlZHBhcmFtIiwgMCwg MCwgJ3MnfSwKKyAgICAgICAgeyJyYXRlbGltaXRfdXMiLCAxLCAwLCAncid9LAorICAgICAgICB7 ImNwdXBvb2wiLCAxLCAwLCAncCd9LAorICAgICAgICBDT01NT05fTE9OR19PUFRTCisgICAgfTsK KworICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICJkOnc6cDpyOnMiLCBvcHRzLCAic2NoZWQt Y3JlZGl0MiIsIDApIHsKKyAgICBjYXNlICdkJzoKKyAgICAgICAgZG9tID0gb3B0YXJnOworICAg ICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgICAgd2VpZ2h0ID0gc3RydG9sKG9wdGFy ZywgTlVMTCwgMTApOworICAgICAgICBvcHRfdyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAg IGNhc2UgJ3MnOgorICAgICAgICBvcHRfcyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNh c2UgJ3InOgorICAgICAgICByYXRlbGltaXQgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7Cisg ICAgICAgIG9wdF9yID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAg ICAgIGNwdXBvb2wgPSBvcHRhcmc7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChj cHVwb29sICYmIChkb20gfHwgb3B0X3cpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU3Bl Y2lmeWluZyBhIGNwdXBvb2wgaXMgbm90IGFsbG93ZWQgd2l0aCBvdGhlciAiCisgICAgICAgICAg ICAgICAgIm9wdGlvbnMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9 CisgICAgaWYgKCFkb20gJiYgb3B0X3cpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNdXN0 IHNwZWNpZnkgYSBkb21haW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAg ICB9CisKKyAgICBpZiAob3B0X3MpIHsKKyAgICAgICAgbGlieGxfc2NoZWRfY3JlZGl0Ml9wYXJh bXMgc2NwYXJhbTsKKyAgICAgICAgdWludDMyX3QgcG9vbGlkID0gMDsKKworICAgICAgICBpZiAo Y3B1cG9vbCkgeworICAgICAgICAgICAgaWYgKGxpYnhsX2NwdXBvb2xfcXVhbGlmaWVyX3RvX2Nw dXBvb2xpZChjdHgsIGNwdXBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICZwb29saWQsIE5VTEwpIHx8CisgICAgICAgICAgICAgICAgIWxp YnhsX2NwdXBvb2xpZF9pc192YWxpZChjdHgsIHBvb2xpZCkpIHsKKyAgICAgICAgICAgICAgICBm cHJpbnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCBcJyVzXCdcbiIsIGNwdXBvb2wpOworICAg ICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAg IH0KKworICAgICAgICBpZiAoIW9wdF9yKSB7IC8qIE91dHB1dCBzY2hlZHVsaW5nIHBhcmFtZXRl cnMgKi8KKyAgICAgICAgICAgIGlmIChzY2hlZF9jcmVkaXQyX3Bvb2xfb3V0cHV0KHBvb2xpZCkp CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfSBlbHNlIHsg ICAgICAvKiBTZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIChzbyBmYXIsIGp1c3QgcmF0ZWxpbWl0 KSAqLworICAgICAgICAgICAgc2NwYXJhbS5yYXRlbGltaXRfdXMgPSByYXRlbGltaXQ7CisgICAg ICAgICAgICBpZiAoc2NoZWRfY3JlZGl0Ml9wYXJhbXNfc2V0KHBvb2xpZCwgJnNjcGFyYW0pKQor ICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9IGVs c2UgaWYgKCFkb20pIHsgLyogbGlzdCBhbGwgZG9tYWluJ3MgY3JlZGl0IHNjaGVkdWxlciBpbmZv ICovCisgICAgICAgIGlmIChzY2hlZF9kb21haW5fb3V0cHV0KExJQlhMX1NDSEVEVUxFUl9DUkVE SVQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZF9jcmVkaXQyX2RvbWFp bl9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkX2NyZWRpdDJf cG9vbF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdXBvb2wpKQor ICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9IGVsc2UgeworICAgICAgICB1 aW50MzJfdCBkb21pZCA9IHhmaW5kX2RvbWFpbihkb20pOworCisgICAgICAgIGlmICghb3B0X3cp IHsgLyogb3V0cHV0IGNyZWRpdDIgc2NoZWR1bGVyIGluZm8gKi8KKyAgICAgICAgICAgIHNjaGVk X2NyZWRpdDJfZG9tYWluX291dHB1dCgtMSk7CisgICAgICAgICAgICBpZiAoc2NoZWRfY3JlZGl0 Ml9kb21haW5fb3V0cHV0KGRvbWlkKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlM VVJFOworICAgICAgICB9IGVsc2UgeyAvKiBzZXQgY3JlZGl0MiBzY2hlZHVsZXIgcGFyYW1hdGVy cyAqLworICAgICAgICAgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFtcyBzY2luZm87CisgICAg ICAgICAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zX2luaXQoJnNjaW5mbyk7CisgICAgICAg ICAgICBzY2luZm8uc2NoZWQgPSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjsKKyAgICAgICAgICAg IGlmIChvcHRfdykKKyAgICAgICAgICAgICAgICBzY2luZm8ud2VpZ2h0ID0gd2VpZ2h0OworICAg ICAgICAgICAgcmMgPSBzY2hlZF9kb21haW5fc2V0KGRvbWlkLCAmc2NpbmZvKTsKKyAgICAgICAg ICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfZGlzcG9zZSgmc2NpbmZvKTsKKyAgICAgICAg ICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAg ICB9CisgICAgfQorCisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworLyoKKyAqIDxub3Ro aW5nPiAgICAgICAgICAgIDogTGlzdCBhbGwgZG9tYWluIHBhcmFtdGVycyBhbmQgc2NoZWQgcGFy YW1zCisgKiAtZCBbZG9taWRdICAgICAgICAgICA6IExpc3QgZGVmYXVsdCBkb21haW4gcGFyYW1z IGZvciBkb21haW4KKyAqIC1kIFtkb21pZF0gW3BhcmFtc10gIDogU2V0IGRvbWFpbiBwYXJhbXMg Zm9yIGRvbWFpbgorICogLWQgW2RvbWlkXSAtdiBbdmNwdWlkIDFdIC12IFt2Y3B1aWQgMl0gLi4u ICA6CisgKiBMaXN0IHBlci1WQ1BVIHBhcmFtcyBmb3IgZG9tYWluCisgKiAtZCBbZG9taWRdIC12 IGFsbCAgOiBMaXN0IGFsbCBwZXItVkNQVSBwYXJhbXMgZm9yIGRvbWFpbgorICogLXYgYWxsICA6 IExpc3QgYWxsIHBlci1WQ1BVIHBhcmFtcyBmb3IgYWxsIGRvbWFpbnMKKyAqIC1kIFtkb21pZF0g LXYgW3ZjcHVpZCAxXSBbcGFyYW1zXSAtdiBbdmNwdWlkIDJdIFtwYXJhbXNdIC4uLiAgOgorICog U2V0IHBlci1WQ1BVIHBhcmFtcyBmb3IgZG9tYWluCisgKiAtZCBbZG9taWRdIC12IGFsbCBbcGFy YW1zXSAgOiBTZXQgYWxsIHBlci1WQ1BVIHBhcmFtcyBmb3IgZG9tYWluCisgKi8KK2ludCBtYWlu X3NjaGVkX3J0ZHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGNvbnN0IGNoYXIgKmRv bSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqY3B1cG9vbCA9IE5VTEw7CisgICAgaW50ICp2Y3B1 cyA9IChpbnQgKil4bWFsbG9jKHNpemVvZihpbnQpKTsgLyogSURzIG9mIFZDUFVzIHRoYXQgY2hh bmdlICovCisgICAgaW50ICpwZXJpb2RzID0gKGludCAqKXhtYWxsb2Moc2l6ZW9mKGludCkpOyAv KiBwZXJpb2QgaXMgaW4gbWljcm9zZWNvbmQgKi8KKyAgICBpbnQgKmJ1ZGdldHMgPSAoaW50ICop eG1hbGxvYyhzaXplb2YoaW50KSk7IC8qIGJ1ZGdldCBpcyBpbiBtaWNyb3NlY29uZCAqLworICAg IGludCB2X3NpemUgPSAxOyAvKiBzaXplIG9mIHZjcHVzIGFycmF5ICovCisgICAgaW50IHBfc2l6 ZSA9IDE7IC8qIHNpemUgb2YgcGVyaW9kcyBhcnJheSAqLworICAgIGludCBiX3NpemUgPSAxOyAv KiBzaXplIG9mIGJ1ZGdldHMgYXJyYXkgKi8KKyAgICBpbnQgdl9pbmRleCA9IDA7IC8qIGluZGV4 IGluIHZjcHVzIGFycmF5ICovCisgICAgaW50IHBfaW5kZXggPTA7IC8qIGluZGV4IGluIHBlcmlv ZHMgYXJyYXkgKi8KKyAgICBpbnQgYl9pbmRleCA9MDsgLyogaW5kZXggZm9yIGluIGJ1ZGdldHMg YXJyYXkgKi8KKyAgICBib29sIG9wdF9wID0gZmFsc2U7CisgICAgYm9vbCBvcHRfYiA9IGZhbHNl OworICAgIGJvb2wgb3B0X3YgPSBmYWxzZTsKKyAgICBib29sIG9wdF9hbGwgPSBmYWxzZTsgLyog b3V0cHV0IHBlci1kb20gcGFyYW1ldGVycyAqLworICAgIGludCBvcHQsIGksIHJjLCByOworICAg IHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKyAgICAgICAgeyJkb21haW4iLCAxLCAw LCAnZCd9LAorICAgICAgICB7InBlcmlvZCIsIDEsIDAsICdwJ30sCisgICAgICAgIHsiYnVkZ2V0 IiwgMSwgMCwgJ2InfSwKKyAgICAgICAgeyJ2Y3B1aWQiLDEsIDAsICd2J30sCisgICAgICAgIHsi Y3B1cG9vbCIsIDEsIDAsICdjJ30sCisgICAgICAgIENPTU1PTl9MT05HX09QVFMKKyAgICB9Owor CisgICAgU1dJVENIX0ZPUkVBQ0hfT1BUKG9wdCwgImQ6cDpiOnY6YyIsIG9wdHMsICJzY2hlZC1y dGRzIiwgMCkgeworICAgIGNhc2UgJ2QnOgorICAgICAgICBkb20gPSBvcHRhcmc7CisgICAgICAg IGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgICBpZiAocF9pbmRleCA+PSBwX3NpemUpIHsK KyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBwZXJpb2RzIGFycmF5IGlzIGZ1bGwKKyAg ICAgICAgICAgICAqIGRvdWJsZSB0aGUgYXJyYXkgc2l6ZSBmb3IgbmV3IGVsZW1lbnRzCisgICAg ICAgICAgICAgKi8KKyAgICAgICAgICAgIHBfc2l6ZSAqPSAyOworICAgICAgICAgICAgcGVyaW9k cyA9IHhyZWFsbG9jKHBlcmlvZHMsIHBfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcGVyaW9k c1twX2luZGV4KytdID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOworICAgICAgICBvcHRfcCA9 IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgICBpZiAoYl9pbmRleCA+ PSBiX3NpemUpIHsgLyogYnVkZ2V0cyBhcnJheSBpcyBmdWxsICovCisgICAgICAgICAgICBiX3Np emUgKj0gMjsKKyAgICAgICAgICAgIGJ1ZGdldHMgPSB4cmVhbGxvYyhidWRnZXRzLCBiX3NpemUp OworICAgICAgICB9CisgICAgICAgIGJ1ZGdldHNbYl9pbmRleCsrXSA9IHN0cnRvbChvcHRhcmcs IE5VTEwsIDEwKTsKKyAgICAgICAgb3B0X2IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNl ICd2JzoKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAiYWxsIikpIHsgLyogZ2V0IG9yIHNl dCBhbGwgdmNwdXMgb2YgYSBkb21haW4gKi8KKyAgICAgICAgICAgIG9wdF9hbGwgPSAxOworICAg ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZfaW5kZXggPj0gdl9zaXpl KSB7IC8qIHZjcHVzIGFycmF5IGlzIGZ1bGwgKi8KKyAgICAgICAgICAgIHZfc2l6ZSAqPSAyOwor ICAgICAgICAgICAgdmNwdXMgPSB4cmVhbGxvYyh2Y3B1cywgdl9zaXplKTsKKyAgICAgICAgfQor ICAgICAgICB2Y3B1c1t2X2luZGV4KytdID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOworICAg ICAgICBvcHRfdiA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgICAgICBj cHVwb29sID0gb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY3B1cG9v bCAmJiAoZG9tIHx8IG9wdF9wIHx8IG9wdF9iIHx8IG9wdF92IHx8IG9wdF9hbGwpKSB7CisgICAg ICAgIGZwcmludGYoc3RkZXJyLCAiU3BlY2lmeWluZyBhIGNwdXBvb2wgaXMgbm90IGFsbG93ZWQg d2l0aCAiCisgICAgICAgICAgICAgICAgIm90aGVyIG9wdGlvbnMuXG4iKTsKKyAgICAgICAgciA9 IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmICghZG9tICYm IChvcHRfcCB8fCBvcHRfYiB8fCBvcHRfdikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJN aXNzaW5nIHBhcmFtZXRlcnMuXG4iKTsKKyAgICAgICAgciA9IEVYSVRfRkFJTFVSRTsKKyAgICAg ICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmIChkb20gJiYgIW9wdF92ICYmICFvcHRfYWxsICYm IChvcHRfcCB8fCBvcHRfYikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNdXN0IHNwZWNp ZnkgVkNQVS5cbiIpOworICAgICAgICByID0gRVhJVF9GQUlMVVJFOworICAgICAgICBnb3RvIG91 dDsKKyAgICB9CisgICAgaWYgKG9wdF92ICYmIG9wdF9hbGwpIHsKKyAgICAgICAgZnByaW50Zihz dGRlcnIsICJJbmNvcnJlY3QgVkNQVSBJRHMuXG4iKTsKKyAgICAgICAgciA9IEVYSVRfRkFJTFVS RTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmICgoKHZfaW5kZXggPiBiX2luZGV4 KSAmJiBvcHRfYikgfHwgKCh2X2luZGV4ID4gcF9pbmRleCkgJiYgb3B0X3ApCisgICAgICAgIHx8 IHBfaW5kZXggIT0gYl9pbmRleCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkluY29ycmVj dCBudW1iZXIgb2YgcGVyaW9kIGFuZCBidWRnZXRcbiIpOworICAgICAgICByID0gRVhJVF9GQUlM VVJFOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoKCFkb20pICYmIG9wdF9h bGwpIHsKKyAgICAgICAgLyogZ2V0IGFsbCBkb21haW4ncyBwZXItdmNwdSBydGRzIHNjaGVkdWxl ciBwYXJhbWV0ZXJzICovCisgICAgICAgIHJjID0gLXNjaGVkX3ZjcHVfb3V0cHV0KExJQlhMX1ND SEVEVUxFUl9SVERTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZF9ydGRz X3ZjcHVfb3V0cHV0X2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWRf cnRkc19wb29sX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1cG9v bCk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgciA9IEVYSVRfRkFJTFVSRTsKKyAg ICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghZG9tICYmICFv cHRfYWxsKSB7CisgICAgICAgIC8qIGxpc3QgYWxsIGRvbWFpbidzIGRlZmF1bHQgc2NoZWR1bGlu ZyBwYXJhbWV0ZXJzICovCisgICAgICAgIHJjID0gLXNjaGVkX2RvbWFpbl9vdXRwdXQoTElCWExf U0NIRURVTEVSX1JURFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWRf cnRkc19kb21haW5fb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNj aGVkX3J0ZHNfcG9vbF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y3B1cG9vbCk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgciA9IEVYSVRfRkFJTFVS RTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg ICAgdWludDMyX3QgZG9taWQgPSB4ZmluZF9kb21haW4oZG9tKTsKKyAgICAgICAgaWYgKCFvcHRf diAmJiAhb3B0X2FsbCkgeyAvKiBvdXRwdXQgZGVmYXVsdCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMg Ki8KKyAgICAgICAgICAgIHNjaGVkX3J0ZHNfZG9tYWluX291dHB1dCgtMSk7CisgICAgICAgICAg ICByYyA9IC1zY2hlZF9ydGRzX2RvbWFpbl9vdXRwdXQoZG9taWQpOworICAgICAgICAgICAgaWYg KHJjKSB7CisgICAgICAgICAgICAgICAgciA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAg ICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghb3B0X3AgJiYg IW9wdF9iKSB7CisgICAgICAgICAgICAvKiBnZXQgcGVyLXZjcHUgcnRkcyBzY2hlZHVsaW5nIHBh cmFtZXRlcnMgKi8KKyAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zIHNjaW5mbzsK KyAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2luaXQoJnNjaW5mbyk7CisgICAg ICAgICAgICBzY2hlZF9ydGRzX3ZjcHVfb3V0cHV0KC0xLCAmc2NpbmZvKTsKKyAgICAgICAgICAg IHNjaW5mby5udW1fdmNwdXMgPSB2X2luZGV4OworICAgICAgICAgICAgaWYgKHZfaW5kZXggPiAw KSB7CisgICAgICAgICAgICAgICAgc2NpbmZvLnZjcHVzID0gKGxpYnhsX3NjaGVkX3BhcmFtcyAq KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtYWxsb2Moc2l6ZW9mKGxpYnhsX3Nj aGVkX3BhcmFtcykgKiAodl9pbmRleCkpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkg PCB2X2luZGV4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNjaW5mby52Y3B1c1tpXS52Y3B1 aWQgPSB2Y3B1c1tpXTsKKyAgICAgICAgICAgICAgICByYyA9IC1zY2hlZF9ydGRzX3ZjcHVfb3V0 cHV0KGRvbWlkLCAmc2NpbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSAvKiBnZXQgcGFyYW1zIGZv ciBhbGwgdmNwdXMgKi8KKyAgICAgICAgICAgICAgICByYyA9IC1zY2hlZF9ydGRzX3ZjcHVfb3V0 cHV0X2FsbChkb21pZCwgJnNjaW5mbyk7CisgICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3Bh cmFtc19kaXNwb3NlKCZzY2luZm8pOworICAgICAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAg ICAgICAgciA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAg ICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9wdF92IHx8IG9wdF9hbGwpIHsKKyAgICAgICAgICAg IC8qIHNldCBwZXItdmNwdSBydGRzIHNjaGVkdWxpbmcgcGFyYW1ldGVycyAqLworICAgICAgICAg ICAgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgc2NpbmZvOworICAgICAgICAgICAgbGlieGxfdmNw dV9zY2hlZF9wYXJhbXNfaW5pdCgmc2NpbmZvKTsKKyAgICAgICAgICAgIHNjaW5mby5zY2hlZCA9 IExJQlhMX1NDSEVEVUxFUl9SVERTOworICAgICAgICAgICAgaWYgKHZfaW5kZXggPiAwKSB7Cisg ICAgICAgICAgICAgICAgc2NpbmZvLm51bV92Y3B1cyA9IHZfaW5kZXg7CisgICAgICAgICAgICAg ICAgc2NpbmZvLnZjcHVzID0gKGxpYnhsX3NjaGVkX3BhcmFtcyAqKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHhtYWxsb2Moc2l6ZW9mKGxpYnhsX3NjaGVkX3BhcmFtcykgKiAodl9p bmRleCkpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2X2luZGV4OyBpKyspIHsK KyAgICAgICAgICAgICAgICAgICAgc2NpbmZvLnZjcHVzW2ldLnZjcHVpZCA9IHZjcHVzW2ldOwor ICAgICAgICAgICAgICAgICAgICBzY2luZm8udmNwdXNbaV0ucGVyaW9kID0gcGVyaW9kc1tpXTsK KyAgICAgICAgICAgICAgICAgICAgc2NpbmZvLnZjcHVzW2ldLmJ1ZGdldCA9IGJ1ZGdldHNbaV07 CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjID0gc2NoZWRfdmNwdV9zZXQo ZG9taWQsICZzY2luZm8pOworICAgICAgICAgICAgfSBlbHNlIHsgLyogc2V0IHBhcmFtcyBmb3Ig YWxsIHZjcHVzICovCisgICAgICAgICAgICAgICAgc2NpbmZvLm51bV92Y3B1cyA9IDE7CisgICAg ICAgICAgICAgICAgc2NpbmZvLnZjcHVzID0gKGxpYnhsX3NjaGVkX3BhcmFtcyAqKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHhtYWxsb2Moc2l6ZW9mKGxpYnhsX3NjaGVkX3BhcmFt cykpOworICAgICAgICAgICAgICAgIHNjaW5mby52Y3B1c1swXS5wZXJpb2QgPSBwZXJpb2RzWzBd OworICAgICAgICAgICAgICAgIHNjaW5mby52Y3B1c1swXS5idWRnZXQgPSBidWRnZXRzWzBdOwor ICAgICAgICAgICAgICAgIHJjID0gc2NoZWRfdmNwdV9zZXRfYWxsKGRvbWlkLCAmc2NpbmZvKTsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfZGlz cG9zZSgmc2NpbmZvKTsKKyAgICAgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgICAgIHIg PSBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9 CisgICAgICAgIH0KKyAgICB9CisKKyAgICByID0gRVhJVF9TVUNDRVNTOworb3V0OgorICAgIGZy ZWUodmNwdXMpOworICAgIGZyZWUocGVyaW9kcyk7CisgICAgZnJlZShidWRnZXRzKTsKKyAgICBy ZXR1cm4gcjsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIG1vZGU6IEMKKyAqIGMt YmFzaWMtb2Zmc2V0OiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqLwot LSAKMi4xMS4wCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczov L2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==