LyoKICogIE1HdG9vbC0xLjMKICogIEZpbGU6IE1HdG9vbC5jCiAqICBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgogKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojcHJhZ21hIHN0cmljdF90eXBlcyxydHRfY2hlY2tzCgpwcm90ZWN0ZWQgZnVuY3Rpb25zIHZpcnR1YWwgaW5oZXJpdCAiL3N0ZC91dGlsL3BhdGgiOwppbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOwoKI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CiNpbmNsdWRlIDxydGxpbWl0cy5oPgojaW5jbHVkZSA8cHJvcGVydGllcy5oPgoKI2lmICFkZWZpbmVkKFFVRVJZQ0FDSEVEKQojZGVmaW5lIFFVRVJZQ0FDSEVEIDQwOTYKI2VuZGlmCiNpZiAhZGVmaW5lZCAoU0VUQ0FDSEVEKQojZGVmaW5lIFNFVENBQ0hFRCA0MDk2CiNlbmRpZgojaW5jbHVkZSA8bW92aW5nLmg+CiNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgojaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKI2luY2x1ZGUgPHVzZXJpbmZvLmg+CiNpbmNsdWRlIDxkZWZpbmVzLmg+CiNpbmNsdWRlIDxob29rLmg+CgojaW5jbHVkZSAiTUd0b29sL3Rvb2wuaCIKCiNpbmNsdWRlICJNR3Rvb2wvdG9vbGxpYi5oIgoKI2RlZmluZSBYREJHIDEKCm5vc2F2ZSBvYmplY3QgIGNsb25lcjsKbm9zYXZlIG9iamVjdCAgbXNndG89TlVMTDsKbm9zYXZlIHN0cmluZyAqbWFucGF0aD0oe1RPT0xfUEFUSCsiL21hbi5kLyIsCgkJCSAiL2RvYy9lZnVuLyIsCgkJCSAiL2RvYy9sZnVuLyIsCgkJCSAiL2RvYy93LyIsCgkJCSAiL2RvYy9oZWxwZGlyLyIsCgkJCSAiL2RvYy9MUEMvIiwKCQkJICIvZG9jL3N0ZC8iLAoJCQkgIi9kb2MvY29uY2VwdHMvIiwKCQkJICIifSk7Cm5vc2F2ZSBzdHJpbmcgIG1vcmVmaWxlPU5VTEw7Cm5vc2F2ZSBzdHJpbmcgKnNjcmlwdGxpbmU9TlVMTDsKbm9zYXZlIHN0cmluZyAqaGlzdG9yeT1hbGxvY2F0ZShNQVhfSElTVE9SWSk7Cm5vc2F2ZSBpbnQgICAgIG1vcmVmbGFnPUZBTFNFOwpub3NhdmUgaW50ICAgICBtb3Jlb2Zmc2V0PTE7Cm5vc2F2ZSBpbnQgICAgIHRlcm09TlVMTDsKbm9zYXZlIGludCAgICAgc2NyaXB0c2l6ZT1OVUxMOwpub3NhdmUgaW50ICAgICBub3N0b3JlPUZBTFNFOwpub3NhdmUgaW50ICAgICB4bGlnaHQ9MDsKbm9zYXZlIGludCAgICAgcGlwZV9pbj1GQUxTRTsKbm9zYXZlIGludCAgICAgcGlwZV9vdXQ9RkFMU0U7Cm5vc2F2ZSBpbnQgICAgIHBpcGVfb3ZyPVRSVUU7Cm5vc2F2ZSBzdHJpbmcgIHBpcGVfaWY9TlVMTDsKbm9zYXZlIHN0cmluZyAgcGlwZV9vZj1OVUxMOwpub3NhdmUgaW50ICAgICB4dGs9RkFMU0U7Cm5vc2F2ZSBtYXBwaW5nIHZhcmlhYmxlPShbXSk7Cm5vc2F2ZSBzdHJpbmcgKmNtZHM7CnByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGluZV9idWZmZXI9KFtdKTsKcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGxpbmVfYnVmZmVyX25hbWU9IiI7CnByaXZhdGUgbm9zYXZlIHN0cmluZyBtb3JlX3NlYXJjaGV4cHI9IiI7CmludCAgICBtb3JlbGluZXM9TU9SRV9MSU5FUzsKaW50ICAgIG1vZGk9KE1PREVfRklSU1R8TU9ERV9QUk9URUNUfE1PREVfU0hPUlQpOwoKI2luY2x1ZGUgIk1HdG9vbC90b29sbGliLmMiCiNpbmNsdWRlICJNR3Rvb2wvdG9vbGNtZC5jIgoKI2RlZmluZSBTYWZlUmV0dXJuKHgpIFwKeyBcCiAgY21kcz0oe30pOyBcCiAgcGlwZV9pbj1GQUxTRTsgXAogIHBpcGVfb2Y9TlVMTDsgXAogIHBpcGVfb3ZyPVRSVUU7IFwKICBwaXBlX291dD1GQUxTRTsgXAogIHBpcGVfb2Y9TlVMTDsgXAogIHJldHVybiAoeCk7IFwKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGNoZWNrIHNvbWUgc2VjdXJpdHkgYXNwZWN0cwogKi8KCnN0YXRpYyBpbnQgc2VjdXJpdHkoKQp7CiAgb2JqZWN0IHByZXY7CiAKICBpZiggcHJvY2Vzc19jYWxsKCkgfHwgZ2V0dWlkKCkhPWdldHVpZChjbG9uZXIpICkgcmV0dXJuIEZBTFNFOyAvLyBSdW1hdGEKCiAgVEsoIlVJRDogIitnZXR1aWQoTUUpKyIgY2xvbmVyOiIrZ2V0dWlkKGNsb25lcikpOwovLyAgVEsoInByZXY6ICIrb2JqZWN0X25hbWUoUFJFVikrIiBtZToiK29iamVjdF9uYW1lKE1FKSk7CiAgaWYocHJldj1QUkVWKQogIHsKICAgIGlmKCFjbG9uZXIpCiAgICAgIHJldHVybiBUUlVFOwogICAgaWYoZ2V0dWlkKHByZXYpPT1ST09USUR8fElTX0FSQ0gocHJldikpCiAgICAgIHJldHVybiBUUlVFOwogICAgaWYocHJldj09TUUpCiAgICAgIHJldHVybiBUUlVFOwogICAgcmV0dXJuIHNlY3VyZV9sZXZlbCgpPj1xdWVyeV93aXpfbGV2ZWwoY2xvbmVyKTsgLy8gUnVtYXRhCiAgICAvL3JldHVybiBnZXR1aWQocHJldik9PWdldHVpZCgpJiZnZXRldWlkKHByZXYpPT1nZXRldWlkKCkmJmNsb25lcj09UlRQOwogIH0KICBlbHNlCiAgICByZXR1cm4gY2xvbmVyPT1OVUxMOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb3duIHdyaXRlIGZ1bmN0aW9uCiAqLwoKc3RhdGljIGludCBXcml0ZShzdHJpbmcgc3RyKQp7CiAgaWYoIXN0cmluZ3Aoc3RyKSB8fCBzdHI9PSIiKQogICAgcmV0dXJuIEZBTFNFOwogIGlmKCFjbG9uZXIgJiYgb2JqZWN0cCh0aGlzX3BsYXllcigpKSkKICAgIHdyaXRlKHN0cik7CiAgZWxzZQogICAgdGVsbF9vYmplY3QoY2xvbmVyLCBzdHIpOwogIHJldHVybiBUUlVFOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb3duIGNvbW1hbmQgZnVuY3Rpb24KICovCgpzdGF0aWMgaW50IENvbW1hbmQoc3RyaW5nIHN0cikKewogIGludCBpOwogIFRLKCJDb21tYW5kOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKICBub3N0b3JlKys7CiAgaWYoTU9ERShNT0RFX0VDSE8pKQogICAgV0xOKCJEb2luZzogIitzdHIpOwogIGk9KGludCljbG9uZXItPmNvbW1hbmRfbWUoc3RyKTsKICBub3N0b3JlLS07CiAgcmV0dXJuIGk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvYmplY3Qgc2VhcmNoaW5nCiAqLwoKc3RhdGljIHZhcmFyZ3Mgb2JqZWN0IFhGaW5kT2JqKHN0cmluZyBzdHIsIGludCBzaWxlbnQpCnsKICBvYmplY3Qgb2JqLCBlbnY7CiAgc3RyaW5nICpzdHJzOwogIGludCBpLCBzLCBjbnQ7CiAgCiAgaWYoIXN0cikKICAgIHJldHVybiBOVUxMOwogIFRLKCJYRmluZE9iajogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CiAgZW52PUVOVihjbG9uZXIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXC4iLCKwMDEiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFxeIiwgIrAwMiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXCQiLCAisDAzIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcXFwiLCAiXFwiKTsKICBpZiAoZmluZF9vYmplY3Qoc3RyKSkgcmV0dXJuIGZpbmRfb2JqZWN0KHN0cik7CiAgaWYgKGZpbGVfc2l6ZShzdHIpPjEpIHsKICAgICByZXR1cm4gbG9hZF9vYmplY3Qoc3RyKTsKICB9CiAgcz1zaXplb2Yoc3Rycz1zdHJpcF9leHBsb2RlKHN0ciwgIi4iKSk7CiAgd2hpbGUocy0tKQogIHsKICAgIGlmKHN0cnNbaV09PSJtInx8c3Ryc1tpXT09Im1lIikKICAgICAgc3Ryc1tpXT1STkFNRShjbG9uZXIpOwogICAgZWxzZSBpZihzdHJzW2ldPT0iaCJ8fHN0cnNbaV09PSJoZXJlIikKICAgICAgc3Ryc1tpXT1vYmplY3RfbmFtZShFTlYoY2xvbmVyKSk7CiAgICBpZihvYmo9RmluZE9iaihzdHJzW2krK10sZW52LChzaWxlbnQ/MTowKSkpCiAgICAgIGVudj1vYmo7CiAgICBlbHNlCiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gb2JqOwp9CgpzdGF0aWMgdmFyYXJncyBvYmplY3QgRmluZE9iaihzdHJpbmcgc3RyLCBvYmplY3QgZW52LCBpbnQgc2lsZW50KQp7CiAgb2JqZWN0IG9iaiwgKmludjsKICBzdHJpbmcgdG1wOwogIGludCBudW0sIGU7CiAgCiAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8ICFvYmplY3RwKGVudikpCiAgICByZXR1cm4gTlVMTDsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAisDAxIiwgIi4iKTsKICB3aGlsZShzdHJbZSsrXT09J14nKQogICAgOwogIHN0cj1zdHJbLS1lLi48MV07CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIrAwMiIsICJeIik7CiAgaWYob2JqPVZhclRvT2JqKHN0cikpCiAgICA7CiAgZWxzZSBpZihzdHJbMF09PScDJykKICAgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICKwMDMiLCAiJCIpOwogIGVsc2UgaWYoc3NjYW5mKHN0ciwgIiVkIiwgbnVtKSYmKGludj1hbGxfaW52ZW50b3J5KGVudikpKQogIHsKICAgIGlmKG51bT4wJiZudW08PXNpemVvZihpbnYpKQogICAgICBvYmo9aW52W251bS0xXTsKICAgIGVsc2UKICAgIHsKICAgICAgV0RMTigiU3BlY2lmaWVkIG9iamVjdCBudW1iZXIgb3V0IG9mIHJhbmdlIFsxLSIrc2l6ZW9mKGludikrIl0iKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgfQogIGlmKG9ianx8KG9iaj1wcmVzZW50KHN0ciwgZW52KSl8fAogICAgIChvYmo9ZmluZF9wbGF5ZXIoTE9XRVIoc3RyKSkpfHwKICAgICAob2JqPWZpbmRfbGl2aW5nKHN0cikpfHwKICAgICAob2JqPWZpbmRfb2JqZWN0KGxvbmdfcGF0aChzdHIpKSkpCiAgewogICAgd2hpbGUoZS0tKQogICAgewogICAgICBpZighKG9iaj1FTlYob2JqKSkpCiAgICAgIHsKCVcoIlNwZWNpZmllZCBvYmplY3QgaGFzIG5vIGVudmlyb25tZW50IFsiKTsKCXdoaWxlKGUtLSkKCSAgVygiXiIpOwoJV0RMTihzdHIrIl0iKTsKCXJldHVybiBOVUxMOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICAgIGlmKCFzaWxlbnQpCiAgICAgIFdETE4oIlNwZWNpZmllZCBvYmplY3QgZG9lcyBub3QgZXhpc3QgWyIrc3RyKyJdIik7CiAgcmV0dXJuIG9iajsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG9iamVjdCB2YXJpYWJsZSBoYW5kbGluZwogKi8KCnN0YXRpYyBvYmplY3QgVmFyVG9PYmooc3RyaW5nIHN0cikKewogIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCBzdHJbMF0hPSckJykKICAgIHJldHVybiBOVUxMOwogIHN3aXRjaChzdHIpCiAgewogICAgY2FzZSAiJG0iOgogICAgY2FzZSAiJG1lIjoKICAgIHJldHVybiBjbG9uZXI7CiAgICBjYXNlICIkaCI6CiAgICBjYXNlICIkaGVyZSI6CiAgICByZXR1cm4gRU5WKGNsb25lcik7CiAgICBkZWZhdWx0OgogICAgcmV0dXJuIHZhcmlhYmxlW3N0clsxLi48MV1dOwogIH0KICByZXR1cm4oTlVMTCk7IC8vbmV2ZXIgcmVhY2hlZAp9CgpzdGF0aWMgc3RyaW5nIFZhclRvRmlsZShzdHJpbmcgc3RyKQp7CiAgcmV0dXJuIHNvdXJjZV9maWxlX25hbWUoVmFyVG9PYmooc3RyKSk7Cn0KCnN0YXRpYyBzdHJpbmcgVmFyVG9QdXJlRmlsZShzdHJpbmcgc3RyKQp7CiAgcmV0dXJuIHB1cmVfZmlsZV9uYW1lKFZhclRvT2JqKHN0cikpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb2JqZWN0IGRlc2NyaXB0aW9uIHByaW50aW5nCiAqLwoKc3RhdGljIHZvaWQgUHJpbnRPYmoob2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpCnsKICBvYmplY3QgaXRlbSwgdG1wOwogIHN0cmluZyBzdHI7CiAgaW50IGk7CgogIFNFQ1VSRTEoKTsKICBpZighb2JqKQogICAgcmV0dXJuOwogIFByaW50U2hvcnQoIlNob3J0OiAiLCBvYmosIGZpbGUpOwogIGlmKCFmaWxlfHxmaWxlPT0iIikKICAgIFdMTigiTG9uZyA6Iik7CiAgZWxzZQogICAgd3JpdGVfZmlsZShmaWxlLCJMb25nIDpcbiIpOwogIGlmKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKICAgIHN0cj1jYXBpdGFsaXplKGdldHVpZChvYmopKTsKICBlbHNlCiAgewogICAgaWYob2JqZWN0X25hbWUob2JqKVswLi4yNl09PSIvZC91bnRlcndlbHQvb2JqZWt0ZS90ZWRkeSMiICYmCiAgICAgICBJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpCiAgICAgIHN0cj0iRWluIFRlZGR5IChzdHVtbSkiOwogICAgZWxzZQogICAgewogICAgICBpZihzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0lOVF9MT05HKSkKCTsKICAgICAgZWxzZSBpZihzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0xPTkcpKQoJOwogICAgICBlbHNlCglzdHI9Ii0gbm8gbG9uZyBkZXNjcmlwdGlvbiAtXG4iOwogICAgfQogIH0KICBpZighZmlsZXx8ZmlsZT09IiIpCiAgICBXKHN0cik7CiAgZWxzZQogICAgd3JpdGVfZmlsZShmaWxlLHN0cik7CiAgRk9SQUxMKGl0ZW0sIG9iaikKICB7CiAgICBpZighaSkKICAgICAgaWYoIWZpbGV8fGZpbGU9PSIiKQoJV0xOKCJDb250ZW50OiIpOwogICAgICBlbHNlCgl3cml0ZV9maWxlKGZpbGUsIkNvbnRlbnQ6XG4iKTsKICAgIFByaW50U2hvcnQoQVJJR0hUKCsraSsiLiAiLCA0LCAiICIpLCBpdGVtLCBmaWxlKTsKICB9Cn0KCnN0YXRpYyBzdHJpbmcgT2JqRmlsZShvYmplY3Qgb2JqKQp7CiAgcmV0dXJuICJbIitzaG9ydF9wYXRoKG9iamVjdF9uYW1lKG9iaikpKyJdIjsKfQoKc3RhdGljIHZhcmFyZ3Mgdm9pZCBQcmludFNob3J0KHN0cmluZyBwcmUsIG9iamVjdCBvYmosIHN0cmluZyBmaWxlKQp7CiAgc3RyaW5nIHN0cjsKCiAgU0VDVVJFMSgpOwogIGlmKCFvYmopCiAgICByZXR1cm47CiAgaWYoTU9ERShNT0RFX1NIT1JUKSkKICB7CiAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQogICAgICBzdHI9Y2FwaXRhbGl6ZShnZXR1aWQob2JqKSk7CiAgICBlbHNlCiAgICB7CiAgICAgIGlmKCEoKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSl8fAoJICAgKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfU0hPUlQpKSkpCglpZihpc19wbGF5ZXIob2JqKSkKCSAgc3RyPUNSTkFNRShvYmopKyIgKGludmlzaWJsZSkiOwoJZWxzZQoJICBzdHI9Ii0gbm8gc2hvcnQgZGVzY3JpcHRpb24gLSI7CiAgICB9CiAgICBzdHI9QUxFRlQoc3ByaW50ZigiJU8gIixzdHIpLCAzNCwgIi4iKSsiICI7CiAgfQogIGVsc2UKICAgIHN0cj0iIjsKICBpZihpbnRlcmFjdGl2ZShvYmopKQogICAgc3RyKz0iaSI7CiAgZWxzZSBpZihsaXZpbmcob2JqKSkKICAgIHN0cis9ImwiOwogIGVsc2UKICAgIHN0cis9Ii4iOwogIHN0cis9KHNoYWRvdyhvYmosIDApID8gInMiIDogIi4iKTsKICBpZighZmlsZXx8ZmlsZT09IiIpCiAgICBXTE4oKHByZStDQVAoc3RyKSsiICIrT2JqRmlsZShvYmopKVswLi43OV0pOwogIGVsc2UKICAgIHdyaXRlX2ZpbGUoZmlsZSwocHJlK0NBUChzdHIpKyIgIitPYmpGaWxlKG9iaikpWzAuLjc5XSsiXG4iKTsKfQoKc3RhdGljIHZhcmFyZ3Mgdm9pZCBEZWVwUHJpbnRTaG9ydChvYmplY3QgZW52LCBpbnQgaW5kZW50LCBzdHJpbmcgcHJlLCBzdHJpbmcgZmlsZSkKewogIGludCBpOwogIG9iamVjdCBpdGVtOwogIHN0cmluZyBzdHI7CiAgCiAgU0VDVVJFMSgpOwogIGlmKCFlbnYpCiAgICByZXR1cm47CiAgZm9yKGk9aW5kZW50LHN0cj0iIjsgaS0tOyBzdHIrPSIgICIpOwogIGlmKHByZSkKICAgIHN0cis9cHJlOwogIGlmKCFmaWxlfHxmaWxlPT0iIikKICAgIFcoc3RyKTsKICBlbHNlCiAgICB3cml0ZV9maWxlKGZpbGUsc3RyKTsKICBpKys7CiAgUHJpbnRTaG9ydCgiIixlbnYsZmlsZSk7CiAgRk9SQUxMKGl0ZW0sIGVudikKICAgIERlZXBQcmludFNob3J0KGl0ZW0saW5kZW50KzEsQVJJR0hUKCgrK2kpKyIuICIsNCwiICIpLGZpbGUpOwp9CgpzdGF0aWMgc3RyaW5nIGJyZWFrX3N0cmluZ19oYXJkKHN0cmluZyBzdHIsIGludCBsZW4sIHN0cmluZyBwcmUpCnsKICBpbnQgcyxwLHQ7CiAgc3RyaW5nIHRtcDsKCiAgaWYoIXN0cnx8IShzPXNpemVvZihzdHIpKSkKICAgIHJldHVybiAiIjsKICB0PWxlbi0ocD1zaXplb2YocHJlKSktMTsKCiAgdG1wPSIiOwogIHdoaWxlKHArcz5sZW4pCiAgewogICAgdG1wKz1wcmUrc3RyWzAuLnRdKyJcbiI7CglzdHI9c3RyW3QrMS4uXTsKCXMtPXQ7CiAgfQogIGlmKHNpemVvZihzdHIpKQogICAgdG1wKz1wcmUrc3RyWzAuLl0rIlxuIjsKICByZXR1cm4gdG1wOwp9CiAgCnN0YXRpYyB2b2lkIGRwcm9wKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYmopCnsKICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcob2JqLT5RdWVyeVByb3Aoa2V5KSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKICBlbHNlCiAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhvYmotPlF1ZXJ5UHJvcChrZXkpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOwp9CgpzdGF0aWMgc3RyaW5nIHByb3BmbGFncyhzdHJpbmcga2V5LCBvYmplY3Qgb2IpCnsKICBpbnQgdG1wOwogIHN0cmluZyAqZmxhZ3M7CiAgdG1wPShpbnQpb2ItPlF1ZXJ5KGtleSwxKTsKICBmbGFncz0oe30pOwogIHRtcCZTQVZFID8JICAgICAgIGZsYWdzKz0oeyJTQVYifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZQUk9URUNURUQgPyAgICAgIGZsYWdzKz0oeyJQUk8ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZTRUNVUkVEID8gICAgICAgIGZsYWdzKz0oeyJTRUMifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZOT1NFVE1FVEhPRCA/ICAgIGZsYWdzKz0oeyJOU00ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZTRVRNTk9URk9VTkQgPyAgIGZsYWdzKz0oeyJTTU4ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZRVUVSWU1OT1RGT1VORCA/IGZsYWdzKz0oeyJRTU4ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZRVUVSWUNBQ0hFRCA/ICAgIGZsYWdzKz0oeyJRQ0EifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZTRVRDQUNIRUQgPyAgICAgIGZsYWdzKz0oeyJTQ0EifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHJldHVybiAiIitpbXBsb2RlKGZsYWdzLCJ8Iik7Cn0KCnN0YXRpYyB2b2lkIGRwcm9wMihzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2IpCnsKICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcGZsYWdzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7CiAgZWxzZQogICAgVyhicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcGZsYWdzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cn0KCnN0YXRpYyBtaXhlZCBwcm9wbWV0aG9kcyhzdHJpbmcga2V5LCBvYmplY3Qgb2IpCnsKICByZXR1cm4gKG1peGVkKW9iLT5RdWVyeShrZXksMik7Cn0KCnN0YXRpYyB2b2lkIGRwcm9wMyhzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2IpCnsKICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcG1ldGhvZHMoa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKICBlbHNlCiAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wbWV0aG9kcyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOwp9CgpzdGF0aWMgdm9pZCBEdW1wUHJvcGVydGllcyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIFNFQ1VSRTEoKTsKICBpZighb2JqKQogICAgcmV0dXJuOwogIFBJUEVfREVMRVRFKHBpcGVfb2YpOwogIHN3aXRjaCAoZmxhZykgewogICAgY2FzZSAwOgogICAgICB3YWxrX21hcHBpbmcoKChtYXBwaW5nICopKG9iai0+X19xdWVyeV9wcm9wZXJ0aWVzKCkpKVswXSwjJ2Rwcm9wLG9iaik7IC8vJykKICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3AyLG9iaik7IC8vJykKICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3AzLG9iaik7IC8vJykKICAgICAgYnJlYWs7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogbW92aW5nIG9iamVjdHMKICovCgpzdGF0aWMgaW50IE1vdmVPYmoob2JqZWN0IG9iajEsIG9iamVjdCBvYmoyLCBpbnQgc2lsZW50KQp7CiAgaW50IGVycjsKICBvYmplY3Qgb2xkZW52OwoKICBTRUNVUkUyKEZBTFNFKTsKICBpZighKG9iajEmJm9iajIpKQogICAgcmV0dXJuIEZBTFNFOwogIG9sZGVudj1FTlYob2JqMSk7CiAgZXJyPShpbnQpb2JqMS0+bW92ZShvYmoyLCBNX1NJTEVOVHxNX05PQ0hFQ0spOwogIGlmKCFzaWxlbnQpCiAgICBzd2l0Y2goZXJyKQogICAgewogICAgICBjYXNlIE1FX1BMQVlFUjoKICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX1BMQVlFUiIpOwogICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICAgIGNhc2UgTUVfVE9PX0hFQVZZOgogICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfVE9PX0hFQVZZIik7CiAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQoJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgICAgY2FzZSBNRV9DQU5UX1RQT1JUX0lOOgogICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfQ0FOVF9UUE9SVF9JTiIpOwogICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICAgIGNhc2UgTUVfQ0FOVF9UUE9SVF9PVVQ6CiAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9DQU5UX1RQT1JUX09VVCIpOwogICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICAgIGRlZmF1bHQ6CiAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCB1bmtub3duIHJldHVybiB2YWx1ZSIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgcmV0dXJuIFRSVUU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBzYXZlIGRlc3RydWN0aW5nIG9mIG9iamVjdHMKICovCgpzdGF0aWMgdm9pZCBEZXN0cnVjdChvYmplY3Qgb2JqKQp7CiAgaWYoIW9iaiB8fCAhdGhpc19vYmplY3QoKSkKICAgIHJldHVybjsKICBjYXRjaChvYmotPnJlbW92ZSgpKTsKICBpZihvYmplY3RwKG9iaikgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKICAgIGRlc3RydWN0KG9iaik7Cn0KCnN0YXRpYyB2b2lkIERlZXBDbGVhbihvYmplY3Qgb2JqKQp7CiAgaWYoIW9iaikKICAgIHJldHVybjsKICBmaWx0ZXIoZmlsdGVyKGRlZXBfaW52ZW50b3J5KG9iaiksICJpc19ub3RfcGxheWVyIiwgTUUpLAoJICAgICAgICJEZXN0cnVjdCIsIE1FKTsKICBpZihpc19ub3RfcGxheWVyKG9iaikpCiAgICBEZXN0cnVjdChvYmopOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogU2hvdyB0aGUgaW5oZXJpdGFuY2UgdHJlZSBvZiBvYmplY3RzCiAqLwoKc3RhdGljIG9iamVjdCAqU3ViTm9kZXMob2JqZWN0IG9iaikKewogIGludCBzOwogIG9iamVjdCAqb2JqczsKICBzdHJpbmcgKmlubGlzdDsKICAKICBpZighb2JqKQogICAgcmV0dXJuIE5VTEw7CiAgaW5saXN0PWluaGVyaXRfbGlzdChvYmopOwogIHM9c2l6ZW9mKGlubGlzdCk7CiAgb2Jqcz0oe30pOwogIHdoaWxlKHMtLT4xKQogICAgb2Jqcz0oe2ZpbmRfb2JqZWN0KGlubGlzdFtzXSl9KStvYmpzOwogIHJldHVybiBvYmpzOwp9CgpzdGF0aWMgdm9pZCBJbmhlcml0YW5jZShvYmplY3Qgb2JqLCBzdHJpbmcgZnVuYywgc3RyaW5nIHByZSkKewogIGludCBpLCBzOwogIG9iamVjdCAqbG47CiAgc3RyaW5nIHN0cjsKICAKICBpZighb2JqKQogICAgcmV0dXJuOwogIHN0cj1wcmUrIiAiK09iakZpbGUob2JqKTsKICBpZihmdW5jKQogIHsKICAgIHN0cj1BTEVGVChzdHIrIiAiLCA1MCwgIi4iKTsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cyhmdW5jLCBvYmopPT1vYmplY3RfbmFtZShvYmopKQogICAgICBzdHIrPUFSSUdIVCgiICIrZnVuYywgMTksICIuIik7CiAgICBlbHNlCiAgICAgIHN0cis9QVJJR0hUKCIiLCAxOSwgIi4iKTsKICB9CiAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCiAgICB3cml0ZV9maWxlKHBpcGVfb2Ysc3RyKyJcbiIpOwogIGVsc2UKICAgIFdMTihzdHIpOwogIGxuPVN1Yk5vZGVzKG9iaik7CiAgZm9yKGk9MDsgaTxzaXplb2YobG4pOyBpKyspCiAgICBsbj1sbi1TdWJOb2RlcyhsbltpXSk7CiAgcz1zaXplb2YobG4pOwogIGZvcihpPTA7IGk8czsgaSsrKQogICAgSW5oZXJpdGFuY2UobG5baV0sIGZ1bmMsIHByZSsiLi4uLi4iKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGZpbGUgbmFtZSBoYW5kbGluZwogKi8KCnN0YXRpYyBzdHJpbmcgWEZpbGUoc3RyaW5nIGZpbGUpCnsKICBUSygiWEZpbGU6IGZpbGU6ICIrKGZpbGU/ZmlsZToiKE5VTEwpIikpOwogIGlmKGZpbGUpCiAgICBzd2l0Y2goZmlsZVswXSkKICAgIHsKICAgICAgY2FzZSAnQCc6CglyZXR1cm4gc291cmNlX2ZpbGVfbmFtZShYRmluZE9iaihmaWxlWzEuLjwxXSkpOwogICAgICBjYXNlICckJzoKCXJldHVybiBzb3VyY2VfZmlsZV9uYW1lKFhGaW5kT2JqKGZpbGUpKTsKICAgICAgZGVmYXVsdDoKCXJldHVybiBvbGRfZXhwbG9kZShsb25nX3BhdGgoZmlsZSksIiMiKVswXTsKICAgIH0KICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIHN0cmluZyBYRmluZEZpbGUoc3RyaW5nIGZpbGUpCnsKICBUSygiWEZpbmRGaWxlOiBmaWxlOiAiKyhmaWxlP2ZpbGU6IihOVUxMKSIpKTsKICBpZihmaWxlPVhGaWxlKGZpbGUpKQogIHsKICAgIGlmKGZpbGVfc2l6ZShmaWxlKT49MCkKICAgICAgcmV0dXJuIGZpbGU7CiAgICBpZihmaWxlWzwzLi48MV0hPSIuYyIgJiYgZmlsZV9zaXplKGZpbGUrIi5jIik+MCkKICAgICAgcmV0dXJuIGZpbGUrIi5jIjsKICB9CiAgV0RMTigiRmlsZSBub3QgZm91bmQgb3Igbm90IHJlYWRhYmxlIFsiK3Nob3J0X3BhdGgoZmlsZSkrIl0iKTsKICByZXR1cm4gTlVMTDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGZpbGUgcHJpbnRpbmcsIHNlYXJjaGluZyBhbmQgZXhlY3V0aW5nCiAqLwoKc3RhdGljIHZvaWQgWE1vcmVGaWxlKHN0cmluZyBmaWxlLCBpbnQgZmxhZykKewogIGludCBzLHNpemU7CiAgCiAgU0VDVVJFMSgpOwogIGlmKCFmaWxlKQogICAgcmV0dXJuOwogIAogIC8vIHRlcm09KHN0cmluZyljbG9uZXItPlF1ZXJ5UHJvcChQX1RUWSkhPSJkdW1iIjsKICBpZigoc2l6ZT0oZmlsZV9zaXplKG1vcmVmaWxlPWxvbmdfcGF0aChmaWxlKSkpKT4wKQogIHsKICAgIGlmKHNpemU+MTAwMDAwKQogICAgICBXRExOKCJXYXJuaW5nOiBsYXJnZSBmaWxlIik7CiAgICBNb3JlRmlsZShOVUxMKTsKICB9CiAgZWxzZSBpZihmbGFnKQogICAgV0RMTigiQ2Fubm90IHJlYWQgZmlsZSIpOwp9CgovKgpzdGF0aWMgc3RyaW5nIHJlYWRfYnVmZmVyKHN0cmluZyBmaWxlbmFtZSwgaW50IHN0YXJ0LCBpbnQgbnVtYmVyKQp7CiAgbWl4ZWQgdG1wOwogIHN0cmluZyByZXN1bHQ7CiAgaW50IGN1cnJlbnQ7CgogIGlmKCFmaWxlbmFtZXx8ZmlsZW5hbWU9PSIiKQogICAgcmV0dXJuICIiOwogIGlmKG51bWJlcjw9MSkKICAgIG51bWJlcj0xOwogIG51bWJlci0tOwogIHJlc3VsdD0iIjsKICBpZihmaWxlbmFtZSE9bGluZV9idWZmZXJfbmFtZSkKICB7CiAgICAvLyBUSygicmVhZF9idWZmZXI6IGluaXRpYWxpemluZyIpOwogICAgbGluZV9idWZmZXI9KFtdKTsKICAgIGxpbmVfYnVmZmVyX25hbWU9ZmlsZW5hbWU7CiAgICBjdXJyZW50PTA7CiAgfQogIGVsc2UKICAgIGN1cnJlbnQ9c3RhcnQ7CgogIHdoaWxlKGN1cnJlbnQ8PXN0YXJ0K251bWJlciAmJiBzdHJpbmdwKCh0bXA9bG9hZF9idWZmZXIoY3VycmVudCsrKSkpKQogICAgaWYoY3VycmVudD49c3RhcnQpCiAgICAgIHJlc3VsdCs9dG1wOwogIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBzdHJpbmcgbG9hZF9idWZmZXIoaW50IGxpbmUpCnsKICBpbnQgaSwgY3VycmVudCwgc3RhcnQsIGxlbmd0aCwgKmlkeDsKCiAgaWYoaW50cChsaW5lX2J1ZmZlcltsaW5lXSkpCiAgewogICAgLy8gVEsoImxvYWRfYnVmZmVyOiBOb3Rmb3VuZDogIitsaW5lKTsKICAgIGN1cnJlbnQ9bGluZTsKICAgIHdoaWxlKGN1cnJlbnQ+MCYmaW50cChsaW5lX2J1ZmZlclstLWN1cnJlbnRdKSk7CiAgICBmb3IoaT1jdXJyZW50O2k8PWxpbmU7aSsrKQogICAgewogICAgICAvLyBUSygibG9hZF9idWZmZXI6IHRyeWluZzogIitpKTsKICAgICAgaWYoaT4wKQoJaWR4PWxpbmVfYnVmZmVyW2ktMV07CiAgICAgIGVsc2UKCWlkeD0oezAsMH0pOwogICAgICBsZW5ndGg9cmVhZF9saW5lKChzdGFydD1pZHhbMF0raWR4WzFdKSk7CiAgICAgIC8vIFRLKCJsb2FkX2J1ZmZlcjogIitzdGFydCsiLyIrbGVuZ3RoKTsKICAgICAgbGluZV9idWZmZXJbaV09KHtzdGFydCxsZW5ndGh9KTsKICAgIH0KICB9CiAgaWR4PWxpbmVfYnVmZmVyW2xpbmVdOwogIHJldHVybgogICAgcmVhZF9ieXRlcyhsaW5lX2J1ZmZlcl9uYW1lLGlkeFswXSxpZHhbMV0pOwp9CgpzdGF0aWMgaW50IHJlYWRfbGluZShpbnQgb2Zmc2V0KQp7CiAgbWl4ZWQgbG9jX2J1ZjsKICBpbnQgbGVuZ3RoLCBwb3M7CgogIC8vIFRLKCJyZWFkX2xpbmU6ICIrb2Zmc2V0KTsKICBsZW5ndGg9MDsKICB3aGlsZSghaW50cCgobG9jX2J1Zj1yZWFkX2J5dGVzKGxpbmVfYnVmZmVyX25hbWUsb2Zmc2V0K2xlbmd0aCwxMDI0KSkpKQogIHsKICAgIGlmKChwb3M9bWVtYmVyKGxvY19idWYsJ1xuJykpPj0wKQogICAgICByZXR1cm4gbGVuZ3RoK3BvcysxOwogICAgbGVuZ3RoKz0xMDI0OwogIH0KICByZXR1cm4gbGVuZ3RoOwp9CiovCgpzdGF0aWMgdm9pZCBNb3JlRmlsZShzdHJpbmcgc3RyKQp7CiAgaW50IGksIG9mZjsKICBzdHJpbmcgZiwgbCwgcjsKICAKICBTRUNVUkUxKCk7CiAgCiAgaWYgKHN0ciAvKiYmIHNpemVvZihzdHIpKi8pCiAgewoJCWlmKCAhc2l6ZW9mKHN0cikgKSBzdHI9IlwwIjsKICAgIGlmKHRlcm0pCiAgICAgIFcoIhtNG1sxTSIpOwogICAgc3dpdGNoKHN0clswXSkKICAgIHsKICAgICAgY2FzZSAncSc6CiAgICAgIGNhc2UgJ3gnOgogICAgICBtb3JlZmxhZz1GQUxTRTsKICAgICAgbW9yZW9mZnNldD0xOwogICAgICBpZihtb3JlZmlsZT09VE1QX0ZJTEV8fG1vcmVmaWxlPT1QSVBFX0ZJTEUpCglybShtb3JlZmlsZSk7CiAgICAgIHJldHVybiBOVUxMOwogICAgICBicmVhazsKICAgICAgY2FzZSAnUCc6CiAgICAgIGNhc2UgJ1UnOgogICAgICBtb3JlZmxhZz1GQUxTRTsKICAgICAgbW9yZW9mZnNldD1tb3Jlb2Zmc2V0LW1vcmVsaW5lczsKICAgICAgY2FzZSAncCc6CiAgICAgIGNhc2UgJ3UnOgogICAgICBtb3Jlb2Zmc2V0PW1vcmVvZmZzZXQtMiptb3JlbGluZXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlICdEJzoKICAgICAgY2FzZSAnTic6CiAgICAgIG1vcmVvZmZzZXQrPW1vcmVsaW5lczsKICAgICAgY2FzZSAwOgkvKiBSRVRVUk4gKi8KICAgICAgY2FzZSAnZCc6CiAgICAgIGlmKG1vcmVmbGFnKQogICAgICB7Cgltb3JlZmxhZz1GQUxTRTsKCW1vcmVvZmZzZXQ9MTsKCWlmKG1vcmVmaWxlPT1UTVBfRklMRSkKCSAgcm0obW9yZWZpbGUpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgICBjYXNlICcvJzoKICAgICAgbW9yZW9mZnNldC0tOwogICAgICBtb3JlX3NlYXJjaGV4cHI9c3RyWzEuLjwxXTsKICAgICAgY2FzZSAnbic6CiAgICAgIGk9bW9yZW9mZnNldC1tb3JlbGluZXMrMTsKICAgICAgaWYobW9yZV9zZWFyY2hleHByPT0iIikKICAgICAgewoJV0RMTigiTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIik7CglyZXR1cm47CiAgICAgIH0KICAgICAgaWYoIXJlZ2V4cCgoeyJkdW1teSJ9KSwgbW9yZV9zZWFyY2hleHByKSkKCVdETE4oIkJhZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKICAgICAgZWxzZQoJd2hpbGUoKGw9cmVhZF9maWxlKG1vcmVmaWxlLCBpKyssIDEpKSYmCgkgICAgICAhc2l6ZW9mKHJlZ2V4cCgoe2x9KSwgbW9yZV9zZWFyY2hleHByKSkpCgkgIDsKICAgICAgaWYobCkKICAgICAgewoJV0xOKCIqKiogU2tpcHBpbmcgLi4uIik7Cgltb3Jlb2Zmc2V0PWktMTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKCVdMTigiKioqIFBhdHRlcm4gbm90IGZvdW5kIik7Cgltb3Jlb2Zmc2V0LT1tb3JlbGluZXM7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJzAnLi4nOSc6CiAgICAgIHNzY2FuZihzdHIsICIlZCIsIGkpOwogICAgICBtb3Jlb2Zmc2V0PWk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlCiAgewogICAgbW9yZW9mZnNldD0xOwogICAgbW9yZWZsYWc9RkFMU0U7CiAgfQogIGlmKG1vcmVvZmZzZXQ8MSkKICAgIG1vcmVvZmZzZXQ9MTsKICBpZihDYXRGaWxlKCkpCiAgICBXKCIqKiogTW9yZTogcSx1LFUsZCxELC88cmVnZXhwPiw8bGluZT4gWyIrKG1vcmVvZmZzZXQtMSkrIl0gKioqICIpOwogIGVsc2UKICB7CiAgICBXKCIqKiogTW9yZTogcSx1LFUsZCxELC88cmVnZXhwPiw8bGluZT4gWyIrKG1vcmVvZmZzZXQtMSkrIj1FT0ZdICoqKiAiKTsKICAgIG1vcmVmbGFnPVRSVUU7CiAgfQogIGlucHV0X3RvKCJNb3JlRmlsZSIpOwogIHJldHVybjsKfQoKLy8gU2NoYWRlIGVpZ2VudGxpY2ggZGFzIGljaCBlcyBuZXVzY2hyZWliZW4gbXVzc3RlLCBhYmVyIGVzIGlzdAovLyBzY2huZWxsZXIgbmV1IGdlc2NocmllYmVuIGFscyBkdXJjaCBkaWUgdW5kb2t1bWVudGllcmVuIGFsdGVuIEZ1bmt0aW9uZW4KLy8gZHVyY2h6dXN0ZWlnZW4uLi4gKnNldWZ6KgovLyAgICAgICAgICAgIFBhZHJlaWMKCi8vICsrKyBLb21tZW50YXJsb3M6IFByb2dyYW1taWVyZXIgc2NocmVpYnQgdW52ZXJzdGFlbmRsaWNoZW4gQ29kZSBuZXUsCi8vICAgICBpbmRlbSBlciB1bnZlcnN0YWVuZGxpY2hlbiBDb2RlIHNjaHJlaWJ0LiArKysKLy8gKysrIEtvbW1lbnRhcmxvczogUHJvZ3JhbW1pZXJlciBlcnNldHp0IHVudmVyc3RhZW5kbGljaGVuIENvZGUgZHVyY2gKLy8gICAgIHVudmVyc3RhZW5kbGljaGVuIENvZGUuICsrKwovLyAgIEFyYXRob3JuIChtaXQgWmVzc3RyYSBpbSBTaW5uKQoKc3RhdGljIHN0cmluZyBsYXN0X2ZpbGUsICpsYXN0X2ZpbGVfYnVmZmVyOwpzdGF0aWMgaW50ICAgIGxhc3RfZmlsZV9kYXRlLCBsYXN0X2ZpbGVfc2l6ZSwgbGFzdF9maWxlX2NvbXBsZXRlOwoKc3RhdGljIHN0cmluZyBzcmVhZF9saW5lKGludCBudW0pCnsKICAgaWYgKCFtb3JlZmlsZSkgcmV0dXJuICIiOwogICBpZiAobGFzdF9maWxlIT1tb3JlZmlsZSB8fCBsYXN0X2ZpbGVfZGF0ZSE9ZmlsZV90aW1lKG1vcmVmaWxlKSkgewogICAgICBpZiAoIShsYXN0X2ZpbGU9cmVhZF9ieXRlcyhtb3JlZmlsZSwgMCwgNTAwMDApKSkgcmV0dXJuICIiOwogICAgICBsYXN0X2ZpbGVfZGF0ZT1maWxlX3RpbWUobW9yZWZpbGUpOwogICAgICBsYXN0X2ZpbGVfYnVmZmVyPWV4cGxvZGUobGFzdF9maWxlLCAiXG4iKTsKICAgICAgbGFzdF9maWxlX3NpemU9c2l6ZW9mKGxhc3RfZmlsZV9idWZmZXIpOwogICAgICBpZiAoc2l6ZW9mKGxhc3RfZmlsZSk9PTUwMDAwICYmIGxhc3RfZmlsZVs8MV0hPSdcbicpIHsKCSBsYXN0X2ZpbGVfc2l6ZS0tOyAvLyBsZXR6dGUgWmVpbGUgbmljaHQgdm9sbHN0YWVuZGlnIGdlbGVzZW4KCSBsYXN0X2ZpbGVfY29tcGxldGU9MDsKICAgICAgfQogICAgICBlbHNlIGlmIChmaWxlX3NpemUobW9yZWZpbGUpPjUwMDAwKQoJbGFzdF9maWxlX2NvbXBsZXRlPTA7CiAgICAgIGVsc2UgbGFzdF9maWxlX2NvbXBsZXRlPTE7CiAgICAgIGxhc3RfZmlsZT1tb3JlZmlsZTsKICAgfQogICBpZiAobnVtPT0wKSBudW09MTsKICAgLy8gYmVpIHp1IGdyb3NzZW4gRmlsZXMgbmljaHQgbWVociBhbGxlcyBidWZmZXJuLi4uCiAgIGlmIChudW0+bGFzdF9maWxlX3NpemUpIHsKICAgICAgaWYgKGxhc3RfZmlsZV9jb21wbGV0ZSkgcmV0dXJuICIiOwogICAgICByZXR1cm4gKHJlYWRfZmlsZShtb3JlZmlsZSwgbnVtLCAxKSB8fCAiIik7CiAgIH0KICAgcmV0dXJuIGxhc3RfZmlsZV9idWZmZXJbbnVtLTFdKyJcbiI7Cn0KCnN0YXRpYyBpbnQgQ2F0RmlsZSgpCnsKICBpbnQgZW5kOwogIHN0cmluZyBsOwogIAogIGVuZD1tb3Jlb2Zmc2V0K21vcmVsaW5lczsKICB3aGlsZShtb3Jlb2Zmc2V0PGVuZCkKLy8gICAgaWYoKGw9cmVhZF9maWxlKG1vcmVmaWxlLCBtb3Jlb2Zmc2V0LCAxKSkhPSIiKQogICAgaWYoKGw9c3JlYWRfbGluZShtb3Jlb2Zmc2V0KSkhPSIiKQogICAgewogICAgICBtb3Jlb2Zmc2V0Kys7CiAgICAgIFcobCk7CiAgICB9CiAgICBlbHNlCiAgICAgIHJldHVybiBGQUxTRTsKLy8gIGlmKHJlYWRfZmlsZShtb3JlZmlsZSwgbW9yZW9mZnNldCsxLCAxKSE9IiIpCiAgaWYoc3JlYWRfbGluZShtb3Jlb2Zmc2V0KzEpIT0iIikKICAgIHJldHVybiBUUlVFOwogIGVsc2UKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIGludCBYR3JlcEZpbGUoc3RyaW5nIHBhdCwgc3RyaW5nIGZpbGUsIGludCBtb2RlKQp7CiAgU0VDVVJFMihGQUxTRSk7CiAgVEsoIlhHcmVwRmlsZTogcGF0OiAiK3BhdCsiIGZpbGU6ICIrZmlsZSsiIG1vZGU6ICIrbW9kZSk7CiAgaWYoIShwYXQmJmZpbGUpKQogICAgcmV0dXJuIEZBTFNFOwoKICAvLyBtYXguIEFuemFobCB2b24gWmVpbGVuIHBybyBQb3J0aW9uICh1ZWJlcnNjaGxhZzogMTAwIEJ5dGVzIHBybyBaZWlsZSkKICBpbnQgbWF4bGluZXMgPSBkcml2ZXJfaW5mbyhESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKVtMSU1JVF9GSUxFXSAvIDEwMDsKICBpbnQgc3RhcnQ7CiAgc3RyaW5nIGJ1ZjsKICAvLyBGaWxlIHBvcnRpb25zd2Vpc2UgZWlubGVzZW4gdW5kIHZlcmFyYmVpdGVuCiAgd2hpbGUoYnVmID0gcmVhZF9maWxlKGZpbGUsIHN0YXJ0LCBtYXhsaW5lcykpCiAgewogICAgc3RyaW5nICpsaW5lcyA9IHN0cmlwX2V4cGxvZGUoYnVmLCJcbiIpOwogICAgaW50IGY7IC8vIFBybyBUcmVmZmVyIGVyaG9laHQsIGJlbnV0enQgenVyIGVpbm1hbGlnZW4gQXVzZ2FiZSBkZXMgRmlsZXMKICAgIC8vIHVlYmVyIGFsbGUgWmVpbGVuIGxhdWZlbiB1bmQgcmVnZXhwZW4KICAgIGZvcmVhY2goc3RyaW5nIGxpbmUgOiBsaW5lcykKICAgIHsKICAgICAgc3RyaW5nICp0cz1yZWdleHAoKHsobW9kZSZYR1JFUF9JQ0FTRT9sb3dlcl9jYXNlKGxpbmUpOmxpbmUpfSksCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdCk7CiAgICAgIGlmKHNpemVvZih0cykpCiAgICAgIHsKICAgICAgICBpZighKG1vZGUmWEdSRVBfUkVWRVJUKSkKICAgICAgICB7CiAgICAgICAgICBpZighZisrKQogICAgICAgICAgICAgIHdyaXRlX2ZpbGUoVE1QX0ZJTEUsICIqKiogRmlsZTogIitmaWxlKyIgKioqXG4iKTsKICAgICAgICAgIHdyaXRlX2ZpbGUoVE1QX0ZJTEUsIGxpbmUrIlxuIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYobW9kZSZYR1JFUF9SRVZFUlQpCiAgICAgIHsKICAgICAgICBpZighZisrKQogICAgICAgICAgICB3cml0ZV9maWxlKFRNUF9GSUxFLCAiKioqIEZpbGU6ICIrZmlsZSsiICoqKlxuIik7CiAgICAgICAgd3JpdGVfZmlsZShUTVBfRklMRSwgbGluZSsiXG4iKTsKICAgICAgfQogICAgfQogICAgaWYgKHNpemVvZihsaW5lcykgPCBtYXhsaW5lcykKICAgICAgYnJlYWs7CiAgICBlbHNlCiAgICAgIHN0YXJ0ICs9IHNpemVvZihsaW5lcyk7CiAgfQogIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBYRXhlY0ZpbGUoaW50IGxpbmUpCnsKICBpbnQgaTsKICAKICBpZighc2NyaXB0bGluZSkKICAgIHJldHVybjsKICBmb3IoaT1saW5lOyBpPHNjcmlwdHNpemUmJmk8bGluZStFWEVDX0xJTkVTOyBpKyspCiAgewogICAgaWYoIXNjcmlwdGxpbmVbaV0pCiAgICAgIGNvbnRpbnVlOwogICAgaWYoIUNvbW1hbmQoc2NyaXB0bGluZVtpXSkpCiAgICB7CiAgICAgIHNjcmlwdGxpbmU9TlVMTDsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICBpZihpPHNjcmlwdHNpemUpCiAgICBjYWxsX291dCgiWEV4ZWNGaWxlIiwgRVhFQ19USU1FLCBpKTsKICBlbHNlCiAgICBzY3JpcHRsaW5lPU5VTEw7Cn0KCnN0YXRpYyB2b2lkIFhtdHBTY3JpcHQoc3RyaW5nIGRpciwgc3RyaW5nIGZpbGUsIHN0cmluZyBvcHQpCnsKICBpbnQgcywgdDsKICBzdHJpbmcgKmZpbGVzOwogIAogIHM9c2l6ZW9mKGZpbGVzPWdldF9kaXIoZGlyKyIvKiIpKTsKICB3aGlsZShzLS0pCiAgewogICAgdD1zaXplb2YoZmlsZXNbc10pLTE7CiAgICBpZihmaWxlc1tzXSA9PSAiLi4iIHx8IGZpbGVzW3NdID09ICIuIiB8fCBmaWxlc1tzXVt0XSA9PSAnficgfHwKICAgICAgIChmaWxlc1tzXVswXSA9PSAnIycgJiYgZmlsZXNbc11bdF0gPT0gJyMnKSkKICAgICAgY29udGludWU7CiAgICBpZihmaWxlX3NpemUoZGlyKyIvIitmaWxlc1tzXSk9PS0yKQogICAgewogICAgICB3cml0ZV9maWxlKGZpbGUsICJta2RpciAiK2ZpbGVzW3NdKyIgOyBjZCAiK2ZpbGVzW3NdKyJcbiIpOwogICAgICBYbXRwU2NyaXB0KGRpcisiLyIrZmlsZXNbc10sIGZpbGUsIG9wdCk7CiAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgImNkIC4uXG4iKTsKICAgIH0KICAgIGVsc2UKICAgICAgd3JpdGVfZmlsZShmaWxlLCAibXRwIC1yICIrb3B0KyIgIitkaXIrIi8iK2ZpbGVzW3NdKyJcbiIpOwogIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICBwbGF5ZXIgcHJvcGVydGllcyBoYW5kbGluZwogKi8KCnN0YXRpYyBzdHJpbmcgUGxheWVySWRsZShvYmplY3Qgb2JqKQp7CiAgc3RyaW5nIHN0cjsKICBpbnQgaSwgdG1wOwogIAogIGlmKCFvYmopCiAgICByZXR1cm4gTlVMTDsKICBpZigoaT1xdWVyeV9pZGxlKG9iaikpPj02MCkKICB7CiAgICBzdHI9QVJJR0hUKCIiKyhpLzM2MDApLCAyLCAiMCIpOwogICAgaS09KGkvMzYwMCkqMzYwMDsKICAgIHN0cis9IiciK0FSSUdIVCgiIisoaS82MCksIDIsICIwIik7CiAgfQogIGVsc2UKICAgIHN0cj0iLi4uLi4iOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyQWdlKG9iamVjdCBvYmopCnsKICBzdHJpbmcgc3RyOwogIGludCBpLCB0bXA7CiAgCiAgaWYoIW9iaikKICAgIHJldHVybiBOVUxMOwogIGk9KGludClvYmotPlF1ZXJ5UHJvcChQX0FHRSk7CiAgc3RyPSIgIitBUklHSFQoIiIrKGkvNDMyMDApLCA0LCAiLiIpOwogIGktPShpLzQzMjAwKSo0MzIwMDsKICByZXR1cm4gc3RyKyI6IitBUklHSFQoIiIrKGkvMTgwMCksIDIsICIwIik7Cn0KCnN0YXRpYyBzdHJpbmcgY3JuYW1lKG9iamVjdCB3aG8pCnsKICBzdHJpbmcgdWlkLCBsbmFtZTsKCiAgaWYoKHVpZD1nZXR1aWQod2hvKSk9PVJPT1RJRCAmJiAKICAgICBvYmplY3RfbmFtZSh3aG8pWzAuLjddPT0iL3NlY3VyZS8iICYmCiAgICAgKGxuYW1lPShzdHJpbmcpd2hvLT5sb2dpbm5hbWUoKSkpCiAgICByZXR1cm4gQ0FQKGxuYW1lKTsKICByZXR1cm4gQ0FQKHVpZCk7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyV2hvKG9iamVjdCBvYmopCnsKICBvYmplY3QgdG1wOwogIHN0cmluZyBzdHIsIHN0bXA7CiAgc3RyPUFSSUdIVCgiIitMRVZFTChvYmopICAsICAzLCAiICIpOwogIHN0cis9QUxFRlQoIiAiK2NybmFtZShvYmopKyIgIiwgMTIsICIuIik7CiAgc3RyKz1QbGF5ZXJBZ2Uob2JqKTsKICBzdHIrPSgoaW50KW9iai0+UXVlcnlQcm9wKFBfR0VOREVSKT09MSA/ICIgbSAiIDogIiBmICIpOwogIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfRlJPRykpICA/ICJmIiA6ICIuIjsKICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0dIT1NUKSkgPyAiZyIgOiAiLiI7CiAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9JTlZJUykpID8gImkiIDogIi4iOwogIHN0cis9KHF1ZXJ5X2VkaXRpbmcob2JqKXx8cXVlcnlfaW5wdXRfcGVuZGluZyhvYmopID8gImUiIDogIi4iKTsKICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0FXQVkpKSAgPyAiYSIgOiAiLiI7CiAgc3RyKz0iICIrUGxheWVySWRsZShvYmopKyIgIjsKICBzdHIrPSh0bXA9RU5WKG9iaikpID8gT2JqRmlsZSh0bXApIDogIi0gZmFicmljIG9mIHNwYWNlIC0iOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyTWFpbChvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcmV0dXJuIHByZSsibWFpbDogIitvYmotPlF1ZXJ5UHJvcChQX01BSUxBRERSKTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJJUChvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcmV0dXJuIHByZSsiaG9zdDogIitxdWVyeV9pcF9uYW1lKG9iaikrIiAoIitxdWVyeV9pcF9udW1iZXIob2JqKSsiKSI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyUmFjZShvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyB0bXAsIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICBwcmU9cHJlKyJyYWNlOiAiK0FMRUZUKG9iai0+UXVlcnlQcm9wKFBfUkFDRSkrIiAiLCAxMCwgIi4iKSsiIGd1aWxkOiAiOwogIHRtcD0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfR1VJTEQpOwogIHJldHVybiB0bXAgPyBwcmUrdG1wIDogcHJlKyItIG5vbmUgLSI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyRG9tYWluKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgaW50IGksIHM7CiAgbWl4ZWQgKnVpbmZvOwogIHN0cmluZyAqZG9tYWlucywgcHJlOwogIAogIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOwogIHByZSs9ImRvbWFpbmxvcmQgb2Y6ICI7CiAgdWluZm89KG1peGVkKilNQVNURVItPmdldF91c2VyaW5mbyhnZXR1aWQob2JqKSk7CiAgaWYodWluZm8mJihkb21haW5zPXVpbmZvWzNdKSYmKHM9c2l6ZW9mKGRvbWFpbnMpKSkKICB7CiAgICBmb3IoaT0wOyBpPHM7IGkrKykKICAgIHsKICAgICAgcHJlICs9IENBUChkb21haW5zW2ldKTsKICAgICAgaWYoaTxzLTEpCglwcmUgKz0gIiwgIjsKICAgIH0KICB9CiAgcmV0dXJuIHByZTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJTdGF0cyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcHJlKz0iaHA9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9IUCksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0hQKSwgMywgIjAiKTsKICBwcmUrPSIgc3A9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9TUCksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX1NQKSwgMywgIjAiKTsKICBwcmUrPSIgZm9vZD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0ZPT0QpLCAzLCAiMCIpOwogIHByZSs9Ii8iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX01BWF9GT09EKSwgMywgIjAiKTsKICBwcmUrPSIgZHJpbms9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9EUklOSyksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSwgMywgIjAiKTsKICBwcmUrPSIgZXhwcz0iK29iai0+UXVlcnlQcm9wKFBfWFApOwogIHJldHVybiBwcmU7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyU25vb3Aob2JqZWN0IG9iaiwgaW50IGZsYWcpCnsKICBzdHJpbmcgdG1wLCBwcmU7CiAgb2JqZWN0IHZpY3RpbTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICBwcmU9cHJlKyJpcyBzbm9vcGVkIGJ5OiAiOwogIGlmKHZpY3RpbT1xdWVyeV9zbm9vcChvYmopKQogICAgcHJlKz1BUklHSFQoIiAiK2NybmFtZSh2aWN0aW0pLCAxMiwgIi4iKTsKICBlbHNlCiAgICBwcmUrPSIuLi4uLi4uLi4uLi4iOwogIHJldHVybiBwcmU7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyQ21kQXZnKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgc3RyaW5nIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICByZXR1cm4gcHJlKyJjbWRhdmc6ICIrKGludClvYmotPl9xdWVyeV9jb21tYW5kX2F2ZXJhZ2UoKTsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBtc2cgaW5wdXQgdG8gb2JqZWN0cwogKi8KCnN0YXRpYyB2b2lkIFhNc2dTYXkoc3RyaW5nIHN0cikKewogIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCiAgewogICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CiAgICBzYXkoIltFbmQgb2YgbWVzc2FnZV1cbiIpOwogIH0KICBlbHNlCiAgewogICAgc2F5KHN0cisiXG4iKTsKICAgIGlucHV0X3RvKCJYTXNnU2F5Iik7CiAgfQp9CgpzdGF0aWMgdm9pZCBYTXNnVGVsbChzdHJpbmcgc3RyKQp7CiAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKICB7CiAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKICAgIHRlbGxfb2JqZWN0KG1zZ3RvLCAiW0VuZCBvZiBtZXNzYWdlXVxuIik7CiAgfQogIGVsc2UKICB7CiAgICB0ZWxsX29iamVjdChtc2d0bywgc3RyKyJcbiIpOwogICAgaW5wdXRfdG8oIlhNc2dUZWxsIik7CiAgfQp9CgpzdGF0aWMgdm9pZCBYTXNnU2hvdXQoc3RyaW5nIHN0cikKewogIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCiAgewogICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CiAgICBzaG91dCgiW0VuZCBvZiBtZXNzYWdlXVxuIik7CiAgfQogIGVsc2UKICB7CiAgICBzaG91dChzdHIrIlxuIik7CiAgICBpbnB1dF90bygiWE1zZ1Nob3V0Iik7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb3duIG9iamVjdCBtb3ZpbmcKICovCgppbnQgbW92ZShtaXhlZCBkZXN0KQp7CiAgbW92ZV9vYmplY3QoTUUsIGNsb25lcj9jbG9uZXI6ZGVzdCk7CiAgcmV0dXJuIFRSVUU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvYmplY3QgaWQKICovCgppbnQgaWQoc3RyaW5nIHN0cikKewogIGlmKCFzZWN1cml0eSgpJiZNT0RFKE1PREVfU0NBTkNISykmJlJUUCYmIUlTX0FSQ0goUlRQKSkKICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAoaWQpIFsiK3F1ZXJ5X3ZlcmIoKSsiXSAiKwoJIChQUkVWID8gT2JqRmlsZShQUkVWKSA6ICJbZGVzdHJ1Y3RlZCBvYmplY3RdIikpOwogIHJldHVybiBMT1dFUihzdHIpPT1MT1dFUihUT09MX05BTUUpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogc2hvcnQgYW5kIGxvbmcgZGVzY3JpcHRpb24KICovCgpzdHJpbmcgc2hvcnQoKQp7CiAgcmV0dXJuIF9xdWVyeV9zaG9ydCgpKyIuXG4iOwp9CgpzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKewogIHN0cmluZyBzaDsgLy8gYWRkZWQgYnkgUnVtYXRhCiAgaWYoY2xvbmVyKQogIHsKICAgIGlmKCghc2VjdXJpdHkoKSkmJk1PREUoTU9ERV9TQ0FOQ0hLKSYmIUlTX0FSQ0goUlRQKSkKICAgICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChzaG9ydCkgWyIrcXVlcnlfdmVyYigpKyJdICIrCgkgICAoUFJFViA/IE9iakZpbGUoUFJFVikgOiAiW2Rlc3RydWN0ZWQgb2JqZWN0XSIpKTsKCWlmKCBzaD1RdWVyeShQX1NIT1JUKSApIHJldHVybiBzaDsgLy8gYWRkZWQgYnkgUnVtYXRhCiAgICByZXR1cm4gY2xvbmVyLT5uYW1lKFdFU1NFTikrIiAiK1RPT0xfVElUTEUrIiBbIisKICAgICAgY3RpbWUodGltZSgpKVsxMS4uMThdKyJdIjsKICB9CiAgcmV0dXJuIFRPT0xfVElUTEU7Cn0KCnN0cmluZyBsb25nKCkKewogIHJldHVybiBfcXVlcnlfbG9uZygpOwp9CgpzdHJpbmcgX3F1ZXJ5X2xvbmcoKQp7CiAgaWYoY2xvbmVyJiYhc2VjdXJpdHkoKSYmTU9ERShNT0RFX1NDQU5DSEspJiYhSVNfQVJDSChSVFApKQogIHsKICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAobG9uZykgWyIrcXVlcnlfdmVyYigpKyJdICIrCgkgKFBSRVYgPyBPYmpGaWxlKFBSRVYpIDogIltkZXN0cnVjdGVkIG9iamVjdF0iKSk7CiAgfQogIHJldHVybiAKICAgICJUaGlzIGlzICIrVE9PTF9OQU1FKyIgdmVyc2lvbiAiK1RPT0xfVkVSU0lPTisKICAgICIgKG1haW50YWluZWQgYnkgS2lya0BNb3JnZW5HcmF1ZW4pXG4iKwogICAgIk9yaWdpbmFsIGNvcHlyaWdodCBoZWxkIGJ5IEh5cC5cbiIrCiAgICAiR2FtZWRyaXZlciBwYXRjaGxldmVsOiAiK19fVkVSU0lPTl9fKyIgbWFzdGVyIG9iamVjdDogIitfX01BU1RFUl9PQkpFQ1RfXysKICAgICJcblxuRG8gJ3hoZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiI7Cn0KCnN0cmluZyBuYW1lKG1peGVkIGR1bW15MSwgbWl4ZWQgZHVtbXkyKQp7CiAgcmV0dXJuIF9xdWVyeV9zaG9ydCgpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogbGlnaHQgc3R1ZmYKICovCgppbnQgX3F1ZXJ5X2xpZ2h0KCkKewogIHJldHVybiB4bGlnaHQ7Cn0KCmludCBfc2V0X2xpZ2h0KGludCB4KQp7CiAgcmV0dXJuIHhsaWdodDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEF1dG9sb2FkaW5nCiAqLwoKbWl4ZWQgKl9xdWVyeV9hdXRvbG9hZG9iaigpCnsKICByZXR1cm4gQVVUT0xPQURfQVJHUzsKfQoKdm9pZCBfc2V0X2F1dG9sb2Fkb2JqKG1peGVkICphcmdzKQp7CiAgV0xOKFRPT0xfVElUTEUrIiAuLi4iKTsKICBpZighcG9pbnRlcnAoYXJncykpCiAgICA7CiAgZWxzZSBpZihzaXplb2YoYXJncykhPTMpCiAgICA7CiAgZWxzZSBpZighc3RyaW5ncChhcmdzWzBdKSkKICAgIDsKICBlbHNlIGlmKCFpbnRwKGFyZ3NbMV0pKQogICAgOwogIGVsc2UgaWYoIWludHAoYXJnc1syXSkpCiAgICA7CiAgZWxzZQogIHsKICAgIGlmKChzdHJpbmcpYXJnc1swXSE9VE9PTF9JTlRFUk5BTCkKICAgIHsKICAgICAgV0xOKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOwogICAgICBXTE4oIioqKgkgICAgTkVXIEVESVRJT04gICAgICAqKioiKTsKICAgICAgV0xOKCIqKioJZG8gJ3h0b29sIG5ld3MnIGZvciAgKioqIik7CiAgICAgIFdMTigiKioqCSBtb3JlIGluZm9ybWF0aW9uICAgICoqKiIpOwogICAgICBXTE4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiAgICB9CiAgICBtb2RpPShpbnQpYXJnc1sxXTsKICAgIG1vcmVsaW5lcz0oaW50KWFyZ3NbMl07CiAgICByZXR1cm47CiAgfQogIFcoIihiYWQgYXV0b2xvYWQsIHVzaW5nIGRlZmF1bHQpXG4iKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGNyZWF0aW9uLCB1cGRhdGluZyBhbmQgaW5pdGlhbGl6YXRpb24gc3R1ZmYKICovCgp2b2lkIHVwZGF0ZV90b29sKG1peGVkICphcmdzLCBvYmplY3Qgb2JqKQp7CiAgU0VDVVJFMSgpOwogIGlmKCEob2JqJiZhcmdzKSkKICAgIHJldHVybjsKICBEZXN0cnVjdChQUkVWKTsKICBfc2V0X2F1dG9sb2Fkb2JqKGFyZ3MpOwogIG1vdmUob2JqKTsKfQoKdm9pZCBjcmVhdGUoKQp7CiAgb2JqZWN0IG9iajsKICAKICBpZihtZW1iZXIob2JqZWN0X25hbWUoKSwnIycpPDApCiAgICByZXR1cm47CiAgaWYoIWNsb25lciYmISgoY2xvbmVyPVRQKXx8KGNsb25lcj1FTlYoTUUpKSkmJiFpbnRlcmFjdGl2ZShjbG9uZXIpKQogICAgZGVzdHJ1Y3QoTUUpOwogIGlmKCFJU19MRUFSTkVSKGNsb25lcikpCiAgICBkZXN0cnVjdChNRSk7CiAgU2V0UHJvcChQX05PRFJPUCwiRGFzIHdhZXJlIHp1IGdlZmFlaHJsaWNoLlxuIik7CiAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKICBTZXRQcm9wKFBfTk9CVVksMSk7CiAgaWYoZmlsZV9zaXplKFNBVkVfRklMRSsiLm8iKT4wKQogIHsKICAgIFdETE4oIkxvYWRpbmcgIitUT09MX1RJVExFKyIgc2V0dGluZ3MiKTsKICAgIHJlc3RvcmVfb2JqZWN0KFNBVkVfRklMRSk7CiAgfQogIGlmKE1PREUoTU9ERV9GSVJTVCkpCiAgICBjYWxsX291dCgibW92ZSIsMCxjbG9uZXIpOwogIGNhbGxfb3V0KCJhZGRfaW5zZXJ0X2hvb2siLDEpOwp9Cgp2b2lkIFRLKHN0cmluZyBzdHIpCnsKICBpZiAoIXh0aykKICAgIHJldHVybjsKICB0ZWxsX29iamVjdChjbG9uZXIsIlhUT09MOiAiK3N0cisiXG4iKTsKfQoKaW50IFh0ayhzdHJpbmcgc3RyKQp7CiAgeHRrPSF4dGs7CiAgV0RMTigiWHRvb2wgaW50ZXJuYWwgdHJhY2luZyAiKyh4dGs/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKTsKICByZXR1cm4gVFJVRTsKfQoKdm9pZCBpbml0KCkKewogIG9iamVjdCBmaXJzdCwgcHJldjsKICAKICBpZihtZW1iZXIob2JqZWN0X25hbWUoKSwnIycpPDApIHJldHVybjsKICBmaXJzdD1maXJzdF9pbnZlbnRvcnkoRU5WKE1FKSk7CiAgaWYoTU9ERShNT0RFX1BST1RFQ1QpJiZpc19wbGF5ZXIoZmlyc3QpJiYhSVNfQVJDSChmaXJzdCkpCiAgewogICAgV0RMTigiV0FSTklORzogIitjcm5hbWUoZmlyc3QpKyIgdHJpZWQgdG8gbW92ZSBpbnRvIHlvdXIgaW52ZW50b3J5Iik7CiAgICB0ZWxsX29iamVjdChmaXJzdCwgIllvdSBjYW5ub3QgbW92ZSB5b3Vyc2VsZiBpbnRvICIrCgkJY3JuYW1lKGNsb25lcikrIidzIGludmVudG9yeS5cbiIpOwogICAgY2FsbF9vdXQoIkRyb3BPYmoiLDAsZmlyc3QpOwogICAgcmV0dXJuOwogIH0KICBlbHNlIGlmKE1PREUoTU9ERV9GSVJTVCkmJmZpcnN0IT1NRSkKICAgIG1vdmUoY2xvbmVyKTsKICBlbHNlIGFjdGlvbnMoKTsKfQoKdm9pZCBEcm9wT2JqKG9iamVjdCBvYmopCnsKICBpZighb2JqfHwhb2JqZWN0cChvYmopKQogICAgcmV0dXJuOwogIG9iai0+bW92ZShFTlYoY2xvbmVyKSxNX05PQ0hFQ0t8TV9OT19TSE9XKTsKfQoKI2RlZmluZSBBQ1RJT05TXAooW1wKICAieGNhbGxvdXRzIiA6ICJYY2FsbG91dHMiOzA7MSxcCiAgInhjYWxsIiAgICAgOiAiWGNhbGwiOzA7MSxcCiAgInhjYXQiICAgICAgOiAiWGNhdCI7MTsxLFwKICAieGNkIiAgICAgICA6ICJYY2QiOzA7MCxcCiAgInhjbGVhbiIgICAgOiAiWGNsZWFuIjswOzAsXAogICJ4Y2xvbmUiICAgIDogIlhjbG9uZSI7MDswLFwKICAieHVjbG9uZSIgICA6ICJYdWNsb25lIjswOzAsXAogICJ4Y21kcyIgICAgIDogIlhjbWRzIjswOzEsXAogICJ4ZGJnIiAgICAgIDogIlhkYmciOzA7MCxcCiAgInhkY2xlYW4iICAgOiAiWGRjbGVhbiI7MDswLFwKICAieGRkZXMiICAgICA6ICJYZGRlcyI7MDswLFwKICAieGRlcyIgICAgICA6ICJYZGVzIjswOzAsXAogICJ4ZGVzdCIgICAgIDogIlhkZXMiOzA7MCxcCiAgInhkbG9vayIgICAgOiAiWGRsb29rIjswOzEsXAogICJ4ZG8iICAgICAgIDogIlhkbyI7MDswLFwKICAieGR1cGRhdGUiICA6ICJYZHVwZGF0ZSI7MDswLFwKICAieGVjaG8iICAgICA6ICJYZWNobyI7MDswLFwKICAieGV2YWwiICAgICA6ICJYZXZhbCI7MDsxLFwKICAieGZvcmFsbCIgICA6ICJYZm9yYWxsIjswOzAsXAogICJ4Z290byIgICAgIDogIlhnb3RvIjswOzAsXAogICJ4aGJlYXRzIiAgIDogIlhoYmVhdHMiOzA7MSxcCiAgInhncmVwIiAgICAgOiAiWGdyZXAiOzE7MSxcCiAgInhoZWFkIiAgICAgOiAiWGhlYWQiOzE7MSxcCiAgInhoZWxwIiAgICAgOiAiWGhlbHAiOzA7MCxcCiAgInhpbnZlbnRvcnkiOiAiWGludmVudG9yeSI7MDsxLFwKICAieGlkcyIgICAgICA6ICJYaWRzIjswOzAsXAogICJ4aW5mbyIgICAgIDogIlhpbmZvIjswOzAsXAogICJ4aW5oZXJpdCIgIDogIlhpbmhlcml0IjswOzEsXAogICJ4bGFnIiAgICAgIDogIlhsYWciOzA7MCxcCiAgInhsaWdodCIgICAgOiAiWGxpZ2h0IjswOzAsXAogICJ4bG9hZCIgICAgIDogIlhsb2FkIjswOzAsXAogICJ4bG9vayIgICAgIDogIlhsb29rIjswOzEsXAogICJ4bHBjIiAgICAgIDogIlhscGMiOzA7MCxcCiAgInhtYW4iICAgICAgOiAiWG1hbiI7MDswLFwKICAieG1vcmUiICAgICA6ICJYbW9yZSI7MTswLFwKICAieG1vdmUiICAgICA6ICJYbW92ZSI7MDswLFwKICAieG1zZyIgICAgICA6ICJYbXNnIjsxOzAsXAogICJ4bXRwIiAgICAgIDogIlhtdHAiOzA7MCxcCiAgInhwcm9jIiAgICAgOiAiWHByb2MiOzA7MSxcCiAgInhwcm9mIiAgICAgOiAiWHByb2YiOzA7MCxcCiAgInhwcm9wcyIgICAgOiAiWHByb3BzIjswOzEsXAogICJ4cXVpdCIgICAgIDogIlhxdWl0IjswOzAsXAogICJ4c2NhbiIgICAgIDogIlhzY2FuIjswOzAsXAogICJ4c2V0IiAgICAgIDogIlhzZXQiOzA7MCxcCiAgInhzaCIgICAgICAgOiAiWHNoIjswOzAsXAogICJ4c29ydCIgICAgIDogIlhzb3J0IjsxOzEsXAogICJ4dGFpbCIgICAgIDogIlh0YWlsIjsxOzEsXAogICJ4dGsiICAgICAgIDogIlh0ayI7MDswLFwKICAieHRvb2wiICAgICA6ICJYdG9vbCI7MDswLFwKICAieHRyYWNlIiAgICA6ICJYdHJhY2UiOzA7MCxcCiAgInh0cmFucyIgICAgOiAiWHRyYW5zIjswOzAsXAogICJ4dXBkYXRlIiAgIDogIlh1cGRhdGUiOzA7MCxcCiAgInh3YyIgICAgICAgOiAiWHdjIjsxOzAsXAogICJ4d2hvIiAgICAgIDogIlh3aG8iOzA7MSxcCiAgXSkKCnN0YXRpYyBzdHJpbmcgUHJlcGFyZUxpbmUoc3RyaW5nIHN0cikKewogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgUXVvdGVMaW5lKHN0cmluZyBzdHIpCnsKICBzdHJpbmcgKnRtcCwqdG1wMjsKICBpbnQgaSwgaTIsIGxlbiwgbGVuMiwgcWQsIHFzOwoKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXFxcIiwisEJTSEwiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXFwiIiwisERCTFEiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXFwnIiwisFNHTFEiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXHwiLCKwUElQRSIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsInx8IiwisE9ST1IiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCItPiIsIrBMQVJSIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFwkIiwisERPTFIiKTsKICB0bXA9cmVnZXhwbG9kZShzdHIsIihcInwnKSIpOwogIGxlbj1zaXplb2YodG1wKTsKICBxZD1xcz0wOwogIGZvcihpPTA7aTxsZW47aSsrKQogIHsKICAgIGlmKGklMikKICAgIHsKICAgICAgaWYodG1wW2ldPT0iJyIpCglxZD0oIXFzPyFxZDpxZCk7CiAgICAgIGVsc2UKCXFzPSghcWQ/IXFzOnFzKTsKICAgICAgaWYoKHRtcFtpXT09IlwiIiYmIXFkKXx8KHRtcFtpXT09IiciJiYhcXMpKQoJdG1wW2ldPSIiOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZighcWQpCiAgICAgIHsKCWxlbjI9c2l6ZW9mKHRtcDI9cmVnZXhwbG9kZSh0bXBbaV0sIlxcJFteIF1bXiBdKiIpKTsKCWZvcihpMj0wO2kyPGxlbjI7aTIrKykKCSAgaWYoaTIlMikKCSAgewoJICAgIFRLKCJRdW90ZUxpbmU6ICIrdG1wMltpMl1bMS4uXSk7CgkgICAgdG1wMltpMl09KHN0cmluZylYRmluZE9iaigodG1wMltpMl0pWzEuLl0pOwoJICB9Cgl0bXBbaV09aW1wbG9kZSh0bXAyLCIiKTsKICAgICAgfQogICAgfQogIH0KICBpZihxZHx8cXMpCiAgICByZXR1cm4gTlVMTDsKICBzdHI9aW1wbG9kZSh0bXAsIiIpOwogIFRLKCJRdW90ZUxpbmU6IHN0cjogIitzdHIpOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgVW5xdW90ZUxpbmUoc3RyaW5nIHN0cikKewogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBCU0hMIiwiXFwiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwREJMUSIsIlwiIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisFNHTFEiLCJcJyIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBEUVVPIiwiIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisFNRVU8iLCIiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwUElQRSIsInwiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwT1JPUiIsInx8Iik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisExBUlIiLCItPiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBET0xSIiwiJCIpOwogIFRLKCJVbnF1b3RlTGluZTogc3RyOiAiK3N0cik7CiAgcmV0dXJuIHN0cjsKfQoKc3RhdGljIHN0cmluZyAqRXhwbG9kZUNtZHMoc3RyaW5nIHN0cikKewogIHN0cmluZyAqdG1wOwogIAogIHRtcD1yZWdleHBsb2RlKHN0ciwiXFx8fD58Pj4iKTsKICB3aGlsZSh0bXBbPDFdPT0iIikKICAgIHRtcD10bXBbMC4uPDJdOwogIHJldHVybiB0bXA7Cn0KCnZhcmFyZ3MgaW50IFBhcnNlTGluZShzdHJpbmcgc3RyKQp7CiAgc3RyaW5nIHZlcmIsIGFyZzsKICBpbnQgcmV0OwogIAogIFRLKCJQYXJzZUxpbmU6IHN0cjogIisoc3RyP3N0cjoiIikpOwogIGlmKCFzaXplb2YoY21kcykpCiAgewogICAgLy8gdGhpcyBpcyBhIHNpbmdsZSBjb21tYW5kIG9yIGJlZ2lubmluZyBvZiBhIGNvbW1hbmQgcGlwZQogICAgdmVyYj1xdWVyeV92ZXJiKCk7CgogICAgLy8gcmV0dXJuIG9uIHVua25vd24gY29tbWFuZHMKICAgIGlmKCF2ZXJifHwhc2l6ZW9mKHZlcmIpfHwhR2V0RnVuYyh2ZXJiLFRSVUUpKQogICAgICByZXR1cm4gRkFMU0U7CgogICAgc3RyPShzdHJpbmcpdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsKICAgIHBpcGVfaW49RkFMU0U7CiAgICBwaXBlX29mPU5VTEw7CiAgICBwaXBlX292cj1UUlVFOwogICAgcGlwZV9vdXQ9RkFMU0U7CiAgICBwaXBlX29mPU5VTEw7CiAgICAvLyBwYXNzIGFyZ3VtZW50cyB0byBzb21lIHNwZWNpYWwgZnVuY3Rpb25zIHVucGFyc2VkCiAgICBpZihtZW1iZXIoKHsieGxwYyIsInhjYWxsIiwieGV2YWwifSksdmVyYik+PTApCiAgICB7CiNpZmRlZiBYREJHCiAgICAgIFRLKCJQYXJzZUxpbmU6IHNwZWNpYWwgZnVuYzogIit2ZXJiKTsKI2VuZGlmCiAgICAgIHJldD1DYWxsRnVuYyh2ZXJiLHN0cik7CiAgICAgIFNhZmVSZXR1cm4ocmV0KTsKICAgIH0KICAgIC8vIG9rLCBoZXJlIHdlIGdvCiAgICBwaXBlX2luPXBpcGVfb3V0PUZBTFNFOwogICAgcGlwZV9pZj1waXBlX29mPU5VTEw7CiAgICBwaXBlX292cj1UUlVFOwogICAgaWYoZmlsZV9zaXplKFBJUEVfRklMRSk+PTApCiAgICAgIHJtKFBJUEVfRklMRSk7CiAgICBpZiAoc3RyJiZzdHIhPSIiKQkgIAogICAgewogICAgICBpZighKHN0cj1RdW90ZUxpbmUoc3RyKSkpCiAgICAgIHsKCVdETE4oIlVudGVybWluYXRlZCBxdW90YXRpb24iKTsKCVNhZmVSZXR1cm4oVFJVRSk7CiAgICAgIH0KICAgICAgY21kcz1FeHBsb2RlQ21kcyhzdHIpOwogICAgfQogICAgZWxzZQogICAgICBjbWRzPSh7IiJ9KTsKICAgIGFyZz1zdHJpcF9zdHJpbmcoY21kc1swXSk7CiAgfQogIGVsc2UKICB7CiAgICBjbWRzWzBdPXN0cmlwX3N0cmluZyhjbWRzWzBdKTsKICAgIFRLKCJQYXJzZUxpbmU6IGNtZHNbMF06ICIrY21kc1swXSk7CiAgICBpZihzc2NhbmYoY21kc1swXSwiJXMgJXMiLHZlcmIsYXJnKSE9MikKICAgIHsKICAgICAgdmVyYj1jbWRzWzBdOwogICAgICBhcmc9IiI7CiAgICB9CiAgfQogIGNtZHM9Y21kc1sxLi5dOwogIFRLKCJQYXJzZUxpbmU6IHZlcmI6ICIrdmVyYik7CiAgaWYgKCF2ZXJifHwhc2l6ZW9mKHZlcmIpfHwhR2V0RnVuYyh2ZXJiLFRSVUUpKQogICAgU2FmZVJldHVybihGQUxTRSk7CiAgVEsoIlBhcnNlTGluZSgxKTogYXJnOiAiK2FyZysiIGNtZHM6ICIrc3ByaW50ZigiJU8iLGNtZHMpKTsKICBzd2l0Y2goc2l6ZW9mKGNtZHMpKQogIHsKICAgIGNhc2UgMDoKICAgIHJldD1DYWxsRnVuYyh2ZXJiLHN0cmlwX3N0cmluZyhVbnF1b3RlTGluZShhcmcpKSk7CiAgICBTYWZlUmV0dXJuKHJldCk7CiAgICBicmVhazsKICAgIAogICAgY2FzZSAxOgogICAgV0RMTigiTWlzc2luZyByaHMgb2YgY29tbWFuZCBwaXBlIik7CiAgICBTYWZlUmV0dXJuKFRSVUUpOwogICAgYnJlYWs7CiAgICAKICAgIGRlZmF1bHQ6CiAgICBwaXBlX291dD1UUlVFOwogICAgc3dpdGNoKGNtZHNbMF0pCiAgICB7CiAgICAgIGNhc2UgInwiOgogICAgICBwaXBlX29mPVBJUEVfRklMRTsKICAgICAgcGlwZV9vdnI9VFJVRTsKICAgICAgY21kcz1jbWRzWzEuLl07CiAgICAgIGJyZWFrOwogICAgICAKICAgICAgY2FzZSAiPiI6CiAgICAgIHBpcGVfb3ZyPVRSVUU7CiAgICAgIGlmKHNpemVvZihjbWRzKSE9MikKICAgICAgewoJV0RMTigiSWxsZWdhbCBJTyByZWRpcmVjdGlvbiIpOwoJU2FmZVJldHVybihUUlVFKTsKICAgICAgfQogICAgICBwaXBlX29mPWNtZHNbMV07CiAgICAgIGNtZHM9KHt9KTsKICAgICAgYnJlYWs7CiAgICAgIAogICAgICBjYXNlICI+PiI6CiAgICAgIHBpcGVfb3ZyPUZBTFNFOwogICAgICBpZihzaXplb2YoY21kcykhPTIpCiAgICAgIHsKCVdETE4oIklsbGVnYWwgSU8gcmVkaXJlY3Rpb24iKTsKCVNhZmVSZXR1cm4oVFJVRSk7CiAgICAgIH0KICAgICAgcGlwZV9vZj1jbWRzWzFdOwogICAgICBjbWRzPSh7fSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBUSygiUGFyc2VMaW5lKDIpOiBhcmc6ICIrYXJnKyIgY21kczogIitzcHJpbnRmKCIlTyIsY21kcykpOwogIGlmKCFDYWxsRnVuYyh2ZXJiLHN0cmlwX3N0cmluZyhhcmcpKSkKICAgIFNhZmVSZXR1cm4oRkFMU0UpOwogIHBpcGVfaW49cGlwZV9vdXQ7CiAgcGlwZV9pZj1waXBlX29mOwogIHBpcGVfb3ZyPUZBTFNFOwogIHBpcGVfb3V0PUZBTFNFOwogIHBpcGVfb2Y9TlVMTDsKICBpZihzaXplb2YoY21kcykpCiAgICBjYWxsX291dCgiUGFyc2VMaW5lIiwwKTsKICBlbHNlCiAgICBTYWZlUmV0dXJuKFRSVUUpOwogIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgaW50IENhbGxGdW5jKHN0cmluZyB2ZXJiLCBzdHJpbmcgc3RyKQp7CiAgc3RyaW5nIGZ1bjsKCiAgZnVuPUdldEZ1bmModmVyYixGQUxTRSk7CiNpZmRlZiBYREJHCiAgVEsoIkNhbGxGdW5jOiB2ZXJiOiAiK3ZlcmIrIiBzdHI6ICIrc3RyKTsKICBUSygiQ2FsbEZ1bmM6IHJlc29sdmVkIGZ1bmN0aW9uOiAiKyhmdW4/ZnVuOiIodW5yZXNvbHZlZCkiKSk7CiNlbmRpZgogIGlmKHN0cj09IiIpCiAgICBzdHI9TlVMTDsKICByZXR1cm4gZnVuPyhpbnQpY2FsbF9vdGhlcihNRSxmdW4sc3RyKTpGQUxTRTsKfQoKc3RhdGljIHN0cmluZyBHZXRGdW5jKHN0cmluZyB2ZXJiLCBpbnQgdGVzdCkKewogIHN0cmluZyBmdW4sKmtleXMsa2V5OwogIGludCBpLGxlbjsKCiAgVEsoIkdldEZ1bmM6IHZlcmI6ICIrdmVyYik7CgogIGlmKHZlcmJbMC4uMF0hPSJ4IikgLy8gQXNzdW1lIGFsbCBjb21tYW5kcyBzdGFydCB3aXRoICJ4IgogICAgcmV0dXJuIDA7CgogIGlmICghKGZ1bj0oc3RyaW5nKUFDVElPTlNbdmVyYiwwXSkpIHsgLy8gVHJ5IGV4YWN0IGhpdCBmaXJzdAogICAga2V5PSIiOwogICAgbGVuPXNpemVvZih2ZXJiKTsKICAgIGZvciAoaT1zaXplb2Yoa2V5cz1tX2luZGljZXMoQUNUSU9OUykpLTE7aT49MDtpLS0pIHsKICAgICAgVEsoIiAgdHJ5aW5nOiAiK2tleXNbaV0pOwogICAgICBpZihzaXplb2Yoa2V5c1tpXSk+PWxlbiYma2V5c1tpXVswLi5sZW4tMV09PXZlcmIpIHsKCWlmKHNpemVvZihrZXkpKSB7CgkgIFdMTigiRGFzIGlzdCBuaWNodCBlaW5kZXV0aWcgLi4uIik7CgkgIHJldHVybiAwOwoJfQoJZnVuPUFDVElPTlNba2V5c1tpXSwwXTsKCWtleT1rZXlzW2ldOwoJLy9icmVhazsKICAgICAgfQogICAgfQogIH0gZWxzZQogICAga2V5PXZlcmI7CgogIGlmKHRlc3QpCiAgICByZXR1cm4gZnVuOwogIAogIGlmIChrZXkpIHsKI2lmZGVmIFhEQkcKICAgIFRLKCJHZXRGdW5jOiBmdW46ICIrZnVuKyIgKGtleTogIitrZXkrIilcbiIrCiAgICAgICAicGlwZV9pbjogIisocGlwZV9pbj8iVFJVRSAgIjoiRkFMU0UgIikrKHBpcGVfaWY/cGlwZV9pZjoiKE5VTEwpIikrIlxuIisKICAgICAgICJwaXBlX291dDogIisocGlwZV9vdXQ/IlRSVUUgICI6IkZBTFNFICIpKyhwaXBlX29mP3BpcGVfb2Y6IihOVUxMKSIpKyJcbiIrCiAgICAgICAicGlwZV9vdnI6ICIrKHBpcGVfb3ZyPyJUUlVFIjoiRkFMU0UiKSk7CiNlbmRpZgogICAgaWYgKHBpcGVfaW4mJiFBQ1RJT05TW2tleSxQSVBFX0lOXSkKICAgIHsKICAgICAgLy8gdGhpcyBjb21tYW5kIGRvZXMgbm90IHJlYWQgcGlwZXMKI2lmZGVmIFhEQkcKICAgICAgVEsoIklsbGVnYWwgcmhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CiNlbmRpZgogICAgICBub3RpZnlfZmFpbCgiSWxsZWdhbCByaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBlbHNlIGlmIChwaXBlX291dCYmIUFDVElPTlNba2V5LFBJUEVfT1VUXSkKICAgIHsKICAgICAgLy8gdGhpcyBjb21tYW5kIGRvZXMgbm90IGZlZWQgcGlwZXMKI2lmZGVmIFhEQkcKICAgICAgVEsoIklsbGVnYWwgbGhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CiNlbmRpZgogICAgICBub3RpZnlfZmFpbCgiSWxsZWdhbCBsaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQogIHJldHVybiBmdW47Cn0KCnZvaWQgYWN0aW9ucygpCnsKICBpZiAoIWNsb25lcnx8IVJUUHx8Y2xvbmVyPT1SVFB8fHF1ZXJ5X3dpel9sZXZlbChjbG9uZXIpPD1xdWVyeV93aXpfbGV2ZWwoUlRQKSkKICAgIGFkZF9hY3Rpb24oIlBhcnNlTGluZSIsIiIsMSk7CiAgYWRkX2FjdGlvbigiQ29tbWFuZFNjYW4iLCAiIiwgMSk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgdGhlIGNoZWNraW5nIHN0dWZmCiAqLwoKcHVibGljIDxpbnR8b2JqZWN0PiogaW5zZXJ0X2hvb2sob2JqZWN0IHBsLCBpbnQgaG9va2lkLCBvYmplY3Qgb2IpCnsKICBpZihjbG9uZXIgJiYgY2xvbmVyID09IHBsICYmIGhvb2tpZCA9PSBIX0hPT0tfSU5TRVJUKQogIHsKICAgIGlmKE1PREUoTU9ERV9GSVJTVCkgJiYgZmluZF9jYWxsX291dCgibW92ZSIpPT0tMSkKICAgICAgY2FsbF9vdXQoIm1vdmUiLDAsY2xvbmVyKTsKICAgIGlmKE1PREUoTU9ERV9JTlZDSEVDSykpCiAgICAgIHdyaXRlX25ld2ludm9iaihvYik7CiAgfQogIHJldHVybiAoe0hfTk9fTU9ELCBvYn0pOwp9Cgp2b2lkIGFkZF9pbnNlcnRfaG9vaygpCnsKICBpZihvYmplY3RwKGNsb25lcikpCiAgICBjbG9uZXItPkhSZWdpc3RlclRvSG9vayhIX0hPT0tfSU5TRVJULCAjJ2luc2VydF9ob29rLAogICAgICAgIEhfSE9PS19MSUJQUklPKDIpLCBIX0xJU1RFTkVSLCAwKTsKfQoKc3RhdGljIHZvaWQgVmFyQ2hlY2soaW50IHNob3cpCnsKICBpbnQgaSwgczsKICBmb3JlYWNoKHN0cmluZyBrLCBtaXhlZCB2IDogdmFyaWFibGUpCiAgewogICAgaWYgKHYpIGNvbnRpbnVlOwogICAgaWYoc2hvdykgV0RMTigiKioqIFZhcmlhYmxlICQiK2srIiBoYXMgYmVlbiBkZXN0cnVjdGVkIik7CiAgICBtX2RlbGV0ZSh2YXJpYWJsZSwgayk7CiAgfQp9CgoKaW50IHdyaXRlX25ld2ludm9iaihvYmplY3Qgb2JqKQp7CiAgaWYob2JqKSBXRExOKCIqKiogTmV3IG9iamVjdCBpbiBpbnZlbnRvcnkgIitPYmpGaWxlKG9iaikpOwogIHJldHVybigxKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICBjYXRjaCBhbGwgY29tbWFuZHMsIGFic29yYiBmb3JjZXMgYW5kIGNoZWNrIGhpc3RvcnkKICovCgppbnQgQ29tbWFuZFNjYW4oc3RyaW5nIGFyZykKewogIHN0cmluZyB2ZXJiLCBjbWQ7CiAgb2JqZWN0IHJ0cDsKICBydHA9UlRQOwoKICBpZighY2xvbmVyJiYhKGNsb25lcj1ydHApKSBkZXN0cnVjdChNRSk7CgogIGlmKCghTU9ERShNT0RFX1BST1RFQ1QpKXx8c2VjdXJpdHkoKXx8CiAgICAgcXVlcnlfd2l6X2xldmVsKGNsb25lcik8cXVlcnlfd2l6X2xldmVsKHJ0cCkpCiAgewogICAgdmVyYj1xdWVyeV92ZXJiKCk7CiAgICBpZih2ZXJiJiZEb0hpc3RvcnkodmVyYisoYXJnID8gIiAiK2FyZyA6ICIiKSkpCiAgICAgIHJldHVybiBUUlVFOwogICAgbm9zdG9yZT1GQUxTRTsKICAgIHJldHVybiBGQUxTRTsKICB9CiAgZWxzZQogIHsKICAgIGlmKHJ0cCkKICAgIHsKICAgICAgV0RMTigiWW91ciAiK1RPT0xfVElUTEUrIiBwcm90ZWN0cyB5b3UgZnJvbSBhIGZvcmNlIGJ5ICIrY3JuYW1lKHJ0cCkrCgkgICAiIFsiK3F1ZXJ5X3ZlcmIoKSsoYXJnID8gIiAiK2FyZysiXSIgOiAiXSIpKTsKICAgICAgdGVsbF9vYmplY3QocnRwLCBjcm5hbWUoY2xvbmVyKSsiJ3MgIitUT09MX1RJVExFKwoJCSAgIiBhYnNvcmJlcyB5b3VyIGZvcmNlLlxuIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFdETE4oIllvdXIgIitUT09MX1RJVExFKyIgcHJvdGVjdHMgeW91IGZyb20gYSBmb3JjZSBbIisKCSAgIHF1ZXJ5X3ZlcmIoKSsoYXJnID8gIiAiK2FyZysiXSIgOiAiXSIpKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwogIH0KfQoKaW50IERvSGlzdG9yeShzdHJpbmcgbGluZSkKewogIGludCBpOwogIHN0cmluZyBjbWQsICpzdHJzOwogIAogIFNFQ1VSRTIoRkFMU0UpOwogIGlmKCFzdHJpbmdwKGxpbmUpIHx8ICFzaXplb2YobGluZSkpCiAgICByZXR1cm4gVFJVRTsKICBlbHNlIGlmKGxpbmU9PSIlISIpCiAgewogICAgV0xOKCJDdXJyZW50IGNvbW1hbmQgaGlzdG9yeToiKTsKICAgIGZvcihpPU1BWF9ISVNUT1JZOyBpOyAtLWkpCiAgICAgIGlmKGhpc3RvcnlbaS0xXSkKICAgICAgewoJVygiICIrQVJJR0hUKCIiK2ksIDIsICIgIikrIjogIik7CglpZihzaXplb2YoaGlzdG9yeVtpLTFdKT43MCkKCSAgV0xOKEFMRUZUKGhpc3RvcnlbaS0xXSwgNzAsICIgIikpOwoJZWxzZQoJICBXTE4oaGlzdG9yeVtpLTFdKTsKICAgICAgfQogICAgcmV0dXJuIFRSVUU7CiAgfQogIGVsc2UgaWYobGluZVswLi4xXT09IiUlIiAmJiAoY21kPWhpc3RvcnlbMF0rbGluZVsyLi48MV0pKQogIHsKICAgIENvbW1hbmQoY21kKTsKICAgIHJldHVybiBUUlVFOwogIH0KICBlbHNlIGlmKGxpbmVbMF09PSdeJyYmKHN0cnM9c3RyaXBfZXhwbG9kZShsaW5lLCAiXiIpKSkKICB7CiAgICBpZihzaXplb2Yoc3RycykmJnN0cnNbMF0mJihjbWQ9aGlzdG9yeVswXSkpCiAgICB7CiAgICAgIGlmKHNpemVvZihzdHJzKT09MikKCWNtZD1zdHJpbmdfcmVwbGFjZShjbWQsIHN0cnNbMF0sIHN0cnNbMV0pOwogICAgICBlbHNlCgljbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCBzdHJzWzBdLCAiIik7CiAgICAgIG5vc3RvcmUtLTsKICAgICAgQ29tbWFuZChjbWQpOwogICAgICBub3N0b3JlKys7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQogIH0KICBlbHNlIGlmKGxpbmVbMF09PSclJyAmJiAoc3NjYW5mKGxpbmVbMS4uPDFdLCAiJWQiLCBpKSkpCiAgewogICAgaT0gaT4wID8gaSA6IDE7CiAgICBpPSBpPD1NQVhfSElTVE9SWSA/IGkgOiBNQVhfSElTVE9SWTsKICAgIGlmKGNtZD1oaXN0b3J5W2ktMV0pCiAgICAgIENvbW1hbmQoY21kKTsKICAgIHJldHVybiBUUlVFOwogIH0KICBlbHNlIGlmKGxpbmVbMF09PSclJykKICB7CiAgICBmb3IoaT0wOyBpPE1BWF9ISVNUT1JZOyBpKyspCiAgICB7CiAgICAgIGlmKGhpc3RvcnlbaV0mJgoJIGhpc3RvcnlbaV1bMC4uc2l6ZW9mKGxpbmUpLTJdPT1saW5lWzEuLiA8MV0pCiAgICAgIHsKCUNvbW1hbmQoaGlzdG9yeVtpXSk7CglyZXR1cm4gVFJVRTsKICAgICAgfQogICAgfQogIH0KICBlbHNlIGlmKG5vc3RvcmU8MSkKICAgIGhpc3Rvcnk9KHtsaW5lfSkraGlzdG9yeVswLi5NQVhfSElTVE9SWS0yXTsKICByZXR1cm4gRkFMU0U7Cn0KCg==