Ci8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGZpbGUgbWFjcm9ibG9jay5jCiAqCiAqIFxicmllZgogKiAgICAgRGVjb2RlIGEgTWFjcm9ibG9jawogKgogKiBcYXV0aG9yCiAqICAgIE1haW4gY29udHJpYnV0b3JzIChzZWUgY29udHJpYnV0b3JzLmggZm9yIGNvcHlyaWdodCwgYWRkcmVzcyBhbmQgYWZmaWxpYXRpb24gZGV0YWlscykKICogICAgLSBJbmdlIExpbGxlLUxhbmf4eSAgICAgICAgICAgICAgIDxpbmdlLmxpbGxlLWxhbmdveUB0ZWxlbm9yLmNvbT4KICogICAgLSBSaWNrYXJkIFNqb2JlcmcgICAgICAgICAgICAgICAgIDxyaWNrYXJkLnNqb2JlcmdAZXJhLmVyaWNzc29uLnNlPgogKiAgICAtIEphbmkgTGFpbmVtYSAgICAgICAgICAgICAgICAgICAgPGphbmkubGFpbmVtYUBub2tpYS5jb20+CiAqICAgIC0gU2ViYXN0aWFuIFB1cnJlaXRlciAgICAgICAgICAgICA8c2ViYXN0aWFuLnB1cnJlaXRlckBtY2guc2llbWVucy5kZT4KICogICAgLSBUaG9tYXMgV2VkaSAgICAgICAgICAgICAgICAgICAgIDx3ZWRpQHRudC51bmktaGFubm92ZXIuZGU+CiAqICAgIC0gRGV0bGV2IE1hcnBlICAgICAgICAgICAgICAgICAgICA8bWFycGVAaGhpLmRlPgogKiAgICAtIEdhYmkgQmxhZXR0ZXJtYW5uICAgICAgICAgICAgICAgPGJsYWV0dGVyQGhoaS5kZT4KICogICAgLSBZZS1LdWkgV2FuZyAgICAgICAgICAgICAgICAgICAgIDx3eWtAaWVlZS5vcmc+CiAqICAgIC0gTG93ZWxsIFdpbmdlciAgICAgICAgICAgICAgICAgICA8bHdpbmdlckBsc2lsLmNvbT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaW5jbHVkZSAiY29udHJpYnV0b3JzLmgiCgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgImdsb2JhbC5oIgojaW5jbHVkZSAibWJ1ZmZlci5oIgojaW5jbHVkZSAiZWxlbWVudHMuaCIKI2luY2x1ZGUgImVycm9yY29uY2VhbG1lbnQuaCIKI2luY2x1ZGUgIm1hY3JvYmxvY2suaCIKI2luY2x1ZGUgImZtby5oIgojaW5jbHVkZSAiY2FiYWMuaCIKI2luY2x1ZGUgInZsYy5oIgojaW5jbHVkZSAiaW1hZ2UuaCIKI2luY2x1ZGUgIm1iX2FjY2Vzcy5oIgojaW5jbHVkZSAiYmlhcmlkZWNvZC5oIgoKI2luY2x1ZGUgInRyYW5zZm9ybTh4OC5oIgoKI2lmIFRSQUNFCiNkZWZpbmUgVFJBQ0VfU1RSSU5HKHMpIHN0cm5jcHkoY3VyclNFLnRyYWNlc3RyaW5nLCBzLCBUUkFDRVNUUklOR19TSVpFKQojZWxzZQojZGVmaW5lIFRSQUNFX1NUUklORyhzKSAvLyBkbyBub3RoaW5nCiNlbmRpZgoKZXh0ZXJuIGludCBsYXN0X2RxdWFudDsKZXh0ZXJuIENvbG9jYXRlZFBhcmFtcyAqQ29fbG9jYXRlZDsKCgpzdGF0aWMgdm9pZCBTZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IgKHN0cnVjdCBpbWdfcGFyICAqaW1nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgICBwbXZbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgICAgIHJlZl9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlICAgICAgICAgICAgbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAgICAgKioqcmVmUGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgICAqKioqdG1wX212LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBibG9ja194LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBibG9ja195LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBibG9ja3NoYXBlX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJsb2Nrc2hhcGVfeSk7CgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIGluaXRpYWxpemVzIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCBzdGFydF9tYWNyb2Jsb2NrKHN0cnVjdCBpbWdfcGFyICppbWcsaW50IEN1cnJlbnRNQkluU2Nhbk9yZGVyKQp7CiAgaW50IGwsajsKICBNYWNyb2Jsb2NrICpjdXJyTUI7ICAgLy8gaW50aWFsaXphdGlvbiBjb2RlIGRlbGV0ZWQsIHNlZSBiZWxvdywgU3RXCgogIGFzc2VydCAoaW1nLT5jdXJyZW50X21iX25yIDwgaW1nLT5QaWNTaXplSW5NYnMpOwoKICBjdXJyTUIgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CgogIC8qIFVwZGF0ZSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrICovCiAgaWYgKGltZy0+TWJhZmZGcmFtZUZsYWcpCiAgewogICAgaW1nLT5tYl94ID0gKGltZy0+Y3VycmVudF9tYl9uciklKCgyKmltZy0+d2lkdGgpL01CX0JMT0NLX1NJWkUpOwogICAgaW1nLT5tYl95ID0gMiooKGltZy0+Y3VycmVudF9tYl9ucikvKCgyKmltZy0+d2lkdGgpL01CX0JMT0NLX1NJWkUpKTsKCiAgICBpZiAoaW1nLT5tYl94ICYgMHgwMSkKICAgIHsKICAgICAgaW1nLT5tYl95Kys7CiAgICB9CgogICAgaW1nLT5tYl94IC89IDI7CiAgfQogIGVsc2UKICB7CiAgICBpbWctPm1iX3ggPSBQaWNQb3NbaW1nLT5jdXJyZW50X21iX25yXVswXTsKICAgIGltZy0+bWJfeSA9IFBpY1Bvc1tpbWctPmN1cnJlbnRfbWJfbnJdWzFdOwogIH0KCiAgLyogRGVmaW5lIHZlcnRpY2FsIHBvc2l0aW9ucyAqLwogIGltZy0+YmxvY2tfeSA9IGltZy0+bWJfeSAqIEJMT0NLX1NJWkU7ICAgICAgLyogbHVtYSBibG9jayBwb3NpdGlvbiAqLwogIGltZy0+cGl4X3kgICA9IGltZy0+bWJfeSAqIE1CX0JMT0NLX1NJWkU7ICAgLyogbHVtYSBtYWNyb2Jsb2NrIHBvc2l0aW9uICovCiAgaW1nLT5waXhfY195ID0gaW1nLT5tYl95ICogaW1nLT5tYl9jcl9zaXplX3k7IC8qIGNocm9tYSBtYWNyb2Jsb2NrIHBvc2l0aW9uICovCgogIC8qIERlZmluZSBob3Jpem9udGFsIHBvc2l0aW9ucyAqLwogIGltZy0+YmxvY2tfeCA9IGltZy0+bWJfeCAqIEJMT0NLX1NJWkU7ICAgICAgLyogbHVtYSBibG9jayBwb3NpdGlvbiAqLwogIGltZy0+cGl4X3ggICA9IGltZy0+bWJfeCAqIE1CX0JMT0NLX1NJWkU7ICAgLyogbHVtYSBwaXhlbCBwb3NpdGlvbiAqLwogIGltZy0+cGl4X2NfeCA9IGltZy0+bWJfeCAqIGltZy0+bWJfY3Jfc2l6ZV94OyAvKiBjaHJvbWEgcGl4ZWwgcG9zaXRpb24gKi8KCiAgLy8gU2F2ZSB0aGUgc2xpY2UgbnVtYmVyIG9mIHRoaXMgbWFjcm9ibG9jay4gV2hlbiB0aGUgbWFjcm9ibG9jayBiZWxvdwogIC8vIGlzIGNvZGVkIGl0IHdpbGwgdXNlIHRoaXMgdG8gZGVjaWRlIGlmIHByZWRpY3Rpb24gZm9yIGFib3ZlIGlzIHBvc3NpYmxlCiAgY3Vyck1CLT5zbGljZV9uciA9IGltZy0+Y3VycmVudF9zbGljZV9ucjsKCiAgaWYgKGltZy0+Y3VycmVudF9zbGljZV9uciA+PSBNQVhfTlVNX1NMSUNFUykKICB7CiAgICBlcnJvciAoIm1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBzbGljZXMgZXhjZWVkZWQsIHBsZWFzZSByZWNvbXBpbGUgd2l0aCBpbmNyZWFzZWQgdmFsdWUgZm9yIE1BWF9OVU1fU0xJQ0VTIiwgMjAwKTsKICB9CgogIGRlY19waWN0dXJlLT5zbGljZV9pZFtpbWctPm1iX3ldW2ltZy0+bWJfeF0gPSBpbWctPmN1cnJlbnRfc2xpY2VfbnI7CiAgaWYgKGltZy0+Y3VycmVudF9zbGljZV9uciA+IGRlY19waWN0dXJlLT5tYXhfc2xpY2VfaWQpCiAgewogICAgZGVjX3BpY3R1cmUtPm1heF9zbGljZV9pZD1pbWctPmN1cnJlbnRfc2xpY2VfbnI7CiAgfQoKICBDaGVja0F2YWlsYWJpbGl0eU9mTmVpZ2hib3JzKCk7CgogIC8vIFJlc2V0IHN5bnRheCBlbGVtZW50IGVudHJpZXMgaW4gTUIgc3RydWN0CiAgY3Vyck1CLT5xcCAgICAgICAgICA9IGltZy0+cXAgOwogIGN1cnJNQi0+bWJfdHlwZSAgICAgPSAwOwogIGN1cnJNQi0+ZGVsdGFfcXVhbnQgPSAwOwogIGN1cnJNQi0+Y2JwICAgICAgICAgPSAwOwogIGN1cnJNQi0+Y2JwX2JsayAgICAgPSAwOwogIGN1cnJNQi0+Y19pcHJlZF9tb2RlPSBEQ19QUkVEXzg7IC8vR0IKCiAgZm9yIChsPTA7IGwgPCAyOyBsKyspCiAgICBmb3IgKGo9MDsgaiA8IEJMT0NLX01VTFRJUExFOyBqKyspCiAgICAgIG1lbXNldCgmKGN1cnJNQi0+bXZkW2xdW2pdWzBdWzBdKSwwLCBCTE9DS19NVUxUSVBMRSAqIDIgKiBzaXplb2YoaW50KSk7CgogIGN1cnJNQi0+Y2JwX2JpdHMgICA9IDA7CgogIC8vIGluaXRpYWxpemUgaW1nLT5tNwogIG1lbXNldCgmKGltZy0+bTdbMF1bMF0pLCAwLCBNQl9CTE9DS19QSVhFTFMgKiBzaXplb2YoaW50KSk7CgogIC8vIHN0b3JlIGZpbHRlcmluZyBwYXJhbWV0ZXJzIGZvciB0aGlzIE1CCiAgY3Vyck1CLT5MRkRpc2FibGVJZGMgPSBpbWctPmN1cnJlbnRTbGljZS0+TEZEaXNhYmxlSWRjOwogIGN1cnJNQi0+TEZBbHBoYUMwT2Zmc2V0ID0gaW1nLT5jdXJyZW50U2xpY2UtPkxGQWxwaGFDME9mZnNldDsKICBjdXJyTUItPkxGQmV0YU9mZnNldCA9IGltZy0+Y3VycmVudFNsaWNlLT5MRkJldGFPZmZzZXQ7Cgp9CgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgc2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sKICogICAgY2hlY2sgZW5kX29mX3NsaWNlIGNvbmRpdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpCb29sZWFuIGV4aXRfbWFjcm9ibG9jayhzdHJ1Y3QgaW1nX3BhciAqaW1nLHN0cnVjdCBpbnBfcGFyICppbnAsaW50IGVvc19iaXQpCnsKIC8vISBUaGUgaWYoKSBzdGF0ZW1lbnQgYmVsb3cgcmVzZW1ibGVzIHRoZSBvcmlnaW5hbCBjb2RlLCB3aGljaCB0ZXN0ZWQKICAvLyEgaW1nLT5jdXJyZW50X21iX25yID09IGltZy0+UGljU2l6ZUluTWJzLiAgQm90aCBpcywgb2YgY291cnNlLCBub25zZW5zZQogIC8vISBJbiBhbiBlcnJvciBwcm9uZSBlbnZpcm9ubWVudCwgb25lIGNhbiBvbmx5IGJlIHN1cmUgdG8gaGF2ZSBhIG5ldwogIC8vISBwaWN0dXJlIGJ5IGNoZWNraW5nIHRoZSB0ciBvZiB0aGUgbmV4dCBzbGljZSBoZWFkZXIhCgovLyBwcmludGYgKCJleGl0X21hY3JvYmxvY2s6IEZtb0dldExhc3RNQk9mUGljdHVyZSAlZCwgaW1nLT5jdXJyZW50X21iX25yICVkXG4iLCBGbW9HZXRMYXN0TUJPZlBpY3R1cmUoKSwgaW1nLT5jdXJyZW50X21iX25yKTsKICBpbWctPm51bV9kZWNfbWIrKzsKCiAgaWYgKGltZy0+bnVtX2RlY19tYiA9PSBpbWctPlBpY1NpemVJbk1icykKLy8gIGlmIChpbWctPmN1cnJlbnRfbWJfbnIgPT0gRm1vR2V0TGFzdE1CT2ZQaWN0dXJlKGN1cnJTbGljZS0+c3RydWN0dXJlKSkKICB7Ci8vdGhiCi8qCiAgICBpZiAoY3VyclNsaWNlLT5uZXh0X2hlYWRlciAhPSBFT1MpCiAgICAgIGN1cnJTbGljZS0+bmV4dF9oZWFkZXIgPSBTT1A7CiovCi8vdGhlCi8vICAgIGFzc2VydCAobmFsX3N0YXJ0Y29kZV9mb2xsb3dzIChpbWcsIGVvc19iaXQpID09IFRSVUUpOwogICAgcmV0dXJuIFRSVUU7CiAgfQogIC8vIGFzayBmb3IgbGFzdCBtYiBpbiB0aGUgc2xpY2UgIFVWTEMKICBlbHNlCiAgewovLyBwcmludGYgKCJleGl0X21hY3JvYmxvY2s6IFNsaWNlICVkIG9sZCBNQiAlZCwgbm93IHVzaW5nIE1CICVkXG4iLCBpbWctPmN1cnJlbnRfc2xpY2VfbnIsIGltZy0+Y3VycmVudF9tYl9uciwgRm1vR2V0TmV4dE1CTnIgKGltZy0+Y3VycmVudF9tYl9ucikpOwoKICAgIGltZy0+Y3VycmVudF9tYl9uciA9IEZtb0dldE5leHRNQk5yIChpbWctPmN1cnJlbnRfbWJfbnIpOwoKICAgIGlmIChpbWctPmN1cnJlbnRfbWJfbnIgPT0gLTEpICAgICAvLyBFbmQgb2YgU2xpY2UgZ3JvdXAsIE1VU1QgYmUgZW5kIG9mIHNsaWNlCiAgICB7CiAgICAgIGFzc2VydCAobmFsX3N0YXJ0Y29kZV9mb2xsb3dzIChpbWcsIGVvc19iaXQpID09IFRSVUUpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICBpZihuYWxfc3RhcnRjb2RlX2ZvbGxvd3MoaW1nLCBlb3NfYml0KSA9PSBGQUxTRSkKICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGlmKGltZy0+dHlwZSA9PSBJX1NMSUNFICB8fCBpbWctPnR5cGUgPT0gU0lfU0xJQ0UgfHwgYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IENBQkFDKQogICAgICByZXR1cm4gVFJVRTsKICAgIGlmKGltZy0+Y29kX2NvdW50ZXI8PTApCiAgICAgIHJldHVybiBUUlVFOwogICAgcmV0dXJuIEZBTFNFOwogIH0KfQoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIEludGVycHJldCB0aGUgbWIgbW9kZSBmb3IgUC1GcmFtZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCBpbnRlcnByZXRfbWJfbW9kZV9QKHN0cnVjdCBpbWdfcGFyICppbWcpCnsKICBjb25zdCBpbnQgSUNCUFRBQls2XSA9IHswLDE2LDMyLDE1LDMxLDQ3fTsKICBNYWNyb2Jsb2NrICpjdXJyTUIgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CiAgaW50ICAgICAgICAgbWJtb2RlID0gY3Vyck1CLT5tYl90eXBlOwoKI2RlZmluZSBaRVJPX1A4eDggICAgIChtYm1vZGU9PTUpCiNkZWZpbmUgTU9ERV9JU19QOHg4ICAobWJtb2RlPT00IHx8IG1ibW9kZT09NSkKI2RlZmluZSBNT0RFX0lTX0k0eDQgIChtYm1vZGU9PTYpCiNkZWZpbmUgSTE2T0ZGU0VUICAgICAobWJtb2RlLTcpCiNkZWZpbmUgTU9ERV9JU19JUENNICAobWJtb2RlPT0zMSkKCiAgaWYobWJtb2RlIDw0KQogIHsKICAgIGN1cnJNQi0+bWJfdHlwZSA9IG1ibW9kZTsKICAgIG1lbXNldCgmY3Vyck1CLT5iOG1vZGVbMF0sbWJtb2RlLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwwLDQgKiBzaXplb2YoY2hhcikpOwogIH0KICBlbHNlIGlmKE1PREVfSVNfUDh4OCkKICB7CiAgICBjdXJyTUItPm1iX3R5cGUgPSBQOHg4OwogICAgaW1nLT5hbGxyZWZ6ZXJvID0gWkVST19QOHg4OwogIH0KICBlbHNlIGlmKE1PREVfSVNfSTR4NCkKICB7CiAgICBjdXJyTUItPm1iX3R5cGUgPSBJNE1COwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSxJQkxPQ0ssNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLC0xLDQgKiBzaXplb2YoY2hhcikpOwogIH0KICBlbHNlIGlmKE1PREVfSVNfSVBDTSkKICB7CiAgICBjdXJyTUItPm1iX3R5cGU9SVBDTTsKICAgIGN1cnJNQi0+Y2JwPSAtMTsKICAgIGN1cnJNQi0+aTE2bW9kZSA9IDA7CgogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwwLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwtMSw0ICogc2l6ZW9mKGNoYXIpKTsKICB9CiAgZWxzZQogIHsKICAgIGN1cnJNQi0+bWJfdHlwZSA9IEkxNk1COwogICAgY3Vyck1CLT5jYnA9IElDQlBUQUJbKEkxNk9GRlNFVCk+PjJdOwogICAgY3Vyck1CLT5pMTZtb2RlID0gKEkxNk9GRlNFVCkgJiAweDAzOwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwwLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwtMSw0ICogc2l6ZW9mKGNoYXIpKTsKICB9Cn0KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBJbnRlcnByZXQgdGhlIG1iIG1vZGUgZm9yIEktRnJhbWVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgaW50ZXJwcmV0X21iX21vZGVfSShzdHJ1Y3QgaW1nX3BhciAqaW1nKQp7CiAgY29uc3QgaW50IElDQlBUQUJbNl0gPSB7MCwxNiwzMiwxNSwzMSw0N307CiAgTWFjcm9ibG9jayAqY3Vyck1CICAgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CiAgaW50ICAgICAgICAgbWJtb2RlICAgPSBjdXJyTUItPm1iX3R5cGU7CgogIGlmIChtYm1vZGU9PTApCiAgewogICAgY3Vyck1CLT5tYl90eXBlID0gSTRNQjsKICAgIG1lbXNldCgmY3Vyck1CLT5iOG1vZGVbMF0sSUJMT0NLLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwtMSw0ICogc2l6ZW9mKGNoYXIpKTsKICB9CiAgZWxzZSBpZihtYm1vZGU9PTI1KQogIHsKICAgIGN1cnJNQi0+bWJfdHlwZT1JUENNOwogICAgY3Vyck1CLT5jYnA9IC0xOwogICAgY3Vyck1CLT5pMTZtb2RlID0gMDsKCiAgICBtZW1zZXQoJmN1cnJNQi0+Yjhtb2RlWzBdLDAsNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLC0xLDQgKiBzaXplb2YoY2hhcikpOwogIH0KICBlbHNlCiAgewogICAgY3Vyck1CLT5tYl90eXBlID0gSTE2TUI7CiAgICBjdXJyTUItPmNicD0gSUNCUFRBQlsobWJtb2RlLTEpPj4yXTsKICAgIGN1cnJNQi0+aTE2bW9kZSA9IChtYm1vZGUtMSkgJiAweDAzOwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwwLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwtMSw0ICogc2l6ZW9mKGNoYXIpKTsKICB9Cn0KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBJbnRlcnByZXQgdGhlIG1iIG1vZGUgZm9yIEItRnJhbWVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgaW50ZXJwcmV0X21iX21vZGVfQihzdHJ1Y3QgaW1nX3BhciAqaW1nKQp7CiAgc3RhdGljIGNvbnN0IGludCBvZmZzZXQycGRpcjE2eDE2WzEyXSAgID0gezAsIDAsIDEsIDIsIDAsMCwwLDAsMCwwLDAsMH07CiAgc3RhdGljIGNvbnN0IGludCBvZmZzZXQycGRpcjE2eDhbMjJdWzJdID0ge3swLDB9LHswLDB9LHswLDB9LHswLDB9LHswLDB9LHswLDB9LHsxLDF9LHswLDB9LHswLDF9LHswLDB9LHsxLDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwwfSx7MCwyfSx7MCwwfSx7MSwyfSx7MCwwfSx7MiwwfSx7MCwwfSx7MiwxfSx7MCwwfSx7MiwyfSx7MCwwfX07CiAgc3RhdGljIGNvbnN0IGludCBvZmZzZXQycGRpcjh4MTZbMjJdWzJdID0ge3swLDB9LHswLDB9LHswLDB9LHswLDB9LHswLDB9LHswLDB9LHswLDB9LHsxLDF9LHswLDB9LHswLDF9LHswLDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwwfSx7MCwwfSx7MCwyfSx7MCwwfSx7MSwyfSx7MCwwfSx7MiwwfSx7MCwwfSx7MiwxfSx7MCwwfSx7MiwyfX07CgogIGNvbnN0IGludCBJQ0JQVEFCWzZdID0gezAsMTYsMzIsMTUsMzEsNDd9OwogIE1hY3JvYmxvY2sgKmN1cnJNQiA9ICZpbWctPm1iX2RhdGFbaW1nLT5jdXJyZW50X21iX25yXTsKCiAgaW50IGksIG1ibW9kZTsKICBpbnQgbWJ0eXBlICA9IGN1cnJNQi0+bWJfdHlwZTsKCiAgLy8tLS0gc2V0IG1idHlwZSwgYjh0eXBlLCBhbmQgYjhwZGlyIC0tLQogIGlmIChtYnR5cGU9PTApICAgICAgIC8vIGRpcmVjdAogIHsKICAgIG1ibW9kZT0wOwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwwLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwyLDQgKiBzaXplb2YoY2hhcikpOwogIH0KICBlbHNlIGlmIChtYnR5cGU9PTIzKSAvLyBpbnRyYTR4NAogIHsKICAgIG1ibW9kZT1JNE1COwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSxJQkxPQ0ssNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLC0xLDQgKiBzaXplb2YoY2hhcikpOwogIH0KICBlbHNlIGlmICgobWJ0eXBlPjIzKSAmJiAobWJ0eXBlPDQ4KSApIC8vIGludHJhMTZ4MTYKICB7CiAgICBtYm1vZGU9STE2TUI7CiAgICBtZW1zZXQoJmN1cnJNQi0+Yjhtb2RlWzBdLDAsNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLC0xLDQgKiBzaXplb2YoY2hhcikpOwoKICAgIGN1cnJNQi0+Y2JwICAgICA9IElDQlBUQUJbKG1idHlwZS0yNCk+PjJdOwogICAgY3Vyck1CLT5pMTZtb2RlID0gKG1idHlwZS0yNCkgJiAweDAzOwogIH0KICBlbHNlIGlmIChtYnR5cGU9PTIyKSAvLyA4eDgoK3NwbGl0KQogIHsKICAgIG1ibW9kZT1QOHg4OyAgICAgICAvLyBiOG1vZGUgYW5kIHBkaXIgaXMgdHJhbnNtaXR0ZWQgaW4gYWRkaXRpb25hbCBjb2Rld29yZHMKICB9CiAgZWxzZSBpZiAobWJ0eXBlPDQpICAgLy8gMTZ4MTYKICB7CiAgICBtYm1vZGU9MTsKICAgIG1lbXNldCgmY3Vyck1CLT5iOG1vZGVbMF0sIDEsNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLG9mZnNldDJwZGlyMTZ4MTZbbWJ0eXBlXSw0ICogc2l6ZW9mKGNoYXIpKTsKICB9CiAgZWxzZSBpZihtYnR5cGU9PTQ4KQogIHsKICAgIG1ibW9kZT1JUENNOwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwgMCw0ICogc2l6ZW9mKGNoYXIpKTsKICAgIG1lbXNldCgmY3Vyck1CLT5iOHBkaXJbMF0sLTEsNCAqIHNpemVvZihjaGFyKSk7CgogICAgY3Vyck1CLT5jYnA9IC0xOwogICAgY3Vyck1CLT5pMTZtb2RlID0gMDsKICB9CgogIGVsc2UgaWYgKChtYnR5cGUmMHgwMSk9PTApIC8vIDE2eDgKICB7CiAgICBtYm1vZGU9MjsKICAgIG1lbXNldCgmY3Vyck1CLT5iOG1vZGVbMF0sIDIsNCAqIHNpemVvZihjaGFyKSk7CiAgICBmb3IoaT0wO2k8NDtpKyspCiAgICB7CiAgICAgIGN1cnJNQi0+YjhwZGlyW2ldPW9mZnNldDJwZGlyMTZ4OCBbbWJ0eXBlXVtpPj4xXTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIG1ibW9kZT0zOwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwgMyw0ICogc2l6ZW9mKGNoYXIpKTsKICAgIGZvcihpPTA7aTw0O2krKykKICAgIHsKICAgICAgY3Vyck1CLT5iOHBkaXJbaV09b2Zmc2V0MnBkaXI4eDE2IFttYnR5cGVdW2kmMHgwMV07CiAgICB9CiAgfQogIGN1cnJNQi0+bWJfdHlwZSA9IG1ibW9kZTsKfQovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgSW50ZXJwcmV0IHRoZSBtYiBtb2RlIGZvciBTSS1GcmFtZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCBpbnRlcnByZXRfbWJfbW9kZV9TSShzdHJ1Y3QgaW1nX3BhciAqaW1nKQp7CiAgY29uc3QgaW50IElDQlBUQUJbNl0gPSB7MCwxNiwzMiwxNSwzMSw0N307CiAgTWFjcm9ibG9jayAqY3Vyck1CICAgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CiAgaW50ICAgICAgICAgbWJtb2RlICAgPSBjdXJyTUItPm1iX3R5cGU7CgogIGlmIChtYm1vZGU9PTApCiAgewogICAgY3Vyck1CLT5tYl90eXBlID0gU0k0TUI7CiAgICBtZW1zZXQoJmN1cnJNQi0+Yjhtb2RlWzBdLElCTE9DSyw0ICogc2l6ZW9mKGNoYXIpKTsKICAgIG1lbXNldCgmY3Vyck1CLT5iOHBkaXJbMF0sLTEsNCAqIHNpemVvZihjaGFyKSk7CiAgICBpbWctPnNpYmxvY2tbaW1nLT5tYl95XVtpbWctPm1iX3hdPTE7CiAgfQogIGVsc2UgaWYgKG1ibW9kZT09MSkKICB7CiAgICBjdXJyTUItPm1iX3R5cGUgPSBJNE1COwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSxJQkxPQ0ssNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLC0xLDQgKiBzaXplb2YoY2hhcikpOwogIH0KICBlbHNlIGlmKG1ibW9kZT09MjYpCiAgewogICAgY3Vyck1CLT5tYl90eXBlPUlQQ007CiAgICBjdXJyTUItPmNicD0gLTE7CiAgICBjdXJyTUItPmkxNm1vZGUgPSAwOwogICAgbWVtc2V0KCZjdXJyTUItPmI4bW9kZVswXSwwLDQgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZjdXJyTUItPmI4cGRpclswXSwtMSw0ICogc2l6ZW9mKGNoYXIpKTsKICB9CgogIGVsc2UKICB7CiAgICBjdXJyTUItPm1iX3R5cGUgPSBJMTZNQjsKICAgIGN1cnJNQi0+Y2JwPSBJQ0JQVEFCWyhtYm1vZGUtMSk+PjJdOwogICAgY3Vyck1CLT5pMTZtb2RlID0gKG1ibW9kZS0yKSAmIDB4MDM7CiAgICBtZW1zZXQoJmN1cnJNQi0+Yjhtb2RlWzBdLDAsNCAqIHNpemVvZihjaGFyKSk7CiAgICBtZW1zZXQoJmN1cnJNQi0+YjhwZGlyWzBdLC0xLDQgKiBzaXplb2YoY2hhcikpOwogIH0KfQovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgaW5pdCBtYWNyb2Jsb2NrIEkgYW5kIFAgZnJhbWVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgaW5pdF9tYWNyb2Jsb2NrKHN0cnVjdCBpbWdfcGFyICppbWcpCnsKICBpbnQgaSxqOwoKICBmb3Ioaj1pbWctPmJsb2NrX3k7ajxpbWctPmJsb2NrX3krQkxPQ0tfU0laRTtqKyspCiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHZlY3RvcnMgYW5kIHByZWQuIG1vZGVzCiAgICBtZW1zZXQoJmRlY19waWN0dXJlLT5tdltMSVNUXzBdW2pdW2ltZy0+YmxvY2tfeF1bMF0sIDAsIDIgKiBCTE9DS19TSVpFICogc2l6ZW9mKHNob3J0KSk7CiAgICBtZW1zZXQoJmRlY19waWN0dXJlLT5tdltMSVNUXzFdW2pdW2ltZy0+YmxvY2tfeF1bMF0sIDAsIDIgKiBCTE9DS19TSVpFICogc2l6ZW9mKHNob3J0KSk7CiAgICBtZW1zZXQoJmRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bal1baW1nLT5ibG9ja194XSwgLTEsIEJMT0NLX1NJWkUgKiBzaXplb2YoY2hhcikpOwogICAgbWVtc2V0KCZkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2pdW2ltZy0+YmxvY2tfeF0sIC0xLCBCTE9DS19TSVpFICogc2l6ZW9mKGNoYXIpKTsKICAgIG1lbXNldCgmaW1nLT5pcHJlZG1vZGVbal1baW1nLT5ibG9ja194XSwgRENfUFJFRCwgQkxPQ0tfU0laRSAqIHNpemVvZihjaGFyKSk7CiAgICBmb3IgKGk9aW1nLT5ibG9ja194O2k8aW1nLT5ibG9ja194K0JMT0NLX1NJWkU7aSsrKQogICAgewogICAgICBkZWNfcGljdHVyZS0+cmVmX3BpY19pZFtMSVNUXzBdW2pdW2ldID0gSU5UNjRfTUlOOwogICAgICBkZWNfcGljdHVyZS0+cmVmX3BpY19pZFtMSVNUXzFdW2pdW2ldID0gSU5UNjRfTUlOOwogICAgfQogIH0KfQoKCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBTZXRzIG1vZGUgZm9yIDh4OCBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIFNldEI4TW9kZSAoc3RydWN0IGltZ19wYXIqIGltZywgTWFjcm9ibG9jayogY3Vyck1CLCBpbnQgdmFsdWUsIGludCBpKQp7CiAgc3RhdGljIGNvbnN0IGludCBwX3YyYjggWyA1XSA9IHs0LCA1LCA2LCA3LCBJQkxPQ0t9OwogIHN0YXRpYyBjb25zdCBpbnQgcF92MnBkIFsgNV0gPSB7MCwgMCwgMCwgMCwgLTF9OwogIHN0YXRpYyBjb25zdCBpbnQgYl92MmI4IFsxNF0gPSB7MCwgNCwgNCwgNCwgNSwgNiwgNSwgNiwgNSwgNiwgNywgNywgNywgSUJMT0NLfTsKICBzdGF0aWMgY29uc3QgaW50IGJfdjJwZCBbMTRdID0gezIsIDAsIDEsIDIsIDAsIDAsIDEsIDEsIDIsIDIsIDAsIDEsIDIsIC0xfTsKCiAgaWYgKGltZy0+dHlwZT09Ql9TTElDRSkKICB7CiAgICBjdXJyTUItPmI4bW9kZVtpXSAgID0gYl92MmI4W3ZhbHVlXTsKICAgIGN1cnJNQi0+YjhwZGlyW2ldICAgPSBiX3YycGRbdmFsdWVdOwoKICB9CiAgZWxzZQogIHsKICAgIGN1cnJNQi0+Yjhtb2RlW2ldICAgPSBwX3YyYjhbdmFsdWVdOwogICAgY3Vyck1CLT5iOHBkaXJbaV0gICA9IHBfdjJwZFt2YWx1ZV07CiAgfQoKfQoKCnZvaWQgcmVzZXRfY29lZmZzKCkKewogIGludCBpLCBqOwoKICAvLyByZXNldCBhbGwgY29lZmZzCiAgZm9yIChpPTA7aTxCTE9DS19TSVpFO2krKykKICB7CiAgICBmb3IgKGo9MDtqPEJMT0NLX1NJWkUgK2ltZy0+bnVtX2Jsazh4OF91djtqKyspCiAgICAgIG1lbXNldCgmaW1nLT5jb2ZbaV1bal1bMF1bMF0sMCxCTE9DS19TSVpFICogQkxPQ0tfU0laRSAqIHNpemVvZihpbnQpKTsKICB9CgogIC8vIENBVkxDCiAgbWVtc2V0KCZpbWctPm56X2NvZWZmW2ltZy0+Y3VycmVudF9tYl9ucl1bMF1bMF0sMCwgQkxPQ0tfU0laRSAqIChCTE9DS19TSVpFICsgaW1nLT5udW1fYmxrOHg4X3V2KSAqIHNpemVvZihpbnQpKTsKfQoKdm9pZCBmaWVsZF9mbGFnX2luZmVyZW5jZSgpCnsKICBNYWNyb2Jsb2NrICpjdXJyTUIgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CgogIGlmIChjdXJyTUItPm1iQXZhaWxBKQogIHsKICAgIGN1cnJNQi0+bWJfZmllbGQgPSBpbWctPm1iX2RhdGFbY3Vyck1CLT5tYkFkZHJBXS5tYl9maWVsZDsKICB9CiAgZWxzZQogIHsKICAgIC8vIGNoZWNrIHRvcCBtYWNyb2Jsb2NrIHBhaXIKICAgIGlmIChjdXJyTUItPm1iQXZhaWxCKQogICAgewogICAgICBjdXJyTUItPm1iX2ZpZWxkID0gaW1nLT5tYl9kYXRhW2N1cnJNQi0+bWJBZGRyQl0ubWJfZmllbGQ7CiAgICB9CiAgICBlbHNlCiAgICAgIGN1cnJNQi0+bWJfZmllbGQgPSAwOwogIH0KCn0KCnZvaWQgc2V0X2Nocm9tYV9xcChNYWNyb2Jsb2NrKiBjdXJyTUIpCnsKICBpbnQgaTsKICBmb3IgKGk9MDsgaTwyOyBpKyspCiAgewogICAgY3Vyck1CLT5xcGNbaV0gPSBpQ2xpcDMgKCAtaW1nLT5iaXRkZXB0aF9jaHJvbWFfcXBfc2NhbGUsIDUxLCBjdXJyTUItPnFwICsgZGVjX3BpY3R1cmUtPmNocm9tYV9xcF9vZmZzZXRbaV0gKTsKICAgIGN1cnJNQi0+cXBjW2ldID0gY3Vyck1CLT5xcGNbaV0gPCAwID8gY3Vyck1CLT5xcGNbaV0gOiBRUF9TQ0FMRV9DUltjdXJyTUItPnFwY1tpXV07CiAgfQp9CgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIEdldCB0aGUgc3ludGF4IGVsZW1lbnRzIGZyb20gdGhlIE5BTAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwppbnQgcmVhZF9vbmVfbWFjcm9ibG9jayhzdHJ1Y3QgaW1nX3BhciAqaW1nLHN0cnVjdCBpbnBfcGFyICppbnApCnsKICBpbnQgaTsKCiAgU3ludGF4RWxlbWVudCBjdXJyU0U7CiAgTWFjcm9ibG9jayAqY3Vyck1CID0gJmltZy0+bWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnJdOwoKICBTbGljZSAqY3VyclNsaWNlID0gaW1nLT5jdXJyZW50U2xpY2U7CiAgRGF0YVBhcnRpdGlvbiAqZFA7CiAgaW50ICpwYXJ0TWFwID0gYXNzaWduU0UycGFydGl0aW9uW2N1cnJTbGljZS0+ZHBfbW9kZV07CiAgTWFjcm9ibG9jayAqdG9wTUIgPSBOVUxMOwogIGludCAgcHJldk1iU2tpcHBlZCA9IDA7CiAgaW50ICBpbWdfYmxvY2tfeTsKICBpbnQgIGNoZWNrX2JvdHRvbSwgcmVhZF9ib3R0b20sIHJlYWRfdG9wOwoKICBpZiAoaW1nLT5NYmFmZkZyYW1lRmxhZykKICB7CiAgICBpZiAoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpCiAgICB7CiAgICAgIHRvcE1CPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9uci0xXTsKICAgICAgaWYoIShpbWctPnR5cGUgPT0gQl9TTElDRSkpCiAgICAgICAgcHJldk1iU2tpcHBlZCA9ICh0b3BNQi0+bWJfdHlwZSA9PSAwKTsKICAgICAgZWxzZQogICAgICAgIHByZXZNYlNraXBwZWQgPSB0b3BNQi0+c2tpcF9mbGFnOwogICAgfQogICAgZWxzZQogICAgICBwcmV2TWJTa2lwcGVkID0gMDsKICB9CgogIGlmICgoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpID09IDApCiAgICBjdXJyTUItPm1iX2ZpZWxkID0gMDsKICBlbHNlCiAgICBjdXJyTUItPm1iX2ZpZWxkID0gaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9uci0xXS5tYl9maWVsZDsKCgogIGN1cnJNQi0+cXAgPSBpbWctPnFwIDsKICBmb3IgKGk9MDsgaTwyOyBpKyspCiAgewogICAgY3Vyck1CLT5xcGNbaV0gPSBpQ2xpcDMgKCAtaW1nLT5iaXRkZXB0aF9jaHJvbWFfcXBfc2NhbGUsIDUxLCBpbWctPnFwICsgZGVjX3BpY3R1cmUtPmNocm9tYV9xcF9vZmZzZXRbaV0gKTsKICAgIGN1cnJNQi0+cXBjW2ldID0gY3Vyck1CLT5xcGNbaV0gPCAwID8gY3Vyck1CLT5xcGNbaV0gOiBRUF9TQ0FMRV9DUltjdXJyTUItPnFwY1tpXV07CiAgfQoKICBjdXJyU0UudHlwZSA9IFNFX01CVFlQRTsKCiAgLy8gIHJlYWQgTUIgbW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtjdXJyU0UudHlwZV1dKTsKCiAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpICAgY3VyclNFLm1hcHBpbmcgPSBsaW5mb191ZTsKCiAgaWYoaW1nLT50eXBlID09IElfU0xJQ0UgfHwgaW1nLT50eXBlID09IFNJX1NMSUNFKQogIHsKICAgIC8vIHJlYWQgTUIgYWZmCiAgICBpZiAoaW1nLT5NYmFmZkZyYW1lRmxhZyAmJiAoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpPT0wKQogICAgewogICAgICBUUkFDRV9TVFJJTkcoIm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWciKTsKICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgIHsKICAgICAgICBjdXJyU0UubGVuID0gMTsKICAgICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkRmllbGRNb2RlSW5mb19DQUJBQzsKICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICB9CiAgICAgIGN1cnJNQi0+bWJfZmllbGQgPSBjdXJyU0UudmFsdWUxOwogICAgfQogICAgaWYoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICA9PSBDQUJBQykKICAgICAgQ2hlY2tBdmFpbGFiaWxpdHlPZk5laWdoYm9yc0NBQkFDKCk7CgogICAgLy8gIHJlYWQgTUIgdHlwZQogICAgVFJBQ0VfU1RSSU5HKCJtYl90eXBlIik7CiAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRNQl90eXBlSW5mb19DQUJBQzsKICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CgogICAgY3Vyck1CLT5tYl90eXBlID0gY3VyclNFLnZhbHVlMTsKICAgIGlmKCFkUC0+Yml0c3RyZWFtLT5laV9mbGFnKQogICAgICBjdXJyTUItPmVpX2ZsYWcgPSAwOwogIH0KICAvLyBub24gSS9TSS1zbGljZSBDQUJBQwogIGVsc2UgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBDQUJBQykKICB7CiAgICAvLyByZWFkIE1CIHNraXBfZmxhZwogICAgaWYgKGltZy0+TWJhZmZGcmFtZUZsYWcgJiYgKChpbWctPmN1cnJlbnRfbWJfbnImMHgwMSkgPT0gMHx8cHJldk1iU2tpcHBlZCkpCiAgICAgIGZpZWxkX2ZsYWdfaW5mZXJlbmNlKCk7CgogICAgQ2hlY2tBdmFpbGFiaWxpdHlPZk5laWdoYm9yc0NBQkFDKCk7CiAgICBUUkFDRV9TVFJJTkcoIm1iX3NraXBfZmxhZyIpOwogICAgY3VyclNFLnJlYWRpbmcgPSByZWFkTUJfc2tpcF9mbGFnSW5mb19DQUJBQzsKICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CgogICAgY3Vyck1CLT5tYl90eXBlICAgPSBjdXJyU0UudmFsdWUxOwogICAgY3Vyck1CLT5za2lwX2ZsYWcgPSAhKGN1cnJTRS52YWx1ZTEpOwoKICAgIGlmIChpbWctPnR5cGU9PUJfU0xJQ0UpCiAgICAgIGN1cnJNQi0+Y2JwID0gY3VyclNFLnZhbHVlMjsKCiAgICBpZighZFAtPmJpdHN0cmVhbS0+ZWlfZmxhZykKICAgICAgY3Vyck1CLT5laV9mbGFnID0gMDsKCiAgICBpZiAoKGltZy0+dHlwZT09Ql9TTElDRSkgJiYgY3VyclNFLnZhbHVlMT09MCAmJiBjdXJyU0UudmFsdWUyPT0wKQogICAgICBpbWctPmNvZF9jb3VudGVyPTA7CgogICAgLy8gcmVhZCBNQiBBRkYKICAgIGlmIChpbWctPk1iYWZmRnJhbWVGbGFnKQogICAgewogICAgICBjaGVja19ib3R0b209cmVhZF9ib3R0b209cmVhZF90b3A9MDsKICAgICAgaWYgKChpbWctPmN1cnJlbnRfbWJfbnImMHgwMSk9PTApCiAgICAgIHsKICAgICAgICBjaGVja19ib3R0b20gPSAgY3Vyck1CLT5za2lwX2ZsYWc7CiAgICAgICAgcmVhZF90b3AgPSAhY2hlY2tfYm90dG9tOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHJlYWRfYm90dG9tID0gKHRvcE1CLT5za2lwX2ZsYWcgJiYgKCFjdXJyTUItPnNraXBfZmxhZykpOwogICAgICAgfQoKICAgICAgaWYgKHJlYWRfYm90dG9tIHx8IHJlYWRfdG9wKQogICAgICB7CiAgICAgICAgVFJBQ0VfU1RSSU5HKCJtYl9maWVsZF9kZWNvZGluZ19mbGFnIik7CiAgICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkRmllbGRNb2RlSW5mb19DQUJBQzsKICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICAgIGN1cnJNQi0+bWJfZmllbGQgPSBjdXJyU0UudmFsdWUxOwogICAgICB9CiAgICAgIGlmIChjaGVja19ib3R0b20pCiAgICAgICAgY2hlY2tfbmV4dF9tYl9hbmRfZ2V0X2ZpZWxkX21vZGVfQ0FCQUMoJmN1cnJTRSxpbWcsZFApOwoKICAgIH0KCiAgICBDaGVja0F2YWlsYWJpbGl0eU9mTmVpZ2hib3JzQ0FCQUMoKTsKCiAgICAvLyByZWFkIE1CIHR5cGUKICAgIGlmIChjdXJyTUItPm1iX3R5cGUgIT0gMCApCiAgICB7CiAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZE1CX3R5cGVJbmZvX0NBQkFDOwogICAgICBUUkFDRV9TVFJJTkcoIm1iX3R5cGUiKTsKICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgICAgY3Vyck1CLT5tYl90eXBlID0gY3VyclNFLnZhbHVlMTsKICAgICAgaWYoIWRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgICAgY3Vyck1CLT5laV9mbGFnID0gMDsKICAgIH0KICB9CiAgLy8gVkxDIE5vbi1JbnRyYQogIGVsc2UKICB7CiAgICBpZihpbWctPmNvZF9jb3VudGVyID09IC0xKQogICAgewogICAgICBUUkFDRV9TVFJJTkcoIm1iX3NraXBfcnVuIik7CiAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgIGltZy0+Y29kX2NvdW50ZXIgPSBjdXJyU0UudmFsdWUxOwogICAgfQogICAgaWYgKGltZy0+Y29kX2NvdW50ZXI9PTApCiAgICB7CiAgICAgIC8vIHJlYWQgTUIgYWZmCiAgICAgIGlmICgoaW1nLT5NYmFmZkZyYW1lRmxhZykgJiYgKCgoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpPT0wKSB8fCAoKGltZy0+Y3VycmVudF9tYl9uciYweDAxKSAmJiBwcmV2TWJTa2lwcGVkKSkpCiAgICAgIHsKICAgICAgICBUUkFDRV9TVFJJTkcoIm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWciKTsKICAgICAgICBjdXJyU0UubGVuID0gMTsKICAgICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICAgICAgY3Vyck1CLT5tYl9maWVsZCA9IGN1cnJTRS52YWx1ZTE7CiAgICAgIH0KCiAgICAgIC8vIHJlYWQgTUIgdHlwZQogICAgICBUUkFDRV9TVFJJTkcoIm1iX3R5cGUiKTsKICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgICAgaWYoaW1nLT50eXBlID09IFBfU0xJQ0UgfHwgaW1nLT50eXBlID09IFNQX1NMSUNFKQogICAgICAgIGN1cnJTRS52YWx1ZTErKzsKICAgICAgY3Vyck1CLT5tYl90eXBlID0gY3VyclNFLnZhbHVlMTsKICAgICAgaWYoIWRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgICAgY3Vyck1CLT5laV9mbGFnID0gMDsKICAgICAgaW1nLT5jb2RfY291bnRlci0tOwogICAgICBjdXJyTUItPnNraXBfZmxhZyA9IDA7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGltZy0+Y29kX2NvdW50ZXItLTsKICAgICAgY3Vyck1CLT5tYl90eXBlID0gMDsKICAgICAgY3Vyck1CLT5laV9mbGFnID0gMDsKICAgICAgY3Vyck1CLT5za2lwX2ZsYWcgPSAxOwoKICAgICAgLy8gcmVhZCBmaWVsZCBmbGFnIG9mIGJvdHRvbSBibG9jawogICAgICBpZihpbWctPk1iYWZmRnJhbWVGbGFnKQogICAgICB7CiAgICAgICAgaWYoaW1nLT5jb2RfY291bnRlciA9PSAwICYmICgoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpID09IDApKQogICAgICAgIHsKICAgICAgICAgIFRSQUNFX1NUUklORygibWJfZmllbGRfZGVjb2RpbmdfZmxhZyAob2YgY29kZWQgYm90dG9tIG1iKSIpOwogICAgICAgICAgY3VyclNFLmxlbiA9IDE7CiAgICAgICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICAgICAgICBkUC0+Yml0c3RyZWFtLT5mcmFtZV9iaXRvZmZzZXQtLTsKICAgICAgICAgIGN1cnJNQi0+bWJfZmllbGQgPSBjdXJyU0UudmFsdWUxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGltZy0+Y29kX2NvdW50ZXIgPiAwICYmICgoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpID09IDApKQogICAgICAgIHsKICAgICAgICAgIC8vIGNoZWNrIGxlZnQgbWFjcm9ibG9jayBwYWlyIGZpcnN0CiAgICAgICAgICBpZiAobWJfaXNfYXZhaWxhYmxlKGltZy0+Y3VycmVudF9tYl9uci0yLCBpbWctPmN1cnJlbnRfbWJfbnIpJiYoKGltZy0+Y3VycmVudF9tYl9uciUoaW1nLT5QaWNXaWR0aEluTWJzKjIpKSE9MCkpCiAgICAgICAgICB7CiAgICAgICAgICAgIGN1cnJNQi0+bWJfZmllbGQgPSBpbWctPm1iX2RhdGFbaW1nLT5jdXJyZW50X21iX25yLTJdLm1iX2ZpZWxkOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAvLyBjaGVjayB0b3AgbWFjcm9ibG9jayBwYWlyCiAgICAgICAgICAgIGlmIChtYl9pc19hdmFpbGFibGUoaW1nLT5jdXJyZW50X21iX25yLTIqaW1nLT5QaWNXaWR0aEluTWJzLCBpbWctPmN1cnJlbnRfbWJfbnIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgY3Vyck1CLT5tYl9maWVsZCA9IGltZy0+bWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnItMippbWctPlBpY1dpZHRoSW5NYnNdLm1iX2ZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBjdXJyTUItPm1iX2ZpZWxkID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGRlY19waWN0dXJlLT5tYl9maWVsZFtpbWctPmN1cnJlbnRfbWJfbnJdID0gY3Vyck1CLT5tYl9maWVsZDsKCiAgaW1nLT5zaWJsb2NrW2ltZy0+bWJfeV1baW1nLT5tYl94XT0wOwoKICBpZiAoKGltZy0+dHlwZT09UF9TTElDRSApKSAgICAvLyBpbnRlciBmcmFtZQogICAgaW50ZXJwcmV0X21iX21vZGVfUChpbWcpOwogIGVsc2UgaWYgKGltZy0+dHlwZT09SV9TTElDRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cmEgZnJhbWUKICAgIGludGVycHJldF9tYl9tb2RlX0koaW1nKTsKICBlbHNlIGlmICgoaW1nLT50eXBlPT1CX1NMSUNFKSkgICAgICAgLy8gQiBmcmFtZQogICAgaW50ZXJwcmV0X21iX21vZGVfQihpbWcpOwogIGVsc2UgaWYgKChpbWctPnR5cGU9PVNQX1NMSUNFKSkgICAgIC8vIFNQIGZyYW1lCiAgICBpbnRlcnByZXRfbWJfbW9kZV9QKGltZyk7CiAgZWxzZSBpZiAoaW1nLT50eXBlPT1TSV9TTElDRSkgICAgIC8vIFNJIGZyYW1lCiAgICBpbnRlcnByZXRfbWJfbW9kZV9TSShpbWcpOwoKICBpZihpbWctPk1iYWZmRnJhbWVGbGFnKQogIHsKICAgIGlmKGN1cnJNQi0+bWJfZmllbGQpCiAgICB7CiAgICAgIGltZy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlIDw8PTE7CiAgICAgIGltZy0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlIDw8PTE7CiAgICB9CiAgfQoKICAvL2luaXQgTm9NYlBhcnRMZXNzVGhhbjh4OEZsYWcKICBjdXJyTUItPk5vTWJQYXJ0TGVzc1RoYW44eDhGbGFnID0gKElTX0RJUkVDVChjdXJyTUIpICYmICEoYWN0aXZlX3Nwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZykpPyAwOiAxOwoKICAvLz09PT09PSBSRUFEIDh4OCBTVUItUEFSVElUSU9OIE1PREVTIChtb2RlcyBvZiA4eDggYmxvY2tzKSBhbmQgSW50cmEgVkJTVCBibG9jayBtb2RlcyA9PT09PT0KICBpZiAoSVNfUDh4OCAoY3Vyck1CKSkKICB7CiAgICBjdXJyU0UudHlwZSAgICA9IFNFX01CVFlQRTsKICAgIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtTRV9NQlRZUEVdXSk7CgogICAgZm9yIChpPTA7IGk8NDsgaSsrKQogICAgewogICAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09VVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKSBjdXJyU0UubWFwcGluZyA9IGxpbmZvX3VlOwogICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRCOF90eXBlSW5mb19DQUJBQzsKCiAgICAgIFRSQUNFX1NUUklORygic3ViX21iX3R5cGUiKTsKICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50ICgmY3VyclNFLCBpbWcsIGRQKTsKICAgICAgU2V0QjhNb2RlIChpbWcsIGN1cnJNQiwgY3VyclNFLnZhbHVlMSwgaSk7CgogICAgICAvL3NldCBOb01iUGFydExlc3NUaGFuOHg4RmxhZyBmb3IgUDh4OCBtb2RlCiAgICAgIGN1cnJNQi0+Tm9NYlBhcnRMZXNzVGhhbjh4OEZsYWcgJj0gKGN1cnJNQi0+Yjhtb2RlW2ldPT0wICYmIGFjdGl2ZV9zcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJNQi0+Yjhtb2RlW2ldPT00KTsKICAgIH0KICAgIC8vLS0tIGluaXQgbWFjcm9ibG9jayBkYXRhIC0tLQogICAgaW5pdF9tYWNyb2Jsb2NrICAgICAgIChpbWcpOwogICAgcmVhZE1vdGlvbkluZm9Gcm9tTkFMIChpbWcsIGlucCk7CiAgfQoKCiAgLy89PT09PT09PT09PT09IFRyYW5zZm9ybSBTaXplIEZsYWcgZm9yIElOVFJBIE1CcyA9PT09PT09PT09PT09CiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy90cmFuc2Zvcm0gc2l6ZSBmbGFnIGZvciBJTlRSQV80eDQgYW5kIElOVFJBXzh4OCBtb2RlcwogIGlmIChjdXJyTUItPm1iX3R5cGUgPT0gSTRNQiAmJiBpbWctPlRyYW5zZm9ybTh4OE1vZGUpCiAgewogICAgY3VyclNFLnR5cGUgICA9ICBTRV9IRUFERVI7CiAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbU0VfSEVBREVSXV0pOwogICAgY3VyclNFLnJlYWRpbmcgPSByZWFkTUJfdHJhbnNmb3JtX3NpemVfZmxhZ19DQUJBQzsKICAgIFRSQUNFX1NUUklORygidHJhbnNmb3JtX3NpemVfOHg4X2ZsYWciKTsKCiAgICAvLyByZWFkIFVWTEMgdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcKICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKQogICAgewogICAgICBjdXJyU0UubGVuID0gMTsKICAgICAgcmVhZFN5bnRheEVsZW1lbnRfRkxDKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwogICAgfQogICAgZWxzZQogICAgewogICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgfQoKICAgIGN1cnJNQi0+bHVtYV90cmFuc2Zvcm1fc2l6ZV84eDhfZmxhZyA9IGN1cnJTRS52YWx1ZTE7CgogICAgaWYgKGN1cnJNQi0+bHVtYV90cmFuc2Zvcm1fc2l6ZV84eDhfZmxhZykKICAgIHsKICAgICAgY3Vyck1CLT5tYl90eXBlID0gSThNQjsKICAgICAgZm9yIChpPTA7aTw0O2krKykKICAgICAgewogICAgICAgIGN1cnJNQi0+Yjhtb2RlW2ldPUk4TUI7CiAgICAgICAgY3Vyck1CLT5iOHBkaXJbaV09LTE7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGN1cnJNQi0+bHVtYV90cmFuc2Zvcm1fc2l6ZV84eDhfZmxhZyA9IDA7CiAgfQoKICBpZihhY3RpdmVfcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgJiYgKGltZy0+dHlwZT09UF9TTElDRXx8IGltZy0+dHlwZT09Ql9TTElDRSkpICAgICAgICAvLyBpbnRlciBmcmFtZQogIHsKICAgIGlmKCAhSVNfSU5UUkEoY3Vyck1CKSApCiAgICB7CiAgICAgIGltZy0+aW50cmFfYmxvY2tbaW1nLT5jdXJyZW50X21iX25yXSA9IDA7CiAgICB9CiAgfQoKICAvLyEgVE8gZm9yIGVycm9yIGNvbmNlYWxtZW50CiAgLy8hIElmIHdlIGhhdmUgYW4gSU5UUkEgTWFjcm9ibG9jayBhbmQgd2UgbG9zdCB0aGUgcGFydGl0aW9uCiAgLy8hIHdoaWNoIGNvbnRhaW5zIHRoZSBpbnRyYSBjb2VmZmljaWVudHMgQ29weSBNQiB3b3VsZCBiZSBiZXR0ZXIKICAvLyEgdGhhbiBqdXN0IGEgZ3JheSBibG9jay4KICAvLyEgU2VlbXMgdG8gYmUgYSBiaXQgYXQgdGhlIHdyb25nIHBsYWNlIHRvIGRvIHRoaXMgcmlnaHQgaGVyZSwgYnV0IGZvciB0aGlzIGNhc2UKICAvLyEgdXAgdG8gbm93IHRoZXJlIGlzIG5vIG90aGVyIHdheS4KICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbU0VfQ0JQX0lOVFJBXV0pOwogIGlmKElTX0lOVFJBIChjdXJyTUIpICYmIGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcgJiYgaW1nLT5udW1iZXIpCiAgewogICAgY3Vyck1CLT5tYl90eXBlID0gMDsKICAgIGN1cnJNQi0+ZWlfZmxhZyA9IDE7CiAgICBmb3IgKGk9MDtpPDQ7aSsrKSB7Y3Vyck1CLT5iOG1vZGVbaV09Y3Vyck1CLT5iOHBkaXJbaV09MDsgfQogIH0KICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbY3VyclNFLnR5cGVdXSk7CiAgLy8hIEVuZCBUTwoKCiAgLy8tLS0gaW5pdCBtYWNyb2Jsb2NrIGRhdGEgLS0tCiAgaWYgKCFJU19QOHg4IChjdXJyTUIpKQogICAgaW5pdF9tYWNyb2Jsb2NrICAgICAgIChpbWcpOwoKICBpZiAoSVNfRElSRUNUIChjdXJyTUIpICYmIGltZy0+Y29kX2NvdW50ZXIgPj0gMCkKICB7CiAgICBjdXJyTUItPmNicCA9IDA7CiAgICByZXNldF9jb2VmZnMoKTsKCiAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09Q0FCQUMpCiAgICAgIGltZy0+Y29kX2NvdW50ZXI9LTE7CgogICAgcmV0dXJuIERFQ09ERV9NQjsKICB9CgogIGlmIChJU19DT1BZIChjdXJyTUIpKSAvL2tlZXAgbGFzdCBtYWNyb2Jsb2NrCiAgewogICAgaW50IGksIGosIGs7CiAgICBzaG9ydCBwbXZbMl07CiAgICBpbnQgemVyb01vdGlvbkFib3ZlOwogICAgaW50IHplcm9Nb3Rpb25MZWZ0OwogICAgUGl4ZWxQb3MgbWJfYSwgbWJfYjsKICAgIGludCAgICAgIGFfbXZfeSA9IDA7CiAgICBpbnQgICAgICBhX3JlZl9pZHggPSAwOwogICAgaW50ICAgICAgYl9tdl95ID0gMDsKICAgIGludCAgICAgIGJfcmVmX2lkeCA9IDA7CiAgICBpbnQgICAgICBsaXN0X29mZnNldCA9ICgoaW1nLT5NYmFmZkZyYW1lRmxhZykmJihjdXJyTUItPm1iX2ZpZWxkKSk/IChpbWctPmN1cnJlbnRfbWJfbnImMHgwMSkgPyA0IDogMiA6IDA7CiAgICBzaG9ydCAqKipjdXJfbXYgPSBkZWNfcGljdHVyZS0+bXZbTElTVF8wXTsKICAgIGdldEx1bWE0eDROZWlnaGJvdXIoaW1nLT5jdXJyZW50X21iX25yLC0xLCAwLCAmbWJfYSk7CiAgICBnZXRMdW1hNHg0TmVpZ2hib3VyKGltZy0+Y3VycmVudF9tYl9uciwgMCwtMSwgJm1iX2IpOwoKICAgIGlmIChtYl9hLmF2YWlsYWJsZSkKICAgIHsKICAgICAgYV9tdl95ICAgID0gY3VyX212W21iX2EucG9zX3ldW21iX2EucG9zX3hdWzFdOwogICAgICBhX3JlZl9pZHggPSBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX2EucG9zX3ldW21iX2EucG9zX3hdOwoKICAgICAgaWYgKGN1cnJNQi0+bWJfZmllbGQgJiYgIWltZy0+bWJfZGF0YVttYl9hLm1iX2FkZHJdLm1iX2ZpZWxkKQogICAgICB7CiAgICAgICAgYV9tdl95ICAgIC89MjsKICAgICAgICBhX3JlZl9pZHggKj0yOwogICAgICB9CiAgICAgIGlmICghY3Vyck1CLT5tYl9maWVsZCAmJiBpbWctPm1iX2RhdGFbbWJfYS5tYl9hZGRyXS5tYl9maWVsZCkKICAgICAgewogICAgICAgIGFfbXZfeSAgICAqPTI7CiAgICAgICAgYV9yZWZfaWR4ID4+PTE7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobWJfYi5hdmFpbGFibGUpCiAgICB7CiAgICAgIGJfbXZfeSAgICA9IGN1cl9tdlttYl9iLnBvc195XVttYl9iLnBvc194XVsxXTsKICAgICAgYl9yZWZfaWR4ID0gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9iLnBvc195XVttYl9iLnBvc194XTsKCiAgICAgIGlmIChjdXJyTUItPm1iX2ZpZWxkICYmICFpbWctPm1iX2RhdGFbbWJfYi5tYl9hZGRyXS5tYl9maWVsZCkKICAgICAgewogICAgICAgIGJfbXZfeSAgICAvPTI7CiAgICAgICAgYl9yZWZfaWR4ICo9MjsKICAgICAgfQogICAgICBpZiAoIWN1cnJNQi0+bWJfZmllbGQgJiYgaW1nLT5tYl9kYXRhW21iX2IubWJfYWRkcl0ubWJfZmllbGQpCiAgICAgIHsKICAgICAgICBiX212X3kgICAgKj0yOwogICAgICAgIGJfcmVmX2lkeCA+Pj0xOwogICAgICB9CiAgICB9CgogICAgemVyb01vdGlvbkxlZnQgID0gIW1iX2EuYXZhaWxhYmxlID8gMSA6IGFfcmVmX2lkeD09MCAmJiBjdXJfbXZbbWJfYS5wb3NfeV1bbWJfYS5wb3NfeF1bMF09PTAgJiYgYV9tdl95PT0wID8gMSA6IDA7CiAgICB6ZXJvTW90aW9uQWJvdmUgPSAhbWJfYi5hdmFpbGFibGUgPyAxIDogYl9yZWZfaWR4PT0wICYmIGN1cl9tdlttYl9iLnBvc195XVttYl9iLnBvc194XVswXT09MCAmJiBiX212X3k9PTAgPyAxIDogMDsKCiAgICBjdXJyTUItPmNicCA9IDA7CiAgICByZXNldF9jb2VmZnMoKTsKCiAgICBpbWdfYmxvY2tfeSAgID0gaW1nLT5ibG9ja195OwoKICAgIGlmICh6ZXJvTW90aW9uQWJvdmUgfHwgemVyb01vdGlvbkxlZnQpCiAgICB7CiAgICAgIGZvcihqPWltZ19ibG9ja195O2o8aW1nX2Jsb2NrX3kgKyBCTE9DS19TSVpFO2orKykKICAgICAgewogICAgICAgIG1lbXNldCgmY3VyX212W2pdW2ltZy0+YmxvY2tfeF1bMF0sIDAsIDIgKiBCTE9DS19TSVpFICogc2l6ZW9mKHNob3J0KSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yIChpbWcsIHBtdiwgMCwgTElTVF8wLCBkZWNfcGljdHVyZS0+cmVmX2lkeCwgZGVjX3BpY3R1cmUtPm12LCAwLCAwLCAxNiwgMTYpOwoKICAgICAgZm9yKGo9aW1nX2Jsb2NrX3k7ajxpbWdfYmxvY2tfeSArIEJMT0NLX1NJWkU7aisrKQogICAgICB7CiAgICAgICAgZm9yKGk9aW1nLT5ibG9ja194O2k8aW1nLT5ibG9ja194ICsgQkxPQ0tfU0laRTtpKyspCiAgICAgICAgICBmb3IgKGs9MDtrPDI7aysrKQogICAgICAgICAgewogICAgICAgICAgICBjdXJfbXZbal1baV1ba10gPSBwbXZba107CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvcihqPWltZ19ibG9ja195O2o8IGltZ19ibG9ja195ICsgQkxPQ0tfU0laRTtqKyspCiAgICB7CiAgICAgIGZvcihpPWltZy0+YmxvY2tfeDtpPGltZy0+YmxvY2tfeCArIEJMT0NLX1NJWkU7aSsrKQogICAgICB7CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqXVtpXSA9IDA7CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9waWNfaWRbTElTVF8wXVtqXVtpXSA9CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX3BpY19udW1baW1nLT5jdXJyZW50X3NsaWNlX25yXVtMSVNUXzAgKyBsaXN0X29mZnNldF1bKHNob3J0KWRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bal1baV1dOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gREVDT0RFX01COwogIH0KICBpZihjdXJyTUItPm1iX3R5cGUhPUlQQ00pCiAgewoKICAgIC8vIGludHJhIHByZWRpY3Rpb24gbW9kZXMgZm9yIGEgbWFjcm9ibG9jayA0eDQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgcmVhZF9pcHJlZF9tb2RlcyhpbWcsaW5wKTsKCiAgICAvLyByZWFkIGludGVyIGZyYW1lIHZlY3RvciBkYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYgKElTX0lOVEVSTVYgKGN1cnJNQikgJiYgKCFJU19QOHg4KGN1cnJNQikpKQogICAgewogICAgICByZWFkTW90aW9uSW5mb0Zyb21OQUwgKGltZywgaW5wKTsKICAgIH0KICAgIC8vIHJlYWQgQ0JQIGFuZCBDb2VmZnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgcmVhZENCUGFuZENvZWZmc0Zyb21OQUwgKGltZyxpbnApOwogIH0KICBlbHNlCiAgewogICAgLy9yZWFkIHBjbV9hbGlnbm1lbnRfemVyb19iaXQgYW5kIHBjbV9ieXRlW2ldCgogICAgLy8gaGVyZSBkUCBpcyBhc3NpZ25lZCB3aXRoIHRoZSBzYW1lIGRQIGFzIFNFX01CVFlQRSwgYmVjYXVzZSBJUENNIHN5bnRheCBpcyBpbiB0aGUKICAgIC8vIHNhbWUgY2F0ZWdvcnkgYXMgTUJUWVBFCiAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbU0VfTUJUWVBFXV0pOwogICAgcmVhZElQQ01jb2VmZnNGcm9tTkFMKGltZyxpbnAsZFApOwogIH0KCgogIHJldHVybiBERUNPREVfTUI7Cn0KCgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIEluaXRpYWxpemUgZGVjb2RpbmcgZW5naW5lIGFmdGVyIGRlY29kaW5nIGFuIElQQ00gbWFjcm9ibG9jawogKiAgICAoZm9yIElQQ00gQ0FCQUMgIDI4LzExLzIwMDMpCiAqCiAqIFxhdXRob3IKICogICAgRG9uZyBXYW5nIDxEb25nLldhbmdAYnJpc3RvbC5hYy51az4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCBpbml0X2RlY29kaW5nX2VuZ2luZV9JUENNKHN0cnVjdCBpbWdfcGFyICppbWcpCnsKICBTbGljZSAqY3VyclNsaWNlID0gaW1nLT5jdXJyZW50U2xpY2U7CiAgQml0c3RyZWFtICpjdXJyU3RyZWFtOwogIGludCBCeXRlU3RhcnRQb3NpdGlvbjsKICBpbnQgUGFydGl0aW9uTnVtYmVyOwogIGludCBpOwoKICBpZihjdXJyU2xpY2UtPmRwX21vZGU9PVBBUl9EUF8xKQogICAgUGFydGl0aW9uTnVtYmVyPTE7CiAgZWxzZSBpZihjdXJyU2xpY2UtPmRwX21vZGU9PVBBUl9EUF8zKQogICAgUGFydGl0aW9uTnVtYmVyPTM7CiAgZWxzZQogIHsKICAgIHByaW50ZigiUGFydGl0aW9uIE1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAgICBleGl0KDEpOwogIH0KCiAgZm9yKGk9MDtpPFBhcnRpdGlvbk51bWJlcjtpKyspCiAgewogICAgY3VyclN0cmVhbSA9IGN1cnJTbGljZS0+cGFydEFycltpXS5iaXRzdHJlYW07CiAgICBCeXRlU3RhcnRQb3NpdGlvbiA9IGN1cnJTdHJlYW0tPnJlYWRfbGVuOwoKCiAgICBhcmlkZWNvX3N0YXJ0X2RlY29kaW5nICgmY3VyclNsaWNlLT5wYXJ0QXJyW2ldLmRlX2NhYmFjLCBjdXJyU3RyZWFtLT5zdHJlYW1CdWZmZXIsIEJ5dGVTdGFydFBvc2l0aW9uLCAmY3VyclN0cmVhbS0+cmVhZF9sZW4sIGltZy0+dHlwZSk7CiAgfQp9CgoKCgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgUmVhZCBJUENNIHBjbV9hbGlnbm1lbnRfemVyb19iaXQgYW5kIHBjbV9ieXRlW2ldIGZyb20gc3RyZWFtIHRvIGltZy0+Y29mCiAqICAgIChmb3IgSVBDTSBDQUJBQyBhbmQgSVBDTSBDQVZMQykKICoKICogXGF1dGhvcgogKiAgICBEb25nIFdhbmcgPERvbmcuV2FuZ0BicmlzdG9sLmFjLnVrPgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKdm9pZCByZWFkSVBDTWNvZWZmc0Zyb21OQUwoc3RydWN0IGltZ19wYXIgKmltZywgc3RydWN0IGlucF9wYXIgKmlucCwgc3RydWN0IGRhdGFwYXJ0aXRpb24gKmRQKQp7CiAgU3ludGF4RWxlbWVudCBjdXJyU0U7CiAgaW50IGksajsKCiAgLy9Gb3IgQ0FCQUMsIHdlIGRvbid0IG5lZWQgdG8gcmVhZCBiaXRzIHRvIGxldCBzdHJlYW0gYnl0ZSBhbGlnbmVkCiAgLy8gIGJlY2F1c2Ugd2UgaGF2ZSB2YXJpYWJsZSBmb3IgaW50ZWdlciBieXRlcyBwb3NpdGlvbgogIGlmKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAgPT0gQ0FCQUMpCiAgewogICAgLy9yZWFkIGx1bWEgYW5kIGNocm9tYSBJUENNIGNvZWZmaWNpZW50cwogICAgY3VyclNFLmxlbj04OwogICAgVFJBQ0VfU1RSSU5HKCJwY21fYnl0ZSBsdW1hIik7CgogICAgZm9yKGk9MDtpPE1CX0JMT0NLX1NJWkU7aSsrKQogICAgewogICAgICBmb3Ioaj0wO2o8TUJfQkxPQ0tfU0laRTtqKyspCiAgICAgIHsKICAgICAgICByZWFkSVBDTUJ5dGVzX0NBQkFDKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwogICAgICAgIGltZy0+Y29mWyhpPj4yKV1bKGo+PjIpXVtpICYgMHgwM11baiAmIDB4MDNdPWN1cnJTRS52YWx1ZTE7CiAgICAgIH0KICAgIH0KICAgIGlmIChkZWNfcGljdHVyZS0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gWVVWNDAwKQogICAgewogICAgICBUUkFDRV9TVFJJTkcoInBjbV9ieXRlIGNocm9tYSIpOwogICAgICBmb3IoaT0wO2k8aW1nLT5tYl9jcl9zaXplX3k7aSsrKQogICAgICB7CiAgICAgICAgZm9yKGo9MDtqPGltZy0+bWJfY3Jfc2l6ZV94O2orKykKICAgICAgICB7CiAgICAgICAgICByZWFkSVBDTUJ5dGVzX0NBQkFDKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwogICAgICAgICAgaW1nLT5jb2ZbKGk+PjIpXVsoaj4+MikrNF1baSAmIDB4MDNdW2ogJiAweDAzXT1jdXJyU0UudmFsdWUxOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IoaT0wO2k8aW1nLT5tYl9jcl9zaXplX3k7aSsrKQogICAgICB7CiAgICAgICAgZm9yKGo9MDtqPGltZy0+bWJfY3Jfc2l6ZV94O2orKykKICAgICAgICB7CiAgICAgICAgICByZWFkSVBDTUJ5dGVzX0NBQkFDKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwogICAgICAgICAgaW1nLT5jb2ZbKGk+PjIpKzJdWyhqPj4yKSs0XVtpICYgMHgwM11baiAmIDB4MDNdPWN1cnJTRS52YWx1ZTE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvL0lmIHRoZSBkZWNvZGVkIE1CIGlzIElQQ00gTUIsIGRlY29kaW5nIGVuZ2luZSBpcyBpbml0aWFsaXplZAoKICAgIC8vIGhlcmUgdGhlIGRlY29kaW5nIGVuZ2luZSBpcyBkaXJlY3RseSBpbml0aWFsaXplZCB3aXRob3V0IGNoZWNraW5nIEVuZCBvZiBTbGljZQogICAgLy8gVGhlIHJlYXNvbiBpcyB0aGF0LCB3aGV0aGVyIGN1cnJlbnQgTUIgaXMgdGhlIGxhc3QgTUIgaW4gc2xpY2Ugb3Igbm90LCB0aGVyZSBpcwogICAgLy8gYXQgbGVhc3Qgb25lICdlbmQgb2Ygc2xpY2UnIHN5bnRheCBhZnRlciB0aGlzIE1CLiBTbyB3aGVuIGZldGNoaW5nIGJ5dGVzIGluIHRoaXMKICAgIC8vIGluaXRpYWxpc2F0aW9uIHByb2Nlc3MsIHdlIGNhbiBndWFyYW50ZWUgdGhlcmUgaXMgYml0cyBhdmFpbGFibGUgaW4gYml0c3RyZWFtLgoKICAgIGluaXRfZGVjb2RpbmdfZW5naW5lX0lQQ00oaW1nKTsKICB9CiAgZWxzZQogIHsKICAgIC8vcmVhZCBiaXRzIHRvIGxldCBzdHJlYW0gYnl0ZSBhbGlnbmVkCgogICAgaWYoKGRQLT5iaXRzdHJlYW0tPmZyYW1lX2JpdG9mZnNldCklOCE9MCkKICAgIHsKICAgICAgVFJBQ0VfU1RSSU5HKCJwY21fYWxpZ25tZW50X3plcm9fYml0Iik7CiAgICAgIGN1cnJTRS5sZW49OC0oZFAtPmJpdHN0cmVhbS0+ZnJhbWVfYml0b2Zmc2V0KSU4OwogICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICB9CgogICAgLy9yZWFkIGx1bWEgYW5kIGNocm9tYSBJUENNIGNvZWZmaWNpZW50cwogICAgY3VyclNFLmxlbj1pbWctPmJpdGRlcHRoX2x1bWE7CiAgICBUUkFDRV9TVFJJTkcoInBjbV9zYW1wbGVfbHVtYSIpOwoKICAgIGZvcihpPTA7aTxNQl9CTE9DS19TSVpFO2krKykKICAgIHsKICAgICAgZm9yKGo9MDtqPE1CX0JMT0NLX1NJWkU7aisrKQogICAgICB7CiAgICAgICAgcmVhZFN5bnRheEVsZW1lbnRfRkxDKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwogICAgICAgIGltZy0+Y29mWyhpPj4yKV1bKGo+PjIpXVtpICYgMHgwM11baiAmIDB4MDNdPWN1cnJTRS52YWx1ZTE7CiAgICAgIH0KICAgIH0KICAgIGN1cnJTRS5sZW49aW1nLT5iaXRkZXB0aF9jaHJvbWE7CiAgICBpZiAoZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjICE9IFlVVjQwMCkKICAgIHsKICAgICAgVFJBQ0VfU1RSSU5HKCJwY21fc2FtcGxlX2Nocm9tYSAodSkiKTsKICAgICAgZm9yKGk9MDtpPGltZy0+bWJfY3Jfc2l6ZV95O2krKykKICAgICAgewogICAgICAgIGZvcihqPTA7ajxpbWctPm1iX2NyX3NpemVfeDtqKyspCiAgICAgICAgewogICAgICAgICAgcmVhZFN5bnRheEVsZW1lbnRfRkxDKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwogICAgICAgICAgaW1nLT5jb2ZbKGk+PjIpXVsoaj4+MikrNF1baSAmIDB4MDNdW2ogJiAweDAzXT1jdXJyU0UudmFsdWUxOwogICAgICAgIH0KICAgICAgfQogICAgICBUUkFDRV9TVFJJTkcoInBjbV9zYW1wbGVfY2hyb21hICh2KSIpOwogICAgICBmb3IoaT0wO2k8aW1nLT5tYl9jcl9zaXplX3k7aSsrKQogICAgICB7CiAgICAgICAgZm9yKGo9MDtqPGltZy0+bWJfY3Jfc2l6ZV94O2orKykKICAgICAgICB7CiAgICAgICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICAgICAgICBpbWctPmNvZlsoaT4+MikrMl1bKGo+PjIpKzRdW2kgJiAweDAzXVtqICYgMHgwM109Y3VyclNFLnZhbHVlMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCgoKdm9pZCByZWFkX2lwcmVkX21vZGVzKHN0cnVjdCBpbWdfcGFyICppbWcsc3RydWN0IGlucF9wYXIgKmlucCkKewogIGludCBiOCxpLGosYmksYmosYngsYnksZGVjOwogIFN5bnRheEVsZW1lbnQgY3VyclNFOwogIFNsaWNlICpjdXJyU2xpY2U7CiAgRGF0YVBhcnRpdGlvbiAqZFA7CiAgaW50ICpwYXJ0TWFwOwogIE1hY3JvYmxvY2sgKmN1cnJNQjsKICBpbnQgdHMsIGxzOwogIGludCBtb3N0UHJvYmFibGVJbnRyYVByZWRNb2RlOwogIGludCB1cEludHJhUHJlZE1vZGU7CiAgaW50IGxlZnRJbnRyYVByZWRNb2RlOwogIGludCBJbnRyYUNocm9tYVByZWRNb2RlRmxhZzsKICBpbnQgYnNfeCwgYnNfeTsKICBpbnQgaWksamo7CgogIFBpeGVsUG9zIGxlZnRfYmxvY2s7CiAgUGl4ZWxQb3MgdG9wX2Jsb2NrOwoKICBjdXJyTUIgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CgogIEludHJhQ2hyb21hUHJlZE1vZGVGbGFnID0gSVNfSU5UUkEoY3Vyck1CKTsKCiAgY3VyclNsaWNlID0gaW1nLT5jdXJyZW50U2xpY2U7CiAgcGFydE1hcCA9IGFzc2lnblNFMnBhcnRpdGlvbltjdXJyU2xpY2UtPmRwX21vZGVdOwoKICBjdXJyU0UudHlwZSA9IFNFX0lOVFJBUFJFRE1PREU7CgogIFRSQUNFX1NUUklORygiaW50cmE0eDRfcHJlZF9tb2RlIik7CiAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW2N1cnJTRS50eXBlXV0pOwoKICBpZiAoIShhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKSkKICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZEludHJhUHJlZE1vZGVfQ0FCQUM7CgogIGZvcihiOD0wO2I4PDQ7YjgrKykgIC8vbG9vcCA4eDggYmxvY2tzCiAgewogICAgaWYoKGN1cnJNQi0+Yjhtb2RlW2I4XT09SUJMT0NLICl8fChjdXJyTUItPmI4bW9kZVtiOF09PUk4TUIpKQogICAgewogICAgICBic194ID0gYnNfeSA9IChjdXJyTUItPmI4bW9kZVtiOF0gPT0gSThNQik/ODo0OwoKICAgICAgSW50cmFDaHJvbWFQcmVkTW9kZUZsYWcgPSAxOwoKICAgICAgaWk9KGJzX3g+PjIpOwogICAgICBqaj0oYnNfeT4+Mik7CgogICAgICBmb3Ioaj0wO2o8MjtqKz1qaikgIC8vbG9vcCBzdWJibG9ja3MKICAgICAgewogICAgICAgIGJ5ID0gKGI4JjIpICsgajsKICAgICAgICBiaiA9IGltZy0+YmxvY2tfeSArIGJ5OwogICAgICAgIGZvcihpPTA7aTwyO2krPWlpKQogICAgICAgIHsKICAgICAgICAgIGJ4ID0gKChiOCYxKTw8MSkgKyBpOwogICAgICAgICAgYmkgPSBpbWctPmJsb2NrX3ggKyBieDsKICAgICAgICAgIC8vZ2V0IGZyb20gc3RyZWFtCiAgICAgICAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMgfHwgZFAtPmJpdHN0cmVhbS0+ZWlfZmxhZykKICAgICAgICAgICAgcmVhZFN5bnRheEVsZW1lbnRfSW50cmE0eDRQcmVkaWN0aW9uTW9kZSgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGN1cnJTRS5jb250ZXh0PShiODw8MikrKGo8PDEpK2k7CiAgICAgICAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgICB9CgogICAgICAgICAgZ2V0THVtYTR4NE5laWdoYm91cihpbWctPmN1cnJlbnRfbWJfbnIsIChieDw8MikgLSAxLCAoYnk8PDIpLCAgICAgJmxlZnRfYmxvY2spOwogICAgICAgICAgZ2V0THVtYTR4NE5laWdoYm91cihpbWctPmN1cnJlbnRfbWJfbnIsIChieDw8MiksICAgICAoYnk8PDIpIC0gMSwgJnRvcF9ibG9jayk7CgogICAgICAgICAgLy9nZXQgZnJvbSBhcnJheSBhbmQgZGVjb2RlCgogICAgICAgICAgaWYgKGFjdGl2ZV9wcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZykKICAgICAgICAgIHsKICAgICAgICAgICAgbGVmdF9ibG9jay5hdmFpbGFibGUgPSBsZWZ0X2Jsb2NrLmF2YWlsYWJsZSA/IGltZy0+aW50cmFfYmxvY2tbbGVmdF9ibG9jay5tYl9hZGRyXSA6IDA7CiAgICAgICAgICAgIHRvcF9ibG9jay5hdmFpbGFibGUgID0gdG9wX2Jsb2NrLmF2YWlsYWJsZSAgPyBpbWctPmludHJhX2Jsb2NrW3RvcF9ibG9jay5tYl9hZGRyXSAgOiAwOwogICAgICAgICAgfQoKICAgICAgICAgIC8vICEhIEtTOiBub3Qgc3VyZSBpZiB0aGUgZm9sbG93aW5nIGlzIHN0aWxsIGNvcnJlY3QuLi4KICAgICAgICAgIHRzID0gbHMgPSAwOyAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgaXMgU0kKICAgICAgICAgIGlmIChJU19PTERJTlRSQShjdXJyTUIpICYmIGltZy0+dHlwZSA9PSBTSV9TTElDRSkgICAgICAgICAgIC8vIG5lZWQgc3VwcG9ydCBmb3IgTUJJTlRMQzEKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGxlZnRfYmxvY2suYXZhaWxhYmxlKQogICAgICAgICAgICAgIGlmIChpbWctPnNpYmxvY2sgW2xlZnRfYmxvY2sucG9zX3ldW2xlZnRfYmxvY2sucG9zX3hdKQogICAgICAgICAgICAgICAgbHM9MTsKCiAgICAgICAgICAgIGlmICh0b3BfYmxvY2suYXZhaWxhYmxlKQogICAgICAgICAgICAgIGlmIChpbWctPnNpYmxvY2sgW3RvcF9ibG9jay5wb3NfeV1bdG9wX2Jsb2NrLnBvc194XSkKICAgICAgICAgICAgICAgIHRzPTE7CiAgICAgICAgICB9CgogICAgICAgICAgdXBJbnRyYVByZWRNb2RlICAgICAgICAgICAgPSAodG9wX2Jsb2NrLmF2YWlsYWJsZSAgJiYodHMgPT0gMCkpID8gaW1nLT5pcHJlZG1vZGVbdG9wX2Jsb2NrLnBvc195IF1bdG9wX2Jsb2NrLnBvc194IF0gOiAtMTsKICAgICAgICAgIGxlZnRJbnRyYVByZWRNb2RlICAgICAgICAgID0gKGxlZnRfYmxvY2suYXZhaWxhYmxlICYmKGxzID09IDApKSA/IGltZy0+aXByZWRtb2RlW2xlZnRfYmxvY2sucG9zX3ldW2xlZnRfYmxvY2sucG9zX3hdIDogLTE7CgogICAgICAgICAgbW9zdFByb2JhYmxlSW50cmFQcmVkTW9kZSAgPSAodXBJbnRyYVByZWRNb2RlIDwgMCB8fCBsZWZ0SW50cmFQcmVkTW9kZSA8IDApID8gRENfUFJFRCA6IHVwSW50cmFQcmVkTW9kZSA8IGxlZnRJbnRyYVByZWRNb2RlID8gdXBJbnRyYVByZWRNb2RlIDogbGVmdEludHJhUHJlZE1vZGU7CgogICAgICAgICAgZGVjID0gKGN1cnJTRS52YWx1ZTEgPT0gLTEpID8gbW9zdFByb2JhYmxlSW50cmFQcmVkTW9kZSA6IGN1cnJTRS52YWx1ZTEgKyAoY3VyclNFLnZhbHVlMSA+PSBtb3N0UHJvYmFibGVJbnRyYVByZWRNb2RlKTsKCiAgICAgICAgICAvL3NldAogICAgICAgICAgZm9yKGpqPTA7amo8KGJzX3k+PjIpO2pqKyspICAgLy9sb29wIDR4NHMgaW4gdGhlIHN1YmJsb2NrIGZvciA4eDggcHJlZGljdGlvbiBzZXR0aW5nCiAgICAgICAgICAgIG1lbXNldCgmaW1nLT5pcHJlZG1vZGVbYmorampdW2JpXSwgZGVjLCAoYnNfeD4+MikgKiBzaXplb2YoY2hhcikpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgaWYgKEludHJhQ2hyb21hUHJlZE1vZGVGbGFnICYmIGRlY19waWN0dXJlLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBZVVY0MDApCiAgewogICAgY3VyclNFLnR5cGUgPSBTRV9JTlRSQVBSRURNT0RFOwogICAgVFJBQ0VfU1RSSU5HKCJpbnRyYV9jaHJvbWFfcHJlZF9tb2RlIik7CiAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbY3VyclNFLnR5cGVdXSk7CgogICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fdWU7CiAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZENJUHJlZE1vZGVfQ0FCQUM7CgogICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgIGN1cnJNQi0+Y19pcHJlZF9tb2RlID0gY3VyclNFLnZhbHVlMTsKCiAgICBpZiAoY3Vyck1CLT5jX2lwcmVkX21vZGUgPCBEQ19QUkVEXzggfHwgY3Vyck1CLT5jX2lwcmVkX21vZGUgPiBQTEFORV84KQogICAgewogICAgICBlcnJvcigiaWxsZWdhbCBjaHJvbWEgaW50cmEgcHJlZCBtb2RlIVxuIiwgNjAwKTsKICAgIH0KICB9Cn0KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBTZXQgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yIChzdHJ1Y3QgaW1nX3BhciAgKmltZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICAgcG12WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICAgICByZWZfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSAgICAgICAgICAgIGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgICAgICoqKnJlZlBpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICAgKioqKnRtcF9tdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYmxvY2tfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYmxvY2tfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYmxvY2tzaGFwZV94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBibG9ja3NoYXBlX3kpCnsKICBpbnQgbWJfeCAgICAgICAgICAgICAgICAgPSBCTE9DS19TSVpFKmJsb2NrX3g7CiAgaW50IG1iX3kgICAgICAgICAgICAgICAgID0gQkxPQ0tfU0laRSpibG9ja195OwogIGludCBtYl9uciAgICAgICAgICAgICAgICA9IGltZy0+Y3VycmVudF9tYl9ucjsKCiAgaW50IG12X2EsIG12X2IsIG12X2MsIHByZWRfdmVjPTA7CiAgaW50IG12UHJlZFR5cGUsIHJGcmFtZUwsIHJGcmFtZVUsIHJGcmFtZVVSOwogIGludCBodjsKCgogIFBpeGVsUG9zIGJsb2NrX2EsIGJsb2NrX2IsIGJsb2NrX2MsIGJsb2NrX2Q7CgogIGdldEx1bWE0eDROZWlnaGJvdXIobWJfbnIsIG1iX3ggLSAxLCAgICAgICAgICAgIG1iX3ksICAgICAmYmxvY2tfYSk7CiAgZ2V0THVtYTR4NE5laWdoYm91cihtYl9uciwgbWJfeCwgICAgICAgICAgICAgICAgbWJfeSAtIDEsICZibG9ja19iKTsKICBnZXRMdW1hNHg0TmVpZ2hib3VyKG1iX25yLCBtYl94ICsgYmxvY2tzaGFwZV94LCBtYl95IC0gMSwgJmJsb2NrX2MpOwogIGdldEx1bWE0eDROZWlnaGJvdXIobWJfbnIsIG1iX3ggLSAxLCAgICAgICAgICAgIG1iX3kgLSAxLCAmYmxvY2tfZCk7CgogIGlmIChtYl95ID4gMCkKICB7CiAgICBpZiAobWJfeCA8IDgpICAvLyBmaXJzdCBjb2x1bW4gb2YgOHg4IGJsb2NrcwogICAgewogICAgICBpZiAobWJfeT09OCkKICAgICAgewogICAgICAgIGlmIChibG9ja3NoYXBlX3ggPT0gMTYpICAgICAgYmxvY2tfYy5hdmFpbGFibGUgID0gMDsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAobWJfeCtibG9ja3NoYXBlX3ggPT0gOCkgIGJsb2NrX2MuYXZhaWxhYmxlICA9IDA7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKG1iX3grYmxvY2tzaGFwZV94ID09IDE2KSAgIGJsb2NrX2MuYXZhaWxhYmxlICA9IDA7CiAgICB9CiAgfQoKICBpZiAoIWJsb2NrX2MuYXZhaWxhYmxlKQogIHsKICAgIGJsb2NrX2M9YmxvY2tfZDsKICB9CgogIG12UHJlZFR5cGUgPSBNVlBSRURfTUVESUFOOwoKICBpZiAoIWltZy0+TWJhZmZGcmFtZUZsYWcpCiAgewogICAgckZyYW1lTCAgICA9IGJsb2NrX2EuYXZhaWxhYmxlICAgID8gcmVmUGljW2xpc3RdW2Jsb2NrX2EucG9zX3ldW2Jsb2NrX2EucG9zX3hdIDogLTE7CiAgICByRnJhbWVVICAgID0gYmxvY2tfYi5hdmFpbGFibGUgICAgPyByZWZQaWNbbGlzdF1bYmxvY2tfYi5wb3NfeV1bYmxvY2tfYi5wb3NfeF0gOiAtMTsKICAgIHJGcmFtZVVSICAgPSBibG9ja19jLmF2YWlsYWJsZSAgICA/IHJlZlBpY1tsaXN0XVtibG9ja19jLnBvc195XVtibG9ja19jLnBvc194XSA6IC0xOwogIH0KICBlbHNlCiAgewogICAgaWYgKGltZy0+bWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnJdLm1iX2ZpZWxkKQogICAgewogICAgICByRnJhbWVMICAgID0gYmxvY2tfYS5hdmFpbGFibGUgICAgPwogICAgICAgIGltZy0+bWJfZGF0YVtibG9ja19hLm1iX2FkZHJdLm1iX2ZpZWxkID8KICAgICAgICByZWZQaWNbbGlzdF1bYmxvY2tfYS5wb3NfeV1bYmxvY2tfYS5wb3NfeF06CiAgICAgICAgcmVmUGljW2xpc3RdW2Jsb2NrX2EucG9zX3ldW2Jsb2NrX2EucG9zX3hdICogMjoKICAgICAgICAtMTsKICAgICAgckZyYW1lVSAgICA9IGJsb2NrX2IuYXZhaWxhYmxlICAgID8KICAgICAgICBpbWctPm1iX2RhdGFbYmxvY2tfYi5tYl9hZGRyXS5tYl9maWVsZCA/CiAgICAgICAgcmVmUGljW2xpc3RdW2Jsb2NrX2IucG9zX3ldW2Jsb2NrX2IucG9zX3hdOgogICAgICAgIHJlZlBpY1tsaXN0XVtibG9ja19iLnBvc195XVtibG9ja19iLnBvc194XSAqIDI6CiAgICAgICAgLTE7CiAgICAgIHJGcmFtZVVSICAgID0gYmxvY2tfYy5hdmFpbGFibGUgICAgPwogICAgICAgIGltZy0+bWJfZGF0YVtibG9ja19jLm1iX2FkZHJdLm1iX2ZpZWxkID8KICAgICAgICByZWZQaWNbbGlzdF1bYmxvY2tfYy5wb3NfeV1bYmxvY2tfYy5wb3NfeF06CiAgICAgICAgcmVmUGljW2xpc3RdW2Jsb2NrX2MucG9zX3ldW2Jsb2NrX2MucG9zX3hdICogMjoKICAgICAgICAtMTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgckZyYW1lTCAgICA9IGJsb2NrX2EuYXZhaWxhYmxlICAgID8KICAgICAgICBpbWctPm1iX2RhdGFbYmxvY2tfYS5tYl9hZGRyXS5tYl9maWVsZCA/CiAgICAgICAgcmVmUGljW2xpc3RdW2Jsb2NrX2EucG9zX3ldW2Jsb2NrX2EucG9zX3hdID4+MToKICAgICAgICByZWZQaWNbbGlzdF1bYmxvY2tfYS5wb3NfeV1bYmxvY2tfYS5wb3NfeF0gOgogICAgICAgIC0xOwogICAgICByRnJhbWVVICAgID0gYmxvY2tfYi5hdmFpbGFibGUgICAgPwogICAgICAgIGltZy0+bWJfZGF0YVtibG9ja19iLm1iX2FkZHJdLm1iX2ZpZWxkID8KICAgICAgICByZWZQaWNbbGlzdF1bYmxvY2tfYi5wb3NfeV1bYmxvY2tfYi5wb3NfeF0gPj4xOgogICAgICAgIHJlZlBpY1tsaXN0XVtibG9ja19iLnBvc195XVtibG9ja19iLnBvc194XSA6CiAgICAgICAgLTE7CiAgICAgIHJGcmFtZVVSICAgID0gYmxvY2tfYy5hdmFpbGFibGUgICAgPwogICAgICAgIGltZy0+bWJfZGF0YVtibG9ja19jLm1iX2FkZHJdLm1iX2ZpZWxkID8KICAgICAgICByZWZQaWNbbGlzdF1bYmxvY2tfYy5wb3NfeV1bYmxvY2tfYy5wb3NfeF0gPj4xOgogICAgICAgIHJlZlBpY1tsaXN0XVtibG9ja19jLnBvc195XVtibG9ja19jLnBvc194XSA6CiAgICAgICAgLTE7CiAgICB9CiAgfQoKCiAgLyogUHJlZGljdGlvbiBpZiBvbmx5IG9uZSBvZiB0aGUgbmVpZ2hib3JzIHVzZXMgdGhlIHJlZmVyZW5jZSBmcmFtZQogICAqIHdlIGFyZSBjaGVja2luZwogICAqLwogIGlmKHJGcmFtZUwgPT0gcmVmX2ZyYW1lICYmIHJGcmFtZVUgIT0gcmVmX2ZyYW1lICYmIHJGcmFtZVVSICE9IHJlZl9mcmFtZSkgICAgICAgbXZQcmVkVHlwZSA9IE1WUFJFRF9MOwogIGVsc2UgaWYockZyYW1lTCAhPSByZWZfZnJhbWUgJiYgckZyYW1lVSA9PSByZWZfZnJhbWUgJiYgckZyYW1lVVIgIT0gcmVmX2ZyYW1lKSAgbXZQcmVkVHlwZSA9IE1WUFJFRF9VOwogIGVsc2UgaWYockZyYW1lTCAhPSByZWZfZnJhbWUgJiYgckZyYW1lVSAhPSByZWZfZnJhbWUgJiYgckZyYW1lVVIgPT0gcmVmX2ZyYW1lKSAgbXZQcmVkVHlwZSA9IE1WUFJFRF9VUjsKICAvLyBEaXJlY3Rpb25hbCBwcmVkaWN0aW9ucwogIGlmKGJsb2Nrc2hhcGVfeCA9PSA4ICYmIGJsb2Nrc2hhcGVfeSA9PSAxNikKICB7CiAgICBpZihtYl94ID09IDApCiAgICB7CiAgICAgIGlmKHJGcmFtZUwgPT0gcmVmX2ZyYW1lKQogICAgICAgIG12UHJlZFR5cGUgPSBNVlBSRURfTDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYoIHJGcmFtZVVSID09IHJlZl9mcmFtZSkKICAgICAgICBtdlByZWRUeXBlID0gTVZQUkVEX1VSOwogICAgfQogIH0KICBlbHNlIGlmKGJsb2Nrc2hhcGVfeCA9PSAxNiAmJiBibG9ja3NoYXBlX3kgPT0gOCkKICB7CiAgICBpZihtYl95ID09IDApCiAgICB7CiAgICAgIGlmKHJGcmFtZVUgPT0gcmVmX2ZyYW1lKQogICAgICAgIG12UHJlZFR5cGUgPSBNVlBSRURfVTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYockZyYW1lTCA9PSByZWZfZnJhbWUpCiAgICAgICAgbXZQcmVkVHlwZSA9IE1WUFJFRF9MOwogICAgfQogIH0KCiAgZm9yIChodj0wOyBodiA8IDI7IGh2KyspCiAgewogICAgaWYgKCFpbWctPk1iYWZmRnJhbWVGbGFnIHx8IGh2PT0wKQogICAgewogICAgICBtdl9hID0gYmxvY2tfYS5hdmFpbGFibGUgID8gdG1wX212W2xpc3RdW2Jsb2NrX2EucG9zX3ldW2Jsb2NrX2EucG9zX3hdW2h2XSA6IDA7CiAgICAgIG12X2IgPSBibG9ja19iLmF2YWlsYWJsZSAgPyB0bXBfbXZbbGlzdF1bYmxvY2tfYi5wb3NfeV1bYmxvY2tfYi5wb3NfeF1baHZdIDogMDsKICAgICAgbXZfYyA9IGJsb2NrX2MuYXZhaWxhYmxlICA/IHRtcF9tdltsaXN0XVtibG9ja19jLnBvc195XVtibG9ja19jLnBvc194XVtodl0gOiAwOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl0ubWJfZmllbGQpCiAgICAgIHsKICAgICAgICBtdl9hID0gYmxvY2tfYS5hdmFpbGFibGUgID8gaW1nLT5tYl9kYXRhW2Jsb2NrX2EubWJfYWRkcl0ubWJfZmllbGQ/CiAgICAgICAgICB0bXBfbXZbbGlzdF1bYmxvY2tfYS5wb3NfeV1bYmxvY2tfYS5wb3NfeF1baHZdOgogICAgICAgICAgdG1wX212W2xpc3RdW2Jsb2NrX2EucG9zX3ldW2Jsb2NrX2EucG9zX3hdW2h2XSAvIDI6CiAgICAgICAgICAwOwogICAgICAgIG12X2IgPSBibG9ja19iLmF2YWlsYWJsZSAgPyBpbWctPm1iX2RhdGFbYmxvY2tfYi5tYl9hZGRyXS5tYl9maWVsZD8KICAgICAgICAgIHRtcF9tdltsaXN0XVtibG9ja19iLnBvc195XVtibG9ja19iLnBvc194XVtodl06CiAgICAgICAgICB0bXBfbXZbbGlzdF1bYmxvY2tfYi5wb3NfeV1bYmxvY2tfYi5wb3NfeF1baHZdIC8gMjoKICAgICAgICAgIDA7CiAgICAgICAgbXZfYyA9IGJsb2NrX2MuYXZhaWxhYmxlICA/IGltZy0+bWJfZGF0YVtibG9ja19jLm1iX2FkZHJdLm1iX2ZpZWxkPwogICAgICAgICAgdG1wX212W2xpc3RdW2Jsb2NrX2MucG9zX3ldW2Jsb2NrX2MucG9zX3hdW2h2XToKICAgICAgICAgIHRtcF9tdltsaXN0XVtibG9ja19jLnBvc195XVtibG9ja19jLnBvc194XVtodl0gLyAyOgogICAgICAgICAgMDsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBtdl9hID0gYmxvY2tfYS5hdmFpbGFibGUgID8gaW1nLT5tYl9kYXRhW2Jsb2NrX2EubWJfYWRkcl0ubWJfZmllbGQ/CiAgICAgICAgICB0bXBfbXZbbGlzdF1bYmxvY2tfYS5wb3NfeV1bYmxvY2tfYS5wb3NfeF1baHZdICogMjoKICAgICAgICAgIHRtcF9tdltsaXN0XVtibG9ja19hLnBvc195XVtibG9ja19hLnBvc194XVtodl06CiAgICAgICAgICAwOwogICAgICAgIG12X2IgPSBibG9ja19iLmF2YWlsYWJsZSAgPyBpbWctPm1iX2RhdGFbYmxvY2tfYi5tYl9hZGRyXS5tYl9maWVsZD8KICAgICAgICAgIHRtcF9tdltsaXN0XVtibG9ja19iLnBvc195XVtibG9ja19iLnBvc194XVtodl0gKiAyOgogICAgICAgICAgdG1wX212W2xpc3RdW2Jsb2NrX2IucG9zX3ldW2Jsb2NrX2IucG9zX3hdW2h2XToKICAgICAgICAgIDA7CiAgICAgICAgbXZfYyA9IGJsb2NrX2MuYXZhaWxhYmxlICA/IGltZy0+bWJfZGF0YVtibG9ja19jLm1iX2FkZHJdLm1iX2ZpZWxkPwogICAgICAgICAgdG1wX212W2xpc3RdW2Jsb2NrX2MucG9zX3ldW2Jsb2NrX2MucG9zX3hdW2h2XSAqIDI6CiAgICAgICAgICB0bXBfbXZbbGlzdF1bYmxvY2tfYy5wb3NfeV1bYmxvY2tfYy5wb3NfeF1baHZdOgogICAgICAgICAgMDsKICAgICAgfQogICAgfQoKICAgIHN3aXRjaCAobXZQcmVkVHlwZSkKICAgIHsKICAgIGNhc2UgTVZQUkVEX01FRElBTjoKICAgICAgaWYoIShibG9ja19iLmF2YWlsYWJsZSB8fCBibG9ja19jLmF2YWlsYWJsZSkpCiAgICAgICAgcHJlZF92ZWMgPSBtdl9hOwogICAgICBlbHNlCiAgICAgICAgcHJlZF92ZWMgPSBtdl9hK212X2IrbXZfYy1pbWluKG12X2EsaW1pbihtdl9iLG12X2MpKS1pbWF4KG12X2EsaW1heChtdl9iLG12X2MpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE1WUFJFRF9MOgogICAgICBwcmVkX3ZlYyA9IG12X2E7CiAgICAgIGJyZWFrOwogICAgY2FzZSBNVlBSRURfVToKICAgICAgcHJlZF92ZWMgPSBtdl9iOwogICAgICBicmVhazsKICAgIGNhc2UgTVZQUkVEX1VSOgogICAgICBwcmVkX3ZlYyA9IG12X2M7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgYnJlYWs7CiAgICB9CgogICAgcG12W2h2XSA9IHByZWRfdmVjOwogIH0KfQoKCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBTZXQgY29udGV4dCBmb3IgcmVmZXJlbmNlIGZyYW1lcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwppbnQKQlR5cGUyQ3R4UmVmIChpbnQgYnR5cGUpCnsKICBpZiAoYnR5cGU8NCkgIHJldHVybiAwOwogIGVsc2UgICAgICAgICAgcmV0dXJuIDE7Cn0KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBSZWFkIG1vdGlvbiBpbmZvCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgcmVhZE1vdGlvbkluZm9Gcm9tTkFMIChzdHJ1Y3QgaW1nX3BhciAqaW1nLCBzdHJ1Y3QgaW5wX3BhciAqaW5wKQp7CiAgaW50IGksaixrOwogIGludCBzdGVwX2gsc3RlcF92OwogIGludCBjdXJyX212ZDsKICBNYWNyb2Jsb2NrICpjdXJyTUIgID0gJmltZy0+bWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnJdOwogIFN5bnRheEVsZW1lbnQgY3VyclNFOwogIFNsaWNlICpjdXJyU2xpY2UgICAgPSBpbWctPmN1cnJlbnRTbGljZTsKICBEYXRhUGFydGl0aW9uICpkUDsKICBpbnQgKnBhcnRNYXAgICAgICAgID0gYXNzaWduU0UycGFydGl0aW9uW2N1cnJTbGljZS0+ZHBfbW9kZV07CiAgaW50IGJmcmFtZSAgICAgICAgICA9IChpbWctPnR5cGU9PUJfU0xJQ0UpOwogIGludCBwYXJ0bW9kZSAgICAgICAgPSAoSVNfUDh4OChjdXJyTUIpPzQ6Y3Vyck1CLT5tYl90eXBlKTsKICBpbnQgc3RlcF9oMCAgICAgICAgID0gQkxPQ0tfU1RFUCBbcGFydG1vZGVdWzBdOwogIGludCBzdGVwX3YwICAgICAgICAgPSBCTE9DS19TVEVQIFtwYXJ0bW9kZV1bMV07CgogIGludCBtdl9tb2RlLCBpMCwgajA7CiAgc2lnbmVkIGNoYXIgcmVmZnJhbWU7CiAgc2hvcnQgcG12WzJdOwogIGludCBqNCwgaTQsIGlpLGpqOwogIGludCB2ZWM7CgogIGludCBtdl9zY2FsZSA9IDA7CgogIGludCBmbGFnX21vZGU7CgogIGludCBsaXN0X29mZnNldCA9ICgoaW1nLT5NYmFmZkZyYW1lRmxhZykmJihjdXJyTUItPm1iX2ZpZWxkKSk/IChpbWctPmN1cnJlbnRfbWJfbnImMHgwMSkgPyA0IDogMiA6IDA7CgogIGJ5dGUgICoqICAgIG1vdmluZ19ibG9jazsKICBzaG9ydCAqKioqICBjb19sb2NhdGVkX212OwogIHNpZ25lZCBjaGFyICoqKiBjb19sb2NhdGVkX3JlZl9pZHg7CiAgaW50NjQgKioqICAgY29fbG9jYXRlZF9yZWZfaWQ7CgogIGlmICgoaW1nLT5NYmFmZkZyYW1lRmxhZykmJihjdXJyTUItPm1iX2ZpZWxkKSkKICB7CiAgICBpZihpbWctPmN1cnJlbnRfbWJfbnImMHgwMSkKICAgIHsKICAgICAgbW92aW5nX2Jsb2NrID0gQ29fbG9jYXRlZC0+Ym90dG9tX21vdmluZ19ibG9jazsKICAgICAgY29fbG9jYXRlZF9tdiA9IENvX2xvY2F0ZWQtPmJvdHRvbV9tdjsKICAgICAgY29fbG9jYXRlZF9yZWZfaWR4ID0gQ29fbG9jYXRlZC0+Ym90dG9tX3JlZl9pZHg7CiAgICAgIGNvX2xvY2F0ZWRfcmVmX2lkID0gQ29fbG9jYXRlZC0+Ym90dG9tX3JlZl9waWNfaWQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIG1vdmluZ19ibG9jayA9IENvX2xvY2F0ZWQtPnRvcF9tb3ZpbmdfYmxvY2s7CiAgICAgIGNvX2xvY2F0ZWRfbXYgPSBDb19sb2NhdGVkLT50b3BfbXY7CiAgICAgIGNvX2xvY2F0ZWRfcmVmX2lkeCA9IENvX2xvY2F0ZWQtPnRvcF9yZWZfaWR4OwogICAgICBjb19sb2NhdGVkX3JlZl9pZCA9IENvX2xvY2F0ZWQtPnRvcF9yZWZfcGljX2lkOwogICAgfQogIH0KICBlbHNlCiAgewogICAgbW92aW5nX2Jsb2NrID0gQ29fbG9jYXRlZC0+bW92aW5nX2Jsb2NrOwogICAgY29fbG9jYXRlZF9tdiA9IENvX2xvY2F0ZWQtPm12OwogICAgY29fbG9jYXRlZF9yZWZfaWR4ID0gQ29fbG9jYXRlZC0+cmVmX2lkeDsKICAgIGNvX2xvY2F0ZWRfcmVmX2lkID0gQ29fbG9jYXRlZC0+cmVmX3BpY19pZDsKICB9CgogIGlmIChiZnJhbWUgJiYgSVNfUDh4OCAoY3Vyck1CKSkKICB7CiAgICBpZiAoaW1nLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcpCiAgICB7CiAgICAgIGludCBpbWdibG9ja195PSAoKGltZy0+TWJhZmZGcmFtZUZsYWcpJiYoY3Vyck1CLT5tYl9maWVsZCkpPyAoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpID8gKGltZy0+YmxvY2tfeS00KT4+MTppbWctPmJsb2NrX3k+PjE6IGltZy0+YmxvY2tfeTsKICAgICAgaW50IGwwX3JGcmFtZUwsIGwwX3JGcmFtZVUsIGwwX3JGcmFtZVVMLCBsMF9yRnJhbWVVUjsKICAgICAgaW50IGwxX3JGcmFtZUwsIGwxX3JGcmFtZVUsIGwxX3JGcmFtZVVMLCBsMV9yRnJhbWVVUjsKCiAgICAgIFBpeGVsUG9zIG1iX2xlZnQsIG1iX3VwLCBtYl91cGxlZnQsIG1iX3VwcmlnaHQ7CgogICAgICBzaWduZWQgY2hhciAgbDBfckZyYW1lLGwxX3JGcmFtZTsKICAgICAgc2hvcnQgcG12bDBbMl09ezAsMH0sIHBtdmwxWzJdPXswLDB9OwoKICAgICAgZ2V0THVtYTR4NE5laWdoYm91cihpbWctPmN1cnJlbnRfbWJfbnIsIC0xLCAgMCwgJm1iX2xlZnQpOwogICAgICBnZXRMdW1hNHg0TmVpZ2hib3VyKGltZy0+Y3VycmVudF9tYl9uciwgIDAsIC0xLCAmbWJfdXApOwogICAgICBnZXRMdW1hNHg0TmVpZ2hib3VyKGltZy0+Y3VycmVudF9tYl9uciwgMTYsIC0xLCAmbWJfdXByaWdodCk7CiAgICAgIGdldEx1bWE0eDROZWlnaGJvdXIoaW1nLT5jdXJyZW50X21iX25yLCAtMSwgLTEsICZtYl91cGxlZnQpOwoKICAgICAgaWYgKCFpbWctPk1iYWZmRnJhbWVGbGFnKQogICAgICB7CiAgICAgICAgbDBfckZyYW1lTCA9IG1iX2xlZnQuYXZhaWxhYmxlID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSA6IC0xOwogICAgICAgIGwwX3JGcmFtZVUgPSBtYl91cC5hdmFpbGFibGUgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gOiAtMTsKICAgICAgICBsMF9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA6IC0xOwogICAgICAgIGwwX3JGcmFtZVVSID0gbWJfdXByaWdodC5hdmFpbGFibGUgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIDogbDBfckZyYW1lVUw7CgogICAgICAgIGwxX3JGcmFtZUwgPSBtYl9sZWZ0LmF2YWlsYWJsZSA/IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gOiAtMTsKICAgICAgICBsMV9yRnJhbWVVID0gbWJfdXAuYXZhaWxhYmxlID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDogLTE7CiAgICAgICAgbDFfckZyYW1lVUwgPSBtYl91cGxlZnQuYXZhaWxhYmxlID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cGxlZnQucG9zX3ldW21iX3VwbGVmdC5wb3NfeF0gOiAtMTsKICAgICAgICBsMV9yRnJhbWVVUiA9IG1iX3VwcmlnaHQuYXZhaWxhYmxlID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA6IGwxX3JGcmFtZVVMOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGlmIChpbWctPm1iX2RhdGFbaW1nLT5jdXJyZW50X21iX25yXS5tYl9maWVsZCkKICAgICAgICB7CiAgICAgICAgICBsMF9yRnJhbWVMID0gbWJfbGVmdC5hdmFpbGFibGUgCiAgICAgICAgICAgID8gaW1nLT5tYl9kYXRhW21iX2xlZnQubWJfYWRkcl0ubWJfZmllbGQgIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gPCAwCiAgICAgICAgICAgID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSAKICAgICAgICAgICAgOiBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdICogMjogLTE7CgogICAgICAgICAgbDBfckZyYW1lVSA9IG1iX3VwLmF2YWlsYWJsZSAKICAgICAgICAgICAgPyBpbWctPm1iX2RhdGFbbWJfdXAubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDwgMAogICAgICAgICAgICA/IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSAKICAgICAgICAgICAgOiBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gKiAyOiAtMTsKCiAgICAgICAgICBsMF9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgCiAgICAgICAgICAgID8gaW1nLT5tYl9kYXRhW21iX3VwbGVmdC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA8IDAKICAgICAgICAgICAgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSAKICAgICAgICAgICAgOiBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSAqMjogLTE7CgogICAgICAgICAgbDBfckZyYW1lVVIgPSBtYl91cHJpZ2h0LmF2YWlsYWJsZSAKICAgICAgICAgICAgPyBpbWctPm1iX2RhdGFbbWJfdXByaWdodC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIDwgMCAKICAgICAgICAgICAgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIAogICAgICAgICAgICA6IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXByaWdodC5wb3NfeV1bbWJfdXByaWdodC5wb3NfeF0gKiAyOiBsMF9yRnJhbWVVTDsKCiAgICAgICAgICBsMV9yRnJhbWVMID0gbWJfbGVmdC5hdmFpbGFibGUgCiAgICAgICAgICAgID8gaW1nLT5tYl9kYXRhW21iX2xlZnQubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSAgPCAwIAogICAgICAgICAgICA/IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gCiAgICAgICAgICAgIDogZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSAqIDI6IC0xOwoKICAgICAgICAgIGwxX3JGcmFtZVUgPSBtYl91cC5hdmFpbGFibGUgCiAgICAgICAgICAgID8gaW1nLT5tYl9kYXRhW21iX3VwLm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSAgPCAwIAogICAgICAgICAgICA/IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSAKICAgICAgICAgICAgOiBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gKiAyOiAtMTsKCiAgICAgICAgICBsMV9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgCiAgICAgICAgICAgID8gaW1nLT5tYl9kYXRhW21iX3VwbGVmdC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSAgPCAwIAogICAgICAgICAgICA/IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdIAogICAgICAgICAgICA6IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdICoyIDogLTE7CgogICAgICAgICAgbDFfckZyYW1lVVIgPSBtYl91cHJpZ2h0LmF2YWlsYWJsZSAKICAgICAgICAgICAgPyBpbWctPm1iX2RhdGFbbWJfdXByaWdodC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdICA8IDAgCiAgICAgICAgICAgID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSAKICAgICAgICAgICAgOiBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdICogMjogbDFfckZyYW1lVUw7CgogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgbDBfckZyYW1lTCA9IG1iX2xlZnQuYXZhaWxhYmxlID8KICAgICAgICAgICAgaW1nLT5tYl9kYXRhW21iX2xlZnQubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSAgPCAwID8KICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSA+PiAxIDoKICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF06IC0xOwoKICAgICAgICAgIGwwX3JGcmFtZVUgPSBtYl91cC5hdmFpbGFibGUgPwogICAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXAubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdICA8IDAgPwogICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gPj4gMSA6CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gOiAtMTsKCiAgICAgICAgICBsMF9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgPwogICAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXBsZWZ0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdIDwgMCA/CiAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdPj4gMSA6CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA6IC0xOwoKICAgICAgICAgIGwwX3JGcmFtZVVSID0gbWJfdXByaWdodC5hdmFpbGFibGUgPwogICAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXByaWdodC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdICA8IDAgPwogICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdID4+IDEgOgogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA6IGwwX3JGcmFtZVVMOwoKICAgICAgICAgIGwxX3JGcmFtZUwgPSBtYl9sZWZ0LmF2YWlsYWJsZSA/CiAgICAgICAgICAgIGltZy0+bWJfZGF0YVttYl9sZWZ0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gPCAwID8KICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSA+PiAxIDoKICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gOiAtMTsKICAgICAgICAgIGwxX3JGcmFtZVUgPSBtYl91cC5hdmFpbGFibGUgPwogICAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXAubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDwgMCA/CiAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSA+PiAxIDoKICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSA6IC0xOwoKICAgICAgICAgIGwxX3JGcmFtZVVMID0gbWJfdXBsZWZ0LmF2YWlsYWJsZSA/CiAgICAgICAgICAgIGltZy0+bWJfZGF0YVttYl91cGxlZnQubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cGxlZnQucG9zX3ldW21iX3VwbGVmdC5wb3NfeF0gIDwgMCA/CiAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdID4+IDEgOgogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cGxlZnQucG9zX3ldW21iX3VwbGVmdC5wb3NfeF0gOiAtMTsKCiAgICAgICAgICBsMV9yRnJhbWVVUiA9IG1iX3VwcmlnaHQuYXZhaWxhYmxlID8KICAgICAgICAgICAgaW1nLT5tYl9kYXRhW21iX3VwcmlnaHQubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA8IDAgPwogICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdID4+IDE6CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIDogbDFfckZyYW1lVUw7CiAgICAgICAgfQogICAgICB9CgogICAgICBsMF9yRnJhbWUgPSAobDBfckZyYW1lTCA+PSAwICYmIGwwX3JGcmFtZVUgPj0gMCkgPyBpbWluKGwwX3JGcmFtZUwsbDBfckZyYW1lVSk6IGltYXgobDBfckZyYW1lTCxsMF9yRnJhbWVVKTsKICAgICAgbDBfckZyYW1lID0gKGwwX3JGcmFtZSA+PSAwICYmIGwwX3JGcmFtZVVSID49IDApID8gaW1pbihsMF9yRnJhbWUsbDBfckZyYW1lVVIpOiBpbWF4KGwwX3JGcmFtZSxsMF9yRnJhbWVVUik7CgogICAgICBsMV9yRnJhbWUgPSAobDFfckZyYW1lTCA+PSAwICYmIGwxX3JGcmFtZVUgPj0gMCkgPyBpbWluKGwxX3JGcmFtZUwsbDFfckZyYW1lVSk6IGltYXgobDFfckZyYW1lTCxsMV9yRnJhbWVVKTsKICAgICAgbDFfckZyYW1lID0gKGwxX3JGcmFtZSA+PSAwICYmIGwxX3JGcmFtZVVSID49IDApID8gaW1pbihsMV9yRnJhbWUsbDFfckZyYW1lVVIpOiBpbWF4KGwxX3JGcmFtZSxsMV9yRnJhbWVVUik7CgoKICAgICAgaWYgKGwwX3JGcmFtZSA+PTApCiAgICAgICAgU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yIChpbWcsIHBtdmwwLCBsMF9yRnJhbWUsIExJU1RfMCwgZGVjX3BpY3R1cmUtPnJlZl9pZHgsIGRlY19waWN0dXJlLT5tdiwgMCwgMCwgMTYsIDE2KTsKCiAgICAgIGlmIChsMV9yRnJhbWUgPj0wKQogICAgICAgIFNldE1vdGlvblZlY3RvclByZWRpY3RvciAoaW1nLCBwbXZsMSwgbDFfckZyYW1lLCBMSVNUXzEsIGRlY19waWN0dXJlLT5yZWZfaWR4LCBkZWNfcGljdHVyZS0+bXYsIDAsIDAsIDE2LCAxNik7CgoKICAgICAgZm9yIChpPTA7aTw0O2krKykKICAgICAgewogICAgICAgIGlmIChjdXJyTUItPmI4bW9kZVtpXSA9PSAwKQogICAgICAgIHsKICAgICAgICAgIGZvcihqPTIqKGk+PjEpO2o8MiooaT4+MSkrMjtqKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGZvcihrPTIqKGkmMHgwMSk7azwyKihpJjB4MDEpKzI7aysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaW50IGo2ID0gaW1nYmxvY2tfeStqOwogICAgICAgICAgICAgIGo0ID0gaW1nLT5ibG9ja195K2o7CiAgICAgICAgICAgICAgaTQgPSBpbWctPmJsb2NrX3grazsKCgogICAgICAgICAgICAgIGlmIChsMF9yRnJhbWUgPj0gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAgKCFsMF9yRnJhbWUgICYmICgoIW1vdmluZ19ibG9ja1tqNl1baTRdKSAmJiAoIWxpc3RYWzErbGlzdF9vZmZzZXRdWzBdLT5pc19sb25nX3Rlcm0pKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzBdID0gMDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzFdID0gMDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqNF1baTRdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzBdID0gcG12bDBbMF07CiAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMF1bajRdW2k0XVsxXSA9IHBtdmwwWzFdOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF0gPSBsMF9yRnJhbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzBdW2o0XVtpNF1bMF0gPSAwOwogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzFdID0gMDsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bajRdW2k0XSA9IC0xOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGwxX3JGcmFtZSA+PSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICAobDFfckZyYW1lPT0wICYmICgoIW1vdmluZ19ibG9ja1tqNl1baTRdKSYmICghbGlzdFhbMStsaXN0X29mZnNldF1bMF0tPmlzX2xvbmdfdGVybSkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1bMF0gPSAwOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1bMV0gPSAwOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2o0XVtpNF0gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1bMF0gPSBwbXZsMVswXTsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8xXVtqNF1baTRdWzFdID0gcG12bDFbMV07CiAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XSA9IGwxX3JGcmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMV1bajRdW2k0XVswXSA9IDA7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1bMV0gPSAwOwogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVtqNF1baTRdID0gLTE7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAobDBfckZyYW1lIDwwICYmIGwxX3JGcmFtZSA8MCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF0gPSAwOwogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVtqNF1baTRdID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgZm9yIChpPTA7aTw0O2krKykKICAgICAgewogICAgICAgIGlmIChjdXJyTUItPmI4bW9kZVtpXSA9PSAwKQogICAgICAgIHsKICAgICAgICAgIGZvcihqPTIqKGk+PjEpO2o8MiooaT4+MSkrMjtqKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGZvcihrPTIqKGkmMHgwMSk7azwyKihpJjB4MDEpKzI7aysrKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgIGludCBsaXN0X29mZnNldCA9ICgoaW1nLT5NYmFmZkZyYW1lRmxhZykmJihjdXJyTUItPm1iX2ZpZWxkKSk/IChpbWctPmN1cnJlbnRfbWJfbnImMHgwMSkgPyA0IDogMiA6IDA7CiAgICAgICAgICAgICAgaW50IGltZ2Jsb2NrX3kgID0gKChpbWctPk1iYWZmRnJhbWVGbGFnKSYmKGN1cnJNQi0+bWJfZmllbGQpKT8gKGltZy0+Y3VycmVudF9tYl9uciYweDAxKSA/IChpbWctPmJsb2NrX3ktNCk+PjEgOiBpbWctPmJsb2NrX3k+PjEgOiBpbWctPmJsb2NrX3k7CiAgICAgICAgICAgICAgaW50IHJlZkxpc3QgPSBjb19sb2NhdGVkX3JlZl9pZHhbTElTVF8wIF1baW1nYmxvY2tfeStqXVtpbWctPmJsb2NrX3gra109PSAtMSA/IExJU1RfMSA6IExJU1RfMDsKICAgICAgICAgICAgICBpbnQgcmVmX2lkeCA9IGNvX2xvY2F0ZWRfcmVmX2lkeFtyZWZMaXN0XVtpbWdibG9ja195ICsgal1baW1nLT5ibG9ja194ICsga107CiAgICAgICAgICAgICAgaW50IG1hcHBlZF9pZHg9LTEsIGlyZWY7CgogICAgICAgICAgICAgIGlmIChyZWZfaWR4ID09IC0xKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4IFtMSVNUXzBdW2ltZy0+YmxvY2tfeSArIGpdW2ltZy0+YmxvY2tfeCArIGtdID0gMDsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4IFtMSVNUXzFdW2ltZy0+YmxvY2tfeSArIGpdW2ltZy0+YmxvY2tfeCArIGtdID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaXJlZj0wO2lyZWY8aW1pbihpbWctPm51bV9yZWZfaWR4X2wwX2FjdGl2ZSxsaXN0WHNpemVbTElTVF8wICsgbGlzdF9vZmZzZXRdKTtpcmVmKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGludCBjdXJyX21iX2ZpZWxkID0gKChpbWctPk1iYWZmRnJhbWVGbGFnKSYmKGN1cnJNQi0+bWJfZmllbGQpKTsKCiAgICAgICAgICAgICAgICAgIGlmKGltZy0+c3RydWN0dXJlPT0wICYmIGN1cnJfbWJfZmllbGQ9PTApCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBNQiBpcyBhIGZyYW1lIE1CIGFuZCB0aGUgY29sb2NhdGVkIGlzIGZyb20gYSBmaWVsZCBwaWN0dXJlLAogICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhlIGNvX2xvY2F0ZWRfcmVmX2lkIG1heSBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZyb20gdGhlIHdyb25nIHZhbHVlIG9mCiAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVfcG9jIGlmIGl0IHJlZmVyZW5jZXMgaXQncyBjb21wbGVtZW50YXJ5IGZpZWxkLCBzbyB0ZXN0IGJvdGggUE9DIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIGlmKGxpc3RYWzBdW2lyZWZdLT50b3BfcG9jKjIgPT0gY29fbG9jYXRlZF9yZWZfaWRbcmVmTGlzdF1baW1nYmxvY2tfeSArIGpdW2ltZy0+YmxvY2tfeCArIGtdCiAgICAgICAgICAgICAgICAgICAgfHwgbGlzdFhbMF1baXJlZl0tPmJvdHRvbV9wb2MqMiA9PSBjb19sb2NhdGVkX3JlZl9pZFtyZWZMaXN0XVtpbWdibG9ja195ICsgal1baW1nLT5ibG9ja194ICsga10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX2lkeD1pcmVmOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgLy8hIGludmFsaWQgaW5kZXguIERlZmF1bHQgdG8gemVybyBldmVuIHRob3VnaCB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4KICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF9pZHg9SU5WQUxJRElOREVYOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChkZWNfcGljdHVyZS0+cmVmX3BpY19udW1baW1nLT5jdXJyZW50X3NsaWNlX25yXVtMSVNUXzAgKyBsaXN0X29mZnNldF1baXJlZl09PWNvX2xvY2F0ZWRfcmVmX2lkW3JlZkxpc3RdW2ltZ2Jsb2NrX3kgKyBqXVtpbWctPmJsb2NrX3ggKyBrXSkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hcHBlZF9pZHg9aXJlZjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIC8vISBpbnZhbGlkIGluZGV4LiBEZWZhdWx0IHRvIHplcm8gZXZlbiB0aG91Z2ggdGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuCiAgICAgICAgICAgICAgICAgICAgbWFwcGVkX2lkeD1JTlZBTElESU5ERVg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoSU5WQUxJRElOREVYID09IG1hcHBlZF9pZHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGVycm9yKCJ0ZW1wb3JhbCBkaXJlY3QgZXJyb3JcbmNvbG9jYXRlZCBibG9jayBoYXMgcmVmIHRoYXQgaXMgdW5hdmFpbGFibGUiLC0xMTExKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4IFtMSVNUXzBdW2ltZy0+YmxvY2tfeSArIGpdW2ltZy0+YmxvY2tfeCArIGtdID0gbWFwcGVkX2lkeDsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4IFtMSVNUXzFdW2ltZy0+YmxvY2tfeSArIGpdW2ltZy0+YmxvY2tfeCArIGtdID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vICBJZiBtdWx0aXBsZSByZWYuIGZyYW1lcywgcmVhZCByZWZlcmVuY2UgZnJhbWUgZm9yIHRoZSBNQiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBpZihpbWctPm51bV9yZWZfaWR4X2wwX2FjdGl2ZT4xKQogIHsKICAgIGZsYWdfbW9kZSA9ICggaW1nLT5udW1fcmVmX2lkeF9sMF9hY3RpdmUgPT0gMiA/IDEgOiAwKTsKCiAgICBjdXJyU0UudHlwZSA9IFNFX1JFRkZSQU1FOwogICAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW1NFX1JFRkZSQU1FXV0pOwoKICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKSAgIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fdWU7CiAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkUmVmRnJhbWVfQ0FCQUM7CgogICAgZm9yIChqMD0wOyBqMDw0OyBqMCs9c3RlcF92MCkKICAgIHsKICAgICAgZm9yIChpMD0wOyBpMDw0OyBpMCs9c3RlcF9oMCkKICAgICAgewogICAgICAgIGs9MiooajA+PjEpKyhpMD4+MSk7CiAgICAgICAgaWYgKChjdXJyTUItPmI4cGRpcltrXT09MCB8fCBjdXJyTUItPmI4cGRpcltrXT09MikgJiYgY3Vyck1CLT5iOG1vZGVba10hPTApCiAgICAgICAgewogICAgICAgICAgVFJBQ0VfU1RSSU5HKCJyZWZfaWR4X2wwIik7CgogICAgICAgICAgaW1nLT5zdWJibG9ja194ID0gaTA7CiAgICAgICAgICBpbWctPnN1YmJsb2NrX3kgPSBqMDsKCiAgICAgICAgICBpZiAoIUlTX1A4eDggKGN1cnJNQikgfHwgYmZyYW1lIHx8ICghYmZyYW1lICYmICFpbWctPmFsbHJlZnplcm8pKQogICAgICAgICAgewogICAgICAgICAgICBjdXJyU0UuY29udGV4dCA9IEJUeXBlMkN0eFJlZiAoY3Vyck1CLT5iOG1vZGVba10pOwogICAgICAgICAgICBpZiggKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpICYmIGZsYWdfbW9kZSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjdXJyU0UubGVuID0gMTsKICAgICAgICAgICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICAgICAgICAgICAgY3VyclNFLnZhbHVlMSA9IDEgLSBjdXJyU0UudmFsdWUxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgIGN1cnJTRS52YWx1ZTIgPSBMSVNUXzA7CiAgICAgICAgICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50ICgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmZnJhbWUgPSBjdXJyU0UudmFsdWUxOwoKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgcmVmZnJhbWUgPSAwOwogICAgICAgICAgfQoKICAgICAgICAgIGZvciAoaj1pbWctPmJsb2NrX3kgK2owOyBqPGltZy0+YmxvY2tfeSArajArc3RlcF92MDtqKyspCiAgICAgICAgICAgIG1lbXNldCgmZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqXVtpbWctPmJsb2NrX3ggKyBpMF0sIHJlZmZyYW1lLCBzdGVwX2gwICogc2l6ZW9mKGNoYXIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGZvciAoajA9MDsgajA8NDsgajArPXN0ZXBfdjApCiAgICB7CiAgICAgIGZvciAoaTA9MDsgaTA8NDsgaTArPXN0ZXBfaDApCiAgICAgIHsKICAgICAgICBrPTIqKGowPj4xKSsoaTA+PjEpOwogICAgICAgIGlmICgoY3Vyck1CLT5iOHBkaXJba109PTAgfHwgY3Vyck1CLT5iOHBkaXJba109PTIpICYmIGN1cnJNQi0+Yjhtb2RlW2tdIT0wKQogICAgICAgIHsKICAgICAgICAgIGZvciAoaj1pbWctPmJsb2NrX3kgKyBqMDsgaiA8IGltZy0+YmxvY2tfeSArIGowK3N0ZXBfdjA7aisrKQogICAgICAgICAgICBtZW1zZXQoJmRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bal1baW1nLT5ibG9ja194ICsgaTBdLCAwLCBzdGVwX2gwICogc2l6ZW9mKGNoYXIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vICBJZiBiYWNrd2FyZCBtdWx0aXBsZSByZWYuIGZyYW1lcywgcmVhZCBiYWNrd2FyZCByZWZlcmVuY2UgZnJhbWUgZm9yIHRoZSBNQiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBpZihpbWctPm51bV9yZWZfaWR4X2wxX2FjdGl2ZT4xKQogIHsKICAgIGZsYWdfbW9kZSA9ICggaW1nLT5udW1fcmVmX2lkeF9sMV9hY3RpdmUgPT0gMiA/IDEgOiAwKTsKCiAgICBjdXJyU0UudHlwZSA9IFNFX1JFRkZSQU1FOwogICAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW1NFX1JFRkZSQU1FXV0pOwogICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fdWU7CiAgICBlbHNlCiAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZFJlZkZyYW1lX0NBQkFDOwoKICAgIGZvciAoajA9MDsgajA8NDsgajArPXN0ZXBfdjApCiAgICB7CiAgICAgIGZvciAoaTA9MDsgaTA8NDsgaTArPXN0ZXBfaDApCiAgICAgIHsKICAgICAgICBrPTIqKGowPj4xKSsoaTA+PjEpOwogICAgICAgIGlmICgoY3Vyck1CLT5iOHBkaXJba109PTEgfHwgY3Vyck1CLT5iOHBkaXJba109PTIpICYmIGN1cnJNQi0+Yjhtb2RlW2tdIT0wKQogICAgICAgIHsKICAgICAgICAgIFRSQUNFX1NUUklORygicmVmX2lkeF9sMSIpOwoKICAgICAgICAgIGltZy0+c3ViYmxvY2tfeCA9IGkwOwogICAgICAgICAgaW1nLT5zdWJibG9ja195ID0gajA7CgogICAgICAgICAgY3VyclNFLmNvbnRleHQgPSBCVHlwZTJDdHhSZWYgKGN1cnJNQi0+Yjhtb2RlW2tdKTsKICAgICAgICAgIGlmKCAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMgfHwgZFAtPmJpdHN0cmVhbS0+ZWlfZmxhZykgJiYgZmxhZ19tb2RlICkKICAgICAgICAgIHsKICAgICAgICAgICAgY3VyclNFLmxlbiA9IDE7CiAgICAgICAgICAgIHJlYWRTeW50YXhFbGVtZW50X0ZMQygmY3VyclNFLCBkUC0+Yml0c3RyZWFtKTsKICAgICAgICAgICAgY3VyclNFLnZhbHVlMSA9IDEtY3VyclNFLnZhbHVlMTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgY3VyclNFLnZhbHVlMiA9IExJU1RfMTsKICAgICAgICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50ICgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgICB9CiAgICAgICAgICByZWZmcmFtZSA9IGN1cnJTRS52YWx1ZTE7CgogICAgICAgICAgZm9yIChqPWltZy0+YmxvY2tfeSArIGowOyBqPGltZy0+YmxvY2tfeSArIGowK3N0ZXBfdjA7aisrKQogICAgICAgICAgewogICAgICAgICAgICBtZW1zZXQoJmRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bal1baW1nLT5ibG9ja194ICsgaTBdLCByZWZmcmFtZSwgc3RlcF9oMCAqIHNpemVvZihjaGFyKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBmb3IgKGowPTA7IGowPDQ7IGowKz1zdGVwX3YwKQogICAgewogICAgICBmb3IgKGkwPTA7IGkwPDQ7IGkwKz1zdGVwX2gwKQogICAgICB7CiAgICAgICAgaz0yKihqMD4+MSkrKGkwPj4xKTsKICAgICAgICBpZiAoKGN1cnJNQi0+YjhwZGlyW2tdPT0xIHx8IGN1cnJNQi0+YjhwZGlyW2tdPT0yKSAmJiBjdXJyTUItPmI4bW9kZVtrXSE9MCkKICAgICAgICB7CiAgICAgICAgICBmb3IgKGo9aW1nLT5ibG9ja195ICsgajA7IGo8aW1nLT5ibG9ja195ICsgajArc3RlcF92MDtqKyspCiAgICAgICAgICAgIG1lbXNldCgmZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVsgal1baW1nLT5ibG9ja194ICsgaTBdLCAwLCBzdGVwX2gwICogc2l6ZW9mKGNoYXIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vPT09PT0gIFJFQUQgRk9SV0FSRCBNT1RJT04gVkVDVE9SUyA9PT09PQogIGN1cnJTRS50eXBlID0gU0VfTVZEOwogIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtTRV9NVkRdXSk7CgogIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKSBjdXJyU0UubWFwcGluZyA9IGxpbmZvX3NlOwogIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZE1WRF9DQUJBQzsKCiAgZm9yIChqMD0wOyBqMDw0OyBqMCs9c3RlcF92MCkKICAgIGZvciAoaTA9MDsgaTA8NDsgaTArPXN0ZXBfaDApCiAgICB7CiAgICAgIGs9MiooajA+PjEpKyhpMD4+MSk7CgogICAgICBpZiAoKGN1cnJNQi0+YjhwZGlyW2tdPT0wIHx8IGN1cnJNQi0+YjhwZGlyW2tdPT0yKSAmJiAoY3Vyck1CLT5iOG1vZGVba10gIT0wKSkvL2hhcyBmb3J3YXJkIHZlY3RvcgogICAgICB7CiAgICAgICAgbXZfbW9kZSAgPSBjdXJyTUItPmI4bW9kZVtrXTsKICAgICAgICBzdGVwX2ggICA9IEJMT0NLX1NURVAgW212X21vZGVdWzBdOwogICAgICAgIHN0ZXBfdiAgID0gQkxPQ0tfU1RFUCBbbXZfbW9kZV1bMV07CgogICAgICAgIHJlZmZyYW1lID0gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtpbWctPmJsb2NrX3krajBdW2ltZy0+YmxvY2tfeCtpMF07CgogICAgICAgIGZvciAoaj1qMDsgajxqMCtzdGVwX3YwOyBqKz1zdGVwX3YpCiAgICAgICAgewogICAgICAgICAgajQgPSBpbWctPmJsb2NrX3krajsKICAgICAgICAgIGZvciAoaT1pMDsgaTxpMCtzdGVwX2gwOyBpKz1zdGVwX2gpCiAgICAgICAgICB7CiAgICAgICAgICAgIGk0ID0gaW1nLT5ibG9ja194K2k7CgogICAgICAgICAgICAvLyBmaXJzdCBtYWtlIG12LXByZWRpY3Rpb24KICAgICAgICAgICAgU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yIChpbWcsIHBtdiwgcmVmZnJhbWUsIExJU1RfMCwgZGVjX3BpY3R1cmUtPnJlZl9pZHgsIGRlY19waWN0dXJlLT5tdiwgaSwgaiwgNCpzdGVwX2gsIDQqc3RlcF92KTsKCiAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgMjsgaysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgVFJBQ0VfU1RSSU5HKCJtdmRfbDAiKTsKCiAgICAgICAgICAgICAgaW1nLT5zdWJibG9ja194ID0gaTsgLy8gcG9zaXRpb24gdXNlZCBmb3IgY29udGV4dCBkZXRlcm1pbmF0aW9uCiAgICAgICAgICAgICAgaW1nLT5zdWJibG9ja195ID0gajsgLy8gcG9zaXRpb24gdXNlZCBmb3IgY29udGV4dCBkZXRlcm1pbmF0aW9uCiAgICAgICAgICAgICAgY3VyclNFLnZhbHVlMiA9IGs8PDE7IC8vIGlkZW50aWZpZXMgdGhlIGNvbXBvbmVudDsgb25seSB1c2VkIGZvciBjb250ZXh0IGRldGVybWluYXRpb24KICAgICAgICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICAgICAgICAgIGN1cnJfbXZkID0gY3VyclNFLnZhbHVlMTsKCiAgICAgICAgICAgICAgdmVjPWN1cnJfbXZkK3BtdltrXTsgICAgICAgICAgIC8qIGZpbmQgbW90aW9uIHZlY3RvciAqLwoKICAgICAgICAgICAgICBmb3Ioamo9MDtqajxzdGVwX3Y7amorKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IoaWk9MDtpaTxzdGVwX2g7aWkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12IFtMSVNUXzBdW2o0K2pqXVtpNCtpaV1ba10gPSB2ZWM7CiAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bXZkICAgICBbTElTVF8wXVtqICtqal1baSAraWldW2tdID0gY3Vycl9tdmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKGN1cnJNQi0+Yjhtb2RlW2s9MiooajA+PjEpKyhpMD4+MSldPT0wKQogICAgICB7CiAgICAgICAgaWYgKCFpbWctPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZykKICAgICAgICB7CiAgICAgICAgICBpbnQgbGlzdF9vZmZzZXQgPSAoKGltZy0+TWJhZmZGcmFtZUZsYWcpJiYoY3Vyck1CLT5tYl9maWVsZCkpPyAoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpID8gNCA6IDIgOiAwOwogICAgICAgICAgaW50IGltZ2Jsb2NrX3kgID0gKChpbWctPk1iYWZmRnJhbWVGbGFnKSYmKGN1cnJNQi0+bWJfZmllbGQpKT8gKGltZy0+Y3VycmVudF9tYl9uciYweDAxKSA/IChpbWctPmJsb2NrX3ktNCk+PjE6aW1nLT5ibG9ja195Pj4xIDogaW1nLT5ibG9ja195OwoKICAgICAgICAgIGludCByZWZMaXN0ID0gKGNvX2xvY2F0ZWRfcmVmX2lkeFtMSVNUXzAgXVtpbWdibG9ja195K2owXVtpbWctPmJsb2NrX3graTBdPT0gLTEgPyBMSVNUXzEgOiBMSVNUXzApOwogICAgICAgICAgaW50IHJlZl9pZHggPSAgY29fbG9jYXRlZF9yZWZfaWR4W3JlZkxpc3RdW2ltZ2Jsb2NrX3krajBdW2ltZy0+YmxvY2tfeCtpMF07CgogICAgICAgICAgaWYgKHJlZl9pZHg9PS0xKQogICAgICAgICAgewogICAgICAgICAgICBmb3IgKGo0PWltZy0+YmxvY2tfeStqMDsgajQ8aW1nLT5ibG9ja195K2owK3N0ZXBfdjA7IGo0KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmb3IgKGk0PWltZy0+YmxvY2tfeCtpMDsgaTQ8aW1nLT5ibG9ja194K2kwK3N0ZXBfaDA7IGk0KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHggW0xJU1RfMV1bajRdW2k0XT0wOwogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHggW0xJU1RfMF1bajRdW2k0XT0wOwoKICAgICAgICAgICAgICAgIGZvciAoaWk9MDsgaWkgPCAyOyBpaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgW0xJU1RfMF1bajRdW2k0XVtpaV09MDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12IFtMSVNUXzFdW2o0XVtpNF1baWldPTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGludCBtYXBwZWRfaWR4PS0xLCBpcmVmOwogICAgICAgICAgICBpbnQgajY7CgogICAgICAgICAgICBmb3IgKGlyZWYgPSAwOyBpcmVmIDwgaW1pbihpbWctPm51bV9yZWZfaWR4X2wwX2FjdGl2ZSwgbGlzdFhzaXplW0xJU1RfMCArIGxpc3Rfb2Zmc2V0XSk7IGlyZWYrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIGludCBjdXJyX21iX2ZpZWxkID0gKChpbWctPk1iYWZmRnJhbWVGbGFnKSYmKGN1cnJNQi0+bWJfZmllbGQpKTsKCiAgICAgICAgICAgICAgaWYoaW1nLT5zdHJ1Y3R1cmU9PTAgJiYgY3Vycl9tYl9maWVsZD09MCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBNQiBpcyBhIGZyYW1lIE1CIGFuZCB0aGUgY29sb2NhdGVkIGlzIGZyb20gYSBmaWVsZCBwaWN0dXJlLAogICAgICAgICAgICAgICAgLy8gdGhlbiB0aGUgY29fbG9jYXRlZF9yZWZfaWQgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSB0aGUgd3JvbmcgdmFsdWUgb2YKICAgICAgICAgICAgICAgIC8vIGZyYW1lX3BvYyBpZiBpdCByZWZlcmVuY2VzIGl0J3MgY29tcGxlbWVudGFyeSBmaWVsZCwgc28gdGVzdCBib3RoIFBPQyB2YWx1ZXMKICAgICAgICAgICAgICAgIGlmKGxpc3RYWzBdW2lyZWZdLT50b3BfcG9jICogMiAgICA9PSBjb19sb2NhdGVkX3JlZl9pZFtyZWZMaXN0XVtpbWdibG9ja195ICsgajBdW2ltZy0+YmxvY2tfeCArIGkwXQogICAgICAgICAgICAgICAgfHwgbGlzdFhbMF1baXJlZl0tPmJvdHRvbV9wb2MgKiAyID09IGNvX2xvY2F0ZWRfcmVmX2lkW3JlZkxpc3RdW2ltZ2Jsb2NrX3kgKyBqMF1baW1nLT5ibG9ja194ICsgaTBdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBtYXBwZWRfaWR4PWlyZWY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSAvLyEgaW52YWxpZCBpbmRleC4gRGVmYXVsdCB0byB6ZXJvIGV2ZW4gdGhvdWdoIHRoaXMgY2FzZSBzaG91bGQgbm90IGhhcHBlbgogICAgICAgICAgICAgICAgICBtYXBwZWRfaWR4PUlOVkFMSURJTkRFWDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoZGVjX3BpY3R1cmUtPnJlZl9waWNfbnVtW2ltZy0+Y3VycmVudF9zbGljZV9ucl1bTElTVF8wICsgbGlzdF9vZmZzZXRdW2lyZWZdPT1jb19sb2NhdGVkX3JlZl9pZFtyZWZMaXN0XVtpbWdibG9ja195K2owXVtpbWctPmJsb2NrX3graTBdKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1hcHBlZF9pZHg9aXJlZjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIC8vISBpbnZhbGlkIGluZGV4LiBEZWZhdWx0IHRvIHplcm8gZXZlbiB0aG91Z2ggdGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuCiAgICAgICAgICAgICAgICBtYXBwZWRfaWR4PUlOVkFMSURJTkRFWDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKElOVkFMSURJTkRFWCA9PSBtYXBwZWRfaWR4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgZXJyb3IoInRlbXBvcmFsIGRpcmVjdCBlcnJvclxuY29sb2NhdGVkIGJsb2NrIGhhcyByZWYgdGhhdCBpcyB1bmF2YWlsYWJsZSIsLTExMTEpOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgZm9yIChqPWowOyBqPGowK3N0ZXBfdjA7IGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIGo0ID0gaW1nLT5ibG9ja195K2o7CiAgICAgICAgICAgICAgajYgPSBpbWdibG9ja195ICsgajsKCiAgICAgICAgICAgICAgZm9yIChpND1pbWctPmJsb2NrX3graTA7IGk0PGltZy0+YmxvY2tfeCtpMCtzdGVwX2gwOyBpNCsrKQogICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBtdl9zY2FsZSA9IGltZy0+bXZzY2FsZVtMSVNUXzAgKyBsaXN0X29mZnNldF1bbWFwcGVkX2lkeF07CgogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHggW0xJU1RfMF1bajRdW2k0XSA9IG1hcHBlZF9pZHg7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeCBbTElTVF8xXVtqNF1baTRdID0gMDsKCgogICAgICAgICAgICAgICAgZm9yIChpaT0wOyBpaSA8IDI7IGlpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGlmIChtdl9zY2FsZSA9PSA5OTk5IHx8IGxpc3RYW0xJU1RfMCtsaXN0X29mZnNldF1bbWFwcGVkX2lkeF0tPmlzX2xvbmdfdGVybSkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMF1bajRdW2k0XVtpaV0gPSBjb19sb2NhdGVkX212W3JlZkxpc3RdW2o2XVtpNF1baWldOwogICAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMV1bajRdW2k0XVtpaV0gPSAwOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMF1bajRdW2k0XVtpaV0gPSAobXZfc2NhbGUgKiBjb19sb2NhdGVkX212W3JlZkxpc3RdW2o2XVtpNF1baWldICsgMTI4ICkgPj4gODsKICAgICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1baWldID0gZGVjX3BpY3R1cmUtPm12W0xJU1RfMF1bajRdW2k0XVtpaV0gLSBjb19sb2NhdGVkX212W3JlZkxpc3RdW2o2XVtpNF1baWldOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAvLz09PT09ICBSRUFEIEJBQ0tXQVJEIE1PVElPTiBWRUNUT1JTID09PT09CiAgY3VyclNFLnR5cGUgPSBTRV9NVkQ7CiAgZFAgICAgICAgICAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW1NFX01WRF1dKTsKCiAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fc2U7CiAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRNVkRfQ0FCQUM7CgogIGZvciAoajA9MDsgajA8NDsgajArPXN0ZXBfdjApCiAgewogICAgZm9yIChpMD0wOyBpMDw0OyBpMCs9c3RlcF9oMCkKICAgIHsKICAgICAgaz0yKihqMD4+MSkrKGkwPj4xKTsKICAgICAgaWYgKChjdXJyTUItPmI4cGRpcltrXT09MSB8fCBjdXJyTUItPmI4cGRpcltrXT09MikgJiYgKGN1cnJNQi0+Yjhtb2RlW2tdIT0wKSkvL2hhcyBiYWNrd2FyZCB2ZWN0b3IKICAgICAgewogICAgICAgIG12X21vZGUgID0gY3Vyck1CLT5iOG1vZGVba107CiAgICAgICAgc3RlcF9oICAgPSBCTE9DS19TVEVQIFttdl9tb2RlXVswXTsKICAgICAgICBzdGVwX3YgICA9IEJMT0NLX1NURVAgW212X21vZGVdWzFdOwoKICAgICAgICByZWZmcmFtZSA9IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1baW1nLT5ibG9ja195K2owXVtpbWctPmJsb2NrX3graTBdOwoKICAgICAgICBmb3IgKGo9ajA7IGo8ajArc3RlcF92MDsgais9c3RlcF92KQogICAgICAgIHsKICAgICAgICAgIGo0ID0gaW1nLT5ibG9ja195K2o7CiAgICAgICAgICBmb3IgKGk9aTA7IGk8aTArc3RlcF9oMDsgaSs9c3RlcF9oKQogICAgICAgICAgewogICAgICAgICAgICBpNCA9IGltZy0+YmxvY2tfeCtpOwoKICAgICAgICAgICAgLy8gZmlyc3QgbWFrZSBtdi1wcmVkaWN0aW9uCiAgICAgICAgICAgIFNldE1vdGlvblZlY3RvclByZWRpY3RvciAoaW1nLCBwbXYsIHJlZmZyYW1lLCBMSVNUXzEsIGRlY19waWN0dXJlLT5yZWZfaWR4LCBkZWNfcGljdHVyZS0+bXYsIGksIGosIDQqc3RlcF9oLCA0KnN0ZXBfdik7CgogICAgICAgICAgICBmb3IgKGs9MDsgayA8IDI7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIFRSQUNFX1NUUklORygibXZkX2wxIik7CgogICAgICAgICAgICAgIGltZy0+c3ViYmxvY2tfeCA9IGk7IC8vIHBvc2l0aW9uIHVzZWQgZm9yIGNvbnRleHQgZGV0ZXJtaW5hdGlvbgogICAgICAgICAgICAgIGltZy0+c3ViYmxvY2tfeSA9IGo7IC8vIHBvc2l0aW9uIHVzZWQgZm9yIGNvbnRleHQgZGV0ZXJtaW5hdGlvbgogICAgICAgICAgICAgIGN1cnJTRS52YWx1ZTIgICA9IChrPDwxKSArMTsgLy8gaWRlbnRpZmllcyB0aGUgY29tcG9uZW50OyBvbmx5IHVzZWQgZm9yIGNvbnRleHQgZGV0ZXJtaW5hdGlvbgogICAgICAgICAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgICAgICAgY3Vycl9tdmQgPSBjdXJyU0UudmFsdWUxOwoKICAgICAgICAgICAgICB2ZWM9Y3Vycl9tdmQrcG12W2tdOyAgICAgICAgICAgLyogZmluZCBtb3Rpb24gdmVjdG9yICovCgogICAgICAgICAgICAgIGZvcihqaj0wO2pqPHN0ZXBfdjtqaisrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcihpaT0wO2lpPHN0ZXBfaDtpaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0K2pqXVtpNCtpaV1ba10gPSB2ZWM7CiAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bXZkICAgICAgW0xJU1RfMV1baitqal0gW2kraWldIFtrXSA9IGN1cnJfbXZkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvLyByZWNvcmQgcmVmZXJlbmNlIHBpY3R1cmUgSWRzIGZvciBkZWJsb2NraW5nIGRlY2lzaW9ucwoKCiAgZm9yKGo0PWltZy0+YmxvY2tfeTtqNDwoaW1nLT5ibG9ja195KzQpO2o0KyspCiAgewogICAgZm9yKGk0PWltZy0+YmxvY2tfeDtpNDwoaW1nLT5ibG9ja194KzQpO2k0KyspCiAgICB7CiAgICAgIGlmIChkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF0+PTApCiAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfcGljX2lkW0xJU1RfMF1bajRdW2k0XSA9IGRlY19waWN0dXJlLT5yZWZfcGljX251bVtpbWctPmN1cnJlbnRfc2xpY2VfbnJdW0xJU1RfMCArIGxpc3Rfb2Zmc2V0XVsoc2hvcnQpZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqNF1baTRdXTsKICAgICAgZWxzZQogICAgICAgICBkZWNfcGljdHVyZS0+cmVmX3BpY19pZFtMSVNUXzBdW2o0XVtpNF0gPSBJTlQ2NF9NSU47CiAgICAgIGlmIChkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2o0XVtpNF0+PTApCiAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfcGljX2lkW0xJU1RfMV1bajRdW2k0XSA9IGRlY19waWN0dXJlLT5yZWZfcGljX251bVtpbWctPmN1cnJlbnRfc2xpY2VfbnJdW0xJU1RfMSArIGxpc3Rfb2Zmc2V0XVsoc2hvcnQpZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVtqNF1baTRdXTsKICAgICAgZWxzZQogICAgICAgICBkZWNfcGljdHVyZS0+cmVmX3BpY19pZFtMSVNUXzFdW2o0XVtpNF0gPSBJTlQ2NF9NSU47CiAgICB9CiAgfQp9CgoKCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBHZXQgdGhlIFByZWRpY3Rpb24gZnJvbSB0aGUgTmVpZ2hib3JpbmcgQmxvY2tzIGZvciBOdW1iZXIgb2YgTm9uemVybyBDb2VmZmljaWVudHMKICoKICogICAgTHVtYSBCbG9ja3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KaW50IHByZWRpY3Rfbm56KHN0cnVjdCBpbWdfcGFyICppbWcsIGludCBpLGludCBqKQp7CiAgUGl4ZWxQb3MgcGl4OwoKICBpbnQgcHJlZF9ubnogPSAwOwogIGludCBjbnQgICAgICA9IDA7CiAgaW50IG1iX25yICAgID0gaW1nLT5jdXJyZW50X21iX25yOwogIE1hY3JvYmxvY2sgKmN1cnJNQiA9ICYoaW1nLT5tYl9kYXRhW21iX25yXSk7CgogIC8vIGxlZnQgYmxvY2sKICBnZXRMdW1hNHg0TmVpZ2hib3VyKG1iX25yLCAoaTw8MikgLSAxLCAoajw8MiksICZwaXgpOwoKICBpZiAoSVNfSU5UUkEoY3Vyck1CKSAmJiBwaXguYXZhaWxhYmxlICYmIGFjdGl2ZV9wcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyAmJiAoaW1nLT5jdXJyZW50U2xpY2UtPmRwX21vZGU9PVBBUl9EUF8zKSkKICB7CiAgICBwaXguYXZhaWxhYmxlICY9IGltZy0+aW50cmFfYmxvY2tbcGl4Lm1iX2FkZHJdOwogICAgaWYgKCFwaXguYXZhaWxhYmxlKQogICAgICBjbnQrKzsKICB9CgogIGlmIChwaXguYXZhaWxhYmxlKQogIHsKICAgIHByZWRfbm56ID0gaW1nLT5uel9jb2VmZiBbcGl4Lm1iX2FkZHIgXVtwaXgueF1bcGl4LnldOwogICAgY250Kys7CiAgfQoKICAvLyB0b3AgYmxvY2sKICBnZXRMdW1hNHg0TmVpZ2hib3VyKG1iX25yLCAoaTw8MiksIChqPDwyKSAtIDEsICZwaXgpOwoKICBpZiAoSVNfSU5UUkEoY3Vyck1CKSAmJiBwaXguYXZhaWxhYmxlICYmIGFjdGl2ZV9wcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyAmJiAoaW1nLT5jdXJyZW50U2xpY2UtPmRwX21vZGU9PVBBUl9EUF8zKSkKICB7CiAgICBwaXguYXZhaWxhYmxlICY9IGltZy0+aW50cmFfYmxvY2tbcGl4Lm1iX2FkZHJdOwogICAgaWYgKCFwaXguYXZhaWxhYmxlKQogICAgICBjbnQrKzsKICB9CgogIGlmIChwaXguYXZhaWxhYmxlKQogIHsKICAgIHByZWRfbm56ICs9IGltZy0+bnpfY29lZmYgW3BpeC5tYl9hZGRyIF1bcGl4LnhdW3BpeC55XTsKICAgIGNudCsrOwogIH0KCiAgaWYgKGNudD09MikKICB7CiAgICBwcmVkX25ueisrOwogICAgcHJlZF9ubno+Pj0xOwogIH0KCiAgcmV0dXJuIHByZWRfbm56Owp9CgoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogXGJyaWVmCiAqICAgIEdldCB0aGUgUHJlZGljdGlvbiBmcm9tIHRoZSBOZWlnaGJvcmluZyBCbG9ja3MgZm9yIE51bWJlciBvZiBOb256ZXJvIENvZWZmaWNpZW50cwogKgogKiAgICBDaHJvbWEgQmxvY2tzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCmludCBwcmVkaWN0X25uel9jaHJvbWEoc3RydWN0IGltZ19wYXIgKmltZywgaW50IGksaW50IGopCnsKICBQaXhlbFBvcyBwaXg7CgogIGludCBwcmVkX25ueiA9IDA7CiAgaW50IGNudCAgICAgID0wOwogIGludCBtYl9uciAgICA9IGltZy0+Y3VycmVudF9tYl9ucjsKICBzdGF0aWMgY29uc3QgaW50IGpfb2ZmX3RhYiBbMTJdID0gezAsMCwwLDAsNCw0LDQsNCw4LDgsOCw4fTsKICBpbnQgal9vZmYgPSBqX29mZl90YWJbal07CiAgTWFjcm9ibG9jayAqY3Vyck1CID0gJihpbWctPm1iX2RhdGFbbWJfbnJdKTsKCiAgaWYgKGRlY19waWN0dXJlLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBZVVY0NDQpCiAgewogICAgLy9ZVVY0MjAgYW5kIFlVVjQyMgogICAgLy8gbGVmdCBibG9jawogICAgZ2V0Q2hyb21hNHg0TmVpZ2hib3VyKG1iX25yLCAoKGkmMHgwMSk8PDIpIC0gMSwgKChqLTQpPDwyKSwgJnBpeCk7CgogICAgaWYgKElTX0lOVFJBKGN1cnJNQikgJiYgcGl4LmF2YWlsYWJsZSAmJiBhY3RpdmVfcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgJiYgKGltZy0+Y3VycmVudFNsaWNlLT5kcF9tb2RlPT1QQVJfRFBfMykpCiAgICB7CiAgICAgIHBpeC5hdmFpbGFibGUgJj0gaW1nLT5pbnRyYV9ibG9ja1twaXgubWJfYWRkcl07CiAgICAgIGlmICghcGl4LmF2YWlsYWJsZSkKICAgICAgICBjbnQrKzsKICAgIH0KCiAgICBpZiAocGl4LmF2YWlsYWJsZSkKICAgIHsKICAgICAgcHJlZF9ubnogPSBpbWctPm56X2NvZWZmIFtwaXgubWJfYWRkciBdWzIgKiAoaT4+MSkgKyBwaXgueF1bNCArIHBpeC55XTsKICAgICAgY250Kys7CiAgICB9CgogICAgLy8gdG9wIGJsb2NrCiAgICBnZXRDaHJvbWE0eDROZWlnaGJvdXIobWJfbnIsICgoaSYweDAxKTw8MiksICgoai00KTw8MikgLSAxLCAmcGl4KTsKCiAgICBpZiAoSVNfSU5UUkEoY3Vyck1CKSAmJiBwaXguYXZhaWxhYmxlICYmIGFjdGl2ZV9wcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyAmJiAoaW1nLT5jdXJyZW50U2xpY2UtPmRwX21vZGU9PVBBUl9EUF8zKSkKICAgIHsKICAgICAgcGl4LmF2YWlsYWJsZSAmPSBpbWctPmludHJhX2Jsb2NrW3BpeC5tYl9hZGRyXTsKICAgICAgaWYgKCFwaXguYXZhaWxhYmxlKQogICAgICAgIGNudCsrOwogICAgfQoKICAgIGlmIChwaXguYXZhaWxhYmxlKQogICAgewogICAgICBwcmVkX25ueiArPSBpbWctPm56X2NvZWZmIFtwaXgubWJfYWRkciBdWzIgKiAoaT4+MSkgKyBwaXgueF1bNCArIHBpeC55XTsKICAgICAgY250Kys7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvL1lVVjQ0NAogICAgLy8gbGVmdCBibG9jawogICAgZ2V0Q2hyb21hNHg0TmVpZ2hib3VyKG1iX25yLCAoaTw8MikgLSAxLCAoKGotal9vZmYpPDwyKSwgJnBpeCk7CgogICAgaWYgKElTX0lOVFJBKGN1cnJNQikgJiYgcGl4LmF2YWlsYWJsZSAmJiBhY3RpdmVfcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgJiYgKGltZy0+Y3VycmVudFNsaWNlLT5kcF9tb2RlPT1QQVJfRFBfMykpCiAgICB7CiAgICAgIHBpeC5hdmFpbGFibGUgJj0gaW1nLT5pbnRyYV9ibG9ja1twaXgubWJfYWRkcl07CiAgICAgIGNudC0tOwogICAgfQoKICAgIGlmIChwaXguYXZhaWxhYmxlKQogICAgewogICAgICBwcmVkX25ueiA9IGltZy0+bnpfY29lZmYgW3BpeC5tYl9hZGRyIF1bcGl4LnhdW2pfb2ZmICsgcGl4LnldOwogICAgICBjbnQrKzsKICAgIH0KCiAgICAvLyB0b3AgYmxvY2sKICAgIGdldENocm9tYTR4NE5laWdoYm91cihtYl9uciwgKGk8PDIpLCAoKGotal9vZmYpPDwyKSAtMSwgJnBpeCk7CgogICAgaWYgKElTX0lOVFJBKGN1cnJNQikgJiYgcGl4LmF2YWlsYWJsZSAmJiBhY3RpdmVfcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgJiYgKGltZy0+Y3VycmVudFNsaWNlLT5kcF9tb2RlPT1QQVJfRFBfMykpCiAgICB7CiAgICAgIHBpeC5hdmFpbGFibGUgJj0gaW1nLT5pbnRyYV9ibG9ja1twaXgubWJfYWRkcl07CiAgICAgIGNudC0tOwogICAgfQoKICAgIGlmIChwaXguYXZhaWxhYmxlKQogICAgewogICAgICBwcmVkX25ueiArPSBpbWctPm56X2NvZWZmIFtwaXgubWJfYWRkciBdW3BpeC54XVtqX29mZiArIHBpeC55XTsKICAgICAgY250Kys7CiAgICB9CiAgfQoKICBpZiAoY250PT0yKQogIHsKICAgIHByZWRfbm56Kys7CiAgICBwcmVkX25uej4+PTE7CiAgfQoKICByZXR1cm4gcHJlZF9ubno7Cn0KCgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgUmVhZHMgY29lZmYgb2YgYW4gNHg0IGJsb2NrIChDQVZMQykKICoKICogXGF1dGhvcgogKiAgICBLYXJsIExpbGxldm9sZCA8a2FybGxAcmVhbC5jb20+CiAqICAgIGNvbnRyaWJ1dGlvbnMgYnkgSmFtZXMgQXUgPGphbWVzQHVidmlkZW8uY29tPgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKCnZvaWQgcmVhZENvZWZmNHg0X0NBVkxDIChzdHJ1Y3QgaW1nX3BhciAqaW1nLHN0cnVjdCBpbnBfcGFyICppbnAsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGosIGludCBsZXZhcnJbMTZdLCBpbnQgcnVuYXJyWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1iZXJfY29lZmZpY2llbnRzKQp7CiAgaW50IG1iX25yID0gaW1nLT5jdXJyZW50X21iX25yOwogIE1hY3JvYmxvY2sgKmN1cnJNQiA9ICZpbWctPm1iX2RhdGFbbWJfbnJdOwogIFN5bnRheEVsZW1lbnQgY3VyclNFOwogIFNsaWNlICpjdXJyU2xpY2UgPSBpbWctPmN1cnJlbnRTbGljZTsKICBEYXRhUGFydGl0aW9uICpkUDsKICBpbnQgKnBhcnRNYXAgPSBhc3NpZ25TRTJwYXJ0aXRpb25bY3VyclNsaWNlLT5kcF9tb2RlXTsKCgogIGludCBrLCBjb2RlLCB2bGNudW07CiAgaW50IG51bWNvZWZmLCBudW10cmFpbGluZ29uZXMsIG51bWNvZWZmX3ZsYzsKICBpbnQgbGV2ZWxfdHdvX29yX2hpZ2hlcjsKICBpbnQgbnVtb25lcywgdG90emVyb3MsIGxldmVsLCBjZGM9MCwgY2FjPTA7CiAgaW50IHplcm9zbGVmdCwgbnRyLCBkcHR5cGUgPSAwOwogIGludCBtYXhfY29lZmZfbnVtID0gMCwgbm56OwogIHNpZ25lZCBjaGFyIHR5cGVbMTVdOwogIHN0YXRpYyBpbnQgaW5jVmxjW10gPSB7MCwzLDYsMTIsMjQsNDgsMzI3Njh9OyAgICAvLyBtYXhpbXVtIHZsYyA9IDYKCiAgbnVtY29lZmYgPSAwOwoKICBzd2l0Y2ggKGJsb2NrX3R5cGUpCiAgewogIGNhc2UgTFVNQToKICAgIG1heF9jb2VmZl9udW0gPSAxNjsKI2lmIFRSQUNFCiAgICBzcHJpbnRmKHR5cGUsICIlcyIsICJMdW1hIik7CiNlbmRpZgogICAgZHB0eXBlID0gSVNfSU5UUkEgKGN1cnJNQikgPyBTRV9MVU1fQUNfSU5UUkEgOiBTRV9MVU1fQUNfSU5URVI7CiAgICBicmVhazsKICBjYXNlIExVTUFfSU5UUkExNngxNkRDOgogICAgbWF4X2NvZWZmX251bSA9IDE2OwojaWYgVFJBQ0UKICAgIHNwcmludGYodHlwZSwgIiVzIiwgIkx1bTE2REMiKTsKI2VuZGlmCiAgICBkcHR5cGUgPSBTRV9MVU1fRENfSU5UUkE7CiAgICBicmVhazsKICBjYXNlIExVTUFfSU5UUkExNngxNkFDOgogICAgbWF4X2NvZWZmX251bSA9IDE1OwojaWYgVFJBQ0UKICAgIHNwcmludGYodHlwZSwgIiVzIiwgIkx1bTE2QUMiKTsKI2VuZGlmCiAgICBkcHR5cGUgPSBTRV9MVU1fQUNfSU5UUkE7CiAgICBicmVhazsKCiAgY2FzZSBDSFJPTUFfREM6CiAgICBtYXhfY29lZmZfbnVtID0gaW1nLT5udW1fY2RjX2NvZWZmOwogICAgY2RjID0gMTsKI2lmIFRSQUNFCiAgICBzcHJpbnRmKHR5cGUsICIlcyIsICJDaHJEQyIpOwojZW5kaWYKICAgIGRwdHlwZSA9IElTX0lOVFJBIChjdXJyTUIpID8gU0VfQ0hSX0RDX0lOVFJBIDogU0VfQ0hSX0RDX0lOVEVSOwogICAgYnJlYWs7CiAgY2FzZSBDSFJPTUFfQUM6CiAgICBtYXhfY29lZmZfbnVtID0gMTU7CiAgICBjYWMgPSAxOwojaWYgVFJBQ0UKICAgIHNwcmludGYodHlwZSwgIiVzIiwgIkNockFDIik7CiNlbmRpZgogICAgZHB0eXBlID0gSVNfSU5UUkEgKGN1cnJNQikgPyBTRV9DSFJfQUNfSU5UUkEgOiBTRV9DSFJfQUNfSU5URVI7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgZXJyb3IgKCJyZWFkQ29lZmY0eDRfQ0FWTEM6IGludmFsaWQgYmxvY2sgdHlwZSIsIDYwMCk7CiAgICBicmVhazsKICB9CgogIGN1cnJTRS50eXBlID0gZHB0eXBlOwogIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtkcHR5cGVdXSk7CgogIGltZy0+bnpfY29lZmZbaW1nLT5jdXJyZW50X21iX25yXVtpXVtqXSA9IDA7CgoKICBpZiAoIWNkYykKICB7CiAgICAvLyBsdW1hIG9yIGNocm9tYSBBQwogICAgaWYgKCFjYWMpCiAgICB7CiAgICAgIG5ueiA9IHByZWRpY3Rfbm56KGltZywgaSwgaik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIG5ueiA9IHByZWRpY3Rfbm56X2Nocm9tYShpbWcsIGksIGopOwogICAgfQoKICAgIGlmIChubnogPCAyKQogICAgewogICAgICBudW1jb2VmZl92bGMgPSAwOwogICAgfQogICAgZWxzZSBpZiAobm56IDwgNCkKICAgIHsKICAgICAgbnVtY29lZmZfdmxjID0gMTsKICAgIH0KICAgIGVsc2UgaWYgKG5ueiA8IDgpCiAgICB7CiAgICAgIG51bWNvZWZmX3ZsYyA9IDI7CiAgICB9CiAgICBlbHNlIC8vCiAgICB7CiAgICAgIG51bWNvZWZmX3ZsYyA9IDM7CiAgICB9CgogICAgY3VyclNFLnZhbHVlMSA9IG51bWNvZWZmX3ZsYzsKCiAgICByZWFkU3ludGF4RWxlbWVudF9OdW1Db2VmZlRyYWlsaW5nT25lcygmY3VyclNFLCBkUCwgdHlwZSk7CgogICAgbnVtY29lZmYgPSAgY3VyclNFLnZhbHVlMTsKICAgIG51bXRyYWlsaW5nb25lcyA9ICBjdXJyU0UudmFsdWUyOwoKICAgIGltZy0+bnpfY29lZmZbaW1nLT5jdXJyZW50X21iX25yXVtpXVtqXSA9IG51bWNvZWZmOwogIH0KICBlbHNlCiAgewogICAgLy8gY2hyb21hIERDCiAgICByZWFkU3ludGF4RWxlbWVudF9OdW1Db2VmZlRyYWlsaW5nT25lc0Nocm9tYURDKCZjdXJyU0UsIGRQKTsKCiAgICBudW1jb2VmZiA9ICBjdXJyU0UudmFsdWUxOwogICAgbnVtdHJhaWxpbmdvbmVzID0gIGN1cnJTRS52YWx1ZTI7CiAgfQoKCiAgZm9yIChrID0gMDsgayA8IG1heF9jb2VmZl9udW07IGsrKykKICB7CiAgICBsZXZhcnJba10gPSAwOwogICAgcnVuYXJyW2tdID0gMDsKICB9CgogIG51bW9uZXMgPSBudW10cmFpbGluZ29uZXM7CiAgKm51bWJlcl9jb2VmZmljaWVudHMgPSBudW1jb2VmZjsKCiAgaWYgKG51bWNvZWZmKQogIHsKICAgIGlmIChudW10cmFpbGluZ29uZXMpCiAgICB7CgogICAgICBjdXJyU0UubGVuID0gbnVtdHJhaWxpbmdvbmVzOwoKI2lmIFRSQUNFCiAgICAgIHNucHJpbnRmKGN1cnJTRS50cmFjZXN0cmluZywKICAgICAgICBUUkFDRVNUUklOR19TSVpFLCAiJXMgdHJhaWxpbmcgb25lcyBzaWduICglZCwlZCkiLCB0eXBlLCBpLCBqKTsKI2VuZGlmCgogICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMgKCZjdXJyU0UsIGRQLT5iaXRzdHJlYW0pOwoKICAgICAgY29kZSA9IGN1cnJTRS5pbmY7CiAgICAgIG50ciA9IG51bXRyYWlsaW5nb25lczsKICAgICAgZm9yIChrID0gbnVtY29lZmYtMTsgayA+IG51bWNvZWZmLTEtbnVtdHJhaWxpbmdvbmVzOyBrLS0pCiAgICAgIHsKICAgICAgICBudHIgLS07CiAgICAgICAgbGV2YXJyW2tdID0gKGNvZGU+Pm50cikmMSA/IC0xIDogMTsKICAgICAgfQogICAgfQoKICAgIC8vIGRlY29kZSBsZXZlbHMKICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAobnVtY29lZmYgPiAzICYmIG51bXRyYWlsaW5nb25lcyA9PSAzKT8gMCA6IDE7CiAgICB2bGNudW0gPSAobnVtY29lZmYgPiAxMCAmJiBudW10cmFpbGluZ29uZXMgPCAzKSA/IDEgOiAwOwoKICAgIGZvciAoayA9IG51bWNvZWZmIC0gMSAtIG51bXRyYWlsaW5nb25lczsgayA+PSAwOyBrLS0pCiAgICB7CgojaWYgVFJBQ0UKICAgICAgc25wcmludGYoY3VyclNFLnRyYWNlc3RyaW5nLAogICAgICAgIFRSQUNFU1RSSU5HX1NJWkUsICIlcyBsZXYgKCVkLCVkKSBrPSVkIHZsYz0lZCAiLCB0eXBlLAogICAgICAgICAgaSwgaiwgaywgdmxjbnVtKTsKI2VuZGlmCgogICAgICBpZiAodmxjbnVtID09IDApCiAgICAgICAgICByZWFkU3ludGF4RWxlbWVudF9MZXZlbF9WTEMwKCZjdXJyU0UsIGRQKTsKICAgICAgZWxzZQogICAgICAgICAgcmVhZFN5bnRheEVsZW1lbnRfTGV2ZWxfVkxDTigmY3VyclNFLCB2bGNudW0sIGRQKTsKCiAgICAgIGlmIChsZXZlbF90d29fb3JfaGlnaGVyKQogICAgICB7CiAgICAgICAgY3VyclNFLmluZiArPSAoY3VyclNFLmluZiA+IDApID8gMSA6IC0xOwogICAgICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAwOwogICAgICB9CgogICAgICBsZXZlbCA9IGxldmFycltrXSA9IGN1cnJTRS5pbmY7CiAgICAgIGlmIChpYWJzKGxldmVsKSA9PSAxKQogICAgICAgIG51bW9uZXMgKys7CgogICAgICAvLyB1cGRhdGUgVkxDIHRhYmxlCiAgICAgIGlmIChpYWJzKGxldmVsKT5pbmNWbGNbdmxjbnVtXSkKICAgICAgICB2bGNudW0rKzsKCiAgICAgIGlmIChrID09IG51bWNvZWZmIC0gMSAtIG51bXRyYWlsaW5nb25lcyAmJiBpYWJzKGxldmVsKT4zKQogICAgICAgIHZsY251bSA9IDI7CgogICAgfQoKICAgIGlmIChudW1jb2VmZiA8IG1heF9jb2VmZl9udW0pCiAgICB7CiAgICAgIC8vIGRlY29kZSB0b3RhbCBydW4KICAgICAgdmxjbnVtID0gbnVtY29lZmYtMTsKICAgICAgY3VyclNFLnZhbHVlMSA9IHZsY251bTsKCiNpZiBUUkFDRQogICAgICBzbnByaW50ZihjdXJyU0UudHJhY2VzdHJpbmcsCiAgICAgICAgVFJBQ0VTVFJJTkdfU0laRSwgIiVzIHRvdGFscnVuICglZCwlZCkgdmxjPSVkICIsIHR5cGUsIGksaiwgdmxjbnVtKTsKI2VuZGlmCiAgICAgIGlmIChjZGMpCiAgICAgICAgcmVhZFN5bnRheEVsZW1lbnRfVG90YWxaZXJvc0Nocm9tYURDKCZjdXJyU0UsIGRQKTsKICAgICAgZWxzZQogICAgICAgIHJlYWRTeW50YXhFbGVtZW50X1RvdGFsWmVyb3MoJmN1cnJTRSwgZFApOwoKICAgICAgdG90emVyb3MgPSBjdXJyU0UudmFsdWUxOwogICAgfQogICAgZWxzZQogICAgewogICAgICB0b3R6ZXJvcyA9IDA7CiAgICB9CgogICAgLy8gZGVjb2RlIHJ1biBiZWZvcmUgZWFjaCBjb2VmZmljaWVudAogICAgemVyb3NsZWZ0ID0gdG90emVyb3M7CiAgICBpID0gbnVtY29lZmYgLSAxOwogICAgaWYgKHplcm9zbGVmdCA+IDAgJiYgaSA+IDApCiAgICB7CiAgICAgIGRvCiAgICAgIHsKICAgICAgICAvLyBzZWxlY3QgVkxDIGZvciBydW5iZWZvcmUKICAgICAgICB2bGNudW0gPSB6ZXJvc2xlZnQgLSAxOwogICAgICAgIGlmICh2bGNudW0gPiBSVU5CRUZPUkVfTlVNIC0gMSkKICAgICAgICAgIHZsY251bSA9IFJVTkJFRk9SRV9OVU0gLSAxOwoKICAgICAgICBjdXJyU0UudmFsdWUxID0gdmxjbnVtOwojaWYgVFJBQ0UKICAgICAgICBzbnByaW50ZihjdXJyU0UudHJhY2VzdHJpbmcsCiAgICAgICAgICBUUkFDRVNUUklOR19TSVpFLCAiJXMgcnVuICglZCwlZCkgaz0lZCB2bGM9JWQgIiwKICAgICAgICAgICAgdHlwZSwgaSwgaiwgaSwgdmxjbnVtKTsKI2VuZGlmCgogICAgICAgIHJlYWRTeW50YXhFbGVtZW50X1J1bigmY3VyclNFLCBkUCk7CiAgICAgICAgcnVuYXJyW2ldID0gY3VyclNFLnZhbHVlMTsKCiAgICAgICAgemVyb3NsZWZ0IC09IHJ1bmFycltpXTsKICAgICAgICBpIC0tOwogICAgICB9IHdoaWxlICh6ZXJvc2xlZnQgIT0gMCAmJiBpICE9IDApOwogICAgfQogICAgcnVuYXJyW2ldID0gemVyb3NsZWZ0OwoKICB9IC8vIGlmIG51bWNvZWZmCn0KCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBDYWxjdWxhdGUgdGhlIHF1YW50aXNhdGlvbiBhbmQgaW52ZXJzZSBxdWFudGlzYXRpb24gcGFyYW1ldGVycwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIENhbGN1bGF0ZVF1YW50OFBhcmFtKCkKewogIGludCBpLCBqLCBrLCB0ZW1wOwoKICBmb3Ioaz0wOyBrPDY7IGsrKykKICAgIGZvcihqPTA7IGo8ODsgaisrKQogICAgewogICAgICBmb3IoaT0wOyBpPDg7IGkrKykKICAgICAgewogICAgICAgIHRlbXAgPSAoaTw8MykrajsKICAgICAgICBJbnZMZXZlbFNjYWxlOHg4THVtYV9JbnRyYVtrXVtpXVtqXSA9IGRlcXVhbnRfY29lZjhba11bal1baV0qcW1hdHJpeFs2XVt0ZW1wXTsKICAgICAgICBJbnZMZXZlbFNjYWxlOHg4THVtYV9JbnRlcltrXVtpXVtqXSA9IGRlcXVhbnRfY29lZjhba11bal1baV0qcW1hdHJpeFs3XVt0ZW1wXTsKICAgICAgfQogICAgfQp9CgovKiEKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogXGJyaWVmCiogICAgR2V0IGNvZWZmaWNpZW50cyAocnVuL2xldmVsKSBvZiBvbmUgOHg4IGJsb2NrCiogICAgZnJvbSB0aGUgTkFMIChDQUJBQyBNb2RlKQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8Kdm9pZCByZWFkTHVtYUNvZWZmOHg4X0NBQkFDIChzdHJ1Y3QgaW1nX3BhciAqaW1nLHN0cnVjdCBpbnBfcGFyICppbnAsIGludCBiOCkKewogIGludCBpLGosazsKICBpbnQgbGV2ZWwgPSAxOwogIGludCBtYl9uciA9IGltZy0+Y3VycmVudF9tYl9ucjsKICBNYWNyb2Jsb2NrICpjdXJyTUIgPSAmaW1nLT5tYl9kYXRhW21iX25yXTsKICBpbnQgY2JwID0gY3Vyck1CLT5jYnA7CiAgU3ludGF4RWxlbWVudCBjdXJyU0U7CiAgU2xpY2UgKmN1cnJTbGljZSA9IGltZy0+Y3VycmVudFNsaWNlOwogIERhdGFQYXJ0aXRpb24gKmRQOwogIGludCAqcGFydE1hcCA9IGFzc2lnblNFMnBhcnRpdGlvbltjdXJyU2xpY2UtPmRwX21vZGVdOwogIGludCBzdGFydF9zY2FuID0gMDsgLy8gdGFrZSBhbGwgY29lZmZzCiAgaW50IGNvZWZfY3RyID0gc3RhcnRfc2NhbiAtIDE7Ly8gaTAsIGowOwogIGludCBib2ZmX3gsIGJvZmZfeTsKCiAgaW50IHJ1biwgbGVuOwoKICBpbnQgcXBfcGVyICAgID0gKGltZy0+cXAgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUgLSBNSU5fUVApLzY7CiAgaW50IHFwX3JlbSAgICA9IChpbWctPnFwICsgaW1nLT5iaXRkZXB0aF9sdW1hX3FwX3NjYWxlIC0gTUlOX1FQKSU2OwogIEJvb2xlYW4gbG9zc2xlc3NfcXBwcmltZSA9IChCb29sZWFuKSAoKGltZy0+cXAgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUpPT0wICYmIGltZy0+bG9zc2xlc3NfcXBwcmltZV9mbGFnPT0xKTsKICBpbnQgKCpJbnZMZXZlbFNjYWxlOHg4KVs4XSA9IElTX0lOVFJBKGN1cnJNQik/IEludkxldmVsU2NhbGU4eDhMdW1hX0ludHJhW3FwX3JlbV0gOiBJbnZMZXZlbFNjYWxlOHg4THVtYV9JbnRlcltxcF9yZW1dOwogIC8vIHNlbGVjdCBzY2FuIHR5cGUKICBjb25zdCBieXRlICgqcG9zX3NjYW44eDgpWzJdID0gKChpbWctPnN0cnVjdHVyZSA9PSBGUkFNRSkgJiYgKCFjdXJyTUItPm1iX2ZpZWxkKSkgPyBTTkdMX1NDQU44eDggOiBGSUVMRF9TQ0FOOHg4OwoKICBpbWctPmlzX2ludHJhX2Jsb2NrID0gSVNfSU5UUkEoY3Vyck1CKTsKCiAgaWYgKGNicCAmICgxPDxiOCkpICAvLyBhcmUgdGhlcmUgYW55IGNvZWZmIGluIGN1cnJlbnQgYmxvY2sgYXQgYWxsCiAgewogICAgLy8gPT09IHNldCBvZmZzZXQgaW4gY3VycmVudCBtYWNyb2Jsb2NrID09PQogICAgYm9mZl94ID0gKGI4JjB4MDEpIDw8IDM7CiAgICBib2ZmX3kgPSAoYjggPj4gMSkgPDwgMzsKCiAgICBpbWctPnN1YmJsb2NrX3ggPSBib2ZmX3ggPj4gMjsgLy8gcG9zaXRpb24gZm9yIGNvZWZmX2NvdW50IGN0eAogICAgaW1nLT5zdWJibG9ja195ID0gYm9mZl95ID4+IDI7IC8vIHBvc2l0aW9uIGZvciBjb2VmZl9jb3VudCBjdHgKCiAgICBpZighbG9zc2xlc3NfcXBwcmltZSkKICAgIHsKICAgICAgZm9yKGs9c3RhcnRfc2NhbjsoayA8IDY1KSAmJiAobGV2ZWwgIT0gMCk7aysrKQogICAgICB7CiAgICAgICAgLy89PT09PT09PT09PT0gcmVhZCA9PT09PT09PT09PT09CiAgICAgICAgLyoKICAgICAgICAqIG1ha2UgZGlzdGluY3Rpb24gYmV0d2VlbiBJTlRSQSBhbmQgSU5URVIgY29kZWQKICAgICAgICAqIGx1bWluYW5jZSBjb2VmZmljaWVudHMKICAgICAgICAqLwogICAgICAgIGN1cnJTRS5jb250ZXh0ID0gTFVNQV84eDg7CiAgICAgICAgY3VyclNFLnR5cGUgICAgPSAoKGltZy0+aXNfaW50cmFfYmxvY2sgPT0gMSkKICAgICAgICAgID8gKGs9PTAgPyBTRV9MVU1fRENfSU5UUkEgOiBTRV9MVU1fQUNfSU5UUkEpIAogICAgICAgICAgOiAoaz09MCA/IFNFX0xVTV9EQ19JTlRFUiA6IFNFX0xVTV9BQ19JTlRFUikpOwoKI2lmIFRSQUNFCiAgICAgICAgc3ByaW50ZihjdXJyU0UudHJhY2VzdHJpbmcsICJMdW1hOHg4IHNuZyAiKTsKI2VuZGlmCiAgICAgICAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW2N1cnJTRS50eXBlXV0pOwogICAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZFJ1bkxldmVsX0NBQkFDOwoKICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICAgIGxldmVsID0gY3VyclNFLnZhbHVlMTsKICAgICAgICBydW4gICA9IGN1cnJTRS52YWx1ZTI7CiAgICAgICAgbGVuICAgPSBjdXJyU0UubGVuOwoKICAgICAgICAvLz09PT09PT09PT09PSBkZWNvZGUgPT09PT09PT09PT09PQogICAgICAgIGlmIChsZXZlbCAhPSAwKSAgICAvKiBsZWF2ZSBpZiBsZW49MSAqLwogICAgICAgIHsKICAgICAgICAgIGNvZWZfY3RyICs9IHJ1biArIDE7CgogICAgICAgICAgaT1wb3Nfc2Nhbjh4OFtjb2VmX2N0cl1bMF07CiAgICAgICAgICBqPXBvc19zY2FuOHg4W2NvZWZfY3RyXVsxXTsKCiAgICAgICAgICBjdXJyTUItPmNicF9ibGsgfD0gNTEgPDwgKDQgKiBiOCAtIDIgKiAoYjggJiAweDAxKSk7IC8vIGNvcnJlc3BvbmRzIHRvIDExMDAxMSwgYXMgaWYgYWxsIGZvdXIgNHg0IGJsb2NrcyBjb250YWluIGNvZWZmLCBzaGlmdGVkIHRvIGJsb2NrIHBvc2l0aW9uCiAgICAgICAgICBpbWctPm03W2JvZmZfeSArIGpdW2JvZmZfeCArIGldID0gcnNoaWZ0X3JuZF9zZigobGV2ZWwgKiBJbnZMZXZlbFNjYWxlOHg4W2pdW2ldKSA8PCBxcF9wZXIsIDYpOyAvLyBkZXF1YW50aXphdGlvbgogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBmb3Ioaz1zdGFydF9zY2FuOyhrIDwgNjUpICYmIChsZXZlbCAhPSAwKTtrKyspCiAgICAgIHsKICAgICAgICAvLz09PT09PT09PT09PSByZWFkID09PT09PT09PT09PT0KICAgICAgICAvKgogICAgICAgICogbWFrZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIElOVFJBIGFuZCBJTlRFUiBjb2RlZAogICAgICAgICogbHVtaW5hbmNlIGNvZWZmaWNpZW50cwogICAgICAgICovCiAgICAgICAgY3VyclNFLmNvbnRleHQgPSBMVU1BXzh4ODsKICAgICAgICBjdXJyU0UudHlwZSAgICA9ICgoaW1nLT5pc19pbnRyYV9ibG9jayA9PSAxKQogICAgICAgICAgPyAoaz09MCA/IFNFX0xVTV9EQ19JTlRSQSA6IFNFX0xVTV9BQ19JTlRSQSkgCiAgICAgICAgICA6IChrPT0wID8gU0VfTFVNX0RDX0lOVEVSIDogU0VfTFVNX0FDX0lOVEVSKSk7CgojaWYgVFJBQ0UKICAgICAgICBzcHJpbnRmKGN1cnJTRS50cmFjZXN0cmluZywgIkx1bWE4eDggc25nICIpOwojZW5kaWYKICAgICAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbY3VyclNFLnR5cGVdXSk7CiAgICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkUnVuTGV2ZWxfQ0FCQUM7CgogICAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgbGV2ZWwgPSBjdXJyU0UudmFsdWUxOwogICAgICAgIHJ1biAgID0gY3VyclNFLnZhbHVlMjsKICAgICAgICBsZW4gICA9IGN1cnJTRS5sZW47CgogICAgICAgIC8vPT09PT09PT09PT09IGRlY29kZSA9PT09PT09PT09PT09CiAgICAgICAgaWYgKGxldmVsICE9IDApICAgIC8qIGxlYXZlIGlmIGxlbj0xICovCiAgICAgICAgewogICAgICAgICAgY29lZl9jdHIgKz0gcnVuKzE7CgogICAgICAgICAgaT1wb3Nfc2Nhbjh4OFtjb2VmX2N0cl1bMF07CiAgICAgICAgICBqPXBvc19zY2FuOHg4W2NvZWZfY3RyXVsxXTsKCiAgICAgICAgICBjdXJyTUItPmNicF9ibGsgfD0gNTEgPDwgKDQgKiBiOCAtIDIgKiAoYjggJiAweDAxKSk7IC8vIGNvcnJlc3BvbmRzIHRvIDExMDAxMSwgYXMgaWYgYWxsIGZvdXIgNHg0IGJsb2NrcyBjb250YWluIGNvZWZmLCBzaGlmdGVkIHRvIGJsb2NrIHBvc2l0aW9uCiAgICAgICAgICBpbWctPm03W2JvZmZfeSArIGpdW2JvZmZfeCArIGldID0gbGV2ZWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgR2V0IGNvZGVkIGJsb2NrIHBhdHRlcm4gYW5kIGNvZWZmaWNpZW50cyAocnVuL2xldmVsKQogKiAgICBmcm9tIHRoZSBOQUwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kdm9pZCByZWFkQ0JQYW5kQ29lZmZzRnJvbU5BTChzdHJ1Y3QgaW1nX3BhciAqaW1nLHN0cnVjdCBpbnBfcGFyICppbnApCnsKICBpbnQgaSxqLGs7CiAgaW50IGxldmVsOwogIGludCBtYl9uciA9IGltZy0+Y3VycmVudF9tYl9ucjsKICBpbnQgaWksamo7CiAgaW50IG0yLGpnMjsvLyBpMSxqMTsKICBNYWNyb2Jsb2NrICpjdXJyTUIgPSAmaW1nLT5tYl9kYXRhW21iX25yXTsKICBpbnQgY2JwOwogIFN5bnRheEVsZW1lbnQgY3VyclNFOwogIFNsaWNlICpjdXJyU2xpY2UgPSBpbWctPmN1cnJlbnRTbGljZTsKICBEYXRhUGFydGl0aW9uICpkUDsKICBpbnQgKnBhcnRNYXAgPSBhc3NpZ25TRTJwYXJ0aXRpb25bY3VyclNsaWNlLT5kcF9tb2RlXTsKICBpbnQgY29lZl9jdHIsIGkwLCBqMCwgYjg7CiAgaW50IGxsOwogIGludCBibG9ja194LGJsb2NrX3k7CiAgaW50IHN0YXJ0X3NjYW47CiAgaW50IHJ1biwgbGVuOwogIGludCBsZXZhcnJbMTZdLCBydW5hcnJbMTZdLCBudW1jb2VmZjsKCiAgaW50IHFwX2NvbnN0OwogIGludCBxcF9wZXIgICAgPSAoaW1nLT5xcCArIGltZy0+Yml0ZGVwdGhfbHVtYV9xcF9zY2FsZSAtIE1JTl9RUCkvNjsKICBpbnQgcXBfcmVtICAgID0gKGltZy0+cXAgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUgLSBNSU5fUVApJTY7CiAgaW50IHNtYiAgICAgICA9ICgoaW1nLT50eXBlPT1TUF9TTElDRSkgJiYgSVNfSU5URVIgKGN1cnJNQikpIHx8IChpbWctPnR5cGUgPT0gU0lfU0xJQ0UgJiYgY3Vyck1CLT5tYl90eXBlID09IFNJNE1CKTsKCiAgaW50IHV2OwogIGludCBxcF9jb25zdF91dlsyXTsKICBpbnQgcXBfcGVyX3V2WzJdOwogIGludCBxcF9yZW1fdXZbMl07CgogIGludCBpbnRyYSAgICAgPSBJU19JTlRSQSAoY3Vyck1CKTsKICBpbnQgdGVtcFs0XTsKCiAgaW50IGI0OwogIGludCB5dXYgPSBkZWNfcGljdHVyZS0+Y2hyb21hX2Zvcm1hdF9pZGMtMTsKICBpbnQgbTVbNF07CiAgaW50IG02WzRdOwoKICBpbnQgbmVlZF90cmFuc2Zvcm1fc2l6ZV9mbGFnOwogIEJvb2xlYW4gbG9zc2xlc3NfcXBwcmltZSA9IChCb29sZWFuKSAoKGltZy0+cXAgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUpPT0wICYmIGltZy0+bG9zc2xlc3NfcXBwcmltZV9mbGFnPT0xKTsKCiAgaW50ICgqSW52TGV2ZWxTY2FsZTR4NClbNF0gPSBOVUxMOwogIGludCAoKkludkxldmVsU2NhbGU4eDgpWzhdID0gTlVMTDsKICAvLyBzZWxlY3Qgc2NhbiB0eXBlCiAgY29uc3QgYnl0ZSAoKnBvc19zY2FuOHg4KVsyXSA9ICgoaW1nLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpICYmICghY3Vyck1CLT5tYl9maWVsZCkpID8gU05HTF9TQ0FOOHg4IDogRklFTERfU0NBTjh4ODsKICBjb25zdCBieXRlICgqcG9zX3NjYW40eDQpWzJdID0gKChpbWctPnN0cnVjdHVyZSA9PSBGUkFNRSkgJiYgKCFjdXJyTUItPm1iX2ZpZWxkKSkgPyBTTkdMX1NDQU4gOiBGSUVMRF9TQ0FOOwoKICBpZihpbWctPnR5cGU9PVNQX1NMSUNFICAmJiBjdXJyTUItPm1iX3R5cGUhPUkxNk1CICkKICAgIHNtYj0xOwoKICAvLyBRUEkKICAvL2luaXQgY29uc3RhbnRzIGZvciBldmVyeSBjaHJvbWEgcXAgb2Zmc2V0CiAgaWYgKGRlY19waWN0dXJlLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBZVVY0MDApCiAgewogICAgZm9yIChpPTA7IGk8MjsgaSsrKQogICAgewogICAgICBxcF9wZXJfdXZbaV0gPSAoY3Vyck1CLT5xcGNbaV0gKyBpbWctPmJpdGRlcHRoX2Nocm9tYV9xcF9zY2FsZSkvNjsKICAgICAgcXBfcmVtX3V2W2ldID0gKGN1cnJNQi0+cXBjW2ldICsgaW1nLT5iaXRkZXB0aF9jaHJvbWFfcXBfc2NhbGUpJTY7CiAgICB9CiAgfQoKICAvLyByZWFkIENCUCBpZiBub3QgbmV3IGludHJhIG1vZGUKICBpZiAoIUlTX05FV0lOVFJBIChjdXJyTUIpKQogIHsKICAgIC8vPT09PT0gICBDIEIgUCAgID09PT09CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgY3VyclNFLnR5cGUgPSAoSVNfT0xESU5UUkEgKGN1cnJNQikgfHwgY3Vyck1CLT5tYl90eXBlID09IFNJNE1CIHx8IGN1cnJNQi0+bWJfdHlwZSA9PSBJOE1CKSAKICAgICAgPyBTRV9DQlBfSU5UUkEKICAgICAgOiBTRV9DQlBfSU5URVI7CgogICAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW2N1cnJTRS50eXBlXV0pOwoKICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKQogICAgewogICAgICBjdXJyU0UubWFwcGluZyA9IChJU19PTERJTlRSQSAoY3Vyck1CKSB8fCBjdXJyTUItPm1iX3R5cGUgPT0gU0k0TUIgfHwgY3Vyck1CLT5tYl90eXBlID09IEk4TUIpCiAgICAgICAgPyBsaW5mb19jYnBfaW50cmEKICAgICAgICA6IGxpbmZvX2NicF9pbnRlcjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkQ0JQX0NBQkFDOwogICAgfQoKICAgIFRSQUNFX1NUUklORygiY29kZWRfYmxvY2tfcGF0dGVybiIpOwoKICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICBjdXJyTUItPmNicCA9IGNicCA9IGN1cnJTRS52YWx1ZTE7CgoKICAgIC8vPT09PT09PT09PT09PSBUcmFuc2Zvcm0gc2l6ZSBmbGFnIGZvciBJTlRFUiBNQnMgPT09PT09PT09PT09PQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBuZWVkX3RyYW5zZm9ybV9zaXplX2ZsYWcgPSAoKChjdXJyTUItPm1iX3R5cGUgPj0gMSAmJiBjdXJyTUItPm1iX3R5cGUgPD0gMyl8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJU19ESVJFQ1QoY3Vyck1CKSAmJiBhY3RpdmVfc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyTUItPk5vTWJQYXJ0TGVzc1RoYW44eDhGbGFnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyTUItPm1iX3R5cGUgIT0gSThNQiAmJiBjdXJyTUItPm1iX3R5cGUgIT0gSTRNQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjdXJyTUItPmNicCYxNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbWctPlRyYW5zZm9ybTh4OE1vZGUpOwoKICAgIGlmIChuZWVkX3RyYW5zZm9ybV9zaXplX2ZsYWcpCiAgICB7CiAgICAgIGN1cnJTRS50eXBlICAgPSAgU0VfSEVBREVSOwogICAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbU0VfSEVBREVSXV0pOwogICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRNQl90cmFuc2Zvcm1fc2l6ZV9mbGFnX0NBQkFDOwogICAgICBUUkFDRV9TVFJJTkcoInRyYW5zZm9ybV9zaXplXzh4OF9mbGFnIik7CgogICAgICAvLyByZWFkIFVWTEMgdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcKICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgIHsKICAgICAgICBjdXJyU0UubGVuID0gMTsKICAgICAgICByZWFkU3ludGF4RWxlbWVudF9GTEMoJmN1cnJTRSwgZFAtPmJpdHN0cmVhbSk7CiAgICAgIH0gCiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgIH0KICAgICAgY3Vyck1CLT5sdW1hX3RyYW5zZm9ybV9zaXplXzh4OF9mbGFnID0gY3VyclNFLnZhbHVlMTsKICAgIH0KCiAgICAvLz09PT09ICAgRFFVQU5UICAgPT09PT0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gRGVsdGEgcXVhbnQgb25seSBpZiBub256ZXJvIGNvZWZmcwogICAgaWYgKGNicCAhPTApCiAgICB7CiAgICAgIGN1cnJTRS50eXBlID0gKElTX0lOVEVSIChjdXJyTUIpKSA/IFNFX0RFTFRBX1FVQU5UX0lOVEVSIDogU0VfREVMVEFfUVVBTlRfSU5UUkE7CgogICAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbY3VyclNFLnR5cGVdXSk7CgogICAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMgfHwgZFAtPmJpdHN0cmVhbS0+ZWlfZmxhZykKICAgICAgewogICAgICAgIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fc2U7CiAgICAgIH0KICAgICAgZWxzZQogICAgICAgIGN1cnJTRS5yZWFkaW5nPSByZWFkRHF1YW50X0NBQkFDOyAvL2dhYmkKCiAgICAgIFRSQUNFX1NUUklORygibWJfcXBfZGVsdGEiKTsKCiAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgIGN1cnJNQi0+ZGVsdGFfcXVhbnQgPSBjdXJyU0UudmFsdWUxOwogICAgICBpZiAoKGN1cnJNQi0+ZGVsdGFfcXVhbnQgPCAtKDI2ICsgaW1nLT5iaXRkZXB0aF9sdW1hX3FwX3NjYWxlLzIpKSB8fCAoY3Vyck1CLT5kZWx0YV9xdWFudCA+ICgyNSArIGltZy0+Yml0ZGVwdGhfbHVtYV9xcF9zY2FsZS8yKSkpCiAgICAgICAgZXJyb3IgKCJtYl9xcF9kZWx0YSBpcyBvdXQgb2YgcmFuZ2UiLCA1MDApOwoKICAgICAgaW1nLT5xcD0gKChpbWctPnFwICsgY3Vyck1CLT5kZWx0YV9xdWFudCArIDUyICsgMippbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUpJSg1MitpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUpKSAtCiAgICAgICAgICAgICAgICAgaW1nLT5iaXRkZXB0aF9sdW1hX3FwX3NjYWxlOwogICAgfQogIH0KICBlbHNlCiAgewogICAgY2JwID0gY3Vyck1CLT5jYnA7CiAgfQoKICBmb3IgKGk9MDtpPEJMT0NLX1NJWkU7aSsrKQogICAgZm9yIChqPTA7ajxCTE9DS19TSVpFO2orKykKICAgICAgbWVtc2V0KCZpbWctPmNvZltpXVtqXVswXVswXSwgMCwgQkxPQ0tfU0laRSAqIEJMT0NLX1NJWkUgKiBzaXplb2YoaW50KSk7IC8vIHJlc2V0IGx1bWEgY29lZmZzCgoKICBpZiAoSVNfTkVXSU5UUkEgKGN1cnJNQikpIC8vIHJlYWQgREMgY29lZmZzIGZvciBuZXcgaW50cmEgbW9kZXMKICB7CiAgICBjdXJyU0UudHlwZSA9IFNFX0RFTFRBX1FVQU5UX0lOVFJBOwoKICAgIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtjdXJyU0UudHlwZV1dKTsKCiAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMgfHwgZFAtPmJpdHN0cmVhbS0+ZWlfZmxhZykKICAgIHsKICAgICAgY3VyclNFLm1hcHBpbmcgPSBsaW5mb19zZTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY3VyclNFLnJlYWRpbmc9IHJlYWREcXVhbnRfQ0FCQUM7CiAgICB9CiNpZiBUUkFDRQogICAgc25wcmludGYoY3VyclNFLnRyYWNlc3RyaW5nLCBUUkFDRVNUUklOR19TSVpFLCAiRGVsdGEgcXVhbnQgIik7CiNlbmRpZgogICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgIGN1cnJNQi0+ZGVsdGFfcXVhbnQgPSBjdXJyU0UudmFsdWUxOwogICAgaWYgKChjdXJyTUItPmRlbHRhX3F1YW50IDwgLSgyNiArIGltZy0+Yml0ZGVwdGhfbHVtYV9xcF9zY2FsZS8yKSkgfHwgKGN1cnJNQi0+ZGVsdGFfcXVhbnQgPiAoMjUgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUvMikpKQogICAgICBlcnJvciAoIm1iX3FwX2RlbHRhIGlzIG91dCBvZiByYW5nZSIsIDUwMCk7CgogICAgaW1nLT5xcD0gKChpbWctPnFwICsgY3Vyck1CLT5kZWx0YV9xdWFudCArIDUyICsgMippbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUpJSg1MitpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUpKSAtCiAgICAgICAgICAgICAgIGltZy0+Yml0ZGVwdGhfbHVtYV9xcF9zY2FsZTsKCiAgICBmb3IgKGk9MDtpPEJMT0NLX1NJWkU7aSsrKQogICAgICBmb3IgKGo9MDtqPEJMT0NLX1NJWkU7aisrKQogICAgICAgIGltZy0+aXByZWRtb2RlW2ltZy0+YmxvY2tfeStqXVtpbWctPmJsb2NrX3graV09RENfUFJFRDsKCgogICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDKQogICAgewogICAgICByZWFkQ29lZmY0eDRfQ0FWTEMoaW1nLCBpbnAsIExVTUFfSU5UUkExNngxNkRDLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmFyciwgcnVuYXJyLCAmbnVtY29lZmYpOwoKICAgICAgY29lZl9jdHI9LTE7CiAgICAgIGxldmVsID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB0byBnZXQgaW5zaWRlIHRoZSBsb29wCiAgICAgIGZvcihrID0gMDsgayA8IG51bWNvZWZmOyBrKyspCiAgICAgIHsKICAgICAgICBpZiAobGV2YXJyW2tdICE9IDApICAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgaWYgbGVuPTEKICAgICAgICB7CiAgICAgICAgICBjb2VmX2N0cj1jb2VmX2N0citydW5hcnJba10rMTsKCiAgICAgICAgICBpMD1wb3Nfc2NhbjR4NFtjb2VmX2N0cl1bMF07CiAgICAgICAgICBqMD1wb3Nfc2NhbjR4NFtjb2VmX2N0cl1bMV07CgogICAgICAgICAgaW1nLT5jb2ZbaTBdW2owXVswXVswXT1sZXZhcnJba107Ly8gYWRkIG5ldyBpbnRyYSBEQyBjb2VmZgogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewoKICAgICAgY3VyclNFLnR5cGUgPSBTRV9MVU1fRENfSU5UUkE7CiAgICAgIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtjdXJyU0UudHlwZV1dKTsKCiAgICAgIGN1cnJTRS5jb250ZXh0ICAgICAgPSBMVU1BXzE2REM7CiAgICAgIGN1cnJTRS50eXBlICAgICAgICAgPSBTRV9MVU1fRENfSU5UUkE7CiAgICAgIGltZy0+aXNfaW50cmFfYmxvY2sgPSAxOwoKICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgIHsKICAgICAgICBjdXJyU0UubWFwcGluZyA9IGxpbmZvX2xldnJ1bl9pbnRlcjsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRSdW5MZXZlbF9DQUJBQzsKICAgICAgfQoKICAgICAgY29lZl9jdHIgPSAtMTsKICAgICAgbGV2ZWwgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHRvIGdldCBpbnNpZGUgdGhlIGxvb3AKCiAgICAgIGZvcihrPTA7KGs8MTcpICYmIChsZXZlbCE9MCk7aysrKQogICAgICB7CiNpZiBUUkFDRQogICAgICAgIHNucHJpbnRmKGN1cnJTRS50cmFjZXN0cmluZywgVFJBQ0VTVFJJTkdfU0laRSwgIkRDIGx1bWEgMTZ4MTYgIik7CiNlbmRpZgogICAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgbGV2ZWwgPSBjdXJyU0UudmFsdWUxOwogICAgICAgIHJ1biAgID0gY3VyclNFLnZhbHVlMjsKICAgICAgICBsZW4gICA9IGN1cnJTRS5sZW47CgogICAgICAgIGlmIChsZXZlbCAhPSAwKSAgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIGlmIGxlbj0xCiAgICAgICAgewogICAgICAgICAgY29lZl9jdHI9Y29lZl9jdHIrcnVuKzE7CgogICAgICAgICAgaTA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzBdOwogICAgICAgICAgajA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzFdOwoKICAgICAgICAgIGltZy0+Y29mW2kwXVtqMF1bMF1bMF09bGV2ZWw7Ly8gYWRkIG5ldyBpbnRyYSBEQyBjb2VmZgogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYoIWxvc3NsZXNzX3FwcHJpbWUpCiAgICAgIGl0cmFuc18yKGltZyk7Ly8gdHJhbnNmb3JtIG5ldyBpbnRyYSBEQwogIH0KCiAgY3Vyck1CLT5xcCA9IGltZy0+cXA7CgogIHNldF9jaHJvbWFfcXAoY3Vyck1CKTsKCiAgcXBfcGVyICAgID0gKGltZy0+cXAgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUgLSBNSU5fUVApLzY7CiAgcXBfcmVtICAgID0gKGltZy0+cXAgKyBpbWctPmJpdGRlcHRoX2x1bWFfcXBfc2NhbGUgLSBNSU5fUVApJTY7CiAgcXBfY29uc3QgID0gMTw8KDMtcXBfcGVyKTsKCiAgSW52TGV2ZWxTY2FsZTR4NCA9IGludHJhPyBJbnZMZXZlbFNjYWxlNHg0THVtYV9JbnRyYVtxcF9yZW1dIDogSW52TGV2ZWxTY2FsZTR4NEx1bWFfSW50ZXJbcXBfcmVtXTsKICBJbnZMZXZlbFNjYWxlOHg4ID0gaW50cmE/IEludkxldmVsU2NhbGU4eDhMdW1hX0ludHJhW3FwX3JlbV0gOiBJbnZMZXZlbFNjYWxlOHg4THVtYV9JbnRlcltxcF9yZW1dOwoKICAvL2luaXQgY29uc3RhbnRzIGZvciBldmVyeSBjaHJvbWEgcXAgb2Zmc2V0CiAgaWYgKGRlY19waWN0dXJlLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBZVVY0MDApCiAgewogICAgZm9yKGk9MDsgaSA8IDI7IGkrKykKICAgIHsKICAgICAgcXBfcGVyX3V2W2ldID0gKGN1cnJNQi0+cXBjW2ldICsgaW1nLT5iaXRkZXB0aF9jaHJvbWFfcXBfc2NhbGUpLzY7CiAgICAgIHFwX3JlbV91dltpXSA9IChjdXJyTUItPnFwY1tpXSArIGltZy0+Yml0ZGVwdGhfY2hyb21hX3FwX3NjYWxlKSU2OwogICAgfQogIH0KCgogIC8vIGx1bWEgY29lZmZpY2llbnRzCiAgZm9yIChibG9ja195PTA7IGJsb2NrX3kgPCA0OyBibG9ja195ICs9IDIpIC8qIGFsbCBtb2RlcyAqLwogIHsKICAgIGZvciAoYmxvY2tfeD0wOyBibG9ja194IDwgNDsgYmxvY2tfeCArPSAyKQogICAgewoKICAgICAgYjggPSAyKihibG9ja195Pj4xKSArIChibG9ja194Pj4xKTsKICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDKQogICAgICB7CiAgICAgICAgZm9yIChqPWJsb2NrX3k7IGogPCBibG9ja195KzI7IGorKykKICAgICAgICB7CiAgICAgICAgICBmb3IgKGk9YmxvY2tfeDsgaSA8IGJsb2NrX3grMjsgaSsrKQogICAgICAgICAgewogICAgICAgICAgICBpaSA9IGJsb2NrX3ggPj4gMTsKICAgICAgICAgICAgamogPSBibG9ja195ID4+IDE7CiAgICAgICAgICAgIGI4ID0gMiAqIGpqICsgaWk7CgogICAgICAgICAgICBpZiAoY2JwICYgKDE8PGI4KSkgIC8qIGFyZSB0aGVyZSBhbnkgY29lZmYgaW4gY3VycmVudCBibG9jayBhdCBhbGwgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgIHJlYWRDb2VmZjR4NF9DQVZMQyhpbWcsIGlucCwgKElTX05FV0lOVFJBKGN1cnJNQikgPyBMVU1BX0lOVFJBMTZ4MTZBQyA6IExVTUEpLCBpLCBqLCBsZXZhcnIsIHJ1bmFyciwgJm51bWNvZWZmKTsKCiAgICAgICAgICAgICAgc3RhcnRfc2NhbiA9IElTX05FV0lOVFJBKGN1cnJNQikgPyAxIDogMDsKICAgICAgICAgICAgICBjb2VmX2N0ciA9IHN0YXJ0X3NjYW4gLSAxOwoKICAgICAgICAgICAgICBpZighbG9zc2xlc3NfcXBwcmltZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWN1cnJNQi0+bHVtYV90cmFuc2Zvcm1fc2l6ZV84eDhfZmxhZykgLy8gNHg0IHRyYW5zZm9ybQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtY29lZmY7IGsrKykKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsZXZhcnJba10gIT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBjb2VmX2N0ciArPSBydW5hcnJba10rMTsKCiAgICAgICAgICAgICAgICAgICAgICBpMCA9IHBvc19zY2FuNHg0W2NvZWZfY3RyXVswXTsKICAgICAgICAgICAgICAgICAgICAgIGowID0gcG9zX3NjYW40eDRbY29lZl9jdHJdWzFdOwoKICAgICAgICAgICAgICAgICAgICAgIC8vIGludmVyc2UgcXVhbnQgZm9yIDR4NCB0cmFuc2Zvcm0gb25seQogICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5jYnBfYmxrICAgICAgfD0gKGludDY0KSAxIDw8ICgoajw8MikgKyBpKTsKICAgICAgICAgICAgICAgICAgICAgIGltZy0+Y29mW2ldW2pdW2owXVtpMF09IHJzaGlmdF9ybmRfc2YoKGxldmFycltrXSpJbnZMZXZlbFNjYWxlNHg0W2owXVtpMF0pPDxxcF9wZXIsIDQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSAvLyA4eDggdHJhbnNmb3JtCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGludCBiNCwgaXosIGp6OwogICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtY29lZmY7IGsrKykKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsZXZhcnJba10gIT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBjb2VmX2N0ciArPSBydW5hcnJba10rMTsKCiAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBzYW1lIGFzIENBQkFDIGZvciBkZWJsb2NraW5nOiBhbnkgY29lZmYgaW4gdGhlIDh4OCBtYXJrcyBhbGwgdGhlIDR4NHMKICAgICAgICAgICAgICAgICAgICAgIC8vYXMgY29udGFpbmluZyBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Y2JwX2JsayAgfD0gNTEgPDwgKChibG9ja195PDwyKSArIGJsb2NrX3gpOwoKICAgICAgICAgICAgICAgICAgICAgIGI0ID0gMiooaiAtIGJsb2NrX3kpKyhpIC0gYmxvY2tfeCk7CgogICAgICAgICAgICAgICAgICAgICAgaXogPSBwb3Nfc2Nhbjh4OFsoY29lZl9jdHIgPDwgMikgKyBiNF1bMF07CiAgICAgICAgICAgICAgICAgICAgICBqeiA9IHBvc19zY2FuOHg4Wyhjb2VmX2N0ciA8PCAyKSArIGI0XVsxXTsKCiAgICAgICAgICAgICAgICAgICAgICBpbWctPm03W2Jsb2NrX3kqNCAranpdW2Jsb2NrX3gqNCAraXpdID0gcnNoaWZ0X3JuZF9zZigobGV2YXJyW2tdKkludkxldmVsU2NhbGU4eDhbanpdW2l6XSk8PHFwX3BlciwgNik7IC8vIGRlcXVhbnRpemF0aW9uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9Ly9lbHNlICghY3Vyck1CLT5sdW1hX3RyYW5zZm9ybV9zaXplXzh4OF9mbGFnKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFjdXJyTUItPmx1bWFfdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcpIC8vIGludmVyc2UgcXVhbnQgZm9yIDR4NCB0cmFuc2Zvcm0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bWNvZWZmOyBrKyspCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGV2YXJyW2tdICE9IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgY29lZl9jdHIgKz0gcnVuYXJyW2tdKzE7CgogICAgICAgICAgICAgICAgICAgICAgaTA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzBdOwogICAgICAgICAgICAgICAgICAgICAgajA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzFdOwoKICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Y2JwX2JsayAgICAgIHw9IChpbnQ2NCkgMSA8PCAoKGo8PDIpICsgaSk7CiAgICAgICAgICAgICAgICAgICAgICBpbWctPmNvZltpXVtqXVtqMF1baTBdPSBsZXZhcnJba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIC8vIGludmVyc2UgcXVhbnQgZm9yIDh4OCB0cmFuc2Zvcm0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaW50IGI0LCBpeiwgano7CiAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1jb2VmZjsgaysrKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxldmFycltrXSAhPSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIGNvZWZfY3RyICs9IHJ1bmFycltrXSsxOwoKICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHNhbWUgYXMgQ0FCQUMgZm9yIGRlYmxvY2tpbmc6IGFueSBjb2VmZiBpbiB0aGUgOHg4IG1hcmtzIGFsbCB0aGUgNHg0cwogICAgICAgICAgICAgICAgICAgICAgLy9hcyBjb250YWluaW5nIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5jYnBfYmxrICB8PSA1MSA8PCAoKGJsb2NrX3k8PDIpICsgYmxvY2tfeCk7CgogICAgICAgICAgICAgICAgICAgICAgYjQgPSAyKihqLWJsb2NrX3kpKyhpLWJsb2NrX3gpOwoKICAgICAgICAgICAgICAgICAgICAgIGl6PXBvc19zY2FuOHg4W2NvZWZfY3RyKjQrYjRdWzBdOwogICAgICAgICAgICAgICAgICAgICAgano9cG9zX3NjYW44eDhbY29lZl9jdHIqNCtiNF1bMV07CgogICAgICAgICAgICAgICAgICAgICAgaW1nLT5tN1tibG9ja195KjQgK2p6XVtibG9ja194KjQgK2l6XSA9IGxldmFycltrXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0vL2Vsc2UgKCFjdXJyTUItPmx1bWFfdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgIGltZy0+bnpfY29lZmZbaW1nLT5jdXJyZW50X21iX25yXVtpXVtqXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gLy8gVkxDCiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGlmKGN1cnJNQi0+bHVtYV90cmFuc2Zvcm1fc2l6ZV84eDhfZmxhZykKICAgICAgICAgIHJlYWRMdW1hQ29lZmY4eDhfQ0FCQUMoaW1nLCBpbnAsIGI4KTsgLy89PT09PT09IDh4OCB0cmFubnNmb3JtIHNpemUgJiBDQUJBQyA9PT09PT09PQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvLz09PT09PT0gT3RoZXIgTW9kZXMgJiBDQUJBQyA9PT09PT09PQogICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIGZvciAoaj1ibG9ja195OyBqIDwgYmxvY2tfeSsyOyBqKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaT1ibG9ja194OyBpIDwgYmxvY2tfeCsyOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBzdGFydF9zY2FuID0gSVNfTkVXSU5UUkEgKGN1cnJNQik/IDEgOiAwOwoKICAgICAgICAgICAgICBpbWctPnN1YmJsb2NrX3ggPSBpOyAvLyBwb3NpdGlvbiBmb3IgY29lZmZfY291bnQgY3R4CiAgICAgICAgICAgICAgaW1nLT5zdWJibG9ja195ID0gajsgLy8gcG9zaXRpb24gZm9yIGNvZWZmX2NvdW50IGN0eAoKICAgICAgICAgICAgICBpZiAoY2JwICYgKDE8PGI4KSkgIC8vIGFyZSB0aGVyZSBhbnkgY29lZmYgaW4gY3VycmVudCBibG9jayBhdCBhbGwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb2VmX2N0ciA9IHN0YXJ0X3NjYW4gLSAxOwogICAgICAgICAgICAgICAgbGV2ZWwgICAgPSAxOwogICAgICAgICAgICAgICAgaW1nLT5pc19pbnRyYV9ibG9jayA9IElTX0lOVFJBKGN1cnJNQik7CgogICAgICAgICAgICAgICAgaWYoIWxvc3NsZXNzX3FwcHJpbWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGZvcihrPXN0YXJ0X3NjYW47KGs8MTcpICYmIChsZXZlbCE9MCk7aysrKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIG1ha2UgZGlzdGluY3Rpb24gYmV0d2VlbiBJTlRSQSBhbmQgSU5URVIgY29kZWQKICAgICAgICAgICAgICAgICAgICAqIGx1bWluYW5jZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGN1cnJTRS5jb250ZXh0ICAgICAgPSAoSVNfTkVXSU5UUkEoY3Vyck1CKSA/IExVTUFfMTZBQyA6IExVTUFfNHg0KTsKICAgICAgICAgICAgICAgICAgICBjdXJyU0UudHlwZSAgICAgICAgID0gKGltZy0+aXNfaW50cmFfYmxvY2sgCiAgICAgICAgICAgICAgICAgICAgICA/IChrPT0wID8gU0VfTFVNX0RDX0lOVFJBIDogU0VfTFVNX0FDX0lOVFJBKSAKICAgICAgICAgICAgICAgICAgICAgIDogKGs9PTAgPyBTRV9MVU1fRENfSU5URVIgOiBTRV9MVU1fQUNfSU5URVIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKI2lmIFRSQUNFCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihjdXJyU0UudHJhY2VzdHJpbmcsICJMdW1hIHNuZyAiKTsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW2N1cnJTRS50eXBlXV0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMgfHwgZFAtPmJpdHN0cmVhbS0+ZWlfZmxhZykgIAogICAgICAgICAgICAgICAgICAgICAgY3VyclNFLm1hcHBpbmcgPSBsaW5mb19sZXZydW5faW50ZXI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRSdW5MZXZlbF9DQUJBQzsKCiAgICAgICAgICAgICAgICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGN1cnJTRS52YWx1ZTE7CiAgICAgICAgICAgICAgICAgICAgcnVuICAgPSBjdXJyU0UudmFsdWUyOwogICAgICAgICAgICAgICAgICAgIGxlbiAgID0gY3VyclNFLmxlbjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IDApICAgIC8qIGxlYXZlIGlmIGxlbj0xICovCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgY29lZl9jdHIgKz0gcnVuKzE7CgogICAgICAgICAgICAgICAgICAgICAgaTA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzBdOwogICAgICAgICAgICAgICAgICAgICAgajA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzFdOwoKICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Y2JwX2JsayB8PSAoaW50NjQpMSA8PCAoKGo8PDIpICsgaSkgOwogICAgICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1bal1bajBdW2kwXT0gcnNoaWZ0X3JuZF9zZigobGV2ZWwqSW52TGV2ZWxTY2FsZTR4NFtqMF1baTBdKSA8PCBxcF9wZXIsIDQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBmb3Ioaz1zdGFydF9zY2FuOyhrPDE3KSAmJiAobGV2ZWwhPTApO2srKykKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgKiBtYWtlIGRpc3RpbmN0aW9uIGJldHdlZW4gSU5UUkEgYW5kIElOVEVSIGNvZGVkCiAgICAgICAgICAgICAgICAgICAgKiBsdW1pbmFuY2UgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjdXJyU0UuY29udGV4dCAgICAgID0gKElTX05FV0lOVFJBKGN1cnJNQikgPyBMVU1BXzE2QUMgOiBMVU1BXzR4NCk7CiAgICAgICAgICAgICAgICAgICAgY3VyclNFLnR5cGUgICAgICAgICA9IChpbWctPmlzX2ludHJhX2Jsb2NrIAogICAgICAgICAgICAgICAgICAgICAgPyAoaz09MCA/IFNFX0xVTV9EQ19JTlRSQSA6IFNFX0xVTV9BQ19JTlRSQSkgCiAgICAgICAgICAgICAgICAgICAgICA6IChrPT0wID8gU0VfTFVNX0RDX0lOVEVSIDogU0VfTFVNX0FDX0lOVEVSKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiNpZiBUUkFDRQogICAgICAgICAgICAgICAgICAgIHNwcmludGYoY3VyclNFLnRyYWNlc3RyaW5nLCAiTHVtYSBzbmcgIik7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtjdXJyU0UudHlwZV1dKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpICAKICAgICAgICAgICAgICAgICAgICAgIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fbGV2cnVuX2ludGVyOwogICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkUnVuTGV2ZWxfQ0FCQUM7CgogICAgICAgICAgICAgICAgICAgIGRQLT5yZWFkU3ludGF4RWxlbWVudCgmY3VyclNFLGltZyxkUCk7CiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBjdXJyU0UudmFsdWUxOwogICAgICAgICAgICAgICAgICAgIHJ1biAgID0gY3VyclNFLnZhbHVlMjsKICAgICAgICAgICAgICAgICAgICBsZW4gICA9IGN1cnJTRS5sZW47CgogICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPSAwKSAgICAvKiBsZWF2ZSBpZiBsZW49MSAqLwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIGNvZWZfY3RyICs9IHJ1bisxOwoKICAgICAgICAgICAgICAgICAgICAgIGkwPXBvc19zY2FuNHg0W2NvZWZfY3RyXVswXTsKICAgICAgICAgICAgICAgICAgICAgIGowPXBvc19zY2FuNHg0W2NvZWZfY3RyXVsxXTsKCiAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPmNicF9ibGsgfD0gKGludDY0KTEgPDwgKChqPDwyKSArIGkpIDsKCiAgICAgICAgICAgICAgICAgICAgICBpbWctPmNvZltpXVtqXVtqMF1baTBdPSBsZXZlbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGlmIChkZWNfcGljdHVyZS0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gWVVWNDAwKQogIHsKCiAgICBmb3IgKGo9NDtqPCg0K2ltZy0+bnVtX2Jsazh4OF91dik7aisrKSAvLyByZXNldCBhbGwgY2hyb21hIGNvZWZmcyBiZWZvcmUgcmVhZAogICAgZm9yIChpPTA7aTw0O2krKykKICAgICAgbWVtc2V0KCZpbWctPmNvZltpXVtqXVswXVswXSwgMCwgMTYgKiBzaXplb2YoaW50KSk7CgogICAgbTIgID0gaW1nLT5tYl94ICogMjsKICAgIGpnMiA9IGltZy0+bWJfeSAqIDI7CgogICAgcXBfY29uc3RfdXZbMF0gPSAxPDwoMy1xcF9wZXJfdXZbMF0pOwogICAgcXBfY29uc3RfdXZbMV0gPSAxPDwoMy1xcF9wZXJfdXZbMV0pOwoKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09IENIUk9NQSBEQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBjaHJvbWEgREMgY29lZmYKICAgIGlmKGNicD4xNSkKICAgIHsKICAgICAgZm9yIChsbD0wO2xsPDM7bGwrPTIpCiAgICAgIHsKICAgICAgICB1diA9IGxsPj4xOwoKICAgICAgICBpZiAoZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjID09IFlVVjQyMCkKICAgICAgICB7CiAgICAgICAgICBpbnQgKCpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hKVs0XSA9IGludHJhCiAgICAgICAgICAgID8gSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRyYVt1dl1bcXBfcmVtX3V2W3V2XV0gCiAgICAgICAgICAgIDogSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRlclt1dl1bcXBfcmVtX3V2W3V2XV07CgogICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT0gQ0hST01BIERDIFlVVjQyMCA9PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICBtZW1zZXQoJmltZy0+Y29mdVswXSwgMCwgNCAqc2l6ZW9mKGludCkpOwoKICAgICAgICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQykKICAgICAgICAgIHsKICAgICAgICAgICAgcmVhZENvZWZmNHg0X0NBVkxDKGltZywgaW5wLCBDSFJPTUFfREMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZhcnIsIHJ1bmFyciwgJm51bWNvZWZmKTsKICAgICAgICAgICAgY29lZl9jdHI9LTE7CiAgICAgICAgICAgIGxldmVsPTE7CiAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG51bWNvZWZmOyBrKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAobGV2YXJyW2tdICE9IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3Vyck1CLT5jYnBfYmxrIHw9IDB4ZjAwMDAgPDwgKGxsPDwxKSA7CiAgICAgICAgICAgICAgICBjb2VmX2N0cj1jb2VmX2N0citydW5hcnJba10rMTsKICAgICAgICAgICAgICAgIGltZy0+Y29mdVtjb2VmX2N0cl09bGV2YXJyW2tdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICBjb2VmX2N0cj0tMTsKICAgICAgICAgICAgbGV2ZWw9MTsKICAgICAgICAgICAgZm9yKGs9MDsoazwoaW1nLT5udW1fY2RjX2NvZWZmKzEpKSYmKGxldmVsIT0wKTtrKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjdXJyU0UuY29udGV4dCAgICAgID0gQ0hST01BX0RDOwogICAgICAgICAgICAgIGN1cnJTRS50eXBlICAgICAgICAgPSAoSVNfSU5UUkEoY3Vyck1CKSA/IFNFX0NIUl9EQ19JTlRSQSA6IFNFX0NIUl9EQ19JTlRFUik7CiAgICAgICAgICAgICAgaW1nLT5pc19pbnRyYV9ibG9jayA9ICBJU19JTlRSQShjdXJyTUIpOwogICAgICAgICAgICAgIGltZy0+aXNfdl9ibG9jayAgICAgPSBsbDsKCiAgI2lmIFRSQUNFCiAgICAgICAgICAgICAgc25wcmludGYoY3VyclNFLnRyYWNlc3RyaW5nLCBUUkFDRVNUUklOR19TSVpFLCAiMngyIERDIENocm9tYSAiKTsKICAjZW5kaWYKICAgICAgICAgICAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbY3VyclNFLnR5cGVdXSk7CgogICAgICAgICAgICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKQogICAgICAgICAgICAgICAgY3VyclNFLm1hcHBpbmcgPSBsaW5mb19sZXZydW5fYzJ4MjsKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRSdW5MZXZlbF9DQUJBQzsKCiAgICAgICAgICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgICAgICAgICAgICBsZXZlbCA9IGN1cnJTRS52YWx1ZTE7CiAgICAgICAgICAgICAgcnVuID0gY3VyclNFLnZhbHVlMjsKICAgICAgICAgICAgICBsZW4gPSBjdXJyU0UubGVuOwogICAgICAgICAgICAgIGlmIChsZXZlbCAhPSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGN1cnJNQi0+Y2JwX2JsayB8PSAweGYwMDAwIDw8IChsbDw8MSkgOwogICAgICAgICAgICAgICAgY29lZl9jdHI9Y29lZl9jdHIrcnVuKzE7CiAgICAgICAgICAgICAgICAvLyBCdWc6IGltZy0+Y29mdSBoYXMgb25seSA0IGVudHJpZXMsIGhlbmNlIGNvZWZfY3RyIE1VU1QgYmUgPDQgKHdoaWNoIGlzCiAgICAgICAgICAgICAgICAvLyBjYXVnaHQgYnkgdGhlIGFzc2VydCgpLiAgSWYgaXQgaXMgYmlnZ2VyIHRoYW4gNCwgaXQgc3RhcnRzIHBhdGNoaW5nIHRoZQogICAgICAgICAgICAgICAgLy8gaW1nLT5wcmVkbW9kZSBwb2ludGVyLCB3aGljaCBsZWFkcyB0byBidWdzIGxhdGVyIG9uLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIFRoaXMgYXNzZXJ0KCkgc2hvdWxkIGJlIGxlZnQgaW4gdGhlIGNvZGUsIGJlY2F1c2UgaXQgY2FwdHVyZXMgYSB2ZXJ5IGxpa2VseQogICAgICAgICAgICAgICAgLy8gYnVnIGVhcmx5IHdoZW4gdGVzdGluZyBpbiBlcnJvciBwcm9uZSBlbnZpcm9ubWVudHMgKG9yIHdoZW4gdGVzdGluZyBOQUwKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uYWxpdHkpLgogICAgICAgICAgICAgICAgYXNzZXJ0IChjb2VmX2N0ciA8IGltZy0+bnVtX2NkY19jb2VmZik7CiAgICAgICAgICAgICAgICBpbWctPmNvZnVbY29lZl9jdHJdPWxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzbWIgLy8gY2hlY2sgdG8gc2VlIGlmIE1CIHR5cGUgaXMgU1ByZWQgb3IgU0ludHJhNHg0CiAgICAgICAgICAgICAgfHwgbG9zc2xlc3NfcXBwcmltZSkKICAgICAgICAgIHsKICAgICAgICAgICAgaW1nLT5jb2ZbMCtsbF1bNF1bMF1bMF09aW1nLT5jb2Z1WzBdOwogICAgICAgICAgICBpbWctPmNvZlsxK2xsXVs0XVswXVswXT1pbWctPmNvZnVbMV07CiAgICAgICAgICAgIGltZy0+Y29mWzArbGxdWzVdWzBdWzBdPWltZy0+Y29mdVsyXTsKICAgICAgICAgICAgaW1nLT5jb2ZbMStsbF1bNV1bMF1bMF09aW1nLT5jb2Z1WzNdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICB0ZW1wWzBdPShpbWctPmNvZnVbMF0raW1nLT5jb2Z1WzFdK2ltZy0+Y29mdVsyXStpbWctPmNvZnVbM10pOwogICAgICAgICAgICB0ZW1wWzFdPShpbWctPmNvZnVbMF0taW1nLT5jb2Z1WzFdK2ltZy0+Y29mdVsyXS1pbWctPmNvZnVbM10pOwogICAgICAgICAgICB0ZW1wWzJdPShpbWctPmNvZnVbMF0raW1nLT5jb2Z1WzFdLWltZy0+Y29mdVsyXS1pbWctPmNvZnVbM10pOwogICAgICAgICAgICB0ZW1wWzNdPShpbWctPmNvZnVbMF0taW1nLT5jb2Z1WzFdLWltZy0+Y29mdVsyXStpbWctPmNvZnVbM10pOwoKICAgICAgICAgICAgZm9yIChpPTA7aTxpbWctPm51bV9jZGNfY29lZmY7aSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYocXBfcGVyX3V2W3V2XTw1KQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdGVtcFtpXT0odGVtcFtpXSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hWzBdWzBdKT4+KDUtcXBfcGVyX3V2W3V2XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHRlbXBbaV09KHRlbXBbaV0qSW52TGV2ZWxTY2FsZTR4NENocm9tYVswXVswXSk8PChxcF9wZXJfdXZbdXZdLTUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpbWctPmNvZlswK2xsXVs0XVswXVswXT10ZW1wWzBdOwogICAgICAgICAgICBpbWctPmNvZlsxK2xsXVs0XVswXVswXT10ZW1wWzFdOwogICAgICAgICAgICBpbWctPmNvZlswK2xsXVs1XVswXVswXT10ZW1wWzJdOwogICAgICAgICAgICBpbWctPmNvZlsxK2xsXVs1XVswXVswXT10ZW1wWzNdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZWNfcGljdHVyZS0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gWVVWNDIyKQogICAgICAgIHsKICAgICAgICAgIGludCBpLGosajE7CiAgICAgICAgICBpbnQgdXZfaWR4ID0gbGw7CiAgICAgICAgICBpbnQgbTNbMl1bNF0gPSB7ezAsMCwwLDB9LHswLDAsMCwwfX07CiAgICAgICAgICBpbnQgbTRbMl1bNF0gPSB7ezAsMCwwLDB9LHswLDAsMCwwfX07CiAgICAgICAgICBpbnQgcXBfcGVyX3V2X2RjID0gKGN1cnJNQi0+cXBjW3V2XSArIDMgKyBpbWctPmJpdGRlcHRoX2Nocm9tYV9xcF9zY2FsZSkvNjsgICAgICAgLy9mb3IgWVVWNDIyIG9ubHkKICAgICAgICAgIGludCBxcF9yZW1fdXZfZGMgPSAoY3Vyck1CLT5xcGNbdXZdICsgMyArIGltZy0+Yml0ZGVwdGhfY2hyb21hX3FwX3NjYWxlKSU2OyAgICAgICAvL2ZvciBZVVY0MjIgb25seQoKICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09IENIUk9NQSBEQyBZVVY0MjIgPT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDKQogICAgICAgICAgewogICAgICAgICAgICByZWFkQ29lZmY0eDRfQ0FWTEMoaW1nLCBpbnAsIENIUk9NQV9EQywgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmFyciwgcnVuYXJyLCAmbnVtY29lZmYpOwogICAgICAgICAgICBjb2VmX2N0cj0tMTsKICAgICAgICAgICAgbGV2ZWw9MTsKICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbnVtY29lZmY7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChsZXZhcnJba10gIT0gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjdXJyTUItPmNicF9ibGsgfD0gKChpbnQ2NCkweGZmMDAwMCkgPDwgKGxsPDwyKTsKICAgICAgICAgICAgICAgIGNvZWZfY3RyPWNvZWZfY3RyK3J1bmFycltrXSsxOwogICAgICAgICAgICAgICAgaTAgPSBTQ0FOX1lVVjQyMltjb2VmX2N0cl1bMF07CiAgICAgICAgICAgICAgICBqMCA9IFNDQU5fWVVWNDIyW2NvZWZfY3RyXVsxXTsKCiAgICAgICAgICAgICAgICBtM1tpMF1bajBdPWxldmFycltrXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgY29lZl9jdHI9LTE7CiAgICAgICAgICAgIGxldmVsPTE7CiAgICAgICAgICAgIGZvcihrPTA7KGs8OSkmJihsZXZlbCE9MCk7aysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgY3VyclNFLmNvbnRleHQgICAgICA9IENIUk9NQV9EQ18yeDQ7CiAgICAgICAgICAgICAgY3VyclNFLnR5cGUgICAgICAgICA9IChJU19JTlRSQShjdXJyTUIpID8gU0VfQ0hSX0RDX0lOVFJBIDogU0VfQ0hSX0RDX0lOVEVSKTsKICAgICAgICAgICAgICBpbWctPmlzX2ludHJhX2Jsb2NrID0gIElTX0lOVFJBKGN1cnJNQik7CiAgICAgICAgICAgICAgaW1nLT5pc192X2Jsb2NrICAgICA9IGxsOwoKICAjaWYgVFJBQ0UKICAgICAgICAgICAgICBzbnByaW50ZihjdXJyU0UudHJhY2VzdHJpbmcsIFRSQUNFU1RSSU5HX1NJWkUsICIyeDQgREMgQ2hyb21hICIpOwogICNlbmRpZgogICAgICAgICAgICAgIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtjdXJyU0UudHlwZV1dKTsKCiAgICAgICAgICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgICAgICAgICAgICBjdXJyU0UubWFwcGluZyA9IGxpbmZvX2xldnJ1bl9jMngyOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZFJ1bkxldmVsX0NBQkFDOwoKICAgICAgICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICAgICAgICAgIGxldmVsID0gY3VyclNFLnZhbHVlMTsKICAgICAgICAgICAgICBydW4gPSBjdXJyU0UudmFsdWUyOwogICAgICAgICAgICAgIGxlbiA9IGN1cnJTRS5sZW47CiAgICAgICAgICAgICAgaWYgKGxldmVsICE9IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3Vyck1CLT5jYnBfYmxrIHw9ICgoaW50NjQpMHhmZjAwMDApIDw8IChsbDw8MikgOwogICAgICAgICAgICAgICAgY29lZl9jdHI9Y29lZl9jdHIrcnVuKzE7CiAgICAgICAgICAgICAgICBhc3NlcnQgKGNvZWZfY3RyIDwgaW1nLT5udW1fY2RjX2NvZWZmKTsKICAgICAgICAgICAgICAgIGkwPVNDQU5fWVVWNDIyW2NvZWZfY3RyXVswXTsKICAgICAgICAgICAgICAgIGowPVNDQU5fWVVWNDIyW2NvZWZfY3RyXVsxXTsKCiAgICAgICAgICAgICAgICBtM1tpMF1bajBdPWxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy8gaW52ZXJzZSBDSFJPTUEgREMgWVVWNDIyIHRyYW5zZm9ybQogICAgICAgICAgLy8gaG9yaXpvbnRhbAogICAgICAgICAgaWYoIWxvc3NsZXNzX3FwcHJpbWUpCiAgICAgICAgICB7CiAgICAgICAgICAgIG00WzBdWzBdID0gbTNbMF1bMF0gKyBtM1sxXVswXTsKICAgICAgICAgICAgbTRbMF1bMV0gPSBtM1swXVsxXSArIG0zWzFdWzFdOwogICAgICAgICAgICBtNFswXVsyXSA9IG0zWzBdWzJdICsgbTNbMV1bMl07CiAgICAgICAgICAgIG00WzBdWzNdID0gbTNbMF1bM10gKyBtM1sxXVszXTsKCiAgICAgICAgICAgIG00WzFdWzBdID0gbTNbMF1bMF0gLSBtM1sxXVswXTsKICAgICAgICAgICAgbTRbMV1bMV0gPSBtM1swXVsxXSAtIG0zWzFdWzFdOwogICAgICAgICAgICBtNFsxXVsyXSA9IG0zWzBdWzJdIC0gbTNbMV1bMl07CiAgICAgICAgICAgIG00WzFdWzNdID0gbTNbMF1bM10gLSBtM1sxXVszXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgZm9yKGk9MDtpPDI7aSsrKQogICAgICAgICAgICAgIGZvcihqPTA7ajw0O2orKykKICAgICAgICAgICAgICAgIGltZy0+Y29mW2krdXZfaWR4XVtqKzRdWzBdWzBdPW0zW2ldW2pdOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHZlcnRpY2FsCiAgICAgICAgICBmb3IgKGk9MDtpPDIgJiYgIWxvc3NsZXNzX3FwcHJpbWU7aSsrKQogICAgICAgICAgewogICAgICAgICAgICBpbnQgKCppbWdjb2YpWzRdWzRdID0gaW1nLT5jb2ZbaSt1dl9pZHhdOwogICAgICAgICAgICBmb3IgKGo9MDsgaiA8IDQ7aisrKSAgICAvL1RPRE86IHJlbW92ZSBtNSB3aXRoIG00CiAgICAgICAgICAgICAgbTVbal09bTRbaV1bal07CgogICAgICAgICAgICBtNlswXT1tNVswXSttNVsyXTsKICAgICAgICAgICAgbTZbMV09bTVbMF0tbTVbMl07CiAgICAgICAgICAgIG02WzJdPW01WzFdLW01WzNdOwogICAgICAgICAgICBtNlszXT1tNVsxXSttNVszXTsKCiAgICAgICAgICAgIGZvciAoaj0wO2o8MjtqKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBqMT0zLWo7CiAgICAgICAgICAgICAgaWYocXBfcGVyX3V2X2RjPDQpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaW50cmEgPT0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaW1nY29mW2ogKzRdWzBdWzBdPSgoKChtNltqXSttNltqMV0pKkludkxldmVsU2NhbGU0eDRDaHJvbWFfSW50cmFbdXZdW3FwX3JlbV91dl9kY11bMF1bMF0rKDE8PCgzLXFwX3Blcl91dl9kYykpKT4+KDQtcXBfcGVyX3V2X2RjKSkrMik+PjI7CiAgICAgICAgICAgICAgICAgIGltZ2NvZltqMSs0XVswXVswXT0oKCgobTZbal0tbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludHJhW3V2XVtxcF9yZW1fdXZfZGNdWzBdWzBdKygxPDwoMy1xcF9wZXJfdXZfZGMpKSk+Pig0LXFwX3Blcl91dl9kYykpKzIpPj4yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBpbWdjb2ZbaiArNF1bMF1bMF09KCgoKG02W2pdK202W2oxXSkqSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRlclt1dl1bcXBfcmVtX3V2X2RjXVswXVswXSsoMTw8KDMtcXBfcGVyX3V2X2RjKSkpPj4oNC1xcF9wZXJfdXZfZGMpKSsyKT4+MjsKICAgICAgICAgICAgICAgICAgaW1nY29mW2oxKzRdWzBdWzBdPSgoKChtNltqXS1tNltqMV0pKkludkxldmVsU2NhbGU0eDRDaHJvbWFfSW50ZXJbdXZdW3FwX3JlbV91dl9kY11bMF1bMF0rKDE8PCgzLXFwX3Blcl91dl9kYykpKT4+KDQtcXBfcGVyX3V2X2RjKSkrMik+PjI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihpbnRyYSA9PSAxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBpbWdjb2ZbaiArNF1bMF1bMF09KCgoKG02W2pdK202W2oxXSkqSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRyYVt1dl1bcXBfcmVtX3V2X2RjXVswXVswXSk8PChxcF9wZXJfdXZfZGMtNCkpKzIpPj4yOwogICAgICAgICAgICAgICAgICBpbWdjb2ZbajErNF1bMF1bMF09KCgoKG02W2pdLW02W2oxXSkqSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRyYVt1dl1bcXBfcmVtX3V2X2RjXVswXVswXSk8PChxcF9wZXJfdXZfZGMtNCkpKzIpPj4yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBpbWdjb2ZbaiArNF1bMF1bMF09KCgoKG02W2pdK202W2oxXSkqSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRlclt1dl1bcXBfcmVtX3V2X2RjXVswXVswXSk8PChxcF9wZXJfdXZfZGMtNCkpKzIpPj4yOwogICAgICAgICAgICAgICAgICBpbWdjb2ZbajErNF1bMF1bMF09KCgoKG02W2pdLW02W2oxXSkqSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRlclt1dl1bcXBfcmVtX3V2X2RjXVswXVswXSk8PChxcF9wZXJfdXZfZGMtNCkpKzIpPj4yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfS8vZm9yIChqPTA7ajwyO2orKykKICAgICAgICAgIH0vL2ZvciAoaT0wO2k8MjtpKyspCiAgICAgICAgfS8vZWxzZSBpZiAoZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjID09IFlVVjQyMikKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT0gQ0hST01BIERDIFlVVjQ0NCA9PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICBpbnQgaSxqLGkxLGoxOwogICAgICAgICAgaW50IHV2X2lkeCA9IDQgKyAobGw8PDEpOwoKICAgICAgICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQykKICAgICAgICAgIHsKICAgICAgICAgICAgcmVhZENvZWZmNHg0X0NBVkxDKGltZywgaW5wLCBDSFJPTUFfREMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZhcnIsIHJ1bmFyciwgJm51bWNvZWZmKTsKICAgICAgICAgICAgY29lZl9jdHI9LTE7CiAgICAgICAgICAgIGxldmVsPTE7CiAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG51bWNvZWZmOyBrKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAobGV2YXJyW2tdICE9IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3Vyck1CLT5jYnBfYmxrIHw9ICgoaW50NjQpMHhmZmZmMDAwMCkgPDwgKGxsPDwzKSA7CiAgICAgICAgICAgICAgICBjb2VmX2N0cj1jb2VmX2N0citydW5hcnJba10rMTsKICAgICAgICAgICAgICAgIGkwPVNOR0xfU0NBTltjb2VmX2N0cl1bMF07CiAgICAgICAgICAgICAgICBqMD1TTkdMX1NDQU5bY29lZl9jdHJdWzFdOwoKICAgICAgICAgICAgICAgIGltZy0+Y29mW2kwXVtqMCt1dl9pZHhdWzBdWzBdPWxldmFycltrXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgY29lZl9jdHI9LTE7CiAgICAgICAgICAgIGxldmVsPTE7CiAgICAgICAgICAgIGZvcihrPTA7KGs8MTcpJiYobGV2ZWwhPTApO2srKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIGN1cnJTRS5jb250ZXh0ICAgICAgPSBDSFJPTUFfRENfNHg0OwogICAgICAgICAgICAgIGN1cnJTRS50eXBlICAgICAgICAgPSAoSVNfSU5UUkEoY3Vyck1CKSA/IFNFX0NIUl9EQ19JTlRSQSA6IFNFX0NIUl9EQ19JTlRFUik7CiAgICAgICAgICAgICAgaW1nLT5pc19pbnRyYV9ibG9jayA9ICBJU19JTlRSQShjdXJyTUIpOwogICAgICAgICAgICAgIGltZy0+aXNfdl9ibG9jayAgICAgPSBsbDsKCiAgI2lmIFRSQUNFCiAgICAgICAgICAgICAgc25wcmludGYoY3VyclNFLnRyYWNlc3RyaW5nLCBUUkFDRVNUUklOR19TSVpFLCAiREMgQ2hyb21hICIpOwogICNlbmRpZgogICAgICAgICAgICAgIGRQID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbcGFydE1hcFtjdXJyU0UudHlwZV1dKTsKCiAgICAgICAgICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgICAgICAgICAgICBjdXJyU0UubWFwcGluZyA9IGxpbmZvX2xldnJ1bl9jMngyOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGN1cnJTRS5yZWFkaW5nID0gcmVhZFJ1bkxldmVsX0NBQkFDOwoKICAgICAgICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICAgICAgICAgIGxldmVsID0gY3VyclNFLnZhbHVlMTsKICAgICAgICAgICAgICBydW4gPSBjdXJyU0UudmFsdWUyOwogICAgICAgICAgICAgIGxlbiA9IGN1cnJTRS5sZW47CiAgICAgICAgICAgICAgaWYgKGxldmVsICE9IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3Vyck1CLT5jYnBfYmxrIHw9ICgoaW50NjQpMHhmZmZmMDAwMCkgPDwgKGxsPDwzKSA7CiAgICAgICAgICAgICAgICBjb2VmX2N0cj1jb2VmX2N0citydW4rMTsKICAgICAgICAgICAgICAgIGFzc2VydCAoY29lZl9jdHIgPCBpbWctPm51bV9jZGNfY29lZmYpOwogICAgICAgICAgICAgICAgaTA9U05HTF9TQ0FOW2NvZWZfY3RyXVswXTsKICAgICAgICAgICAgICAgIGowPVNOR0xfU0NBTltjb2VmX2N0cl1bMV07CgogICAgICAgICAgICAgICAgaW1nLT5jb2ZbaTBdW2owK3V2X2lkeF1bMF1bMF09bGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gaW52ZXJzZSBDSFJPTUEgREMgWVVWNDQ0IHRyYW5zZm9ybQogICAgICAgICAgLy8gaG9yaXpvbnRhbAogICAgICAgICAgZm9yIChqPXV2X2lkeDsgKGogPCA0K3V2X2lkeCkgJiYgIWxvc3NsZXNzX3FwcHJpbWU7aisrKQogICAgICAgICAgewogICAgICAgICAgICBmb3IgKGk9MDtpPDQ7aSsrKQogICAgICAgICAgICAgIG01W2ldPWltZy0+Y29mW2ldW2pdWzBdWzBdOwoKICAgICAgICAgICAgbTZbMF09bTVbMF0rbTVbMl07CiAgICAgICAgICAgIG02WzFdPW01WzBdLW01WzJdOwogICAgICAgICAgICBtNlsyXT1tNVsxXS1tNVszXTsKICAgICAgICAgICAgbTZbM109bTVbMV0rbTVbM107CgogICAgICAgICAgICBmb3IgKGk9MDtpPDI7aSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaTE9My1pOwogICAgICAgICAgICAgIGltZy0+Y29mW2ldW2pdWzBdWzBdPSBtNltpXSttNltpMV07CiAgICAgICAgICAgICAgaW1nLT5jb2ZbaTFdW2pdWzBdWzBdPW02W2ldLW02W2kxXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIHZlcnRpY2FsCiAgICAgICAgICBmb3IgKGk9MDtpPDQgJiYgIWxvc3NsZXNzX3FwcHJpbWU7aSsrKQogICAgICAgICAgewogICAgICAgICAgICBmb3IgKGo9MDsgaiA8IDQ7aisrKQogICAgICAgICAgICAgIG01W2pdPWltZy0+Y29mW2ldW2ordXZfaWR4XVswXVswXTsKCiAgICAgICAgICAgIG02WzBdPW01WzBdK201WzJdOwogICAgICAgICAgICBtNlsxXT1tNVswXS1tNVsyXTsKICAgICAgICAgICAgbTZbMl09bTVbMV0tbTVbM107CiAgICAgICAgICAgIG02WzNdPW01WzFdK201WzNdOwoKICAgICAgICAgICAgZm9yIChqPTA7ajwyO2orKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIGoxPTMtajsKICAgICAgICAgICAgICBpZihxcF9wZXJfdXZbdXZdPDQpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaW50cmEgPT0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1baiArdXZfaWR4XVswXVswXT0oKCgobTZbal0rbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludHJhW3V2XVtxcF9yZW1fdXZbdXZdXVswXVswXSsoMTw8KDMtcXBfcGVyX3V2W3V2XSkpKT4+KDQtcXBfcGVyX3V2W3V2XSkpKzIpPj4yOwogICAgICAgICAgICAgICAgICBpbWctPmNvZltpXVtqMSt1dl9pZHhdWzBdWzBdPSgoKChtNltqXS1tNltqMV0pKkludkxldmVsU2NhbGU0eDRDaHJvbWFfSW50cmFbdXZdW3FwX3JlbV91dlt1dl1dWzBdWzBdKygxPDwoMy1xcF9wZXJfdXZbdXZdKSkpPj4oNC1xcF9wZXJfdXZbdXZdKSkrMik+PjI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGltZy0+Y29mW2ldW2ogK3V2X2lkeF1bMF1bMF09KCgoKG02W2pdK202W2oxXSkqSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRlclt1dl1bcXBfcmVtX3V2W3V2XV1bMF1bMF0rKDE8PCgzLXFwX3Blcl91dlt1dl0pKSk+Pig0LXFwX3Blcl91dlt1dl0pKSsyKT4+MjsKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1bajErdXZfaWR4XVswXVswXT0oKCgobTZbal0tbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludGVyW3V2XVtxcF9yZW1fdXZbdXZdXVswXVswXSsoMTw8KDMtcXBfcGVyX3V2W3V2XSkpKT4+KDQtcXBfcGVyX3V2W3V2XSkpKzIpPj4yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaW50cmEgPT0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1baiArdXZfaWR4XVswXVswXT0oKCgobTZbal0rbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludHJhW3V2XVtxcF9yZW1fdXZbdXZdXVswXVswXSk8PChxcF9wZXJfdXZbdXZdLTQpKSsyKT4+MjsKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1bajErdXZfaWR4XVswXVswXT0oKCgobTZbal0tbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludHJhW3V2XVtxcF9yZW1fdXZbdXZdXVswXVswXSk8PChxcF9wZXJfdXZbdXZdLTQpKSsyKT4+MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1baiArdXZfaWR4XVswXVswXT0oKCgobTZbal0rbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludGVyW3V2XVtxcF9yZW1fdXZbdXZdXVswXVswXSk8PChxcF9wZXJfdXZbdXZdLTQpKSsyKT4+MjsKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1bajErdXZfaWR4XVswXVswXT0oKCgobTZbal0tbTZbajFdKSpJbnZMZXZlbFNjYWxlNHg0Q2hyb21hX0ludGVyW3V2XVtxcF9yZW1fdXZbdXZdXVswXVswXSk8PChxcF9wZXJfdXZbdXZdLTQpKSsyKT4+MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0vL2ZvciAoaT0wO2k8NDtpKyspCiAgICAgICAgfS8vZWxzZSAoZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjID09IFlVVjQ0NCkKICAgICAgfS8vZm9yIChsbD0wO2xsPDM7bGwrPTIpCiAgICB9CgogICAgLy8gY2hyb21hIEFDIGNvZWZmLCBhbGwgemVybyBmcmFtIHN0YXJ0X3NjYW4KICAgIGlmIChjYnA8PTMxKQogICAgICAgIGZvciAoaT0wOyBpIDwgNDsgaSsrKQogICAgICAgICAgbWVtc2V0KCZpbWctPm56X2NvZWZmIFtpbWctPmN1cnJlbnRfbWJfbnIgXVtpXVs0XSwgMCwgaW1nLT5udW1fYmxrOHg4X3V2ICogc2l6ZW9mKGludCkpOwoKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09IENIUk9NQSBBQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBjaHJvbWEgQUMgY29lZmYsIGFsbCB6ZXJvIGZyYW0gc3RhcnRfc2NhbgogICAgaWYgKGNicD4zMSkKICAgIHsKICAgICAgZm9yIChiOD0wOyBiOCA8IGltZy0+bnVtX2Jsazh4OF91djsgYjgrKykKICAgICAgewogICAgICAgIGludCB1dmMgPSAoYjggPiAoKGltZy0+bnVtX2Jsazh4OF91dj4+MSkgLSAxICkpOwogICAgICAgIGludCAoKkludkxldmVsU2NhbGU0eDRDaHJvbWEpWzRdID0gaW50cmEKICAgICAgICAgID8gSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRyYVt1dmNdW3FwX3JlbV91dlt1dmNdXSAKICAgICAgICAgIDogSW52TGV2ZWxTY2FsZTR4NENocm9tYV9JbnRlclt1dmNdW3FwX3JlbV91dlt1dmNdXTsKCiAgICAgICAgaW1nLT5pc192X2Jsb2NrID0gdXYgPSB1dmM7CgogICAgICAgIGZvciAoYjQ9MDsgYjQgPCA0OyBiNCsrKQogICAgICAgIHsKICAgICAgICAgIGkgPSBjb2Z1dl9ibGtfeFt5dXZdW2I4XVtiNF07CiAgICAgICAgICBqID0gY29mdXZfYmxrX3lbeXV2XVtiOF1bYjRdOwoKCiAgICAgICAgICBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMpCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlYWRDb2VmZjR4NF9DQVZMQyhpbWcsIGlucCwgQ0hST01BX0FDLCBpLCBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmFyciwgcnVuYXJyLCAmbnVtY29lZmYpOwogICAgICAgICAgICBjb2VmX2N0cj0wOwogICAgICAgICAgICBsZXZlbD0xOwogICAgICAgICAgICBpZighbG9zc2xlc3NfcXBwcmltZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG51bWNvZWZmO2srKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGV2YXJyW2tdICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Y2JwX2JsayB8PSAoKGludDY0KTEpIDw8IGNicF9ibGtfY2hyb21hW2I4XVtiNF07CiAgICAgICAgICAgICAgICAgIGNvZWZfY3RyPWNvZWZfY3RyK3J1bmFycltrXSsxOwoKICAgICAgICAgICAgICAgICAgaTA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzBdOwogICAgICAgICAgICAgICAgICBqMD1wb3Nfc2NhbjR4NFtjb2VmX2N0cl1bMV07CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBpbWctPmNvZltpXVtqXVtqMF1baTBdID0gcnNoaWZ0X3JuZF9zZigobGV2YXJyW2tdKkludkxldmVsU2NhbGU0eDRDaHJvbWFbajBdW2kwXSk8PHFwX3Blcl91dlt1dl0sIDQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBudW1jb2VmZjtrKyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGxldmFycltrXSAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBjdXJyTUItPmNicF9ibGsgfD0gKChpbnQ2NCkxKSA8PCBjYnBfYmxrX2Nocm9tYVtiOF1bYjRdOwogICAgICAgICAgICAgICAgICBjb2VmX2N0cj1jb2VmX2N0citydW5hcnJba10rMTsKCiAgICAgICAgICAgICAgICAgIGkwPXBvc19zY2FuNHg0W2NvZWZfY3RyXVswXTsKICAgICAgICAgICAgICAgICAgajA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzFdOwoKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1bal1bajBdW2kwXT1sZXZhcnJba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGNvZWZfY3RyPTA7CiAgICAgICAgICAgIGxldmVsPTE7CgogICAgICAgICAgICBpbWctPnN1YmJsb2NrX3kgPSBzdWJibGtfb2Zmc2V0X3lbeXV2XVtiOF1bYjRdPj4yOwogICAgICAgICAgICBpbWctPnN1YmJsb2NrX3ggPSBzdWJibGtfb2Zmc2V0X3hbeXV2XVtiOF1bYjRdPj4yOwoKICAgICAgICAgICAgY3VyclNFLmNvbnRleHQgICAgICA9IENIUk9NQV9BQzsKICAgICAgICAgICAgY3VyclNFLnR5cGUgICAgICAgICA9IChJU19JTlRSQShjdXJyTUIpID8gU0VfQ0hSX0FDX0lOVFJBIDogU0VfQ0hSX0FDX0lOVEVSKTsKICAgICAgICAgICAgaW1nLT5pc19pbnRyYV9ibG9jayA9ICBJU19JTlRSQShjdXJyTUIpOwoKICAgICAgICAgICAgaWYoIWxvc3NsZXNzX3FwcHJpbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmb3Ioaz0wOyhrPDE2KSYmKGxldmVsIT0wKTtrKyspCiAgICAgICAgICAgICAgewojaWYgVFJBQ0UKICAgICAgICAgICAgICAgIHNucHJpbnRmKGN1cnJTRS50cmFjZXN0cmluZywgVFJBQ0VTVFJJTkdfU0laRSwgIkFDIENocm9tYSAiKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBkUCA9ICYoY3VyclNsaWNlLT5wYXJ0QXJyW3BhcnRNYXBbY3VyclNFLnR5cGVdXSk7CgogICAgICAgICAgICAgICAgaWYgKGFjdGl2ZV9wcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBVVkxDIHx8IGRQLT5iaXRzdHJlYW0tPmVpX2ZsYWcpCiAgICAgICAgICAgICAgICAgIGN1cnJTRS5tYXBwaW5nID0gbGluZm9fbGV2cnVuX2ludGVyOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBjdXJyU0UucmVhZGluZyA9IHJlYWRSdW5MZXZlbF9DQUJBQzsKCiAgICAgICAgICAgICAgICBkUC0+cmVhZFN5bnRheEVsZW1lbnQoJmN1cnJTRSxpbWcsZFApOwogICAgICAgICAgICAgICAgbGV2ZWwgPSBjdXJyU0UudmFsdWUxOwogICAgICAgICAgICAgICAgcnVuID0gY3VyclNFLnZhbHVlMjsKICAgICAgICAgICAgICAgIGxlbiA9IGN1cnJTRS5sZW47CgogICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Y2JwX2JsayB8PSAoKGludDY0KTEpIDw8IGNicF9ibGtfY2hyb21hW2I4XVtiNF07CiAgICAgICAgICAgICAgICAgIGNvZWZfY3RyICs9IChydW4gKyAxKTsKCiAgICAgICAgICAgICAgICAgIGkwPXBvc19zY2FuNHg0W2NvZWZfY3RyXVswXTsKICAgICAgICAgICAgICAgICAgajA9cG9zX3NjYW40eDRbY29lZl9jdHJdWzFdOwoKICAgICAgICAgICAgICAgICAgaW1nLT5jb2ZbaV1bal1bajBdW2kwXSA9IHJzaGlmdF9ybmRfc2YoKGxldmVsKkludkxldmVsU2NhbGU0eDRDaHJvbWFbajBdW2kwXSk8PHFwX3Blcl91dlt1dl0sIDQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gLy9mb3Ioaz0wOyhrPDE2KSYmKGxldmVsIT0wKTtrKyspCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgZm9yKGs9MDsoazwxNikmJihsZXZlbCE9MCk7aysrKQogICAgICAgICAgICAgIHsKI2lmIFRSQUNFCiAgICAgICAgICAgICAgICBzbnByaW50ZihjdXJyU0UudHJhY2VzdHJpbmcsIFRSQUNFU1RSSU5HX1NJWkUsICJBQyBDaHJvbWEgIik7CiNlbmRpZgogICAgICAgICAgICAgICAgZFAgPSAmKGN1cnJTbGljZS0+cGFydEFycltwYXJ0TWFwW2N1cnJTRS50eXBlXV0pOwoKICAgICAgICAgICAgICAgIGlmIChhY3RpdmVfcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVVZMQyB8fCBkUC0+Yml0c3RyZWFtLT5laV9mbGFnKQogICAgICAgICAgICAgICAgICBjdXJyU0UubWFwcGluZyA9IGxpbmZvX2xldnJ1bl9pbnRlcjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgY3VyclNFLnJlYWRpbmcgPSByZWFkUnVuTGV2ZWxfQ0FCQUM7CgogICAgICAgICAgICAgICAgZFAtPnJlYWRTeW50YXhFbGVtZW50KCZjdXJyU0UsaW1nLGRQKTsKICAgICAgICAgICAgICAgIGxldmVsID0gY3VyclNFLnZhbHVlMTsKICAgICAgICAgICAgICAgIHJ1biA9IGN1cnJTRS52YWx1ZTI7CiAgICAgICAgICAgICAgICBsZW4gPSBjdXJyU0UubGVuOwoKICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBjdXJyTUItPmNicF9ibGsgfD0gKChpbnQ2NCkxKSA8PCBjYnBfYmxrX2Nocm9tYVtiOF1bYjRdOwogICAgICAgICAgICAgICAgICBjb2VmX2N0ciArPSAocnVuICsgMSk7CgogICAgICAgICAgICAgICAgICBpMD1wb3Nfc2NhbjR4NFtjb2VmX2N0cl1bMF07CiAgICAgICAgICAgICAgICAgIGowPXBvc19zY2FuNHg0W2NvZWZfY3RyXVsxXTsKCiAgICAgICAgICAgICAgICAgIGltZy0+Y29mW2ldW2pdW2owXVtpMF09bGV2ZWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSAvL2ZvcihrPTA7KGs8MTYpJiYobGV2ZWwhPTApO2srKykKICAgICAgICAgICAgfQogICAgICAgICAgfSAvL2Vsc2UgLyBpZiAoYWN0aXZlX3Bwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFVWTEMpCiAgICAgICAgfSAvL2ZvciAoYjQ9MDsgYjQgPCA0OyBiNCsrKQogICAgICB9IC8vZm9yIChiOD0wOyBiOCA8IGltZy0+bnVtX2Jsazh4OF91djsgYjgrKykKICAgIH0gLy9pZiAoY2JwPjMxKQogIH0gLy9pZiAoZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjICE9IFlVVjQwMCkKfQoKCi8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBDb3B5IElQQ00gY29lZmZpY2llbnRzIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIgYW5kIHNldCBwYXJhbWV0ZXJzIGZvciB0aGlzIE1CCiAqICAgIChmb3IgSVBDTSBDQUJBQyBhbmQgSVBDTSBDQVZMQyAgMjgvMTEvMjAwMykKICoKICogXGF1dGhvcgogKiAgICBEb25nIFdhbmcgPERvbmcuV2FuZ0BicmlzdG9sLmFjLnVrPgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKdm9pZCBkZWNvZGVfaXBjbV9tYihzdHJ1Y3QgaW1nX3BhciAqaW1nKQp7CiAgaW50IGksajsKCiAgTWFjcm9ibG9jayAqY3Vyck1iID0gJmltZy0+bWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnJdOwoKICAvL0NvcHkgY29lZmZpY2llbnRzIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKICAvL0lQQ00gY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgaW4gaW1nLT5jb2Ygd2hpY2ggaXMgc2V0IGluIGZ1bmN0aW9uIHJlYWRJUENNY29lZmZzRnJvbU5BTCgpCgogIGZvcihpPTA7aTwxNjtpKyspCiAgICBmb3Ioaj0wO2o8MTY7aisrKQogICAgICBkZWNfcGljdHVyZS0+aW1nWVtpbWctPnBpeF95K2ldW2ltZy0+cGl4X3gral09aW1nLT5jb2ZbKGk+PjIpXVsoaj4+MildW2kgJiAweDAzXVtqICYgMHgwM107CgogIGlmIChkZWNfcGljdHVyZS0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gWVVWNDAwKQogIHsKICAgIGZvcihpPTA7aTxpbWctPm1iX2NyX3NpemVfeTtpKyspCiAgICAgIGZvcihqPTA7ajxpbWctPm1iX2NyX3NpemVfeDtqKyspCiAgICAgICAgZGVjX3BpY3R1cmUtPmltZ1VWWzBdW2ltZy0+cGl4X2NfeStpXVtpbWctPnBpeF9jX3gral09aW1nLT5jb2ZbKGk+PjIpICBdWyhqPj4yKSs0XVtpICYgMHgwM11baiAmIDB4MDNdOyAgCgogICAgZm9yKGk9MDtpPGltZy0+bWJfY3Jfc2l6ZV95O2krKykKICAgICAgZm9yKGo9MDtqPGltZy0+bWJfY3Jfc2l6ZV94O2orKykKICAgICAgICBkZWNfcGljdHVyZS0+aW1nVVZbMV1baW1nLT5waXhfY195K2ldW2ltZy0+cGl4X2NfeCtqXT1pbWctPmNvZlsoaT4+MikrMl1bKGo+PjIpKzRdW2kgJiAweDAzXVtqICYgMHgwM107IAogIH0KCiAgLy8gZm9yIGRlYmxvY2tpbmcgZmlsdGVyCiAgY3Vyck1iLT5xcD0wOwogIHNldF9jaHJvbWFfcXAoY3Vyck1iKTsKCiAgLy8gZm9yIENBVkxDOiBTZXQgdGhlIG56X2NvZWZmIHRvIDE2LgogIC8vIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHRvIGJlIHVzZWQgaW4gQ0FWTEMgZGVjb2Rpbmcgb2YgbmVpZ2hib3VyIGJsb2NrcwogIGZvcihpPTA7aTw0O2krKykKICAgIGZvciAoaj0wO2o8KDQgKyBpbWctPm51bV9ibGs4eDhfdXYpO2orKykKICAgICAgaW1nLT5uel9jb2VmZltpbWctPmN1cnJlbnRfbWJfbnJdW2ldW2pdPTE2OwoKCiAgLy8gZm9yIENBQkFDIGRlY29kaW5nIG9mIE1CIHNraXAgZmxhZwogIGN1cnJNYi0+c2tpcF9mbGFnID0gMDsKCiAgLy9mb3IgZGVibG9ja2luZyBmaWx0ZXIgQ0FCQUMKICBjdXJyTWItPmNicF9ibGs9MHhGRkZGOwoKICAvL0ZvciBDQUJBQyBkZWNvZGluZyBvZiBEcXVhbnQKICBsYXN0X2RxdWFudD0wOwp9CgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgZGVjb2RlIG9uZSBtYWNyb2Jsb2NrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgppbnQgZGVjb2RlX29uZV9tYWNyb2Jsb2NrKHN0cnVjdCBpbWdfcGFyICppbWcsc3RydWN0IGlucF9wYXIgKmlucCkKewogIGludCB0bXBfYmxvY2tbQkxPQ0tfU0laRV1bQkxPQ0tfU0laRV07CiAgaW50IHRtcF9ibG9ja2J3W0JMT0NLX1NJWkVdW0JMT0NLX1NJWkVdOwogIGludCBpPTAsaj0wLGssbCxpaT0wLGpqPTAsaTE9MCxqMT0wLGo0PTAsaTQ9MDsKICBpbnQgdXYsIGh2OwogIGludCB2ZWMxX3g9MCx2ZWMxX3k9MCx2ZWMyX3g9MCx2ZWMyX3k9MDsKICBpbnQgaW9mZixqb2ZmOwogIGludCBibG9jazh4ODsgICAvLyBuZWVkZWQgZm9yIEFCVAoKICBpbnQgYndfcHJlZD0wLCBmd19wcmVkPTAsIHByZWQsIGlmeDsKICBpbnQgaWkwLGpqMCxpaTEsamoxLGlmMSxqZjEsaWYwLGpmMDsKICBpbnQgbXZfbXVsLCBmMV94LCBmMV95LCBmMl94LCBmMl95LCBmMywgZjQ7CgogIHN0YXRpYyBjb25zdCBieXRlIGRlY29kZV9ibG9ja19zY2FuWzE2XSA9IHswLDEsNCw1LDIsMyw2LDcsOCw5LDEyLDEzLDEwLDExLDE0LDE1fTsKCiAgTWFjcm9ibG9jayAqY3Vyck1CICAgPSAmaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl07CiAgc2hvcnQgcmVmX2lkeCwgbDBfcmVmZnJhbWU9LTEsIGwxX3JlZmZyYW1lPS0xOwogIGludCBtdl9tb2RlLCBwcmVkX2RpciwgaW50cmFfcHJlZGljdGlvbjsgLy8gPSBjdXJyTUItPnJlZl9mcmFtZTsKICBzaG9ydCBsMF9yZWZfaWR4PS0xLCBsMV9yZWZfaWR4PS0xOwogIGludCBhbHBoYV9sMCwgYWxwaGFfbDEsIHdwX29mZnNldDsKCiAgc2hvcnQgICoqKiBtdl9hcnJheSwgKioqbDBfbXZfYXJyYXksICoqKmwxX212X2FycmF5OwoKICBpbnQgbXZfc2NhbGU7CgogIGludCBtYl9uciAgICAgPSBpbWctPmN1cnJlbnRfbWJfbnI7CiAgaW50IHNtYiAgICAgICA9ICgoaW1nLT50eXBlPT1TUF9TTElDRSkgJiYgSVNfSU5URVIgKGN1cnJNQikpIHx8IChpbWctPnR5cGUgPT0gU0lfU0xJQ0UgJiYgY3Vyck1CLT5tYl90eXBlID09IFNJNE1CKTsKICBpbnQgbGlzdF9vZmZzZXQ7CiAgaW50IG1heF95X2NyOwoKICBTdG9yYWJsZVBpY3R1cmUgKipsaXN0OwoKICBpbnQgamY7CgogIHNpZ25lZCBjaGFyIGwwX3JGcmFtZSA9IC0xLCBsMV9yRnJhbWUgPSAtMTsKCiAgc2hvcnQgcG12bDBbMl09ezAsMH0sCiAgICAgICAgcG12bDFbMl09ezAsMH07CgogIGludCBkaXJlY3RfcGRpcj0tMTsKCiAgaW50IGN1cnJfbWJfZmllbGQgPSAoKGltZy0+TWJhZmZGcmFtZUZsYWcpJiYoY3Vyck1CLT5tYl9maWVsZCkpOwoKICBieXRlICAqKiAgICBtb3ZpbmdfYmxvY2s7CiAgc2hvcnQgKioqKiAgY29fbG9jYXRlZF9tdjsKICBzaWduZWQgY2hhciAqKiogY29fbG9jYXRlZF9yZWZfaWR4OwogIGludDY0ICoqKiAgIGNvX2xvY2F0ZWRfcmVmX2lkOwoKICBpbnQgbmVlZF80eDRfdHJhbnNmb3JtID0gKCFjdXJyTUItPmx1bWFfdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcpOwoKICBpbnQgYjgsIGI0OwogIGludCB1dl9zaGlmdDsKICBpbnQgeXV2ID0gZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjIC0gMTsKCiAgaWYoaW1nLT50eXBlPT1TUF9TTElDRSAmJiBjdXJyTUItPm1iX3R5cGUhPUkxNk1CKQogICAgc21iPTE7Ly8gbW9kaWYgRVMgYWRkZWQKCiAgaWYoY3Vyck1CLT5tYl90eXBlPT1JUENNKQogIHsKICAgIC8vY29weSByZWFkZWQgZGF0YSBpbnRvIGltZ1kgYW5kIHNldCBwYXJhbWV0ZXJzCiAgICBkZWNvZGVfaXBjbV9tYihpbWcpOwogICAgcmV0dXJuIDA7CiAgfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgLy8gZmluZCBvdXQgdGhlIGNvcnJlY3QgbGlzdCBvZmZzZXRzCiAgaWYgKGN1cnJfbWJfZmllbGQpCiAgewogICAgaWYobWJfbnImMHgwMSkKICAgIHsKICAgICAgbGlzdF9vZmZzZXQgPSA0OyAvLyB0b3AgZmllbGQgbWIKICAgICAgbW92aW5nX2Jsb2NrID0gQ29fbG9jYXRlZC0+Ym90dG9tX21vdmluZ19ibG9jazsKICAgICAgY29fbG9jYXRlZF9tdiA9IENvX2xvY2F0ZWQtPmJvdHRvbV9tdjsKICAgICAgY29fbG9jYXRlZF9yZWZfaWR4ID0gQ29fbG9jYXRlZC0+Ym90dG9tX3JlZl9pZHg7CiAgICAgIGNvX2xvY2F0ZWRfcmVmX2lkID0gQ29fbG9jYXRlZC0+Ym90dG9tX3JlZl9waWNfaWQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGxpc3Rfb2Zmc2V0ID0gMjsgLy8gYm90dG9tIGZpZWxkIG1iCiAgICAgIG1vdmluZ19ibG9jayA9IENvX2xvY2F0ZWQtPnRvcF9tb3ZpbmdfYmxvY2s7CiAgICAgIGNvX2xvY2F0ZWRfbXYgPSBDb19sb2NhdGVkLT50b3BfbXY7CiAgICAgIGNvX2xvY2F0ZWRfcmVmX2lkeCA9IENvX2xvY2F0ZWQtPnRvcF9yZWZfaWR4OwogICAgICBjb19sb2NhdGVkX3JlZl9pZCA9IENvX2xvY2F0ZWQtPnRvcF9yZWZfcGljX2lkOwogICAgfQogICAgbWF4X3lfY3IgPSAoZGVjX3BpY3R1cmUtPnNpemVfeV9jcj4+MSktMTsKICB9CiAgZWxzZQogIHsKICAgIGxpc3Rfb2Zmc2V0ID0gMDsgIC8vIG5vIG1iIGFmZiBvciBmcmFtZSBtYgogICAgbW92aW5nX2Jsb2NrID0gQ29fbG9jYXRlZC0+bW92aW5nX2Jsb2NrOwogICAgY29fbG9jYXRlZF9tdiA9IENvX2xvY2F0ZWQtPm12OwogICAgY29fbG9jYXRlZF9yZWZfaWR4ID0gQ29fbG9jYXRlZC0+cmVmX2lkeDsKICAgIGNvX2xvY2F0ZWRfcmVmX2lkID0gQ29fbG9jYXRlZC0+cmVmX3BpY19pZDsKICAgIG1heF95X2NyID0gZGVjX3BpY3R1cmUtPnNpemVfeV9jci0xOwogIH0KCiAgaWYgKCFpbWctPk1iYWZmRnJhbWVGbGFnKQogIHsKICAgIGZvciAobCA9IExJU1RfMCArIGxpc3Rfb2Zmc2V0OyBsIDw9IChMSVNUXzEgKyBsaXN0X29mZnNldCk7IGwrKykKICAgIHsKICAgICAgZm9yKGsgPSAwOyBrIDwgbGlzdFhzaXplW2xdOyBrKyspCiAgICAgIHsKICAgICAgICBsaXN0WFtsXVtrXS0+Y2hyb21hX3ZlY3Rvcl9hZGp1c3RtZW50PSAwOwogICAgICAgIGlmKGltZy0+c3RydWN0dXJlID09IFRPUF9GSUVMRCAmJiBpbWctPnN0cnVjdHVyZSAhPSBsaXN0WFtsXVtrXS0+c3RydWN0dXJlKQogICAgICAgICAgbGlzdFhbbF1ba10tPmNocm9tYV92ZWN0b3JfYWRqdXN0bWVudCA9IC0yOwogICAgICAgIGlmKGltZy0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCAmJiBpbWctPnN0cnVjdHVyZSAhPSBsaXN0WFtsXVtrXS0+c3RydWN0dXJlKQogICAgICAgICAgbGlzdFhbbF1ba10tPmNocm9tYV92ZWN0b3JfYWRqdXN0bWVudCA9IDI7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGlmIChjdXJyX21iX2ZpZWxkKQogICAgewogICAgICBmb3IgKGwgPSBMSVNUXzAgKyBsaXN0X29mZnNldDsgbCA8PSAoTElTVF8xICsgbGlzdF9vZmZzZXQpOyBsKyspCiAgICAgIHsKICAgICAgICBmb3IoayA9IDA7IGsgPCBsaXN0WHNpemVbbF07IGsrKykKICAgICAgICB7CiAgICAgICAgICBsaXN0WFtsXVtrXS0+Y2hyb21hX3ZlY3Rvcl9hZGp1c3RtZW50PSAwOwogICAgICAgICAgaWYoaW1nLT5jdXJyZW50X21iX25yICUgMiA9PSAwICYmIGxpc3RYW2xdW2tdLT5zdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKQogICAgICAgICAgICBsaXN0WFtsXVtrXS0+Y2hyb21hX3ZlY3Rvcl9hZGp1c3RtZW50ID0gLTI7CiAgICAgICAgICBpZihpbWctPmN1cnJlbnRfbWJfbnIgJSAyID09IDEgJiYgbGlzdFhbbF1ba10tPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQpCiAgICAgICAgICAgIGxpc3RYW2xdW2tdLT5jaHJvbWFfdmVjdG9yX2FkanVzdG1lbnQgPSAyOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBmb3IgKGwgPSBMSVNUXzAgKyBsaXN0X29mZnNldDsgbCA8PSAoTElTVF8xICsgbGlzdF9vZmZzZXQpOyBsKyspCiAgICAgIHsKICAgICAgICBmb3IoayA9IDA7IGsgPCBsaXN0WHNpemVbbF07IGsrKykKICAgICAgICB7CiAgICAgICAgICBsaXN0WFtsXVtrXS0+Y2hyb21hX3ZlY3Rvcl9hZGp1c3RtZW50PSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgbXZfbXVsPTQ7CgogIC8vIGx1bWEgZGVjb2RpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgLy8gZ2V0IHByZWRpY3Rpb24gZm9yIElOVFJBX01CXzE2eDE2CiAgaWYgKElTX05FV0lOVFJBIChjdXJyTUIpKQogIHsKICAgIGludHJhcHJlZF9sdW1hXzE2eDE2KGltZywgY3Vyck1CLT5pMTZtb2RlKTsKICB9CgogIGlmIChpbWctPnR5cGU9PUJfU0xJQ0UgJiYgaW1nLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgJiYgKElTX0RJUkVDVCAoY3Vyck1CKSB8fAogICAgKElTX1A4eDgoY3Vyck1CKSAmJiAhKGN1cnJNQi0+Yjhtb2RlWzBdICYmIGN1cnJNQi0+Yjhtb2RlWzFdICYmIGN1cnJNQi0+Yjhtb2RlWzJdICYmIGN1cnJNQi0+Yjhtb2RlWzNdKSkpKQogIHsKICAgIHNpZ25lZCBjaGFyIGwwX3JGcmFtZUwsIGwwX3JGcmFtZVUsIGwwX3JGcmFtZVVMLCBsMF9yRnJhbWVVUjsKICAgIHNpZ25lZCBjaGFyIGwxX3JGcmFtZUwsIGwxX3JGcmFtZVUsIGwxX3JGcmFtZVVMLCBsMV9yRnJhbWVVUjsKCiAgICBQaXhlbFBvcyBtYl9sZWZ0LCBtYl91cCwgbWJfdXBsZWZ0LCBtYl91cHJpZ2h0OwoKICAgIGdldEx1bWE0eDROZWlnaGJvdXIoaW1nLT5jdXJyZW50X21iX25yLCAtMSwgIDAsICZtYl9sZWZ0KTsKICAgIGdldEx1bWE0eDROZWlnaGJvdXIoaW1nLT5jdXJyZW50X21iX25yLCAgMCwgLTEsICZtYl91cCk7CiAgICBnZXRMdW1hNHg0TmVpZ2hib3VyKGltZy0+Y3VycmVudF9tYl9uciwgMTYsIC0xLCAmbWJfdXByaWdodCk7CiAgICBnZXRMdW1hNHg0TmVpZ2hib3VyKGltZy0+Y3VycmVudF9tYl9uciwgLTEsIC0xLCAmbWJfdXBsZWZ0KTsKCiAgICBpZiAoIWltZy0+TWJhZmZGcmFtZUZsYWcpCiAgICB7CiAgICAgIGwwX3JGcmFtZUwgID0gbWJfbGVmdC5hdmFpbGFibGUgICAgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdICAgICAgIDogLTE7CiAgICAgIGwwX3JGcmFtZVUgID0gbWJfdXAuYXZhaWxhYmxlICAgICAgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gICAgICAgICAgIDogLTE7CiAgICAgIGwwX3JGcmFtZVVMID0gbWJfdXBsZWZ0LmF2YWlsYWJsZSAgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSAgIDogLTE7CiAgICAgIGwwX3JGcmFtZVVSID0gbWJfdXByaWdodC5hdmFpbGFibGUgPyBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIDogbDBfckZyYW1lVUw7CgogICAgICBsMV9yRnJhbWVMID0gbWJfbGVmdC5hdmFpbGFibGUgICAgID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSAgICAgICA6IC0xOwogICAgICBsMV9yRnJhbWVVID0gbWJfdXAuYXZhaWxhYmxlICAgICAgID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdICAgICAgICAgICA6IC0xOwogICAgICBsMV9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cGxlZnQucG9zX3ldW21iX3VwbGVmdC5wb3NfeF0gICA6IC0xOwogICAgICBsMV9yRnJhbWVVUiA9IG1iX3VwcmlnaHQuYXZhaWxhYmxlID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA6IGwxX3JGcmFtZVVMOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoaW1nLT5tYl9kYXRhW2ltZy0+Y3VycmVudF9tYl9ucl0ubWJfZmllbGQpCiAgICAgIHsKICAgICAgICBsMF9yRnJhbWVMID0gbWJfbGVmdC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX2xlZnQubWJfYWRkcl0ubWJfZmllbGQgIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gPCAwPwogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSA6CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdICogMjogLTE7CgogICAgICAgIGwwX3JGcmFtZVUgPSBtYl91cC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX3VwLm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSA8IDA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gOgogICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSAqIDI6IC0xOwoKICAgICAgICBsMF9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX3VwbGVmdC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA8IDA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA6CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cGxlZnQucG9zX3ldW21iX3VwbGVmdC5wb3NfeF0gKjI6IC0xOwoKICAgICAgICBsMF9yRnJhbWVVUiA9IG1iX3VwcmlnaHQuYXZhaWxhYmxlID8KICAgICAgICAgIGltZy0+bWJfZGF0YVttYl91cHJpZ2h0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXByaWdodC5wb3NfeV1bbWJfdXByaWdodC5wb3NfeF0gPCAwPwogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA6CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSAqIDI6IGwwX3JGcmFtZVVMOwoKICAgICAgICBsMV9yRnJhbWVMID0gbWJfbGVmdC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX2xlZnQubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSA8IDA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdIDoKICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdICogMjogLTE7CgogICAgICAgIGwxX3JGcmFtZVUgPSBtYl91cC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX3VwLm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSA8IDA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gOgogICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXAucG9zX3ldW21iX3VwLnBvc194XSAqIDI6IC0xOwoKICAgICAgICBsMV9yRnJhbWVVTCA9IG1iX3VwbGVmdC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX3VwbGVmdC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA8IDA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA6CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cGxlZnQucG9zX3ldW21iX3VwbGVmdC5wb3NfeF0gKjI6IC0xOwoKICAgICAgICBsMV9yRnJhbWVVUiA9IG1iX3VwcmlnaHQuYXZhaWxhYmxlID8KICAgICAgICAgIGltZy0+bWJfZGF0YVttYl91cHJpZ2h0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXByaWdodC5wb3NfeV1bbWJfdXByaWdodC5wb3NfeF0gPCAwPwogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA6CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSAqIDI6IGwxX3JGcmFtZVVMOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGwwX3JGcmFtZUwgPSBtYl9sZWZ0LmF2YWlsYWJsZSA/CiAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfbGVmdC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdICA8IDAgPwogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl9sZWZ0LnBvc195XVttYl9sZWZ0LnBvc194XSA+PiAxIDoKICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdOiAtMTsKCiAgICAgICAgbDBfckZyYW1lVSA9IG1iX3VwLmF2YWlsYWJsZSA/CiAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXAubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDwgMCA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gPj4gMSA6CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDogLTE7CgogICAgICAgIGwwX3JGcmFtZVVMID0gbWJfdXBsZWZ0LmF2YWlsYWJsZSA/CiAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXBsZWZ0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdIDwgMCA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XT4+IDEgOgogICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdIDogLTE7CgogICAgICAgIGwwX3JGcmFtZVVSID0gbWJfdXByaWdodC5hdmFpbGFibGUgPwogICAgICAgICAgaW1nLT5tYl9kYXRhW21iX3VwcmlnaHQubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA8IDAgPwogICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVttYl91cHJpZ2h0LnBvc195XVttYl91cHJpZ2h0LnBvc194XSA+PiAxIDoKICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIDogbDBfckZyYW1lVUw7CgogICAgICAgIGwxX3JGcmFtZUwgPSBtYl9sZWZ0LmF2YWlsYWJsZSA/CiAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfbGVmdC5tYl9hZGRyXS5tYl9maWVsZCB8fCBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdIDwgMCA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX2xlZnQucG9zX3ldW21iX2xlZnQucG9zX3hdID4+IDEgOgogICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfbGVmdC5wb3NfeV1bbWJfbGVmdC5wb3NfeF0gOiAtMTsKCiAgICAgICAgbDFfckZyYW1lVSA9IG1iX3VwLmF2YWlsYWJsZSA/CiAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXAubWJfYWRkcl0ubWJfZmllbGQgfHwgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDwgMCA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwLnBvc195XVttYl91cC5wb3NfeF0gPj4gMSA6CiAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVttYl91cC5wb3NfeV1bbWJfdXAucG9zX3hdIDogLTE7CgogICAgICAgIGwxX3JGcmFtZVVMID0gbWJfdXBsZWZ0LmF2YWlsYWJsZSA/CiAgICAgICAgICBpbWctPm1iX2RhdGFbbWJfdXBsZWZ0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXBsZWZ0LnBvc195XVttYl91cGxlZnQucG9zX3hdIDwgMCA/CiAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA+PiAxIDoKICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwbGVmdC5wb3NfeV1bbWJfdXBsZWZ0LnBvc194XSA6IC0xOwoKICAgICAgICBsMV9yRnJhbWVVUiA9IG1iX3VwcmlnaHQuYXZhaWxhYmxlID8KICAgICAgICAgIGltZy0+bWJfZGF0YVttYl91cHJpZ2h0Lm1iX2FkZHJdLm1iX2ZpZWxkIHx8IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXByaWdodC5wb3NfeV1bbWJfdXByaWdodC5wb3NfeF0gPCAwID8KICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bbWJfdXByaWdodC5wb3NfeV1bbWJfdXByaWdodC5wb3NfeF0gPj4gMToKICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW21iX3VwcmlnaHQucG9zX3ldW21iX3VwcmlnaHQucG9zX3hdIDogbDFfckZyYW1lVUw7CiAgICAgIH0KICAgIH0KCiAgICBsMF9yRnJhbWUgPSAobDBfckZyYW1lTCA+PSAwICYmIGwwX3JGcmFtZVUgPj0gMCkgPyBpbWluKGwwX3JGcmFtZUwsbDBfckZyYW1lVSk6IGltYXgobDBfckZyYW1lTCxsMF9yRnJhbWVVKTsKICAgIGwwX3JGcmFtZSA9IChsMF9yRnJhbWUgPj0gMCAmJiBsMF9yRnJhbWVVUiA+PSAwKSA/IGltaW4obDBfckZyYW1lLGwwX3JGcmFtZVVSKTogaW1heChsMF9yRnJhbWUsbDBfckZyYW1lVVIpOwoKICAgIGwxX3JGcmFtZSA9IChsMV9yRnJhbWVMID49IDAgJiYgbDFfckZyYW1lVSA+PSAwKSA/IGltaW4obDFfckZyYW1lTCxsMV9yRnJhbWVVKTogaW1heChsMV9yRnJhbWVMLGwxX3JGcmFtZVUpOwogICAgbDFfckZyYW1lID0gKGwxX3JGcmFtZSA+PSAwICYmIGwxX3JGcmFtZVVSID49IDApID8gaW1pbihsMV9yRnJhbWUsbDFfckZyYW1lVVIpOiBpbWF4KGwxX3JGcmFtZSxsMV9yRnJhbWVVUik7CgogICAgaWYgKGwwX3JGcmFtZSA+PTApCiAgICAgIFNldE1vdGlvblZlY3RvclByZWRpY3RvciAoaW1nLCBwbXZsMCwgbDBfckZyYW1lLCBMSVNUXzAsIGRlY19waWN0dXJlLT5yZWZfaWR4LCBkZWNfcGljdHVyZS0+bXYsIDAsIDAsIDE2LCAxNik7CgogICAgaWYgKGwxX3JGcmFtZSA+PTApCiAgICAgIFNldE1vdGlvblZlY3RvclByZWRpY3RvciAoaW1nLCBwbXZsMSwgbDFfckZyYW1lLCBMSVNUXzEsIGRlY19waWN0dXJlLT5yZWZfaWR4LCBkZWNfcGljdHVyZS0+bXYsIDAsIDAsIDE2LCAxNik7CiAgfQoKICBmb3IgKGJsb2NrOHg4PTA7IGJsb2NrOHg4PDQ7IGJsb2NrOHg4KyspCiAgewogICAgaWYgKGN1cnJNQi0+Yjhtb2RlW2Jsb2NrOHg4XSA9PSBJOE1CKQogICAgewogICAgICAvLz09PT09PT09PT09IDh4OCBCTE9DSyBUWVBFID09PT09PT09PT09PQogICAgICBpb2ZmID0gOCooYmxvY2s4eDgmMHgwMSk7CiAgICAgIGpvZmYgPSA4KihibG9jazh4OD4+MSk7CgogICAgICAvL1BSRURJQ1RJT04KICAgICAgaW50cmFwcmVkOHg4KGltZywgYmxvY2s4eDgpOwogICAgICBpdHJhbnM4eDgoaW1nLGlvZmYsam9mZik7ICAgICAgLy8gdXNlIERDVCB0cmFuc2Zvcm0gYW5kIG1ha2UgOHg4IGJsb2NrIG03IGZyb20gcHJlZGljdGlvbiBibG9jayBtcHIKCiAgICAgIGZvcihqaj1qb2ZmO2pqPGpvZmYgKyA4O2pqKyspCiAgICAgIHsKICAgICAgICBmb3IoaWk9aW9mZjtpaTxpb2ZmICsgODtpaSsrKQogICAgICAgIHsKICAgICAgICAgIGRlY19waWN0dXJlLT5pbWdZW2ltZy0+cGl4X3kgKyBqal1baW1nLT5waXhfeCArIGlpXSA9IGltZy0+bTdbampdW2lpXTsgLy8gY29uc3RydWN0IHBpY3R1cmUgZnJvbSA0eDQgYmxvY2tzCiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGZvciAoayA9IGJsb2NrOHg4KjQ7IGsgPCBibG9jazh4OCo0KzQ7IGsgKyspCiAgICB7CiAgICAgIGkgPSAgKGRlY29kZV9ibG9ja19zY2FuW2tdICYgMyk7CiAgICAgIGogPSAoKGRlY29kZV9ibG9ja19zY2FuW2tdID4+IDIpICYgMyk7CgogICAgICBpb2ZmID0gKGkgPDwgMik7CiAgICAgIGk0ICAgPSBpbWctPmJsb2NrX3ggKyBpOwoKICAgICAgam9mZiA9IChqIDw8IDIpOwogICAgICBqNCAgID0gaW1nLT5ibG9ja195ICsgajsKCiAgICAgIG12X21vZGUgID0gY3Vyck1CLT5iOG1vZGVbMiooaj4+MSkrKGk+PjEpXTsKICAgICAgcHJlZF9kaXIgPSBjdXJyTUItPmI4cGRpclsyKihqPj4xKSsoaT4+MSldOwoKICAgICAgYXNzZXJ0IChwcmVkX2Rpcjw9Mik7CgogICAgICAvLyBQUkVESUNUSU9OCiAgICAgIGlmIChtdl9tb2RlPT1JQkxPQ0spCiAgICAgIHsKICAgICAgICAvLz09PT09IElOVFJBIFBSRURJQ1RJT04gPT09PT0KICAgICAgICBpZiAoaW50cmFwcmVkKGltZyxpb2ZmLGpvZmYsaTQsajQpPT1TRUFSQ0hfU1lOQykgIC8qIG1ha2UgNHg0IHByZWRpY3Rpb24gYmxvY2sgbXByIGZyb20gZ2l2ZW4gcHJlZGljdGlvbiBpbWctPm1iX21vZGUgKi8KICAgICAgICAgIHJldHVybiBTRUFSQ0hfU1lOQzsgICAgICAgICAgICAgICAgICAgLyogYml0IGVycm9yICovCiAgICAgIH0KICAgICAgZWxzZSBpZiAoIUlTX05FV0lOVFJBIChjdXJyTUIpKQogICAgICB7CiAgICAgICAgaWYgKHByZWRfZGlyICE9IDIpCiAgICAgICAgewogICAgICAgICAgLy89PT09PSBGT1JXQVJEL0JBQ0tXQVJEIFBSRURJQ1RJT04gPT09PT0KICAgICAgICAgIGwwX3JlZmZyYW1lID0gcmVmX2lkeCAgPSBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzAgKyBwcmVkX2Rpcl1bajRdW2k0XTsKICAgICAgICAgIG12X2FycmF5ID0gZGVjX3BpY3R1cmUtPm12W0xJU1RfMCArIHByZWRfZGlyXTsKICAgICAgICAgIGxpc3QgICAgID0gbGlzdFhbMCtsaXN0X29mZnNldCsgcHJlZF9kaXJdOwogICAgICAgICAgdmVjMV94ID0gaTQqNCptdl9tdWwgKyBtdl9hcnJheVtqNF1baTRdWzBdOwoKICAgICAgICAgIGlmICghY3Vycl9tYl9maWVsZCkKICAgICAgICAgIHsKICAgICAgICAgICAgdmVjMV95ID0gajQgKiA0ICogbXZfbXVsICsgbXZfYXJyYXlbajRdW2k0XVsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChtYl9uciYweDAxKSA9PSAwKQogICAgICAgICAgICAgIHZlYzFfeSA9IChpbWctPmJsb2NrX3kgKiAyICsgam9mZikgKiBtdl9tdWwgKyBtdl9hcnJheVtqNF1baTRdWzFdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgdmVjMV95ID0gKChpbWctPmJsb2NrX3ktNCkgKiAyICsgam9mZikqIG12X211bCArIG12X2FycmF5W2o0XVtpNF1bMV07CiAgICAgICAgICB9CgogICAgICAgICAgZ2V0X2Jsb2NrIChyZWZfaWR4LCBsaXN0LCB2ZWMxX3gsIHZlYzFfeSwgaW1nLCB0bXBfYmxvY2spOwoKICAgICAgICAgIGlmIChpbWctPmFwcGx5X3dlaWdodHMpCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICgoKGFjdGl2ZV9wcHMtPndlaWdodGVkX3ByZWRfZmxhZyYmKGltZy0+dHlwZT09UF9TTElDRXx8IGltZy0+dHlwZSA9PSBTUF9TTElDRSkpfHwKICAgICAgICAgICAgICAoYWN0aXZlX3Bwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYz09MSAmJiAoaW1nLT50eXBlPT1CX1NMSUNFKSkpICYmIGN1cnJfbWJfZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICByZWZfaWR4ID4+PTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFscGhhX2wwICA9IGltZy0+d3Bfd2VpZ2h0W3ByZWRfZGlyXVtyZWZfaWR4XVswXTsKICAgICAgICAgICAgd3Bfb2Zmc2V0ID0gaW1nLT53cF9vZmZzZXRbcHJlZF9kaXJdW2wwX3JlZmZyYW1lPj5jdXJyX21iX2ZpZWxkXVswXTsKICAgICAgICAgICAgZm9yKGpqPTA7amo8QkxPQ0tfU0laRTtqaisrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaW50IGpwb3MgPSBqaitqb2ZmOwogICAgICAgICAgICAgIGZvcihpaT0wO2lpPEJMT0NLX1NJWkU7aWkrKykKICAgICAgICAgICAgICAgIGltZy0+bXByW2pwb3NdW2lpK2lvZmZdID0gaUNsaXAxKGltZy0+bWF4X2ltZ3BlbF92YWx1ZSwgCiAgICAgICAgICAgICAgICAocnNoaWZ0X3JuZF9zZigoYWxwaGFfbDAgKiAgdG1wX2Jsb2NrW2pqXVtpaV0pLCBpbWctPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pICArIHdwX29mZnNldCApKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICBmb3Ioamo9MDtqajxCTE9DS19TSVpFO2pqKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQganBvcyA9IGpqK2pvZmY7CiAgICAgICAgICAgICAgZm9yKGlpPTA7aWk8QkxPQ0tfU0laRTtpaSsrKQogICAgICAgICAgICAgICAgaW1nLT5tcHJbanBvc11baWkraW9mZl0gPSB0bXBfYmxvY2tbampdW2lpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgaWYgKG12X21vZGUgIT0gMCkKICAgICAgICAgIHsKICAgICAgICAgICAgLy89PT09PSBCSS1ESVJFQ1RJT05BTCBQUkVESUNUSU9OID09PT09CiAgICAgICAgICAgIGwwX212X2FycmF5ID0gZGVjX3BpY3R1cmUtPm12W0xJU1RfMF07CiAgICAgICAgICAgIGwxX212X2FycmF5ID0gZGVjX3BpY3R1cmUtPm12W0xJU1RfMV07CgogICAgICAgICAgICBsMF9yZWZmcmFtZSA9IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bajRdW2k0XTsKICAgICAgICAgICAgbDFfcmVmZnJhbWUgPSBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2o0XVtpNF07CiAgICAgICAgICAgIGwwX3JlZl9pZHggID0gbDBfcmVmZnJhbWU7CiAgICAgICAgICAgIGwxX3JlZl9pZHggID0gbDFfcmVmZnJhbWU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIC8vPT09PT0gRElSRUNUIFBSRURJQ1RJT04gPT09PT0KICAgICAgICAgICAgbDBfbXZfYXJyYXkgPSBkZWNfcGljdHVyZS0+bXZbTElTVF8wXTsKICAgICAgICAgICAgbDFfbXZfYXJyYXkgPSBkZWNfcGljdHVyZS0+bXZbTElTVF8xXTsKICAgICAgICAgICAgbDFfcmVmZnJhbWUgPSAwOwoKICAgICAgICAgICAgaWYgKGltZy0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGludCBpbWdibG9ja195PSAoKGltZy0+TWJhZmZGcmFtZUZsYWcpJiYoY3Vyck1CLT5tYl9maWVsZCkpPyAoaW1nLT5jdXJyZW50X21iX25yJjB4MDEpID8gKGltZy0+YmxvY2tfeS00KT4+MTppbWctPmJsb2NrX3k+PjE6IGltZy0+YmxvY2tfeTsKICAgICAgICAgICAgICBpbnQgajYgPSBpbWdibG9ja195ICsgajsKCiAgICAgICAgICAgICAgaWYgKGwwX3JGcmFtZSA+PTApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFsMF9yRnJhbWUgICYmICgoIW1vdmluZ19ibG9ja1tqNl1baTRdKSAmJiAoIWxpc3RYWzErbGlzdF9vZmZzZXRdWzBdLT5pc19sb25nX3Rlcm0pKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzBdID0gMDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzFdID0gMDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqNF1baTRdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzBdID0gcG12bDBbMF07CiAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMF1bajRdW2k0XVsxXSA9IHBtdmwwWzFdOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF0gPSBsMF9yRnJhbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF0gPSAtMTsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMF1bajRdW2k0XVswXSA9IDA7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzBdW2o0XVtpNF1bMV0gPSAwOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGwxX3JGcmFtZSA+PTApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgIChsMV9yRnJhbWU9PTAgJiYgKCghbW92aW5nX2Jsb2NrW2o2XVtpNF0pICYmICghbGlzdFhbMStsaXN0X29mZnNldF1bMF0tPmlzX2xvbmdfdGVybSkpKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8xXVtqNF1baTRdWzBdID0gMDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8xXVtqNF1baTRdWzFdID0gMDsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVtqNF1baTRdID0gbDFfckZyYW1lOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8xXVtqNF1baTRdWzBdID0gcG12bDFbMF07CiAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMV1bajRdW2k0XVsxXSA9IHBtdmwxWzFdOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2o0XVtpNF0gPSBsMV9yRnJhbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1bMF0gPSAwOwogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8xXVtqNF1baTRdWzFdID0gMDsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XSA9IC0xOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGwwX3JGcmFtZSA8IDAgJiYgbDFfckZyYW1lIDwgMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF0gPSAwOwogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVtqNF1baTRdID0gMDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGwwX3JlZmZyYW1lID0gKGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bajRdW2k0XSE9LTEpID8gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqNF1baTRdIDogMDsKICAgICAgICAgICAgICBsMV9yZWZmcmFtZSA9IChkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2o0XVtpNF0hPS0xKSA/IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XSA6IDA7CgogICAgICAgICAgICAgIGwwX3JlZl9pZHggPSBsMF9yZWZmcmFtZTsKICAgICAgICAgICAgICBsMV9yZWZfaWR4ID0gbDFfcmVmZnJhbWU7CgogICAgICAgICAgICAgIGlmICAgICAgKGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XT09LTEpIAogICAgICAgICAgICAgICAgZGlyZWN0X3BkaXIgPSAwOwogICAgICAgICAgICAgIGVsc2UgaWYgKGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bajRdW2k0XT09LTEpIAogICAgICAgICAgICAgICAgZGlyZWN0X3BkaXIgPSAxOwogICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZGlyZWN0X3BkaXIgPSAyOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIC8vIFRlbXBvcmFsIE1vZGUKICAgICAgICAgICAgewoKICAgICAgICAgICAgICBpbnQgaW1nYmxvY2tfeT0gKChpbWctPk1iYWZmRnJhbWVGbGFnKSYmKGN1cnJNQi0+bWJfZmllbGQpKT8gKGltZy0+Y3VycmVudF9tYl9uciYweDAxKSA/IChpbWctPmJsb2NrX3ktNCk+PjE6aW1nLT5ibG9ja195Pj4xOiBpbWctPmJsb2NrX3k7CiAgICAgICAgICAgICAgaW50IGo2PSBpbWdibG9ja195ICsgajsKCiAgICAgICAgICAgICAgaW50IHJlZkxpc3QgPSAoY29fbG9jYXRlZF9yZWZfaWR4W0xJU1RfMF1bajZdW2k0XT09IC0xID8gTElTVF8xIDogTElTVF8wKTsKICAgICAgICAgICAgICBpbnQgcmVmX2lkeCA9ICBjb19sb2NhdGVkX3JlZl9pZHhbcmVmTGlzdF1bajZdW2k0XTsKCgogICAgICAgICAgICAgIGlmKHJlZl9pZHg9PS0xKSAvLyBjby1sb2NhdGVkIGlzIGludHJhIG1vZGUKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IoaHY9MDsgaHY8MjsgaHYrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdW2h2XT0wOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1baHZdPTA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqNF1baTRdID0gMDsKICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XSA9IDA7CgogICAgICAgICAgICAgICAgbDBfcmVmZnJhbWUgPSAwOwogICAgICAgICAgICAgICAgbDBfcmVmX2lkeCA9IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgLy8gY28tbG9jYXRlZCBza2lwIG9yIGludGVyIG1vZGUKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgbWFwcGVkX2lkeD0wOwogICAgICAgICAgICAgICAgaW50IGlyZWY7CgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBmb3IgKGlyZWY9MDtpcmVmPGltaW4oaW1nLT5udW1fcmVmX2lkeF9sMF9hY3RpdmUsbGlzdFhzaXplW0xJU1RfMCArIGxpc3Rfb2Zmc2V0XSk7aXJlZisrKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoaW1nLT5zdHJ1Y3R1cmU9PTAgJiYgY3Vycl9tYl9maWVsZD09MCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBNQiBpcyBhIGZyYW1lIE1CIGFuZCB0aGUgY29sb2NhdGVkIGlzIGZyb20gYSBmaWVsZCBwaWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGUgY29fbG9jYXRlZF9yZWZfaWQgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSB0aGUgd3JvbmcgdmFsdWUgb2YKICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lX3BvYyBpZiBpdCByZWZlcmVuY2VzIGl0J3MgY29tcGxlbWVudGFyeSBmaWVsZCwgc28gdGVzdCBib3RoIFBPQyB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgIGlmKGxpc3RYWzBdW2lyZWZdLT50b3BfcG9jKjIgPT0gY29fbG9jYXRlZF9yZWZfaWRbcmVmTGlzdF1bajZdW2k0XSB8fCBsaXN0WFswXVtpcmVmXS0+Ym90dG9tX3BvYyoyID09IGNvX2xvY2F0ZWRfcmVmX2lkW3JlZkxpc3RdW2o2XVtpNF0pCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF9pZHg9aXJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8vISBpbnZhbGlkIGluZGV4LiBEZWZhdWx0IHRvIHplcm8gZXZlbiB0aG91Z2ggdGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF9pZHg9SU5WQUxJRElOREVYOwogICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoZGVjX3BpY3R1cmUtPnJlZl9waWNfbnVtW2ltZy0+Y3VycmVudF9zbGljZV9ucl1bTElTVF8wICsgbGlzdF9vZmZzZXRdW2lyZWZdPT1jb19sb2NhdGVkX3JlZl9pZFtyZWZMaXN0XVtqNl1baTRdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF9pZHg9aXJlZjsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIC8vISBpbnZhbGlkIGluZGV4LiBEZWZhdWx0IHRvIHplcm8gZXZlbiB0aG91Z2ggdGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX2lkeD1JTlZBTElESU5ERVg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChJTlZBTElESU5ERVggPT0gbWFwcGVkX2lkeCkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yKCJ0ZW1wb3JhbCBkaXJlY3QgZXJyb3JcbmNvbG9jYXRlZCBibG9jayBoYXMgcmVmIHRoYXQgaXMgdW5hdmFpbGFibGUiLC0xMTExKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGwwX3JlZl9pZHggPSBtYXBwZWRfaWR4OwogICAgICAgICAgICAgICAgbXZfc2NhbGUgPSBpbWctPm12c2NhbGVbTElTVF8wICsgbGlzdF9vZmZzZXRdW21hcHBlZF9pZHhdOwoKICAgICAgICAgICAgICAgIC8vISBJbiBzdWNoIGNhc2UsIGFuIGFycmF5IGlzIG5lZWRlZCBmb3IgZWFjaCBkaWZmZXJlbnQgcmVmZXJlbmNlLgogICAgICAgICAgICAgICAgaWYgKG12X3NjYWxlID09IDk5OTkgfHwgbGlzdFhbTElTVF8wK2xpc3Rfb2Zmc2V0XVttYXBwZWRfaWR4XS0+aXNfbG9uZ190ZXJtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzBdW2o0XVtpNF1bMF09Y29fbG9jYXRlZF9tdltyZWZMaXN0XVtqNl1baTRdWzBdOwogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzBdW2o0XVtpNF1bMV09Y29fbG9jYXRlZF9tdltyZWZMaXN0XVtqNl1baTRdWzFdOwoKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8xXVtqNF1baTRdWzBdPTA7CiAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMV1bajRdW2k0XVsxXT0wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzBdW2o0XVtpNF1bMF09KG12X3NjYWxlICogY29fbG9jYXRlZF9tdltyZWZMaXN0XVtqNl1baTRdWzBdICsgMTI4ICkgPj4gODsKICAgICAgICAgICAgICAgICAgZGVjX3BpY3R1cmUtPm12ICBbTElTVF8wXVtqNF1baTRdWzFdPShtdl9zY2FsZSAqIGNvX2xvY2F0ZWRfbXZbcmVmTGlzdF1bajZdW2k0XVsxXSArIDEyOCApID4+IDg7CgogICAgICAgICAgICAgICAgICBkZWNfcGljdHVyZS0+bXYgIFtMSVNUXzFdW2o0XVtpNF1bMF09ZGVjX3BpY3R1cmUtPm12W0xJU1RfMF1bajRdW2k0XVswXSAtIGNvX2xvY2F0ZWRfbXZbcmVmTGlzdF1bajZdW2k0XVswXSA7CiAgICAgICAgICAgICAgICAgIGRlY19waWN0dXJlLT5tdiAgW0xJU1RfMV1bajRdW2k0XVsxXT1kZWNfcGljdHVyZS0+bXZbTElTVF8wXVtqNF1baTRdWzFdIC0gY29fbG9jYXRlZF9tdltyZWZMaXN0XVtqNl1baTRdWzFdIDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsMF9yZWZmcmFtZSA9IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bajRdW2k0XSA9IG1hcHBlZF9pZHg7IC8vbGlzdFhbMV1bMF0tPnJlZl9pZHhbcmVmTGlzdF1bajRdW2k0XTsKICAgICAgICAgICAgICAgIGwxX3JlZmZyYW1lID0gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVtqNF1baTRdID0gMDsKCiAgICAgICAgICAgICAgICBsMF9yZWZfaWR4ID0gbDBfcmVmZnJhbWU7CiAgICAgICAgICAgICAgICBsMV9yZWZfaWR4ID0gbDFfcmVmZnJhbWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZSBwaWN0dXJlIElEIGRldGVybWluZWQgYnkgZGlyZWN0IG1vZGUKICAgICAgICAgICAgZGVjX3BpY3R1cmUtPnJlZl9waWNfaWRbTElTVF8wXVtqNF1baTRdID0gZGVjX3BpY3R1cmUtPnJlZl9waWNfbnVtW2ltZy0+Y3VycmVudF9zbGljZV9ucl1bTElTVF8wICsgbGlzdF9vZmZzZXRdWyhzaG9ydClkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdW2o0XVtpNF1dOwogICAgICAgICAgICBkZWNfcGljdHVyZS0+cmVmX3BpY19pZFtMSVNUXzFdW2o0XVtpNF0gPSBkZWNfcGljdHVyZS0+cmVmX3BpY19udW1baW1nLT5jdXJyZW50X3NsaWNlX25yXVtMSVNUXzEgKyBsaXN0X29mZnNldF1bKHNob3J0KWRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XV07CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG12X21vZGU9PTAgJiYgaW1nLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgKQogICAgICAgICAgewogICAgICAgICAgICBpZiAoZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVtqNF1baTRdID49IDApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgdmVjMV94ID0gaTQqNCptdl9tdWwgKyBsMF9tdl9hcnJheVtqNF1baTRdWzBdOwogICAgICAgICAgICAgIGlmICghY3Vycl9tYl9maWVsZCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ZWMxX3kgPSBqNCo0Km12X211bCArIGwwX212X2FycmF5W2o0XVtpNF1bMV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKG1iX25yJjB4MDEpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHZlYzFfeSA9IChpbWctPmJsb2NrX3kgKiAyICsgam9mZikgKiBtdl9tdWwgKyBsMF9tdl9hcnJheVtqNF1baTRdWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB2ZWMxX3kgPSAoKGltZy0+YmxvY2tfeS00KSAqIDIgKyBqb2ZmKSogbXZfbXVsICsgbDBfbXZfYXJyYXlbajRdW2k0XVsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZ2V0X2Jsb2NrKGwwX3JlZmZyYW1lLCBsaXN0WFswK2xpc3Rfb2Zmc2V0XSwgdmVjMV94LCB2ZWMxX3ksIGltZywgdG1wX2Jsb2NrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bajRdW2k0XSA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmVjMl94ID0gaTQqNCptdl9tdWwgKyBsMV9tdl9hcnJheVtqNF1baTRdWzBdOwogICAgICAgICAgICAgIGlmICghY3Vycl9tYl9maWVsZCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ZWMyX3kgPSBqNCo0Km12X211bCArIGwxX212X2FycmF5W2o0XVtpNF1bMV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKG1iX25yJjB4MDEpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHZlYzJfeSA9IChpbWctPmJsb2NrX3kgKiAyICsgam9mZikgKiBtdl9tdWwgKyBsMV9tdl9hcnJheVtqNF1baTRdWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB2ZWMyX3kgPSAoKGltZy0+YmxvY2tfeS00KSAqIDIgKyBqb2ZmKSogbXZfbXVsICsgbDFfbXZfYXJyYXlbajRdW2k0XVsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZ2V0X2Jsb2NrKGwxX3JlZmZyYW1lLCBsaXN0WFsxK2xpc3Rfb2Zmc2V0XSwgdmVjMl94LCB2ZWMyX3ksIGltZywgdG1wX2Jsb2NrYncpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHZlYzFfeCA9IGk0ICogNCAqIG12X211bCArIGwwX212X2FycmF5W2o0XVtpNF1bMF07CiAgICAgICAgICAgIHZlYzJfeCA9IGk0ICogNCAqIG12X211bCArIGwxX212X2FycmF5W2o0XVtpNF1bMF07CgogICAgICAgICAgICBpZiAoIWN1cnJfbWJfZmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2ZWMxX3kgPSBqNCAqIDQgKiBtdl9tdWwgKyBsMF9tdl9hcnJheVtqNF1baTRdWzFdOwogICAgICAgICAgICAgIHZlYzJfeSA9IGo0ICogNCAqIG12X211bCArIGwxX212X2FycmF5W2o0XVtpNF1bMV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKChtYl9uciYweDAxKSA9PSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZlYzFfeSA9IChpbWctPmJsb2NrX3kgKiAyICsgam9mZikgKiBtdl9tdWwgKyBsMF9tdl9hcnJheVtqNF1baTRdWzFdOwogICAgICAgICAgICAgICAgdmVjMl95ID0gKGltZy0+YmxvY2tfeSAqIDIgKyBqb2ZmKSAqIG12X211bCArIGwxX212X2FycmF5W2o0XVtpNF1bMV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ZWMxX3kgPSAoKGltZy0+YmxvY2tfeS00KSAqIDIgKyBqb2ZmKSogbXZfbXVsICsgbDBfbXZfYXJyYXlbajRdW2k0XVsxXTsKICAgICAgICAgICAgICAgIHZlYzJfeSA9ICgoaW1nLT5ibG9ja195LTQpICogMiArIGpvZmYpKiBtdl9tdWwgKyBsMV9tdl9hcnJheVtqNF1baTRdWzFdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0X2Jsb2NrKGwwX3JlZmZyYW1lLCBsaXN0WFswK2xpc3Rfb2Zmc2V0XSwgdmVjMV94LCB2ZWMxX3ksIGltZywgdG1wX2Jsb2NrKTsKICAgICAgICAgICAgZ2V0X2Jsb2NrKGwxX3JlZmZyYW1lLCBsaXN0WFsxK2xpc3Rfb2Zmc2V0XSwgdmVjMl94LCB2ZWMyX3ksIGltZywgdG1wX2Jsb2NrYncpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChtdl9tb2RlPT0wICYmIGltZy0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICYmIGRpcmVjdF9wZGlyPT0wKQogICAgICAgICAgewogICAgICAgICAgICBpZiAoaW1nLT5hcHBseV93ZWlnaHRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKCgoYWN0aXZlX3Bwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnJiYoaW1nLT50eXBlPT1QX1NMSUNFfHwgaW1nLT50eXBlID09IFNQX1NMSUNFKSl8fAogICAgICAgICAgICAgICAgKGFjdGl2ZV9wcHMtPndlaWdodGVkX2JpcHJlZF9pZGM9PTEgJiYgKGltZy0+dHlwZT09Ql9TTElDRSkpKSAmJiBjdXJyX21iX2ZpZWxkKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGwwX3JlZl9pZHggPj49MTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGFscGhhX2wwICA9IGltZy0+d3Bfd2VpZ2h0W0xJU1RfMF1bbDBfcmVmX2lkeF1bMF07CiAgICAgICAgICAgICAgd3Bfb2Zmc2V0ID0gaW1nLT53cF9vZmZzZXRbTElTVF8wXVtsMF9yZWZmcmFtZT4+Y3Vycl9tYl9maWVsZF1bMF07CgogICAgICAgICAgICAgIGZvcihqaj0wO2pqPEJMT0NLX1NJWkU7amorKykKICAgICAgICAgICAgICAgIGZvcihpaT0wO2lpPEJMT0NLX1NJWkU7aWkrKykKICAgICAgICAgICAgICAgICAgaW1nLT5tcHJbamoram9mZl1baWkraW9mZl0gPSBpQ2xpcDEoaW1nLT5tYXhfaW1ncGVsX3ZhbHVlLCAKICAgICAgICAgICAgICAgICAgKHJzaGlmdF9ybmRfc2YoKGFscGhhX2wwICogdG1wX2Jsb2NrW2pqXVtpaV0pLCBpbWctPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pICsgd3Bfb2Zmc2V0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgZm9yKGpqPTA7amo8QkxPQ0tfU0laRTtqaisrKQogICAgICAgICAgICAgICAgZm9yKGlpPTA7aWk8QkxPQ0tfU0laRTtpaSsrKQogICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXSA9IHRtcF9ibG9ja1tqal1baWldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChtdl9tb2RlPT0wICYmIGltZy0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICYmIGRpcmVjdF9wZGlyPT0xKQogICAgICAgICAgewogICAgICAgICAgICBpZiAoaW1nLT5hcHBseV93ZWlnaHRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKCgoYWN0aXZlX3Bwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnJiYoaW1nLT50eXBlPT1QX1NMSUNFfHwgaW1nLT50eXBlID09IFNQX1NMSUNFKSl8fAogICAgICAgICAgICAgICAgKGFjdGl2ZV9wcHMtPndlaWdodGVkX2JpcHJlZF9pZGM9PTEgJiYgKGltZy0+dHlwZT09Ql9TTElDRSkpKSAmJiBjdXJyX21iX2ZpZWxkKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGwxX3JlZl9pZHggPj49MTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYWxwaGFfbDEgID0gaW1nLT53cF93ZWlnaHRbTElTVF8xXVtsMV9yZWZfaWR4XVswXTsKICAgICAgICAgICAgICB3cF9vZmZzZXQgPSBpbWctPndwX29mZnNldFtMSVNUXzFdW2wxX3JlZmZyYW1lPj5jdXJyX21iX2ZpZWxkXVswXTsKCiAgICAgICAgICAgICAgZm9yKGpqPTA7amo8QkxPQ0tfU0laRTtqaisrKQogICAgICAgICAgICAgICAgZm9yKGlpPTA7aWk8QkxPQ0tfU0laRTtpaSsrKQogICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXSA9IGlDbGlwMShpbWctPm1heF9pbWdwZWxfdmFsdWUsIAogICAgICAgICAgICAgICAgICAocnNoaWZ0X3JuZF9zZigoYWxwaGFfbDEgKiB0bXBfYmxvY2tid1tqal1baWldKSwgaW1nLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIHdwX29mZnNldCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgIGZvcihqaj0wO2pqPEJMT0NLX1NJWkU7amorKykKICAgICAgICAgICAgICAgIGZvcihpaT0wO2lpPEJMT0NLX1NJWkU7aWkrKykKICAgICAgICAgICAgICAgICAgaW1nLT5tcHJbamoram9mZl1baWkraW9mZl0gPSB0bXBfYmxvY2tid1tqal1baWldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKGltZy0+YXBwbHlfd2VpZ2h0cykKICAgICAgICAgIHsKICAgICAgICAgICAgaW50IHd0X2xpc3Rfb2Zmc2V0ID0gKGFjdGl2ZV9wcHMtPndlaWdodGVkX2JpcHJlZF9pZGM9PTIpP2xpc3Rfb2Zmc2V0OjA7CgogICAgICAgICAgICBpZiAobXZfbW9kZT09MCAmJiBpbWctPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZz09MCApbDFfcmVmX2lkeD0wOyAgICAvL3RlbXBvcmFsIGRpcmVjdAoKICAgICAgICAgICAgaWYgKCgoYWN0aXZlX3Bwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnJiYoaW1nLT50eXBlPT1QX1NMSUNFfHwgaW1nLT50eXBlID09IFNQX1NMSUNFKSl8fAogICAgICAgICAgICAgIChhY3RpdmVfcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjPT0xICYmIChpbWctPnR5cGU9PUJfU0xJQ0UpKSkgJiYgY3Vycl9tYl9maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGwwX3JlZl9pZHggPj49MTsKICAgICAgICAgICAgICBsMV9yZWZfaWR4ID4+PTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFscGhhX2wwICA9ICAgaW1nLT53YnBfd2VpZ2h0W0xJU1RfMCArIHd0X2xpc3Rfb2Zmc2V0XVtsMF9yZWZfaWR4XVtsMV9yZWZfaWR4XVswXTsKICAgICAgICAgICAgYWxwaGFfbDEgID0gICBpbWctPndicF93ZWlnaHRbTElTVF8xICsgd3RfbGlzdF9vZmZzZXRdW2wwX3JlZl9pZHhdW2wxX3JlZl9pZHhdWzBdOwogICAgICAgICAgICB3cF9vZmZzZXQgPSAoKGltZy0+d3Bfb2Zmc2V0IFtMSVNUXzAgKyB3dF9saXN0X29mZnNldF1bbDBfcmVmX2lkeF1bMF0gKyBpbWctPndwX29mZnNldFtMSVNUXzEgKyB3dF9saXN0X29mZnNldF1bbDFfcmVmX2lkeF1bMF0gKyAxKSA+PjEpOwoKICAgICAgICAgICAgZm9yKGlpPTA7aWk8QkxPQ0tfU0laRTtpaSsrKQogICAgICAgICAgICAgIGZvcihqaj0wO2pqPEJMT0NLX1NJWkU7amorKykKICAgICAgICAgICAgICAgIGltZy0+bXByW2pqK2pvZmZdW2lpK2lvZmZdID0gKGludClpQ2xpcDEoaW1nLT5tYXhfaW1ncGVsX3ZhbHVlLCAKICAgICAgICAgICAgICAgIChyc2hpZnRfcm5kX3NmKChhbHBoYV9sMCAqIHRtcF9ibG9ja1tqal1baWldICsgYWxwaGFfbDEgKiB0bXBfYmxvY2tid1tqal1baWldKSwgKGltZy0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbSArIDEpKSArIHdwX29mZnNldCkpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICBmb3Ioamo9MDtqajxCTE9DS19TSVpFO2pqKyspCiAgICAgICAgICAgICAgZm9yKGlpPTA7aWk8QkxPQ0tfU0laRTtpaSsrKQogICAgICAgICAgICAgICAgaW1nLT5tcHJbamoram9mZl1baWkraW9mZl0gPSAodG1wX2Jsb2NrW2pqXVtpaV0rdG1wX2Jsb2NrYndbampdW2lpXSsxKT4+MTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vID09PT09PT09PT09PT09PSA0eDQgaXRyYW5zID09PT09PT09PT09PT09PT0KICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBpZiAoc21iICYmIG12X21vZGUhPUlCTE9DSykKICAgICAgewogICAgICAgIGlmKCFJU19ORVdJTlRSQSAoY3Vyck1CKSkvLyBtb2RpZiBFUyBhZGRlZAogICAgICAgICAgaXRyYW5zX3NwKGltZyxpb2ZmLGpvZmYsaSxqKTsKICAgICAgICBlbHNlIC8vbW9kaWYgRVMgYWRkZWQKICAgICAgICAgIGl0cmFucyhpbWcsaW9mZixqb2ZmLGksaiwwKTsgLy8gbW9kaWYgRVMgYWRkZWQKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZihuZWVkXzR4NF90cmFuc2Zvcm0pCiAgICAgICAgewogICAgICAgICAgaWYoaW1nLT50eXBlPT1TUF9TTElDRSAmJiBjdXJyTUItPm1iX3R5cGUgIT0gSTE2TUIpIC8vIEVTIGFkZGVkCiAgICAgICAgICAgIGl0cmFuc19zcChpbWcsaW9mZixqb2ZmLGksaik7Ly9FUyBhZGRlZAogICAgICAgICAgZWxzZQogICAgICAgICAgICBpdHJhbnMgICAoaW1nLGlvZmYsam9mZixpLGosIDApOyAgICAgIC8vIHVzZSBEQ1QgdHJhbnNmb3JtIGFuZCBtYWtlIDR4NCBibG9jayBtNyBmcm9tIHByZWRpY3Rpb24gYmxvY2sgbXByCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmKG5lZWRfNHg0X3RyYW5zZm9ybSkKICAgICAgewogICAgICAgIGludCBqX3BvcyA9IGo0ICogQkxPQ0tfU0laRTsKICAgICAgICBpbnQgaV9wb3MgPSBpNCAqIEJMT0NLX1NJWkU7CgogICAgICAgIGZvcihqaj0wO2pqPEJMT0NLX1NJWkU7amorKykKICAgICAgICB7CiAgICAgICAgICBmb3IoaWk9MDtpaTxCTE9DS19TSVpFO2lpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGRlY19waWN0dXJlLT5pbWdZW2pfcG9zICsgampdW2lfcG9zICsgaWldPWltZy0+bTdbampdW2lpXTsgLy8gY29uc3RydWN0IHBpY3R1cmUgZnJvbSA0eDQgYmxvY2tzCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ly8gaWYobmVlZF80eDRfdHJhbnNmb3JtKQogICAgfQoKICAgIGlmKCFuZWVkXzR4NF90cmFuc2Zvcm0pCiAgICB7CiAgICAgIC8vID09PT09PT09PT09PT09PSA4eDggaXRyYW5zID09PT09PT09PT09PT09PT0KICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBpb2ZmID0gOCooYmxvY2s4eDgmMHgwMSk7CiAgICAgIGpvZmYgPSA4KihibG9jazh4OD4+MSk7CgogICAgICBpdHJhbnM4eDgoaW1nLGlvZmYsam9mZik7ICAgICAgLy8gdXNlIERDVCB0cmFuc2Zvcm0gYW5kIG1ha2UgOHg4IGJsb2NrIG03IGZyb20gcHJlZGljdGlvbiBibG9jayBtcHIKCiAgICAgIGZvcihqaj1qb2ZmO2pqPGpvZmYgKyA4O2pqKyspCiAgICAgIHsKICAgICAgICBmb3IoaWk9aW9mZjtpaTxpb2ZmICsgODtpaSsrKQogICAgICAgIHsKICAgICAgICAgIGRlY19waWN0dXJlLT5pbWdZW2ltZy0+cGl4X3kgKyBqal1baW1nLT5waXhfeCArIGlpXT1pbWctPm03W2pqXVtpaV07IC8vIGNvbnN0cnVjdCBwaWN0dXJlIGZyb20gNHg0IGJsb2NrcwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgaWYgKGRlY19waWN0dXJlLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBZVVY0MDApCiAgewogICAgLy8gY2hyb21hIGRlY29kaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGYxX3ggPSA2NC9pbWctPm1iX2NyX3NpemVfeDsKICAgIGYyX3ggPSBmMV94LTE7CgogICAgZjFfeSA9IDY0L2ltZy0+bWJfY3Jfc2l6ZV95OwogICAgZjJfeSA9IGYxX3ktMTsKCiAgICBmMyA9IGYxX3gqZjFfeTsKICAgIGY0ID0gZjM+PjE7CgogICAgZm9yKHV2PTA7dXY8Mjt1disrKQogICAgewogICAgICB1dl9zaGlmdCA9IHV2KihpbWctPm51bV9ibGs4eDhfdXY+PjEpOwogICAgICBpbnRyYV9wcmVkaWN0aW9uID0gSVNfSU5UUkEgKGN1cnJNQik7CgogICAgICBpZiAoaW50cmFfcHJlZGljdGlvbikKICAgICAgewogICAgICAgIGludHJhcHJlZF9jaHJvbWEoaW1nLCB1dik7CiAgICAgIH0KCiAgICAgIGZvciAoYjg9MDtiODwoaW1nLT5udW1fYmxrOHg4X3V2Pj4xKTtiOCsrKQogICAgICB7CiAgICAgICAgZm9yKGI0PTA7YjQ8NDtiNCsrKQogICAgICAgIHsKICAgICAgICAgIGpvZmYgPSBzdWJibGtfb2Zmc2V0X3lbeXV2XVtiOF1bYjRdOwogICAgICAgICAgajQgICA9IGltZy0+cGl4X2NfeStqb2ZmOwogICAgICAgICAgaW9mZiA9IHN1YmJsa19vZmZzZXRfeFt5dXZdW2I4XVtiNF07CiAgICAgICAgICBpNCAgID0gaW1nLT5waXhfY194K2lvZmY7CgogICAgICAgICAgbXZfbW9kZSAgPSBjdXJyTUItPmI4bW9kZVtibG9jazh4OF9pZHhbeXV2XVtiOF1bYjRdXTsKICAgICAgICAgIHByZWRfZGlyID0gY3Vyck1CLT5iOHBkaXJbYmxvY2s4eDhfaWR4W3l1dl1bYjhdW2I0XV07CiAgICAgICAgICBhc3NlcnQgKHByZWRfZGlyPD0yKTsKCgogICAgICAgICAgaWYgKCFpbnRyYV9wcmVkaWN0aW9uKQogICAgICAgICAgewogICAgICAgICAgICBpZiAocHJlZF9kaXIgIT0gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgIGludCBqcG9zOwogICAgICAgICAgICAgIC8vLS0tIEZPUldBUkQvQkFDS1dBUkQgUFJFRElDVElPTiAtLS0KICAgICAgICAgICAgICBtdl9hcnJheSA9IGRlY19waWN0dXJlLT5tdltMSVNUXzAgKyBwcmVkX2Rpcl07CiAgICAgICAgICAgICAgbGlzdCA9IGxpc3RYWzArbGlzdF9vZmZzZXQrcHJlZF9kaXJdOwoKICAgICAgICAgICAgICBmb3Ioamo9MDtqajw0O2pqKyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgamY9KGo0K2pqKS8oaW1nLT5tYl9zaXplX2Jsa1sxXVsxXSk7ICAgICAvLyBqZiAgPSBTdWJibG9ja195LWNvb3JkaW5hdGUKCiAgICAgICAgICAgICAgICBpZiAoIWN1cnJfbWJfZmllbGQpCiAgICAgICAgICAgICAgICAgIGpwb3M9KGo0K2pqKSpmMV95OwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBpZiAoKG1iX25yJjB4MDEpID09IDApCiAgICAgICAgICAgICAgICAgICAganBvcz0oKChpbWctPnBpeF9jX3kpPj4xKSAgICAgICAgICAgICAgICAgICArIGpqICsgam9mZikqZjFfeTsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGpwb3M9KCgoaW1nLT5waXhfY195LWltZy0+bWJfY3Jfc2l6ZV95KT4+MSkgKyBqaiArIGpvZmYpKmYxX3k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yKGlpPTA7aWk8NDtpaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBpZng9KGk0K2lpKS8oaW1nLT5tYl9zaXplX2Jsa1sxXVswXSk7ICAvLyBpZnggPSBTdWJibG9ja194LWNvb3JkaW5hdGUKICAgICAgICAgICAgICAgICAgbDBfcmVmZnJhbWUgPSByZWZfaWR4ID0gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wK3ByZWRfZGlyXVtqZl1baWZ4XTsKICAgICAgICAgICAgICAgICAgaTE9KGk0K2lpKSpmMV94K212X2FycmF5W2pmXVtpZnhdWzBdOwoKICAgICAgICAgICAgICAgICAgajEgPSBqcG9zK212X2FycmF5W2pmXVtpZnhdWzFdOwogICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSkKICAgICAgICAgICAgICAgICAgICBqMSArPSBsaXN0W3JlZl9pZHhdLT5jaHJvbWFfdmVjdG9yX2FkanVzdG1lbnQ7CgogICAgICAgICAgICAgICAgICBpaTAgPSBpQ2xpcDMgKDAsIGltZy0+d2lkdGhfY3JfbTEsIGkxL2YxX3gpOwogICAgICAgICAgICAgICAgICBqajAgPSBpQ2xpcDMgKDAsIG1heF95X2NyLCBqMS9mMV95KTsKICAgICAgICAgICAgICAgICAgaWkxID0gaUNsaXAzICgwLCBpbWctPndpZHRoX2NyX20xLCAoKGkxK2YyX3gpL2YxX3gpKTsKICAgICAgICAgICAgICAgICAgamoxID0gaUNsaXAzICgwLCBtYXhfeV9jciwgKChqMStmMl95KS9mMV95KSk7CgogICAgICAgICAgICAgICAgICBpZjE9KGkxICYgZjJfeCk7CiAgICAgICAgICAgICAgICAgIGpmMT0oajEgJiBmMl95KTsKICAgICAgICAgICAgICAgICAgaWYwPWYxX3gtaWYxOwogICAgICAgICAgICAgICAgICBqZjA9ZjFfeS1qZjE7CgogICAgICAgICAgICAgICAgICBpZiAoaW1nLT5hcHBseV93ZWlnaHRzKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW1ncGVsICoqY3VyVVYgPSBsaXN0W3JlZl9pZHhdLT5pbWdVVlt1dl07CiAgICAgICAgICAgICAgICAgICAgcHJlZCA9IChpZjAqamYwKmN1clVWW2pqMF1baWkwXSArIGlmMSpqZjAqY3VyVVZbamowXVtpaTFdKwogICAgICAgICAgICAgICAgICAgICAgaWYwKmpmMSpjdXJVVltqajFdW2lpMF0gKyBpZjEqamYxKmN1clVWW2pqMV1baWkxXStmNCkvZjM7CgogICAgICAgICAgICAgICAgICAgIGlmICgoKGFjdGl2ZV9wcHMtPndlaWdodGVkX3ByZWRfZmxhZyYmKGltZy0+dHlwZT09UF9TTElDRXx8IGltZy0+dHlwZSA9PSBTUF9TTElDRSkpfHwKICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVfcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjPT0xICYmIChpbWctPnR5cGU9PUJfU0xJQ0UpKSkgJiYgY3Vycl9tYl9maWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICByZWZfaWR4ID4+PTE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXSA9IGlDbGlwMShpbWctPm1heF9pbWdwZWxfdmFsdWVfdXYsICgoKGltZy0+d3Bfd2VpZ2h0W3ByZWRfZGlyXVtyZWZfaWR4XVt1disxXSAqIHByZWQgICsgaW1nLT53cF9yb3VuZF9jaHJvbWEpPj5pbWctPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBpbWctPndwX29mZnNldFtwcmVkX2Rpcl1bcmVmX2lkeF1bdXYrMV0pKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbWdwZWwgKipjdXJVViA9IGxpc3RbcmVmX2lkeF0tPmltZ1VWW3V2XTsKICAgICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXT0oCiAgICAgICAgICAgICAgICAgICAgICBpZjAqamYwKmN1clVWW2pqMF1baWkwXSArIGlmMSpqZjAqY3VyVVZbamowXVtpaTFdKwogICAgICAgICAgICAgICAgICAgICAgaWYwKmpmMSpjdXJVVltqajFdW2lpMF0gKyBpZjEqamYxKmN1clVWW2pqMV1baWkxXStmNCkvZjM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbDBfbXZfYXJyYXkgPSBkZWNfcGljdHVyZS0+bXZbTElTVF8wXTsKICAgICAgICAgICAgICBsMV9tdl9hcnJheSA9IGRlY19waWN0dXJlLT5tdltMSVNUXzFdOwoKICAgICAgICAgICAgICBmb3Ioamo9MDtqajw0O2pqKyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGpwb3M7CiAgICAgICAgICAgICAgICBqZj0oajQramopLyhpbWctPm1iX3NpemVfYmxrWzFdWzFdKTsgICAgIC8vIGpmICA9IFN1YmJsb2NrX3ktY29vcmRpbmF0ZQoKICAgICAgICAgICAgICAgIGlmICghY3Vycl9tYl9maWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAganBvcz0oajQramopKmYxX3k7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGlmICgobWJfbnImMHgwMSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICBqcG9zPSgoKGltZy0+cGl4X2NfeSk+PjEpICAgICAgICAgICAgICAgICAgICsgamogKyBqb2ZmKSpmMV95OwogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAganBvcz0oKChpbWctPnBpeF9jX3ktaW1nLT5tYl9jcl9zaXplX3kpPj4xKSArIGpqICsgam9mZikqZjFfeTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IoaWk9MDtpaTw0O2lpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGlmeD0oaTQraWkpLyhpbWctPm1iX3NpemVfYmxrWzFdWzBdKTsgIC8vIGlmeCA9IFN1YmJsb2NrX3gtY29vcmRpbmF0ZQogICAgICAgICAgICAgICAgICBkaXJlY3RfcGRpciA9IDI7CgogICAgICAgICAgICAgICAgICBpZiAobXZfbW9kZSA9PSAwICYmIGltZy0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy89PT09PSBESVJFQ1QgUFJFRElDVElPTiA9PT09PQogICAgICAgICAgICAgICAgICAgIGlmIChkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdWzIqKGpmPj4xKV1bKGlmeD4+MSkqMl0hPS0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIGwwX3JlZmZyYW1lID0gZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8wXVsyKihqZj4+MSldWyhpZng+PjEpKjJdOwogICAgICAgICAgICAgICAgICAgICAgbDBfcmVmX2lkeCA9IGwwX3JlZmZyYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZGVjX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXVsyKihqZj4+MSldWyhpZng+PjEpKjJdIT0tMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBsMV9yZWZmcmFtZSA9IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bMiooamY+PjEpXVsoaWZ4Pj4xKSoyXTsKICAgICAgICAgICAgICAgICAgICAgIGwxX3JlZl9pZHggPSBsMV9yZWZmcmFtZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMV1bMiooamY+PjEpXVsoaWZ4Pj4xKSoyXT09LTEpIGRpcmVjdF9wZGlyID0gMDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdWzIqKGpmPj4xKV1bKGlmeD4+MSkqMl09PS0xKSBkaXJlY3RfcGRpciA9IDE7CgogICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RfcGRpciA9PSAwIHx8IGRpcmVjdF9wZGlyID09IDIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgaTE9KGk0K2lpKSpmMV94K2wwX212X2FycmF5W2pmXVtpZnhdWzBdOwoKICAgICAgICAgICAgICAgICAgICAgIGoxPWpwb3MrbDBfbXZfYXJyYXlbamZdW2lmeF1bMV07CiAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgajEgKz0gbGlzdFhbMCtsaXN0X29mZnNldF1bbDBfcmVmZnJhbWVdLT5jaHJvbWFfdmVjdG9yX2FkanVzdG1lbnQ7CgogICAgICAgICAgICAgICAgICAgICAgaWkwID0gaUNsaXAzICgwLCBpbWctPndpZHRoX2NyX20xLCBpMS9mMV94KTsKICAgICAgICAgICAgICAgICAgICAgIGpqMCA9IGlDbGlwMyAoMCwgbWF4X3lfY3IsIGoxL2YxX3kpOwogICAgICAgICAgICAgICAgICAgICAgaWkxID0gaUNsaXAzICgwLCBpbWctPndpZHRoX2NyX20xLCAoKGkxK2YyX3gpL2YxX3gpKTsKICAgICAgICAgICAgICAgICAgICAgIGpqMSA9IGlDbGlwMyAoMCwgbWF4X3lfY3IsICgoajErZjJfeSkvZjFfeSkpOwoKCiAgICAgICAgICAgICAgICAgICAgICBpZjE9KGkxICYgZjJfeCk7CiAgICAgICAgICAgICAgICAgICAgICBqZjE9KGoxICYgZjJfeSk7CiAgICAgICAgICAgICAgICAgICAgICBpZjA9ZjFfeC1pZjE7CiAgICAgICAgICAgICAgICAgICAgICBqZjA9ZjFfeS1qZjE7CgogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbWdwZWwgKipjdXJVViA9IGxpc3RYW0xJU1RfMCArIGxpc3Rfb2Zmc2V0XVtsMF9yZWZmcmFtZV0tPmltZ1VWW3V2XTsKICAgICAgICAgICAgICAgICAgICAgICAgZndfcHJlZD0oaWYwKmpmMCAqIGN1clVWW2pqMF1baWkwXSsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZjEqamYwICogY3VyVVZbamowXVtpaTFdKwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmMCpqZjEgKiBjdXJVVltqajFdW2lpMF0rCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYxKmpmMSAqIGN1clVWW2pqMV1baWkxXStmNCkvZjM7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RfcGRpciA9PSAxIHx8IGRpcmVjdF9wZGlyID09IDIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgaTE9KGk0K2lpKSpmMV94K2wxX212X2FycmF5W2pmXVtpZnhdWzBdOwoKICAgICAgICAgICAgICAgICAgICAgIGoxPWpwb3MrbDFfbXZfYXJyYXlbamZdW2lmeF1bMV07CiAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgajEgKz0gbGlzdFhbMStsaXN0X29mZnNldF1bbDFfcmVmZnJhbWVdLT5jaHJvbWFfdmVjdG9yX2FkanVzdG1lbnQ7CgogICAgICAgICAgICAgICAgICAgICAgaWkwID0gaUNsaXAzICgwLCBpbWctPndpZHRoX2NyX20xLCBpMS9mMV94KTsKICAgICAgICAgICAgICAgICAgICAgIGpqMCA9IGlDbGlwMyAoMCwgbWF4X3lfY3IsIGoxL2YxX3kpOwogICAgICAgICAgICAgICAgICAgICAgaWkxID0gaUNsaXAzICgwLCBpbWctPndpZHRoX2NyX20xLCAoKGkxK2YyX3gpL2YxX3gpKTsKICAgICAgICAgICAgICAgICAgICAgIGpqMSA9IGlDbGlwMyAoMCwgbWF4X3lfY3IsICgoajErZjJfeSkvZjFfeSkpOwoKICAgICAgICAgICAgICAgICAgICAgIGlmMT0oaTEgJiBmMl94KTsKICAgICAgICAgICAgICAgICAgICAgIGpmMT0oajEgJiBmMl95KTsKICAgICAgICAgICAgICAgICAgICAgIGlmMD1mMV94LWlmMTsKICAgICAgICAgICAgICAgICAgICAgIGpmMD1mMV95LWpmMTsKCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGltZ3BlbCAqKmN1clVWID0gbGlzdFhbMStsaXN0X29mZnNldF1bbDFfcmVmZnJhbWVdLT5pbWdVVlt1dl07CiAgICAgICAgICAgICAgICAgICAgICAgIGJ3X3ByZWQ9KGlmMCpqZjAqY3VyVVZbamowXVtpaTBdICsgaWYxKmpmMCpjdXJVVltqajBdW2lpMV0rCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYwKmpmMSpjdXJVVltqajFdW2lpMF0gKyBpZjEqamYxKmN1clVWW2pqMV1baWkxXStmNCkvZjM7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLz09PT09IEJJLURJUkVDVElPTkFMIFBSRURJQ1RJT04gPT09PT0KICAgICAgICAgICAgICAgICAgICBsMF9yZWZmcmFtZSA9IGRlY19waWN0dXJlLT5yZWZfaWR4W0xJU1RfMF1bamZdW2lmeF07CiAgICAgICAgICAgICAgICAgICAgbDFfcmVmZnJhbWUgPSBkZWNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzFdW2pmXVtpZnhdOwoKICAgICAgICAgICAgICAgICAgICBsMF9yZWZfaWR4ID0gbDBfcmVmZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgbDFfcmVmX2lkeCA9IGwxX3JlZmZyYW1lOwoKICAgICAgICAgICAgICAgICAgICBpMT0oaTQraWkpKmYxX3grbDBfbXZfYXJyYXlbamZdW2lmeF1bMF07CgogICAgICAgICAgICAgICAgICAgIGoxPWpwb3MrbDBfbXZfYXJyYXlbamZdW2lmeF1bMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZV9zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpCiAgICAgICAgICAgICAgICAgICAgICBqMSArPSBsaXN0WFswK2xpc3Rfb2Zmc2V0XVtsMF9yZWZmcmFtZV0tPmNocm9tYV92ZWN0b3JfYWRqdXN0bWVudDsKCiAgICAgICAgICAgICAgICAgICAgaWkwID0gaUNsaXAzICgwLCBpbWctPndpZHRoX2NyX20xLCBpMS9mMV94KTsKICAgICAgICAgICAgICAgICAgICBqajAgPSBpQ2xpcDMgKDAsIG1heF95X2NyLCBqMS9mMV95KTsKICAgICAgICAgICAgICAgICAgICBpaTEgPSBpQ2xpcDMgKDAsIGltZy0+d2lkdGhfY3JfbTEsICgoaTErZjJfeCkvZjFfeCkpOwogICAgICAgICAgICAgICAgICAgIGpqMSA9IGlDbGlwMyAoMCwgbWF4X3lfY3IsICgoajErZjJfeSkvZjFfeSkpOwoKICAgICAgICAgICAgICAgICAgICBpZjE9KGkxICYgZjJfeCk7CiAgICAgICAgICAgICAgICAgICAgamYxPShqMSAmIGYyX3kpOwogICAgICAgICAgICAgICAgICAgIGlmMD1mMV94LWlmMTsKICAgICAgICAgICAgICAgICAgICBqZjA9ZjFfeS1qZjE7CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgaW1ncGVsICoqY3VyVVYgPSBsaXN0WFswK2xpc3Rfb2Zmc2V0XVtsMF9yZWZmcmFtZV0tPmltZ1VWW3V2XTsKCiAgICAgICAgICAgICAgICAgICAgICBmd19wcmVkPShpZjAqamYwKmN1clVWW2pqMF1baWkwXSsKICAgICAgICAgICAgICAgICAgICAgICAgaWYxKmpmMCpjdXJVVltqajBdW2lpMV0rCiAgICAgICAgICAgICAgICAgICAgICAgIGlmMCpqZjEqY3VyVVZbamoxXVtpaTBdKwogICAgICAgICAgICAgICAgICAgICAgICBpZjEqamYxKmN1clVWW2pqMV1baWkxXStmNCkvZjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGkxPShpNCtpaSkqZjFfeCtsMV9tdl9hcnJheVtqZl1baWZ4XVswXTsKCiAgICAgICAgICAgICAgICAgICAgajE9anBvcytsMV9tdl9hcnJheVtqZl1baWZ4XVsxXTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlX3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgIGoxICs9IGxpc3RYWzErbGlzdF9vZmZzZXRdW2wxX3JlZmZyYW1lXS0+Y2hyb21hX3ZlY3Rvcl9hZGp1c3RtZW50OwoKICAgICAgICAgICAgICAgICAgICBpaTAgPSBpQ2xpcDMgKDAsIGltZy0+d2lkdGhfY3JfbTEsIGkxL2YxX3gpOwogICAgICAgICAgICAgICAgICAgIGpqMCA9IGlDbGlwMyAoMCwgbWF4X3lfY3IsIGoxL2YxX3kpOwogICAgICAgICAgICAgICAgICAgIGlpMSA9IGlDbGlwMyAoMCwgaW1nLT53aWR0aF9jcl9tMSwgKChpMStmMl94KS9mMV94KSk7CiAgICAgICAgICAgICAgICAgICAgamoxID0gaUNsaXAzICgwLCBtYXhfeV9jciwgKChqMStmMl95KS9mMV95KSk7CgoKICAgICAgICAgICAgICAgICAgICBpZjE9KGkxICYgZjJfeCk7CiAgICAgICAgICAgICAgICAgICAgamYxPShqMSAmIGYyX3kpOwogICAgICAgICAgICAgICAgICAgIGlmMD1mMV94LWlmMTsKICAgICAgICAgICAgICAgICAgICBqZjA9ZjFfeS1qZjE7CgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIGltZ3BlbCAqKmN1clVWID0gbGlzdFhbMStsaXN0X29mZnNldF1bbDFfcmVmZnJhbWVdLT5pbWdVVlt1dl07CiAgICAgICAgICAgICAgICAgICAgICBid19wcmVkPShpZjAqamYwKmN1clVWW2pqMF1baWkwXSsgaWYxKmpmMCpjdXJVVltqajBdW2lpMV0rCiAgICAgICAgICAgICAgICAgICAgICAgIGlmMCpqZjEqY3VyVVZbamoxXVtpaTBdK2lmMSpqZjEqY3VyVVZbamoxXVtpaTFdK2Y0KS9mMzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBpZiAoaW1nLT5hcHBseV93ZWlnaHRzKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgoYWN0aXZlX3Bwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnJiYoaW1nLT50eXBlPT1QX1NMSUNFfHwgaW1nLT50eXBlID09IFNQX1NMSUNFKSl8fAogICAgICAgICAgICAgICAgICAgICAgKGFjdGl2ZV9wcHMtPndlaWdodGVkX2JpcHJlZF9pZGM9PTEgJiYgKGltZy0+dHlwZT09Ql9TTElDRSkpKSAmJiBjdXJyX21iX2ZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIGwwX3JlZl9pZHggPj49MTsKICAgICAgICAgICAgICAgICAgICAgIGwxX3JlZl9pZHggPj49MTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChpbWctPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyAmJiBkaXJlY3RfcGRpcj09MSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXT0gaUNsaXAxKGltZy0+bWF4X2ltZ3BlbF92YWx1ZV91diwgCiAgICAgICAgICAgICAgICAgICAgICAgICgoKGltZy0+d3Bfd2VpZ2h0WzFdW2wxX3JlZl9pZHhdW3V2KzFdICogYndfcHJlZCAgKyBpbWctPndwX3JvdW5kX2Nocm9tYSk+PmltZy0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIGltZy0+d3Bfb2Zmc2V0WzFdW2wxX3JlZmZyYW1lPj5jdXJyX21iX2ZpZWxkXVt1disxXSkpOyAgIC8vIFJlcGxhY2VkIHdpdGggaW50ZWdlciBvbmx5IG9wZXJhdGlvbnMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1nLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgJiYgZGlyZWN0X3BkaXI9PTApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgaW1nLT5tcHJbamoram9mZl1baWkraW9mZl09aUNsaXAxKGltZy0+bWF4X2ltZ3BlbF92YWx1ZV91diwgKCgoaW1nLT53cF93ZWlnaHRbMF1bbDBfcmVmX2lkeF1bdXYrMV0gKiBmd19wcmVkICsgaW1nLT53cF9yb3VuZF9jaHJvbWEpPj5pbWctPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBpbWctPndwX29mZnNldFswXVtsMF9yZWZmcmFtZT4+Y3Vycl9tYl9maWVsZF1bdXYrMV0pKTsgICAvLyBSZXBsYWNlZCB3aXRoIGludGVnZXIgb25seSBvcGVyYXRpb25zCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgd3RfbGlzdF9vZmZzZXQgPSAoYWN0aXZlX3Bwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYz09Mik/bGlzdF9vZmZzZXQ6MDsKCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9sMCA9IGltZy0+d2JwX3dlaWdodFswK3d0X2xpc3Rfb2Zmc2V0XVtsMF9yZWZfaWR4XVtsMV9yZWZfaWR4XVt1disxXTsKICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2wxID0gaW1nLT53YnBfd2VpZ2h0WzErd3RfbGlzdF9vZmZzZXRdW2wwX3JlZl9pZHhdW2wxX3JlZl9pZHhdW3V2KzFdOwoKICAgICAgICAgICAgICAgICAgICAgIGltZy0+bXByW2pqK2pvZmZdW2lpK2lvZmZdPSBpQ2xpcDEoaW1nLT5tYXhfaW1ncGVsX3ZhbHVlX3V2LCAoKChhbHBoYV9sMCAqIGZ3X3ByZWQgKyBhbHBoYV9sMSAqIGJ3X3ByZWQgICsgKDE8PGltZy0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSkgPj4gKGltZy0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tICsgMSkpKyAoKGltZy0+d3Bfb2Zmc2V0W3d0X2xpc3Rfb2Zmc2V0ICsgMF1bbDBfcmVmX2lkeF1bdXYrMV0gKyBpbWctPndwX29mZnNldFt3dF9saXN0X29mZnNldCArIDFdW2wxX3JlZl9pZHhdW3V2KzFdICsgMSk+PjEpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpbWctPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyAmJiBkaXJlY3RfcGRpcj09MSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXT1id19wcmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbWctPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyAmJiBkaXJlY3RfcGRpcj09MCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBpbWctPm1wcltqaitqb2ZmXVtpaStpb2ZmXT1md19wcmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgaW1nLT5tcHJbamoram9mZl1baWkraW9mZl09KGZ3X3ByZWQgKyBid19wcmVkICsgMSApPj4xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSAvL2lmICghaW50cmFfcHJlZGljdGlvbikKCiAgICAgICAgICBpZiAoIXNtYikKICAgICAgICAgIHsKICAgICAgICAgICAgaW1ncGVsICoqY3VyVVYgPSBkZWNfcGljdHVyZS0+aW1nVVZbdXZdOwogICAgICAgICAgICBpdHJhbnMoaW1nLGlvZmYsam9mZiwgY29mdXZfYmxrX3hbeXV2XVtiOCt1dl9zaGlmdF1bYjRdLCBjb2Z1dl9ibGtfeVt5dXZdW2I4K3V2X3NoaWZ0XVtiNF0sIDEpOwoKICAgICAgICAgICAgZm9yKGpqPTA7amo8NDtqaisrKQogICAgICAgICAgICAgIGZvcihpaT0wO2lpPDQ7aWkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjdXJVVltqNCtqal1baTQraWldPWltZy0+bTdbampdW2lpXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZihzbWIpCiAgICAgIHsKICAgICAgICBpbWdwZWwgKipjdXJVViA9IGRlY19waWN0dXJlLT5pbWdVVlt1dl07CiAgICAgICAgaXRyYW5zX3NwX2Nocm9tYShpbWcsMip1dik7CgogICAgICAgIGZvciAoaj00O2o8NjtqKyspCiAgICAgICAgewogICAgICAgICAgam9mZj0oai00KSo0OwogICAgICAgICAgajQ9aW1nLT5waXhfY195K2pvZmY7CiAgICAgICAgICBmb3IoaT0wO2k8MjtpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGlvZmY9aSo0OwogICAgICAgICAgICBpND1pbWctPnBpeF9jX3graW9mZjsKICAgICAgICAgICAgaXRyYW5zKGltZyxpb2ZmLGpvZmYsMip1ditpLGosIDEpOwoKICAgICAgICAgICAgZm9yKGpqPTA7amo8NDtqaisrKQogICAgICAgICAgICAgIGZvcihpaT0wO2lpPDQ7aWkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjdXJVVltqNCtqal1baTQraWldPWltZy0+bTdbampdW2lpXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gMDsKfQo=