From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH 22/29] xl: split out psr related code Date: Fri, 24 Feb 2017 16:13:07 +0000 Message-ID: <20170224161314.22154-23-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.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1chIXr-0006Z1-LW for xen-devel@lists.xenproject.org; Fri, 24 Feb 2017 16:16:35 +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 bC9NYWtlZmlsZSAgICAgfCAgIDEgKwogdG9vbHMveGwveGxfY21kaW1wbC5jIHwgNTMzIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0b29scy94bC94bF9w c3IuYyAgICAgfCA1NjcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgNTY4IGluc2VydGlvbnMoKyksIDUzMyBkZWxldGlv bnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy94bC94bF9wc3IuYwoKZGlmZiAtLWdpdCBh L3Rvb2xzL3hsL01ha2VmaWxlIGIvdG9vbHMveGwvTWFrZWZpbGUKaW5kZXggOTY0ZGE4ZTcwNS4u ZmRiNjRmZWQxZCAxMDA2NDQKLS0tIGEvdG9vbHMveGwvTWFrZWZpbGUKKysrIGIvdG9vbHMveGwv TWFrZWZpbGUKQEAgLTE5LDYgKzE5LDcgQEAgWExfT0JKUyA9IHhsLm8geGxfY21kaW1wbC5vIHhs X2NtZHRhYmxlLm8geGxfc3hwLm8geGxfdXRpbHMubwogWExfT0JKUyArPSB4bF90bWVtLm8geGxf cGFyc2UubyB4bF9jcHVwb29sLm8geGxfZmxhc2subwogWExfT0JKUyArPSB4bF92dHBtLm8geGxf YmxvY2subyB4bF9uaWMubyB4bF91c2IubwogWExfT0JKUyArPSB4bF9zY2hlZC5vIHhsX3BjaS5v IHhsX3ZjcHUubyB4bF9jZC5vIHhsX21lbS5vCitYTF9PQkpTICs9IHhsX3Bzci5vCiAKICQoWExf T0JKUyk6IENGTEFHUyArPSAkKENGTEFHU19saWJ4ZW50b29sbG9nKQogJChYTF9PQkpTKTogQ0ZM QUdTICs9ICQoQ0ZMQUdTX1hMKQpkaWZmIC0tZ2l0IGEvdG9vbHMveGwveGxfY21kaW1wbC5jIGIv dG9vbHMveGwveGxfY21kaW1wbC5jCmluZGV4IDM1ZDgxNDE3ZWMuLmY2OTQyZmZiZTggMTAwNjQ0 Ci0tLSBhL3Rvb2xzL3hsL3hsX2NtZGltcGwuYworKysgYi90b29scy94bC94bF9jbWRpbXBsLmMK QEAgLTM2MTksNTM5ICszNjE5LDYgQEAgb3V0OgogICAgIHJldHVybiByZXQ7CiB9CiAKLSNpZmRl ZiBMSUJYTF9IQVZFX1BTUl9DTVQKLXN0YXRpYyBpbnQgcHNyX2NtdF9od2luZm8odm9pZCkKLXsK LSAgICBpbnQgcmM7Ci0gICAgaW50IGVuYWJsZWQ7Ci0gICAgdWludDMyX3QgdG90YWxfcm1pZDsK LQotICAgIHByaW50ZigiQ2FjaGUgTW9uaXRvcmluZyBUZWNobm9sb2d5IChDTVQpOlxuIik7Ci0K LSAgICBlbmFibGVkID0gbGlieGxfcHNyX2NtdF9lbmFibGVkKGN0eCk7Ci0gICAgcHJpbnRmKCIl LTE2czogJXNcbiIsICJFbmFibGVkIiwgZW5hYmxlZCA/ICIxIiA6ICIwIik7Ci0gICAgaWYgKCFl bmFibGVkKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJjID0gbGlieGxfcHNyX2NtdF9nZXRf dG90YWxfcm1pZChjdHgsICZ0b3RhbF9ybWlkKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgZnBy aW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0IG1heCBSTUlEIHZhbHVlXG4iKTsKLSAgICAgICAg cmV0dXJuIHJjOwotICAgIH0KLSAgICBwcmludGYoIiUtMTZzOiAldVxuIiwgIlRvdGFsIFJNSUQi LCB0b3RhbF9ybWlkKTsKLQotICAgIHByaW50ZigiU3VwcG9ydGVkIG1vbml0b3IgdHlwZXM6XG4i KTsKLSAgICBpZiAobGlieGxfcHNyX2NtdF90eXBlX3N1cHBvcnRlZChjdHgsIExJQlhMX1BTUl9D TVRfVFlQRV9DQUNIRV9PQ0NVUEFOQ1kpKQotICAgICAgICBwcmludGYoImNhY2hlLW9jY3VwYW5j eVxuIik7Ci0gICAgaWYgKGxpYnhsX3Bzcl9jbXRfdHlwZV9zdXBwb3J0ZWQoY3R4LCBMSUJYTF9Q U1JfQ01UX1RZUEVfVE9UQUxfTUVNX0NPVU5UKSkKLSAgICAgICAgcHJpbnRmKCJ0b3RhbC1tZW0t YmFuZHdpZHRoXG4iKTsKLSAgICBpZiAobGlieGxfcHNyX2NtdF90eXBlX3N1cHBvcnRlZChjdHgs IExJQlhMX1BTUl9DTVRfVFlQRV9MT0NBTF9NRU1fQ09VTlQpKQotICAgICAgICBwcmludGYoImxv Y2FsLW1lbS1iYW5kd2lkdGhcbiIpOwotCi0gICAgcmV0dXJuIHJjOwotfQotCi0jZGVmaW5lIE1C TV9TQU1QTEVfUkVUUllfTUFYIDQKLXN0YXRpYyBpbnQgcHNyX2NtdF9nZXRfbWVtX2JhbmR3aWR0 aCh1aW50MzJfdCBkb21pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs aWJ4bF9wc3JfY210X3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1aW50MzJfdCBzb2NrZXRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1aW50NjRfdCAqYmFuZHdpZHRoX3IpCi17Ci0gICAgdWludDY0X3Qgc2FtcGxlMSwgc2Ft cGxlMjsKLSAgICB1aW50NjRfdCB0c2MxLCB0c2MyOwotICAgIGludCByZXRyeV9hdHRlbXB0cyA9 IDA7Ci0gICAgaW50IHJjOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgcmMgPSBsaWJ4bF9w c3JfY210X2dldF9zYW1wbGUoY3R4LCBkb21pZCwgdHlwZSwgc29ja2V0aWQsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGUxLCAmdHNjMSk7Ci0gICAgICAgIGlm IChyYyA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmM7Ci0KLSAgICAgICAgdXNsZWVwKDEwMDAw KTsKLQotICAgICAgICByYyA9IGxpYnhsX3Bzcl9jbXRfZ2V0X3NhbXBsZShjdHgsIGRvbWlkLCB0 eXBlLCBzb2NrZXRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNh bXBsZTIsICZ0c2MyKTsKLSAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBy YzsKLQotICAgICAgICBpZiAodHNjMiA8PSB0c2MxKQotICAgICAgICAgICAgcmV0dXJuIC0xOwot Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEhhcmR3YXJlIGd1YXJhbnRlZXMgYXQgbW9zdCAxIG92 ZXJmbG93IGNhbiBoYXBwZW4gaWYgdGhlIGR1cmF0aW9uCi0gICAgICAgICAqIGJldHdlZW4gdHdv IHNhbXBsZXMgaXMgbGVzcyB0aGFuIDEgc2Vjb25kLiBOb3RlIHRoYXQgdHNjIHJldHVybmVkCi0g ICAgICAgICAqIGZyb20gaHlwZXJ2aXNvciBpcyBhbHJlYWR5LXNjYWxlZCB0aW1lKG5zKS4KLSAg ICAgICAgICovCi0gICAgICAgIGlmICh0c2MyIC0gdHNjMSA8IDEwMDAwMDAwMDAgJiYgc2FtcGxl MiA+PSBzYW1wbGUxKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKHJldHJ5X2F0 dGVtcHRzIDwgTUJNX1NBTVBMRV9SRVRSWV9NQVgpIHsKLSAgICAgICAgICAgIHJldHJ5X2F0dGVt cHRzKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImV2 ZW50IGNvdW50ZXIgb3ZlcmZsb3dlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAg ICAgIH0KLSAgICB9Ci0KLSAgICAqYmFuZHdpZHRoX3IgPSAoc2FtcGxlMiAtIHNhbXBsZTEpICog MTAwMDAwMDAwMCAvICh0c2MyIC0gdHNjMSkgLyAxMDI0OwotICAgIHJldHVybiAwOwotfQotCi1z dGF0aWMgdm9pZCBwc3JfY210X3ByaW50X2RvbWFpbl9pbmZvKGxpYnhsX2RvbWluZm8gKmRvbWlu Zm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX3Bzcl9jbXRf dHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9i aXRtYXAgKnNvY2tldG1hcCkKLXsKLSAgICBjaGFyICpkb21haW5fbmFtZTsKLSAgICB1aW50MzJf dCBzb2NrZXRpZDsKLSAgICB1aW50NjRfdCBtb25pdG9yX2RhdGE7Ci0KLSAgICBpZiAoIWxpYnhs X3Bzcl9jbXRfZG9tYWluX2F0dGFjaGVkKGN0eCwgZG9taW5mby0+ZG9taWQpKQotICAgICAgICBy ZXR1cm47Ci0KLSAgICBkb21haW5fbmFtZSA9IGxpYnhsX2RvbWlkX3RvX25hbWUoY3R4LCBkb21p bmZvLT5kb21pZCk7Ci0gICAgcHJpbnRmKCIlLTQwcyAlNWQiLCBkb21haW5fbmFtZSwgZG9taW5m by0+ZG9taWQpOwotICAgIGZyZWUoZG9tYWluX25hbWUpOwotCi0gICAgbGlieGxfZm9yX2VhY2hf c2V0X2JpdChzb2NrZXRpZCwgKnNvY2tldG1hcCkgewotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsK LSAgICAgICAgY2FzZSBMSUJYTF9QU1JfQ01UX1RZUEVfQ0FDSEVfT0NDVVBBTkNZOgotICAgICAg ICAgICAgaWYgKCFsaWJ4bF9wc3JfY210X2dldF9zYW1wbGUoY3R4LCBkb21pbmZvLT5kb21pZCwg dHlwZSwgc29ja2V0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmbW9uaXRvcl9kYXRhLCBOVUxMKSkKLSAgICAgICAgICAgICAgICBwcmludGYoIiUxMyJQUkl1 NjQiIEtCIiwgbW9uaXRvcl9kYXRhIC8gMTAyNCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg ICAgY2FzZSBMSUJYTF9QU1JfQ01UX1RZUEVfVE9UQUxfTUVNX0NPVU5UOgotICAgICAgICBjYXNl IExJQlhMX1BTUl9DTVRfVFlQRV9MT0NBTF9NRU1fQ09VTlQ6Ci0gICAgICAgICAgICBpZiAoIXBz cl9jbXRfZ2V0X21lbV9iYW5kd2lkdGgoZG9taW5mby0+ZG9taWQsIHR5cGUsIHNvY2tldGlkLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb25pdG9yX2RhdGEp KQotICAgICAgICAgICAgICAgIHByaW50ZigiJTExIlBSSXU2NCIgS0IvcyIsIG1vbml0b3JfZGF0 YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJl dHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotc3RhdGlj IGludCBwc3JfY210X3Nob3cobGlieGxfcHNyX2NtdF90eXBlIHR5cGUsIHVpbnQzMl90IGRvbWlk KQotewotICAgIHVpbnQzMl90IGksIHNvY2tldGlkLCB0b3RhbF9ybWlkOwotICAgIHVpbnQzMl90 IGwzX2NhY2hlX3NpemU7Ci0gICAgbGlieGxfYml0bWFwIHNvY2tldG1hcDsKLSAgICBpbnQgcmMs IG5yX2RvbWFpbnM7Ci0KLSAgICBpZiAoIWxpYnhsX3Bzcl9jbXRfZW5hYmxlZChjdHgpKSB7Ci0g ICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ01UIGlzIGRpc2FibGVkIGluIHRoZSBzeXN0ZW1cbiIp OwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKCFsaWJ4bF9wc3JfY210X3R5 cGVfc3VwcG9ydGVkKGN0eCwgdHlwZSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNb25p dG9yIHR5cGUgJyVzJyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBzeXN0ZW1cbiIsCi0gICAgICAg ICAgICAgICAgbGlieGxfcHNyX2NtdF90eXBlX3RvX3N0cmluZyh0eXBlKSk7Ci0gICAgICAgIHJl dHVybiAtMTsKLSAgICB9Ci0KLSAgICBsaWJ4bF9iaXRtYXBfaW5pdCgmc29ja2V0bWFwKTsKLSAg ICBsaWJ4bF9zb2NrZXRfYml0bWFwX2FsbG9jKGN0eCwgJnNvY2tldG1hcCwgMCk7Ci0gICAgcmMg PSBsaWJ4bF9nZXRfb25saW5lX3NvY2tldG1hcChjdHgsICZzb2NrZXRtYXApOwotICAgIGlmIChy YyA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgZ2V0dGluZyBhdmFpbGFi bGUgc29ja2V0cywgcmM6ICVkXG4iLCByYyk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQot ICAgIHJjID0gbGlieGxfcHNyX2NtdF9nZXRfdG90YWxfcm1pZChjdHgsICZ0b3RhbF9ybWlkKTsK LSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdl dCBtYXggUk1JRCB2YWx1ZVxuIik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIHBy aW50ZigiVG90YWwgUk1JRDogJWRcbiIsIHRvdGFsX3JtaWQpOwotCi0gICAgLyogSGVhZGVyICov Ci0gICAgcHJpbnRmKCIlLTQwcyAlNXMiLCAiTmFtZSIsICJJRCIpOwotICAgIGxpYnhsX2Zvcl9l YWNoX3NldF9iaXQoc29ja2V0aWQsIHNvY2tldG1hcCkKLSAgICAgICAgcHJpbnRmKCIlMTRzICVk IiwgIlNvY2tldCIsIHNvY2tldGlkKTsKLSAgICBwcmludGYoIlxuIik7Ci0KLSAgICBpZiAodHlw ZSA9PSBMSUJYTF9QU1JfQ01UX1RZUEVfQ0FDSEVfT0NDVVBBTkNZKSB7Ci0gICAgICAgICAgICAv KiBUb3RhbCBMMyBjYWNoZSBzaXplICovCi0gICAgICAgICAgICBwcmludGYoIiUtNDZzIiwgIlRv dGFsIEwzIENhY2hlIFNpemUiKTsKLSAgICAgICAgICAgIGxpYnhsX2Zvcl9lYWNoX3NldF9iaXQo c29ja2V0aWQsIHNvY2tldG1hcCkgewotICAgICAgICAgICAgICAgIHJjID0gbGlieGxfcHNyX2Nt dF9nZXRfbDNfY2FjaGVfc2l6ZShjdHgsIHNvY2tldGlkLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbDNfY2FjaGVfc2l6ZSk7Ci0gICAgICAg ICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVy ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBzeXN0ZW0gbDMg Y2FjaGUgc2l6ZSBmb3Igc29ja2V0OiVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNvY2tldGlkKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgICAgICAg ICAgfQotICAgICAgICAgICAgICAgIHByaW50ZigiJTEzdSBLQiIsIGwzX2NhY2hlX3NpemUpOwot ICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLQotICAgIC8q IEVhY2ggZG9tYWluICovCi0gICAgaWYgKGRvbWlkICE9IElOVkFMSURfRE9NSUQpIHsKLSAgICAg ICAgbGlieGxfZG9taW5mbyBkb21pbmZvOwotCi0gICAgICAgIGxpYnhsX2RvbWluZm9faW5pdCgm ZG9taW5mbyk7Ci0gICAgICAgIGlmIChsaWJ4bF9kb21haW5faW5mbyhjdHgsICZkb21pbmZvLCBk b21pZCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBkb21h aW4gaW5mbyBmb3IgJWRcbiIsIGRvbWlkKTsKLSAgICAgICAgICAgIHJjID0gLTE7Ci0gICAgICAg ICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotICAgICAgICBwc3JfY210X3ByaW50X2RvbWFpbl9p bmZvKCZkb21pbmZvLCB0eXBlLCAmc29ja2V0bWFwKTsKLSAgICAgICAgbGlieGxfZG9taW5mb19k aXNwb3NlKCZkb21pbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbGlieGxf ZG9taW5mbyAqbGlzdDsKLSAgICAgICAgaWYgKCEobGlzdCA9IGxpYnhsX2xpc3RfZG9tYWluKGN0 eCwgJm5yX2RvbWFpbnMpKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQg dG8gZ2V0IGRvbWFpbiBpbmZvIGZvciBkb21haW4gbGlzdC5cbiIpOwotICAgICAgICAgICAgcmMg PSAtMTsKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9 IDA7IGkgPCBucl9kb21haW5zOyBpKyspCi0gICAgICAgICAgICBwc3JfY210X3ByaW50X2RvbWFp bl9pbmZvKGxpc3QgKyBpLCB0eXBlLCAmc29ja2V0bWFwKTsKLSAgICAgICAgbGlieGxfZG9taW5m b19saXN0X2ZyZWUobGlzdCwgbnJfZG9tYWlucyk7Ci0gICAgfQotCi1vdXQ6Ci0gICAgbGlieGxf Yml0bWFwX2Rpc3Bvc2UoJnNvY2tldG1hcCk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgbWFp bl9wc3JfY210X2F0dGFjaChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgdWludDMyX3Qg ZG9taWQ7Ci0gICAgaW50IG9wdCwgcmV0ID0gMDsKLQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChv cHQsICIiLCBOVUxMLCAicHNyLWNtdC1hdHRhY2giLCAxKSB7Ci0gICAgICAgIC8qIE5vIG9wdGlv bnMgKi8KLSAgICB9Ci0KLSAgICBkb21pZCA9IHhmaW5kX2RvbWFpbihhcmd2W29wdGluZF0pOwot ICAgIHJldCA9IGxpYnhsX3Bzcl9jbXRfYXR0YWNoKGN0eCwgZG9taWQpOwotCi0gICAgcmV0dXJu IHJldDsKLX0KLQotaW50IG1haW5fcHNyX2NtdF9kZXRhY2goaW50IGFyZ2MsIGNoYXIgKiphcmd2 KQotewotICAgIHVpbnQzMl90IGRvbWlkOwotICAgIGludCBvcHQsIHJldCA9IDA7Ci0KLSAgICBT V0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiIiwgTlVMTCwgInBzci1jbXQtZGV0YWNoIiwgMSkgewot ICAgICAgICAvKiBObyBvcHRpb25zICovCi0gICAgfQotCi0gICAgZG9taWQgPSB4ZmluZF9kb21h aW4oYXJndltvcHRpbmRdKTsKLSAgICByZXQgPSBsaWJ4bF9wc3JfY210X2RldGFjaChjdHgsIGRv bWlkKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBtYWluX3Bzcl9jbXRfc2hvdyhpbnQg YXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IG9wdCwgcmV0ID0gMDsKLSAgICB1aW50MzJf dCBkb21pZDsKLSAgICBsaWJ4bF9wc3JfY210X3R5cGUgdHlwZTsKLQotICAgIFNXSVRDSF9GT1JF QUNIX09QVChvcHQsICIiLCBOVUxMLCAicHNyLWNtdC1zaG93IiwgMSkgewotICAgICAgICAvKiBO byBvcHRpb25zICovCi0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiY2Fj aGUtb2NjdXBhbmN5IikpCi0gICAgICAgIHR5cGUgPSBMSUJYTF9QU1JfQ01UX1RZUEVfQ0FDSEVf T0NDVVBBTkNZOwotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAidG90YWwtbWVt LWJhbmR3aWR0aCIpKQotICAgICAgICB0eXBlID0gTElCWExfUFNSX0NNVF9UWVBFX1RPVEFMX01F TV9DT1VOVDsKLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3Zbb3B0aW5kXSwgImxvY2FsLW1lbS1i YW5kd2lkdGgiKSkKLSAgICAgICAgdHlwZSA9IExJQlhMX1BTUl9DTVRfVFlQRV9MT0NBTF9NRU1f Q09VTlQ7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGhlbHAoInBzci1jbXQtc2hvdyIpOwotICAgICAg ICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgICBpZiAob3B0aW5kICsgMSA+PSBhcmdjKQotICAgICAg ICBkb21pZCA9IElOVkFMSURfRE9NSUQ7Ci0gICAgZWxzZSBpZiAob3B0aW5kICsgMSA9PSBhcmdj IC0gMSkKLSAgICAgICAgZG9taWQgPSB4ZmluZF9kb21haW4oYXJndltvcHRpbmQgKyAxXSk7Ci0g ICAgZWxzZSB7Ci0gICAgICAgIGhlbHAoInBzci1jbXQtc2hvdyIpOwotICAgICAgICByZXR1cm4g MjsKLSAgICB9Ci0KLSAgICByZXQgPSBwc3JfY210X3Nob3codHlwZSwgZG9taWQpOwotCi0gICAg cmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgTElCWExfSEFWRV9QU1JfQ0FUCi1zdGF0 aWMgaW50IHBzcl9jYXRfaHdpbmZvKHZvaWQpCi17Ci0gICAgaW50IHJjOwotICAgIGludCBpLCBu cjsKLSAgICB1aW50MzJfdCBsM19jYWNoZV9zaXplOwotICAgIGxpYnhsX3Bzcl9jYXRfaW5mbyAq aW5mbzsKLQotICAgIHByaW50ZigiQ2FjaGUgQWxsb2NhdGlvbiBUZWNobm9sb2d5IChDQVQpOlxu Iik7Ci0KLSAgICByYyA9IGxpYnhsX3Bzcl9jYXRfZ2V0X2wzX2luZm8oY3R4LCAmaW5mbywgJm5y KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0 IGNhdCBpbmZvXG4iKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIGZvciAoaSA9 IDA7IGkgPCBucjsgaSsrKSB7Ci0gICAgICAgIHJjID0gbGlieGxfcHNyX2NtdF9nZXRfbDNfY2Fj aGVfc2l6ZShjdHgsIGluZm9baV0uaWQsICZsM19jYWNoZV9zaXplKTsKLSAgICAgICAgaWYgKHJj KSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgbDMgY2FjaGUg c2l6ZSBmb3Igc29ja2V0OiVkXG4iLAotICAgICAgICAgICAgICAgICAgICBpbmZvW2ldLmlkKTsK LSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiJS0xNnM6 ICV1XG4iLCAiU29ja2V0IElEIiwgaW5mb1tpXS5pZCk7Ci0gICAgICAgIHByaW50ZigiJS0xNnM6 ICV1S0JcbiIsICJMMyBDYWNoZSIsIGwzX2NhY2hlX3NpemUpOwotICAgICAgICBwcmludGYoIiUt MTZzOiAlc1xuIiwgIkNEUCBTdGF0dXMiLAotICAgICAgICAgICAgICAgaW5mb1tpXS5jZHBfZW5h YmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICAgICAgICBwcmludGYoIiUtMTZzOiAl dVxuIiwgIk1heGltdW0gQ09TIiwgaW5mb1tpXS5jb3NfbWF4KTsKLSAgICAgICAgcHJpbnRmKCIl LTE2czogJXVcbiIsICJDQk0gbGVuZ3RoIiwgaW5mb1tpXS5jYm1fbGVuKTsKLSAgICAgICAgcHJp bnRmKCIlLTE2czogJSNsbHhcbiIsICJEZWZhdWx0IENCTSIsCi0gICAgICAgICAgICAgICAoMXVs bCA8PCBpbmZvW2ldLmNibV9sZW4pIC0gMSk7Ci0gICAgfQotCi1vdXQ6Ci0gICAgbGlieGxfcHNy X2NhdF9pbmZvX2xpc3RfZnJlZShpbmZvLCBucik7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0 aWMgdm9pZCBwc3JfY2F0X3ByaW50X29uZV9kb21haW5fY2JtX3R5cGUodWludDMyX3QgZG9taWQs IHVpbnQzMl90IHNvY2tldGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxpYnhsX3Bzcl9jYm1fdHlwZSB0eXBlKQotewotICAgIHVpbnQ2NF90IGNibTsK LQotICAgIGlmICghbGlieGxfcHNyX2NhdF9nZXRfY2JtKGN0eCwgZG9taWQsIHR5cGUsIHNvY2tl dGlkLCAmY2JtKSkKLSAgICAgICAgcHJpbnRmKCIlIzE2IlBSSXg2NCwgY2JtKTsKLSAgICBlbHNl Ci0gICAgICAgIHByaW50ZigiJTE2cyIsICJlcnJvciIpOwotfQotCi1zdGF0aWMgdm9pZCBwc3Jf Y2F0X3ByaW50X29uZV9kb21haW5fY2JtKHVpbnQzMl90IGRvbWlkLCB1aW50MzJfdCBzb2NrZXRp ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjZHBfZW5h YmxlZCkKLXsKLSAgICBjaGFyICpkb21haW5fbmFtZTsKLQotICAgIGRvbWFpbl9uYW1lID0gbGli eGxfZG9taWRfdG9fbmFtZShjdHgsIGRvbWlkKTsKLSAgICBwcmludGYoIiU1ZCUyNXMiLCBkb21p ZCwgZG9tYWluX25hbWUpOwotICAgIGZyZWUoZG9tYWluX25hbWUpOwotCi0gICAgaWYgKCFjZHBf ZW5hYmxlZCkgewotICAgICAgICBwc3JfY2F0X3ByaW50X29uZV9kb21haW5fY2JtX3R5cGUoZG9t aWQsIHNvY2tldGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TElCWExfUFNSX0NCTV9UWVBFX0wzX0NCTSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHNyX2Nh dF9wcmludF9vbmVfZG9tYWluX2NibV90eXBlKGRvbWlkLCBzb2NrZXRpZCwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlhMX1BTUl9DQk1fVFlQRV9MM19DQk1f Q09ERSk7Ci0gICAgICAgIHBzcl9jYXRfcHJpbnRfb25lX2RvbWFpbl9jYm1fdHlwZShkb21pZCwg c29ja2V0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJY TF9QU1JfQ0JNX1RZUEVfTDNfQ0JNX0RBVEEpOwotICAgIH0KLQotICAgIHByaW50ZigiXG4iKTsK LX0KLQotc3RhdGljIGludCBwc3JfY2F0X3ByaW50X2RvbWFpbl9jYm0odWludDMyX3QgZG9taWQs IHVpbnQzMl90IHNvY2tldGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ym9vbCBjZHBfZW5hYmxlZCkKLXsKLSAgICBpbnQgaSwgbnJfZG9tYWluczsKLSAgICBsaWJ4bF9k b21pbmZvICpsaXN0OwotCi0gICAgaWYgKGRvbWlkICE9IElOVkFMSURfRE9NSUQpIHsKLSAgICAg ICAgcHNyX2NhdF9wcmludF9vbmVfZG9tYWluX2NibShkb21pZCwgc29ja2V0aWQsIGNkcF9lbmFi bGVkKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCEobGlzdCA9IGxpYnhs X2xpc3RfZG9tYWluKGN0eCwgJm5yX2RvbWFpbnMpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVy ciwgIkZhaWxlZCB0byBnZXQgZG9tYWluIGxpc3QgZm9yIGNibSBkaXNwbGF5XG4iKTsKLSAgICAg ICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBucl9kb21haW5zOyBp KyspCi0gICAgICAgIHBzcl9jYXRfcHJpbnRfb25lX2RvbWFpbl9jYm0obGlzdFtpXS5kb21pZCwg c29ja2V0aWQsIGNkcF9lbmFibGVkKTsKLSAgICBsaWJ4bF9kb21pbmZvX2xpc3RfZnJlZShsaXN0 LCBucl9kb21haW5zKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBzcl9jYXRf cHJpbnRfc29ja2V0KHVpbnQzMl90IGRvbWlkLCBsaWJ4bF9wc3JfY2F0X2luZm8gKmluZm8pCi17 Ci0gICAgaW50IHJjOwotICAgIHVpbnQzMl90IGwzX2NhY2hlX3NpemU7Ci0KLSAgICByYyA9IGxp YnhsX3Bzcl9jbXRfZ2V0X2wzX2NhY2hlX3NpemUoY3R4LCBpbmZvLT5pZCwgJmwzX2NhY2hlX3Np emUpOwotICAgIGlmIChyYykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBn ZXQgbDMgY2FjaGUgc2l6ZSBmb3Igc29ja2V0OiVkXG4iLAotICAgICAgICAgICAgICAgIGluZm8t PmlkKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaW50ZigiJS0xNnM6ICV1 XG4iLCAiU29ja2V0IElEIiwgaW5mby0+aWQpOwotICAgIHByaW50ZigiJS0xNnM6ICV1S0JcbiIs ICJMMyBDYWNoZSIsIGwzX2NhY2hlX3NpemUpOwotICAgIHByaW50ZigiJS0xNnM6ICUjbGx4XG4i LCAiRGVmYXVsdCBDQk0iLCAoMXVsbCA8PCBpbmZvLT5jYm1fbGVuKSAtIDEpOwotICAgIGlmIChp bmZvLT5jZHBfZW5hYmxlZCkKLSAgICAgICAgcHJpbnRmKCIlNXMlMjVzJTE2cyUxNnNcbiIsICJJ RCIsICJOQU1FIiwgIkNCTSAoY29kZSkiLCAiQ0JNIChkYXRhKSIpOwotICAgIGVsc2UKLSAgICAg ICAgcHJpbnRmKCIlNXMlMjVzJTE2c1xuIiwgIklEIiwgIk5BTUUiLCAiQ0JNIik7Ci0KLSAgICBy ZXR1cm4gcHNyX2NhdF9wcmludF9kb21haW5fY2JtKGRvbWlkLCBpbmZvLT5pZCwgaW5mby0+Y2Rw X2VuYWJsZWQpOwotfQotCi1zdGF0aWMgaW50IHBzcl9jYXRfc2hvdyh1aW50MzJfdCBkb21pZCkK LXsKLSAgICBpbnQgaSwgbnI7Ci0gICAgaW50IHJjOwotICAgIGxpYnhsX3Bzcl9jYXRfaW5mbyAq aW5mbzsKLQotICAgIHJjID0gbGlieGxfcHNyX2NhdF9nZXRfbDNfaW5mbyhjdHgsICZpbmZvLCAm bnIpOwotICAgIGlmIChyYykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBn ZXQgY2F0IGluZm9cbiIpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgZm9yIChp ID0gMDsgaSA8IG5yOyBpKyspIHsKLSAgICAgICAgcmMgPSBwc3JfY2F0X3ByaW50X3NvY2tldChk b21pZCwgaW5mbyArIGkpOwotICAgICAgICBpZiAocmMpCi0gICAgICAgICAgICBnb3RvIG91dDsK LSAgICB9Ci0KLW91dDoKLSAgICBsaWJ4bF9wc3JfY2F0X2luZm9fbGlzdF9mcmVlKGluZm8sIG5y KTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBtYWluX3Bzcl9jYXRfY2JtX3NldChpbnQgYXJn YywgY2hhciAqKmFyZ3YpCi17Ci0gICAgdWludDMyX3QgZG9taWQ7Ci0gICAgbGlieGxfcHNyX2Ni bV90eXBlIHR5cGU7Ci0gICAgdWludDY0X3QgY2JtOwotICAgIGludCByZXQsIG9wdCA9IDA7Ci0g ICAgaW50IG9wdF9kYXRhID0gMCwgb3B0X2NvZGUgPSAwOwotICAgIGxpYnhsX2JpdG1hcCB0YXJn ZXRfbWFwOwotICAgIGNoYXIgKnZhbHVlOwotICAgIGxpYnhsX3N0cmluZ19saXN0IHNvY2tldF9s aXN0OwotICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLSAgICBpbnQgaSwgaiwgbGVuOwot Ci0gICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0gewotICAgICAgICB7InNvY2tldCIs IDEsIDAsICdzJ30sCi0gICAgICAgIHsiZGF0YSIsIDAsIDAsICdkJ30sCi0gICAgICAgIHsiY29k ZSIsIDAsIDAsICdjJ30sCi0gICAgICAgIENPTU1PTl9MT05HX09QVFMKLSAgICB9OwotCi0gICAg bGlieGxfc29ja2V0X2JpdG1hcF9hbGxvYyhjdHgsICZ0YXJnZXRfbWFwLCAwKTsKLSAgICBsaWJ4 bF9iaXRtYXBfc2V0X25vbmUoJnRhcmdldF9tYXApOwotCi0gICAgU1dJVENIX0ZPUkVBQ0hfT1BU KG9wdCwgInM6Y2QiLCBvcHRzLCAicHNyLWNhdC1jYm0tc2V0IiwgMikgewotICAgIGNhc2UgJ3Mn OgotICAgICAgICB0cmltKGlzc3BhY2UsIG9wdGFyZywgJnZhbHVlKTsKLSAgICAgICAgc3BsaXRf c3RyaW5nX2ludG9fc3RyaW5nX2xpc3QodmFsdWUsICIsIiwgJnNvY2tldF9saXN0KTsKLSAgICAg ICAgbGVuID0gbGlieGxfc3RyaW5nX2xpc3RfbGVuZ3RoKCZzb2NrZXRfbGlzdCk7Ci0gICAgICAg IGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgcGFyc2VfcmFuZ2Uoc29j a2V0X2xpc3RbaV0sICZzdGFydCwgJmVuZCk7Ci0gICAgICAgICAgICBmb3IgKGogPSBzdGFydDsg aiA8PSBlbmQ7IGorKykKLSAgICAgICAgICAgICAgICBsaWJ4bF9iaXRtYXBfc2V0KCZ0YXJnZXRf bWFwLCBqKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxpYnhsX3N0cmluZ19saXN0X2Rpc3Bvc2Uo JnNvY2tldF9saXN0KTsKLSAgICAgICAgZnJlZSh2YWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAg IGNhc2UgJ2QnOgotICAgICAgICBvcHRfZGF0YSA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh c2UgJ2MnOgotICAgICAgICBvcHRfY29kZSA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQot ICAgIGlmIChvcHRfZGF0YSAmJiBvcHRfY29kZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwg IkNhbm5vdCBoYW5kbGUgLWMgYW5kIC1kIGF0IHRoZSBzYW1lIHRpbWVcbiIpOwotICAgICAgICBy ZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChvcHRfZGF0YSkgewotICAgICAgICB0eXBlID0gTElC WExfUFNSX0NCTV9UWVBFX0wzX0NCTV9EQVRBOwotICAgIH0gZWxzZSBpZiAob3B0X2NvZGUpIHsK LSAgICAgICAgdHlwZSA9IExJQlhMX1BTUl9DQk1fVFlQRV9MM19DQk1fQ09ERTsKLSAgICB9IGVs c2UgewotICAgICAgICB0eXBlID0gTElCWExfUFNSX0NCTV9UWVBFX0wzX0NCTTsKLSAgICB9Ci0K LSAgICBpZiAobGlieGxfYml0bWFwX2lzX2VtcHR5KCZ0YXJnZXRfbWFwKSkKLSAgICAgICAgbGli eGxfYml0bWFwX3NldF9hbnkoJnRhcmdldF9tYXApOwotCi0gICAgaWYgKGFyZ2MgIT0gb3B0aW5k ICsgMikgewotICAgICAgICBoZWxwKCJwc3ItY2F0LWNibS1zZXQiKTsKLSAgICAgICAgcmV0dXJu IDI7Ci0gICAgfQotCi0gICAgZG9taWQgPSB4ZmluZF9kb21haW4oYXJndltvcHRpbmRdKTsKLSAg ICBjYm0gPSBzdHJ0b2xsKGFyZ3Zbb3B0aW5kICsgMV0sIE5VTEwgLCAwKTsKLQotICAgIHJldCA9 IGxpYnhsX3Bzcl9jYXRfc2V0X2NibShjdHgsIGRvbWlkLCB0eXBlLCAmdGFyZ2V0X21hcCwgY2Jt KTsKLQotICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZ0YXJnZXRfbWFwKTsKLSAgICByZXR1cm4g cmV0OwotfQotCi1pbnQgbWFpbl9wc3JfY2F0X3Nob3coaW50IGFyZ2MsIGNoYXIgKiphcmd2KQot ewotICAgIGludCBvcHQ7Ci0gICAgdWludDMyX3QgZG9taWQ7Ci0KLSAgICBTV0lUQ0hfRk9SRUFD SF9PUFQob3B0LCAiIiwgTlVMTCwgInBzci1jYXQtc2hvdyIsIDApIHsKLSAgICAgICAgLyogTm8g b3B0aW9ucyAqLwotICAgIH0KLQotICAgIGlmIChvcHRpbmQgPj0gYXJnYykKLSAgICAgICAgZG9t aWQgPSBJTlZBTElEX0RPTUlEOwotICAgIGVsc2UgaWYgKG9wdGluZCA9PSBhcmdjIC0gMSkKLSAg ICAgICAgZG9taWQgPSB4ZmluZF9kb21haW4oYXJndltvcHRpbmRdKTsKLSAgICBlbHNlIHsKLSAg ICAgICAgaGVscCgicHNyLWNhdC1zaG93Iik7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQot ICAgIHJldHVybiBwc3JfY2F0X3Nob3coZG9taWQpOwotfQotCi1pbnQgbWFpbl9wc3JfaHdpbmZv KGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgb3B0LCByZXQgPSAwOwotICAgIGJv b2wgYWxsID0gdHJ1ZSwgY210ID0gZmFsc2UsIGNhdCA9IGZhbHNlOwotICAgIHN0YXRpYyBzdHJ1 Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKLSAgICAgICAgeyJjbXQiLCAwLCAwLCAnbSd9LAotICAgICAg ICB7ImNhdCIsIDAsIDAsICdhJ30sCi0gICAgICAgIENPTU1PTl9MT05HX09QVFMKLSAgICB9Owot Ci0gICAgU1dJVENIX0ZPUkVBQ0hfT1BUKG9wdCwgIm1hIiwgb3B0cywgInBzci1od2luZm8iLCAw KSB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICAgIGFsbCA9IGZhbHNlOyBjbXQgPSB0cnVlOwotICAg ICAgICBicmVhazsKLSAgICBjYXNlICdhJzoKLSAgICAgICAgYWxsID0gZmFsc2U7IGNhdCA9IHRy dWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghcmV0ICYmIChhbGwgfHwgY210 KSkKLSAgICAgICAgcmV0ID0gcHNyX2NtdF9od2luZm8oKTsKLQotICAgIGlmICghcmV0ICYmIChh bGwgfHwgY2F0KSkKLSAgICAgICAgcmV0ID0gcHNyX2NhdF9od2luZm8oKTsKLQotICAgIHJldHVy biByZXQ7Ci19Ci0KLSNlbmRpZgotCiBpbnQgbWFpbl9xZW11X21vbml0b3JfY29tbWFuZChpbnQg YXJnYywgY2hhciAqKmFyZ3YpCiB7CiAgICAgaW50IG9wdDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3hs L3hsX3Bzci5jIGIvdG9vbHMveGwveGxfcHNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uMjk4NTYyMmYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3hsL3hsX3Bz ci5jCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDktMjAxNyBDaXRyaXgg THRkIGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIu MSBvbmx5LiB3aXRoIHRoZSBzcGVjaWFsCisgKiBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmli ZWQgaW4gZmlsZSBMSUNFTlNFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAq IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICov CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8 c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaWJ4bC5oPgorI2lu Y2x1ZGUgPGxpYnhsX3V0aWxzLmg+CisjaW5jbHVkZSA8bGlieGx1dGlsLmg+CisKKyNpbmNsdWRl ICJ4bC5oIgorI2luY2x1ZGUgInhsX3V0aWxzLmgiCisjaW5jbHVkZSAieGxfcGFyc2UuaCIKKwor I2lmZGVmIExJQlhMX0hBVkVfUFNSX0NNVAorc3RhdGljIGludCBwc3JfY210X2h3aW5mbyh2b2lk KQoreworICAgIGludCByYzsKKyAgICBpbnQgZW5hYmxlZDsKKyAgICB1aW50MzJfdCB0b3RhbF9y bWlkOworCisgICAgcHJpbnRmKCJDYWNoZSBNb25pdG9yaW5nIFRlY2hub2xvZ3kgKENNVCk6XG4i KTsKKworICAgIGVuYWJsZWQgPSBsaWJ4bF9wc3JfY210X2VuYWJsZWQoY3R4KTsKKyAgICBwcmlu dGYoIiUtMTZzOiAlc1xuIiwgIkVuYWJsZWQiLCBlbmFibGVkID8gIjEiIDogIjAiKTsKKyAgICBp ZiAoIWVuYWJsZWQpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmMgPSBsaWJ4bF9wc3JfY210 X2dldF90b3RhbF9ybWlkKGN0eCwgJnRvdGFsX3JtaWQpOworICAgIGlmIChyYykgeworICAgICAg ICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgbWF4IFJNSUQgdmFsdWVcbiIpOworICAg ICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHByaW50ZigiJS0xNnM6ICV1XG4iLCAiVG90YWwg Uk1JRCIsIHRvdGFsX3JtaWQpOworCisgICAgcHJpbnRmKCJTdXBwb3J0ZWQgbW9uaXRvciB0eXBl czpcbiIpOworICAgIGlmIChsaWJ4bF9wc3JfY210X3R5cGVfc3VwcG9ydGVkKGN0eCwgTElCWExf UFNSX0NNVF9UWVBFX0NBQ0hFX09DQ1VQQU5DWSkpCisgICAgICAgIHByaW50ZigiY2FjaGUtb2Nj dXBhbmN5XG4iKTsKKyAgICBpZiAobGlieGxfcHNyX2NtdF90eXBlX3N1cHBvcnRlZChjdHgsIExJ QlhMX1BTUl9DTVRfVFlQRV9UT1RBTF9NRU1fQ09VTlQpKQorICAgICAgICBwcmludGYoInRvdGFs LW1lbS1iYW5kd2lkdGhcbiIpOworICAgIGlmIChsaWJ4bF9wc3JfY210X3R5cGVfc3VwcG9ydGVk KGN0eCwgTElCWExfUFNSX0NNVF9UWVBFX0xPQ0FMX01FTV9DT1VOVCkpCisgICAgICAgIHByaW50 ZigibG9jYWwtbWVtLWJhbmR3aWR0aFxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNkZWZp bmUgTUJNX1NBTVBMRV9SRVRSWV9NQVggNAorc3RhdGljIGludCBwc3JfY210X2dldF9tZW1fYmFu ZHdpZHRoKHVpbnQzMl90IGRvbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGxpYnhsX3Bzcl9jbXRfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVpbnQzMl90IHNvY2tldGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVpbnQ2NF90ICpiYW5kd2lkdGhfcikKK3sKKyAgICB1aW50NjRfdCBzYW1wbGUx LCBzYW1wbGUyOworICAgIHVpbnQ2NF90IHRzYzEsIHRzYzI7CisgICAgaW50IHJldHJ5X2F0dGVt cHRzID0gMDsKKyAgICBpbnQgcmM7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICByYyA9IGxp YnhsX3Bzcl9jbXRfZ2V0X3NhbXBsZShjdHgsIGRvbWlkLCB0eXBlLCBzb2NrZXRpZCwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZTEsICZ0c2MxKTsKKyAgICAg ICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICB1c2xlZXAo MTAwMDApOworCisgICAgICAgIHJjID0gbGlieGxfcHNyX2NtdF9nZXRfc2FtcGxlKGN0eCwgZG9t aWQsIHR5cGUsIHNvY2tldGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmc2FtcGxlMiwgJnRzYzIpOworICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgcmV0 dXJuIHJjOworCisgICAgICAgIGlmICh0c2MyIDw9IHRzYzEpCisgICAgICAgICAgICByZXR1cm4g LTE7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFyZHdhcmUgZ3VhcmFudGVlcyBhdCBtb3N0 IDEgb3ZlcmZsb3cgY2FuIGhhcHBlbiBpZiB0aGUgZHVyYXRpb24KKyAgICAgICAgICogYmV0d2Vl biB0d28gc2FtcGxlcyBpcyBsZXNzIHRoYW4gMSBzZWNvbmQuIE5vdGUgdGhhdCB0c2MgcmV0dXJu ZWQKKyAgICAgICAgICogZnJvbSBoeXBlcnZpc29yIGlzIGFscmVhZHktc2NhbGVkIHRpbWUobnMp LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHRzYzIgLSB0c2MxIDwgMTAwMDAwMDAwMCAmJiBz YW1wbGUyID49IHNhbXBsZTEpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAocmV0 cnlfYXR0ZW1wdHMgPCBNQk1fU0FNUExFX1JFVFJZX01BWCkgeworICAgICAgICAgICAgcmV0cnlf YXR0ZW1wdHMrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJy LCAiZXZlbnQgY291bnRlciBvdmVyZmxvd2VkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsK KyAgICAgICAgfQorICAgIH0KKworICAgICpiYW5kd2lkdGhfciA9IChzYW1wbGUyIC0gc2FtcGxl MSkgKiAxMDAwMDAwMDAwIC8gKHRzYzIgLSB0c2MxKSAvIDEwMjQ7CisgICAgcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIHBzcl9jbXRfcHJpbnRfZG9tYWluX2luZm8obGlieGxfZG9taW5mbyAq ZG9taW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfcHNy X2NtdF90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxp YnhsX2JpdG1hcCAqc29ja2V0bWFwKQoreworICAgIGNoYXIgKmRvbWFpbl9uYW1lOworICAgIHVp bnQzMl90IHNvY2tldGlkOworICAgIHVpbnQ2NF90IG1vbml0b3JfZGF0YTsKKworICAgIGlmICgh bGlieGxfcHNyX2NtdF9kb21haW5fYXR0YWNoZWQoY3R4LCBkb21pbmZvLT5kb21pZCkpCisgICAg ICAgIHJldHVybjsKKworICAgIGRvbWFpbl9uYW1lID0gbGlieGxfZG9taWRfdG9fbmFtZShjdHgs IGRvbWluZm8tPmRvbWlkKTsKKyAgICBwcmludGYoIiUtNDBzICU1ZCIsIGRvbWFpbl9uYW1lLCBk b21pbmZvLT5kb21pZCk7CisgICAgZnJlZShkb21haW5fbmFtZSk7CisKKyAgICBsaWJ4bF9mb3Jf ZWFjaF9zZXRfYml0KHNvY2tldGlkLCAqc29ja2V0bWFwKSB7CisgICAgICAgIHN3aXRjaCAodHlw ZSkgeworICAgICAgICBjYXNlIExJQlhMX1BTUl9DTVRfVFlQRV9DQUNIRV9PQ0NVUEFOQ1k6Cisg ICAgICAgICAgICBpZiAoIWxpYnhsX3Bzcl9jbXRfZ2V0X3NhbXBsZShjdHgsIGRvbWluZm8tPmRv bWlkLCB0eXBlLCBzb2NrZXRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZtb25pdG9yX2RhdGEsIE5VTEwpKQorICAgICAgICAgICAgICAgIHByaW50ZigiJTEz IlBSSXU2NCIgS0IiLCBtb25pdG9yX2RhdGEgLyAxMDI0KTsKKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICBjYXNlIExJQlhMX1BTUl9DTVRfVFlQRV9UT1RBTF9NRU1fQ09VTlQ6CisgICAgICAg IGNhc2UgTElCWExfUFNSX0NNVF9UWVBFX0xPQ0FMX01FTV9DT1VOVDoKKyAgICAgICAgICAgIGlm ICghcHNyX2NtdF9nZXRfbWVtX2JhbmR3aWR0aChkb21pbmZvLT5kb21pZCwgdHlwZSwgc29ja2V0 aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vbml0b3Jf ZGF0YSkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMTEiUFJJdTY0IiBLQi9zIiwgbW9uaXRv cl9kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg ICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpbnRmKCJcbiIpOworfQorCitz dGF0aWMgaW50IHBzcl9jbXRfc2hvdyhsaWJ4bF9wc3JfY210X3R5cGUgdHlwZSwgdWludDMyX3Qg ZG9taWQpCit7CisgICAgdWludDMyX3QgaSwgc29ja2V0aWQsIHRvdGFsX3JtaWQ7CisgICAgdWlu dDMyX3QgbDNfY2FjaGVfc2l6ZTsKKyAgICBsaWJ4bF9iaXRtYXAgc29ja2V0bWFwOworICAgIGlu dCByYywgbnJfZG9tYWluczsKKworICAgIGlmICghbGlieGxfcHNyX2NtdF9lbmFibGVkKGN0eCkp IHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDTVQgaXMgZGlzYWJsZWQgaW4gdGhlIHN5c3Rl bVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIWxpYnhsX3Bzcl9j bXRfdHlwZV9zdXBwb3J0ZWQoY3R4LCB0eXBlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwg Ik1vbml0b3IgdHlwZSAnJXMnIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHN5c3RlbVxuIiwKKyAg ICAgICAgICAgICAgICBsaWJ4bF9wc3JfY210X3R5cGVfdG9fc3RyaW5nKHR5cGUpKTsKKyAgICAg ICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxpYnhsX2JpdG1hcF9pbml0KCZzb2NrZXRtYXAp OworICAgIGxpYnhsX3NvY2tldF9iaXRtYXBfYWxsb2MoY3R4LCAmc29ja2V0bWFwLCAwKTsKKyAg ICByYyA9IGxpYnhsX2dldF9vbmxpbmVfc29ja2V0bWFwKGN0eCwgJnNvY2tldG1hcCk7CisgICAg aWYgKHJjIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBnZXR0aW5nIGF2 YWlsYWJsZSBzb2NrZXRzLCByYzogJWRcbiIsIHJjKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAg fQorCisgICAgcmMgPSBsaWJ4bF9wc3JfY210X2dldF90b3RhbF9ybWlkKGN0eCwgJnRvdGFsX3Jt aWQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQg dG8gZ2V0IG1heCBSTUlEIHZhbHVlXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisg ICAgcHJpbnRmKCJUb3RhbCBSTUlEOiAlZFxuIiwgdG90YWxfcm1pZCk7CisKKyAgICAvKiBIZWFk ZXIgKi8KKyAgICBwcmludGYoIiUtNDBzICU1cyIsICJOYW1lIiwgIklEIik7CisgICAgbGlieGxf Zm9yX2VhY2hfc2V0X2JpdChzb2NrZXRpZCwgc29ja2V0bWFwKQorICAgICAgICBwcmludGYoIiUx NHMgJWQiLCAiU29ja2V0Iiwgc29ja2V0aWQpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGlm ICh0eXBlID09IExJQlhMX1BTUl9DTVRfVFlQRV9DQUNIRV9PQ0NVUEFOQ1kpIHsKKyAgICAgICAg ICAgIC8qIFRvdGFsIEwzIGNhY2hlIHNpemUgKi8KKyAgICAgICAgICAgIHByaW50ZigiJS00NnMi LCAiVG90YWwgTDMgQ2FjaGUgU2l6ZSIpOworICAgICAgICAgICAgbGlieGxfZm9yX2VhY2hfc2V0 X2JpdChzb2NrZXRpZCwgc29ja2V0bWFwKSB7CisgICAgICAgICAgICAgICAgcmMgPSBsaWJ4bF9w c3JfY210X2dldF9sM19jYWNoZV9zaXplKGN0eCwgc29ja2V0aWQsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsM19jYWNoZV9zaXplKTsKKyAg ICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYo c3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHN5c3Rl bSBsMyBjYWNoZSBzaXplIGZvciBzb2NrZXQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc29ja2V0aWQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAg ICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMTN1IEtCIiwgbDNfY2FjaGVfc2l6 ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorCisg ICAgLyogRWFjaCBkb21haW4gKi8KKyAgICBpZiAoZG9taWQgIT0gSU5WQUxJRF9ET01JRCkgewor ICAgICAgICBsaWJ4bF9kb21pbmZvIGRvbWluZm87CisKKyAgICAgICAgbGlieGxfZG9taW5mb19p bml0KCZkb21pbmZvKTsKKyAgICAgICAgaWYgKGxpYnhsX2RvbWFpbl9pbmZvKGN0eCwgJmRvbWlu Zm8sIGRvbWlkKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0 IGRvbWFpbiBpbmZvIGZvciAlZFxuIiwgZG9taWQpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAg ICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHBzcl9jbXRfcHJpbnRfZG9t YWluX2luZm8oJmRvbWluZm8sIHR5cGUsICZzb2NrZXRtYXApOworICAgICAgICBsaWJ4bF9kb21p bmZvX2Rpc3Bvc2UoJmRvbWluZm8pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBs aWJ4bF9kb21pbmZvICpsaXN0OworICAgICAgICBpZiAoIShsaXN0ID0gbGlieGxfbGlzdF9kb21h aW4oY3R4LCAmbnJfZG9tYWlucykpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZh aWxlZCB0byBnZXQgZG9tYWluIGluZm8gZm9yIGRvbWFpbiBsaXN0LlxuIik7CisgICAgICAgICAg ICByYyA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9y IChpID0gMDsgaSA8IG5yX2RvbWFpbnM7IGkrKykKKyAgICAgICAgICAgIHBzcl9jbXRfcHJpbnRf ZG9tYWluX2luZm8obGlzdCArIGksIHR5cGUsICZzb2NrZXRtYXApOworICAgICAgICBsaWJ4bF9k b21pbmZvX2xpc3RfZnJlZShsaXN0LCBucl9kb21haW5zKTsKKyAgICB9CisKK291dDoKKyAgICBs aWJ4bF9iaXRtYXBfZGlzcG9zZSgmc29ja2V0bWFwKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2lu dCBtYWluX3Bzcl9jbXRfYXR0YWNoKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICB1aW50 MzJfdCBkb21pZDsKKyAgICBpbnQgb3B0LCByZXQgPSAwOworCisgICAgU1dJVENIX0ZPUkVBQ0hf T1BUKG9wdCwgIiIsIE5VTEwsICJwc3ItY210LWF0dGFjaCIsIDEpIHsKKyAgICAgICAgLyogTm8g b3B0aW9ucyAqLworICAgIH0KKworICAgIGRvbWlkID0geGZpbmRfZG9tYWluKGFyZ3Zbb3B0aW5k XSk7CisgICAgcmV0ID0gbGlieGxfcHNyX2NtdF9hdHRhY2goY3R4LCBkb21pZCk7CisKKyAgICBy ZXR1cm4gcmV0OworfQorCitpbnQgbWFpbl9wc3JfY210X2RldGFjaChpbnQgYXJnYywgY2hhciAq KmFyZ3YpCit7CisgICAgdWludDMyX3QgZG9taWQ7CisgICAgaW50IG9wdCwgcmV0ID0gMDsKKwor ICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBOVUxMLCAicHNyLWNtdC1kZXRhY2giLCAx KSB7CisgICAgICAgIC8qIE5vIG9wdGlvbnMgKi8KKyAgICB9CisKKyAgICBkb21pZCA9IHhmaW5k X2RvbWFpbihhcmd2W29wdGluZF0pOworICAgIHJldCA9IGxpYnhsX3Bzcl9jbXRfZGV0YWNoKGN0 eCwgZG9taWQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW5fcHNyX2NtdF9zaG93 KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgb3B0LCByZXQgPSAwOworICAgIHVp bnQzMl90IGRvbWlkOworICAgIGxpYnhsX3Bzcl9jbXRfdHlwZSB0eXBlOworCisgICAgU1dJVENI X0ZPUkVBQ0hfT1BUKG9wdCwgIiIsIE5VTEwsICJwc3ItY210LXNob3ciLCAxKSB7CisgICAgICAg IC8qIE5vIG9wdGlvbnMgKi8KKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChhcmd2W29wdGluZF0s ICJjYWNoZS1vY2N1cGFuY3kiKSkKKyAgICAgICAgdHlwZSA9IExJQlhMX1BTUl9DTVRfVFlQRV9D QUNIRV9PQ0NVUEFOQ1k7CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W29wdGluZF0sICJ0b3Rh bC1tZW0tYmFuZHdpZHRoIikpCisgICAgICAgIHR5cGUgPSBMSUJYTF9QU1JfQ01UX1RZUEVfVE9U QUxfTUVNX0NPVU5UOworICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAibG9jYWwt bWVtLWJhbmR3aWR0aCIpKQorICAgICAgICB0eXBlID0gTElCWExfUFNSX0NNVF9UWVBFX0xPQ0FM X01FTV9DT1VOVDsKKyAgICBlbHNlIHsKKyAgICAgICAgaGVscCgicHNyLWNtdC1zaG93Iik7Cisg ICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIGlmIChvcHRpbmQgKyAxID49IGFyZ2MpCisg ICAgICAgIGRvbWlkID0gSU5WQUxJRF9ET01JRDsKKyAgICBlbHNlIGlmIChvcHRpbmQgKyAxID09 IGFyZ2MgLSAxKQorICAgICAgICBkb21pZCA9IHhmaW5kX2RvbWFpbihhcmd2W29wdGluZCArIDFd KTsKKyAgICBlbHNlIHsKKyAgICAgICAgaGVscCgicHNyLWNtdC1zaG93Iik7CisgICAgICAgIHJl dHVybiAyOworICAgIH0KKworICAgIHJldCA9IHBzcl9jbXRfc2hvdyh0eXBlLCBkb21pZCk7CisK KyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBMSUJYTF9IQVZFX1BTUl9DQVQK K3N0YXRpYyBpbnQgcHNyX2NhdF9od2luZm8odm9pZCkKK3sKKyAgICBpbnQgcmM7CisgICAgaW50 IGksIG5yOworICAgIHVpbnQzMl90IGwzX2NhY2hlX3NpemU7CisgICAgbGlieGxfcHNyX2NhdF9p bmZvICppbmZvOworCisgICAgcHJpbnRmKCJDYWNoZSBBbGxvY2F0aW9uIFRlY2hub2xvZ3kgKENB VCk6XG4iKTsKKworICAgIHJjID0gbGlieGxfcHNyX2NhdF9nZXRfbDNfaW5mbyhjdHgsICZpbmZv LCAmbnIpOworICAgIGlmIChyYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0 byBnZXQgY2F0IGluZm9cbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgZm9y IChpID0gMDsgaSA8IG5yOyBpKyspIHsKKyAgICAgICAgcmMgPSBsaWJ4bF9wc3JfY210X2dldF9s M19jYWNoZV9zaXplKGN0eCwgaW5mb1tpXS5pZCwgJmwzX2NhY2hlX3NpemUpOworICAgICAgICBp ZiAocmMpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBsMyBj YWNoZSBzaXplIGZvciBzb2NrZXQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGluZm9baV0u aWQpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIl LTE2czogJXVcbiIsICJTb2NrZXQgSUQiLCBpbmZvW2ldLmlkKTsKKyAgICAgICAgcHJpbnRmKCIl LTE2czogJXVLQlxuIiwgIkwzIENhY2hlIiwgbDNfY2FjaGVfc2l6ZSk7CisgICAgICAgIHByaW50 ZigiJS0xNnM6ICVzXG4iLCAiQ0RQIFN0YXR1cyIsCisgICAgICAgICAgICAgICBpbmZvW2ldLmNk cF9lbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisgICAgICAgIHByaW50ZigiJS0x NnM6ICV1XG4iLCAiTWF4aW11bSBDT1MiLCBpbmZvW2ldLmNvc19tYXgpOworICAgICAgICBwcmlu dGYoIiUtMTZzOiAldVxuIiwgIkNCTSBsZW5ndGgiLCBpbmZvW2ldLmNibV9sZW4pOworICAgICAg ICBwcmludGYoIiUtMTZzOiAlI2xseFxuIiwgIkRlZmF1bHQgQ0JNIiwKKyAgICAgICAgICAgICAg ICgxdWxsIDw8IGluZm9baV0uY2JtX2xlbikgLSAxKTsKKyAgICB9CisKK291dDoKKyAgICBsaWJ4 bF9wc3JfY2F0X2luZm9fbGlzdF9mcmVlKGluZm8sIG5yKTsKKyAgICByZXR1cm4gcmM7Cit9CisK K3N0YXRpYyB2b2lkIHBzcl9jYXRfcHJpbnRfb25lX2RvbWFpbl9jYm1fdHlwZSh1aW50MzJfdCBk b21pZCwgdWludDMyX3Qgc29ja2V0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbGlieGxfcHNyX2NibV90eXBlIHR5cGUpCit7CisgICAgdWludDY0X3Qg Y2JtOworCisgICAgaWYgKCFsaWJ4bF9wc3JfY2F0X2dldF9jYm0oY3R4LCBkb21pZCwgdHlwZSwg c29ja2V0aWQsICZjYm0pKQorICAgICAgICBwcmludGYoIiUjMTYiUFJJeDY0LCBjYm0pOworICAg IGVsc2UKKyAgICAgICAgcHJpbnRmKCIlMTZzIiwgImVycm9yIik7Cit9CisKK3N0YXRpYyB2b2lk IHBzcl9jYXRfcHJpbnRfb25lX2RvbWFpbl9jYm0odWludDMyX3QgZG9taWQsIHVpbnQzMl90IHNv Y2tldGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNk cF9lbmFibGVkKQoreworICAgIGNoYXIgKmRvbWFpbl9uYW1lOworCisgICAgZG9tYWluX25hbWUg PSBsaWJ4bF9kb21pZF90b19uYW1lKGN0eCwgZG9taWQpOworICAgIHByaW50ZigiJTVkJTI1cyIs IGRvbWlkLCBkb21haW5fbmFtZSk7CisgICAgZnJlZShkb21haW5fbmFtZSk7CisKKyAgICBpZiAo IWNkcF9lbmFibGVkKSB7CisgICAgICAgIHBzcl9jYXRfcHJpbnRfb25lX2RvbWFpbl9jYm1fdHlw ZShkb21pZCwgc29ja2V0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBMSUJYTF9QU1JfQ0JNX1RZUEVfTDNfQ0JNKTsKKyAgICB9IGVsc2UgeworICAgICAgICBw c3JfY2F0X3ByaW50X29uZV9kb21haW5fY2JtX3R5cGUoZG9taWQsIHNvY2tldGlkLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCWExfUFNSX0NCTV9UWVBFX0wz X0NCTV9DT0RFKTsKKyAgICAgICAgcHNyX2NhdF9wcmludF9vbmVfZG9tYWluX2NibV90eXBlKGRv bWlkLCBzb2NrZXRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IExJQlhMX1BTUl9DQk1fVFlQRV9MM19DQk1fREFUQSk7CisgICAgfQorCisgICAgcHJpbnRmKCJc biIpOworfQorCitzdGF0aWMgaW50IHBzcl9jYXRfcHJpbnRfZG9tYWluX2NibSh1aW50MzJfdCBk b21pZCwgdWludDMyX3Qgc29ja2V0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBib29sIGNkcF9lbmFibGVkKQoreworICAgIGludCBpLCBucl9kb21haW5zOworICAgIGxp YnhsX2RvbWluZm8gKmxpc3Q7CisKKyAgICBpZiAoZG9taWQgIT0gSU5WQUxJRF9ET01JRCkgewor ICAgICAgICBwc3JfY2F0X3ByaW50X29uZV9kb21haW5fY2JtKGRvbWlkLCBzb2NrZXRpZCwgY2Rw X2VuYWJsZWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIShsaXN0ID0g bGlieGxfbGlzdF9kb21haW4oY3R4LCAmbnJfZG9tYWlucykpKSB7CisgICAgICAgIGZwcmludGYo c3RkZXJyLCAiRmFpbGVkIHRvIGdldCBkb21haW4gbGlzdCBmb3IgY2JtIGRpc3BsYXlcbiIpOwor ICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5yX2RvbWFp bnM7IGkrKykKKyAgICAgICAgcHNyX2NhdF9wcmludF9vbmVfZG9tYWluX2NibShsaXN0W2ldLmRv bWlkLCBzb2NrZXRpZCwgY2RwX2VuYWJsZWQpOworICAgIGxpYnhsX2RvbWluZm9fbGlzdF9mcmVl KGxpc3QsIG5yX2RvbWFpbnMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHNy X2NhdF9wcmludF9zb2NrZXQodWludDMyX3QgZG9taWQsIGxpYnhsX3Bzcl9jYXRfaW5mbyAqaW5m bykKK3sKKyAgICBpbnQgcmM7CisgICAgdWludDMyX3QgbDNfY2FjaGVfc2l6ZTsKKworICAgIHJj ID0gbGlieGxfcHNyX2NtdF9nZXRfbDNfY2FjaGVfc2l6ZShjdHgsIGluZm8tPmlkLCAmbDNfY2Fj aGVfc2l6ZSk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVk IHRvIGdldCBsMyBjYWNoZSBzaXplIGZvciBzb2NrZXQ6JWRcbiIsCisgICAgICAgICAgICAgICAg aW5mby0+aWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpbnRmKCIlLTE2 czogJXVcbiIsICJTb2NrZXQgSUQiLCBpbmZvLT5pZCk7CisgICAgcHJpbnRmKCIlLTE2czogJXVL QlxuIiwgIkwzIENhY2hlIiwgbDNfY2FjaGVfc2l6ZSk7CisgICAgcHJpbnRmKCIlLTE2czogJSNs bHhcbiIsICJEZWZhdWx0IENCTSIsICgxdWxsIDw8IGluZm8tPmNibV9sZW4pIC0gMSk7CisgICAg aWYgKGluZm8tPmNkcF9lbmFibGVkKQorICAgICAgICBwcmludGYoIiU1cyUyNXMlMTZzJTE2c1xu IiwgIklEIiwgIk5BTUUiLCAiQ0JNIChjb2RlKSIsICJDQk0gKGRhdGEpIik7CisgICAgZWxzZQor ICAgICAgICBwcmludGYoIiU1cyUyNXMlMTZzXG4iLCAiSUQiLCAiTkFNRSIsICJDQk0iKTsKKwor ICAgIHJldHVybiBwc3JfY2F0X3ByaW50X2RvbWFpbl9jYm0oZG9taWQsIGluZm8tPmlkLCBpbmZv LT5jZHBfZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBpbnQgcHNyX2NhdF9zaG93KHVpbnQzMl90IGRv bWlkKQoreworICAgIGludCBpLCBucjsKKyAgICBpbnQgcmM7CisgICAgbGlieGxfcHNyX2NhdF9p bmZvICppbmZvOworCisgICAgcmMgPSBsaWJ4bF9wc3JfY2F0X2dldF9sM19pbmZvKGN0eCwgJmlu Zm8sICZucik7CisgICAgaWYgKHJjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVk IHRvIGdldCBjYXQgaW5mb1xuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBm b3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworICAgICAgICByYyA9IHBzcl9jYXRfcHJpbnRfc29j a2V0KGRvbWlkLCBpbmZvICsgaSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8g b3V0OworICAgIH0KKworb3V0OgorICAgIGxpYnhsX3Bzcl9jYXRfaW5mb19saXN0X2ZyZWUoaW5m bywgbnIpOworICAgIHJldHVybiByYzsKK30KKworaW50IG1haW5fcHNyX2NhdF9jYm1fc2V0KGlu dCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICB1aW50MzJfdCBkb21pZDsKKyAgICBsaWJ4bF9w c3JfY2JtX3R5cGUgdHlwZTsKKyAgICB1aW50NjRfdCBjYm07CisgICAgaW50IHJldCwgb3B0ID0g MDsKKyAgICBpbnQgb3B0X2RhdGEgPSAwLCBvcHRfY29kZSA9IDA7CisgICAgbGlieGxfYml0bWFw IHRhcmdldF9tYXA7CisgICAgY2hhciAqdmFsdWU7CisgICAgbGlieGxfc3RyaW5nX2xpc3Qgc29j a2V0X2xpc3Q7CisgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworICAgIGludCBpLCBqLCBs ZW47CisKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisgICAgICAgIHsic29j a2V0IiwgMSwgMCwgJ3MnfSwKKyAgICAgICAgeyJkYXRhIiwgMCwgMCwgJ2QnfSwKKyAgICAgICAg eyJjb2RlIiwgMCwgMCwgJ2MnfSwKKyAgICAgICAgQ09NTU9OX0xPTkdfT1BUUworICAgIH07CisK KyAgICBsaWJ4bF9zb2NrZXRfYml0bWFwX2FsbG9jKGN0eCwgJnRhcmdldF9tYXAsIDApOworICAg IGxpYnhsX2JpdG1hcF9zZXRfbm9uZSgmdGFyZ2V0X21hcCk7CisKKyAgICBTV0lUQ0hfRk9SRUFD SF9PUFQob3B0LCAiczpjZCIsIG9wdHMsICJwc3ItY2F0LWNibS1zZXQiLCAyKSB7CisgICAgY2Fz ZSAncyc6CisgICAgICAgIHRyaW0oaXNzcGFjZSwgb3B0YXJnLCAmdmFsdWUpOworICAgICAgICBz cGxpdF9zdHJpbmdfaW50b19zdHJpbmdfbGlzdCh2YWx1ZSwgIiwiLCAmc29ja2V0X2xpc3QpOwor ICAgICAgICBsZW4gPSBsaWJ4bF9zdHJpbmdfbGlzdF9sZW5ndGgoJnNvY2tldF9saXN0KTsKKyAg ICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBwYXJzZV9yYW5n ZShzb2NrZXRfbGlzdFtpXSwgJnN0YXJ0LCAmZW5kKTsKKyAgICAgICAgICAgIGZvciAoaiA9IHN0 YXJ0OyBqIDw9IGVuZDsgaisrKQorICAgICAgICAgICAgICAgIGxpYnhsX2JpdG1hcF9zZXQoJnRh cmdldF9tYXAsIGopOworICAgICAgICB9CisKKyAgICAgICAgbGlieGxfc3RyaW5nX2xpc3RfZGlz cG9zZSgmc29ja2V0X2xpc3QpOworICAgICAgICBmcmVlKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7 CisgICAgY2FzZSAnZCc6CisgICAgICAgIG9wdF9kYXRhID0gMTsKKyAgICAgICAgYnJlYWs7Cisg ICAgY2FzZSAnYyc6CisgICAgICAgIG9wdF9jb2RlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAg fQorCisgICAgaWYgKG9wdF9kYXRhICYmIG9wdF9jb2RlKSB7CisgICAgICAgIGZwcmludGYoc3Rk ZXJyLCAiQ2Fubm90IGhhbmRsZSAtYyBhbmQgLWQgYXQgdGhlIHNhbWUgdGltZVxuIik7CisgICAg ICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKG9wdF9kYXRhKSB7CisgICAgICAgIHR5cGUg PSBMSUJYTF9QU1JfQ0JNX1RZUEVfTDNfQ0JNX0RBVEE7CisgICAgfSBlbHNlIGlmIChvcHRfY29k ZSkgeworICAgICAgICB0eXBlID0gTElCWExfUFNSX0NCTV9UWVBFX0wzX0NCTV9DT0RFOworICAg IH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSBMSUJYTF9QU1JfQ0JNX1RZUEVfTDNfQ0JNOworICAg IH0KKworICAgIGlmIChsaWJ4bF9iaXRtYXBfaXNfZW1wdHkoJnRhcmdldF9tYXApKQorICAgICAg ICBsaWJ4bF9iaXRtYXBfc2V0X2FueSgmdGFyZ2V0X21hcCk7CisKKyAgICBpZiAoYXJnYyAhPSBv cHRpbmQgKyAyKSB7CisgICAgICAgIGhlbHAoInBzci1jYXQtY2JtLXNldCIpOworICAgICAgICBy ZXR1cm4gMjsKKyAgICB9CisKKyAgICBkb21pZCA9IHhmaW5kX2RvbWFpbihhcmd2W29wdGluZF0p OworICAgIGNibSA9IHN0cnRvbGwoYXJndltvcHRpbmQgKyAxXSwgTlVMTCAsIDApOworCisgICAg cmV0ID0gbGlieGxfcHNyX2NhdF9zZXRfY2JtKGN0eCwgZG9taWQsIHR5cGUsICZ0YXJnZXRfbWFw LCBjYm0pOworCisgICAgbGlieGxfYml0bWFwX2Rpc3Bvc2UoJnRhcmdldF9tYXApOworICAgIHJl dHVybiByZXQ7Cit9CisKK2ludCBtYWluX3Bzcl9jYXRfc2hvdyhpbnQgYXJnYywgY2hhciAqKmFy Z3YpCit7CisgICAgaW50IG9wdDsKKyAgICB1aW50MzJfdCBkb21pZDsKKworICAgIFNXSVRDSF9G T1JFQUNIX09QVChvcHQsICIiLCBOVUxMLCAicHNyLWNhdC1zaG93IiwgMCkgeworICAgICAgICAv KiBObyBvcHRpb25zICovCisgICAgfQorCisgICAgaWYgKG9wdGluZCA+PSBhcmdjKQorICAgICAg ICBkb21pZCA9IElOVkFMSURfRE9NSUQ7CisgICAgZWxzZSBpZiAob3B0aW5kID09IGFyZ2MgLSAx KQorICAgICAgICBkb21pZCA9IHhmaW5kX2RvbWFpbihhcmd2W29wdGluZF0pOworICAgIGVsc2Ug eworICAgICAgICBoZWxwKCJwc3ItY2F0LXNob3ciKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAg fQorCisgICAgcmV0dXJuIHBzcl9jYXRfc2hvdyhkb21pZCk7Cit9CisKK2ludCBtYWluX3Bzcl9o d2luZm8oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBvcHQsIHJldCA9IDA7Cisg ICAgYm9vbCBhbGwgPSB0cnVlLCBjbXQgPSBmYWxzZSwgY2F0ID0gZmFsc2U7CisgICAgc3RhdGlj IHN0cnVjdCBvcHRpb24gb3B0c1tdID0geworICAgICAgICB7ImNtdCIsIDAsIDAsICdtJ30sCisg ICAgICAgIHsiY2F0IiwgMCwgMCwgJ2EnfSwKKyAgICAgICAgQ09NTU9OX0xPTkdfT1BUUworICAg IH07CisKKyAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAibWEiLCBvcHRzLCAicHNyLWh3aW5m byIsIDApIHsKKyAgICBjYXNlICdtJzoKKyAgICAgICAgYWxsID0gZmFsc2U7IGNtdCA9IHRydWU7 CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOgorICAgICAgICBhbGwgPSBmYWxzZTsgY2F0 ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFyZXQgJiYgKGFsbCB8 fCBjbXQpKQorICAgICAgICByZXQgPSBwc3JfY210X2h3aW5mbygpOworCisgICAgaWYgKCFyZXQg JiYgKGFsbCB8fCBjYXQpKQorICAgICAgICByZXQgPSBwc3JfY2F0X2h3aW5mbygpOworCisgICAg cmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBt b2RlOiBDCisgKiBjLWJhc2ljLW9mZnNldDogNAorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisg KiBFbmQ6CisgKi8KLS0gCjIuMTEuMAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhl bi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=