LyoKICogRElTUERJQi5kbGwKICogCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbiAod2l0aCBzb21lIGhlbHAgZnJvbSBNYXJjdXMgTWVpc3NuZXIpCiAqCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAiZGlzcGRpYi5oIgojaW5jbHVkZSAidmdhLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJ3aW5lL3dpbmdkaTE2LmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpCgpzdGF0aWMgaW50IGRpc3BkaWJfbXVsdGkgPSAwOwoKc3RhdGljIFdPUkQgRElTUERJQl9CZWdpbihXT1JEIHdGbGFncykKewogICAgdW5zaWduZWQgWHJlcyxZcmVzLERlcHRoOwoKICAgIHN3aXRjaCh3RmxhZ3MmRElTUExBWURJQl9NT0RFKSB7CiAgICAgICAgY2FzZSBESVNQTEFZRElCX01PREVfREVGQVVMVDoKICAgICAgICAgICAgLyogRklYTUU6IGlzIHRoaXMgc3VwcG9zZWQgdG8gYXV0b2RldGVjdD8gKi8KICAgICAgICBjYXNlIERJU1BMQVlESUJfTU9ERV8zMjB4MjAweDg6CiAgICAgICAgICAgIFhyZXM9MzIwOyBZcmVzPTIwMDsgRGVwdGg9ODsgYnJlYWs7CiAgICAgICAgY2FzZSBESVNQTEFZRElCX01PREVfMzIweDI0MHg4OgogICAgICAgICAgICBYcmVzPTMyMDsgWXJlcz0yNDA7IERlcHRoPTg7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBESVNQTEFZRElCX05PVFNVUFBPUlRFRDsKICAgIH0KICAgIC8qIG1vcmUgb3IgbGVzcyBkdW1teSBjYWxscyB0byBEZWF0aC9SZXN1cnJlY3Rpb24sIGZvciBjb21wbGV0ZW5lc3MgKi8KICAgIC8qIEZJWE1FOiB3aGF0IGFyZ3VtZW50cyBzaG91bGQgdGhleSBnZXQ/ICovCiAgICBEZWF0aDE2KDApOwogICAgaWYgKFZHQV9TZXRNb2RlKFhyZXMsWXJlcyxEZXB0aCkpIHsKICAgICAgICAgUmVzdXJyZWN0aW9uMTYoMCwwLDAsMCwwLDAsMCk7CiAgICAgICAgIHJldHVybiBESVNQTEFZRElCX05PVFNVUFBPUlRFRDsKICAgIH0KICAgIHJldHVybiBESVNQTEFZRElCX05PRVJST1I7Cn0KCnN0YXRpYyB2b2lkIERJU1BESUJfRW5kKHZvaWQpCnsKICAgIFJlc3VycmVjdGlvbjE2KDAsMCwwLDAsMCwwLDApOyAvKiBGSVhNRTogYXJndW1lbnRzICovCiAgICBWR0FfRXhpdCgpOwp9CgpzdGF0aWMgdm9pZCBESVNQRElCX1BhbGV0dGUoTFBCSVRNQVBJTkZPIGxwYmkpCnsKICAgIFZHQV9TZXRRdWFkUGFsZXR0ZShscGJpLT5ibWlDb2xvcnMsMCwyNTYpOwp9CgpzdGF0aWMgdm9pZCBESVNQRElCX1Nob3coTFBCSVRNQVBJTkZPSEVBREVSIGxwYmksTFBTVFIgbHBCaXRzLFdPUkQgdUZsYWdzKQp7CiAgICBpbnQgWG9mcyxZb2ZzLFdpZHRoPWxwYmktPmJpV2lkdGgsSGVpZ2h0PWxwYmktPmJpSGVpZ2h0LERlbHRhOwogICAgdW5zaWduZWQgUGl0Y2g9KFdpZHRoKzMpJn4zLHNQaXRjaCxzV2lkdGgsc0hlaWdodDsKICAgIExQU1RSIHN1cmYgPSBET1NNRU1fTWFwRG9zVG9MaW5lYXIoMHhhMDAwMCk7CgogICAgaWYgKFZHQV9HZXRNb2RlKCZzSGVpZ2h0LCZzV2lkdGgsTlVMTCkpIHJldHVybjsKICAgIHNQaXRjaD0zMjA7CgogICAgRGVsdGE9KEhlaWdodDwwKSoyLTE7CiAgICBIZWlnaHQqPS1EZWx0YTsgUGl0Y2gqPURlbHRhOwoKICAgIGlmICh1RmxhZ3MmRElTUExBWURJQl9OT0NFTlRFUikgewogICAgICAgIFhvZnM9MDsgWW9mcz0wOwogICAgfSBlbHNlIHsKICAgICAgICBYb2ZzPShzV2lkdGgtV2lkdGgpLzI7CiAgICAgICAgWW9mcz0oc0hlaWdodC1IZWlnaHQpLzI7CiAgICB9CiAgICBzdXJmICs9IChZb2ZzKnNQaXRjaCkrWG9mczsKICAgIGlmIChQaXRjaDwwKSBscEJpdHMtPVBpdGNoKihIZWlnaHQtMSk7CiAgICBmb3IgKDsgSGVpZ2h0OyBIZWlnaHQtLSxscEJpdHMrPVBpdGNoLHN1cmYrPXNQaXRjaCkgewogICAgICAgIG1lbWNweShzdXJmLGxwQml0cyxXaWR0aCk7CiAgICB9CgogICAgVkdBX1BvbGwoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRGlzcGxheURpYgkoRElTUERJQi4xKQogKgogKiAgRGlzYWJsZXMgR0RJIGFuZCB0YWtlcyBvdmVyIHRoZSBWR0Egc2NyZWVuIHRvIHNob3cgRElCcyBpbiBmdWxsIHNjcmVlbi4KICoKICogRkxBR1MKICoKICogIERJU1BMQVlESUJfTk9QQUxFVFRFOiBkb24ndCBjaGFuZ2UgcGFsZXR0ZQogKiAgRElTUExBWURJQl9OT0NFTlRFUjogZG9uJ3QgY2VudGVyIGJpdG1hcAogKiAgRElTUExBWURJQl9OT1dBSVQ6IGRvbid0IHdhaXQgKGZvciBrZXlwcmVzcykgYmVmb3JlIHJldHVybmluZwogKiAgRElTUExBWURJQl9CRUdJTjogc3RhcnQgb2YgbXVsdGlwbGUgY2FsbHMgKGRvZXMgbm90IHJlc3RvcmUgdGhlIHNjcmVlbikKICogIERJU1BMQVlESUJfRU5EOiBlbmQgb2YgbXVsdGlwbGUgY2FsbHMgKHJlc3RvcmVzIHRoZSBzY3JlZW4pCiAqICBESVNQTEFZRElCX01PREVfREVGQVVMVDogZGVmYXVsdCBkaXNwbGF5IG1vZGUKICogIERJU1BMQVlESUJfTU9ERV8zMjB4MjAweDg6IFN0YW5kYXJkIFZHQSAzMjB4MjAwIDI1NiBjb2xvcnMKICogIERJU1BMQVlESUJfTU9ERV8zMjB4MjQweDg6IFR3ZWFrZWQgVkdBIDMyMHgyNDAgMjU2IGNvbG9ycwogKgogKiBSRVRVUk5TCiAqCiAqICBESVNQTEFZRElCX05PRVJST1I6IHN1Y2Nlc3MKICogIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOiBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkCiAqICBESVNQTEFZRElCX0lOVkFMSURESUI6IG51bGwgb3IgaW52YWxpZCBESUIgaGVhZGVyCiAqICBESVNQTEFZRElCX0lOVkFMSURGT1JNQVQ6IGludmFsaWQgRElCIGZvcm1hdAogKiAgRElTUExBWURJQl9JTlZBTElEVEFTSzogbm90IGNhbGxlZCBmcm9tIGN1cnJlbnQgdGFzawogKgogKiBCVUdTCiAqCiAqICBXYWl0aW5nIGZvciBrZXlwcmVzc2VzIGlzIG5vdCBpbXBsZW1lbnRlZC4KICovCldPUkQgV0lOQVBJIERpc3BsYXlEaWIoCgkJTFBCSVRNQVBJTkZPIGxwYmksIC8qIERJQiBoZWFkZXIgd2l0aCByZXNvbHV0aW9uIGFuZCBwYWxldHRlICovCgkJTFBTVFIgbHBCaXRzLCAvKiBCaXRtYXAgYml0cyB0byBzaG93ICovCgkJV09SRCB3RmxhZ3MKCSkKewogICAgV09SRCByZXQ7CgogICAgaWYgKHdGbGFncyZESVNQTEFZRElCX0VORCkgewogICAgICAgIGlmIChkaXNwZGliX211bHRpKSBESVNQRElCX0VuZCgpOwogICAgICAgIGRpc3BkaWJfbXVsdGkgPSAwOwogICAgICAgIHJldHVybiBESVNQTEFZRElCX05PRVJST1I7CiAgICB9CiAgICBpZiAoIWRpc3BkaWJfbXVsdGkpIHsKICAgICAgICByZXQ9RElTUERJQl9CZWdpbih3RmxhZ3MpOwogICAgICAgIGlmIChyZXQpIHJldHVybiByZXQ7CiAgICB9CiAgICBpZiAod0ZsYWdzJkRJU1BMQVlESUJfQkVHSU4pIGRpc3BkaWJfbXVsdGkgPSAxOwogICAgaWYgKCEod0ZsYWdzJkRJU1BMQVlESUJfTk9QQUxFVFRFKSkgewogICAgICAgIERJU1BESUJfUGFsZXR0ZShscGJpKTsKICAgIH0KICAgIC8qIEZJWE1FOiBub3Qgc3VyZSBpZiBpdCdzIHZhbGlkIHRvIGRyYXcgaW1hZ2VzIGluIERJU1BMQVlESUJfQkVHSU4sIHNvLi4uICovCiAgICBpZiAobHBCaXRzKSB7CiAgICAgICAgRElTUERJQl9TaG93KCYobHBiaS0+Ym1pSGVhZGVyKSxscEJpdHMsd0ZsYWdzKTsKICAgIH0KICAgIGlmICghKHdGbGFncyZESVNQTEFZRElCX05PV0FJVCkpIHsKICAgICAgICBGSVhNRSgid2FpdCBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgfQogICAgaWYgKCFkaXNwZGliX211bHRpKSBESVNQRElCX0VuZCgpOwogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQo=