LyoKICogIE1HdG9vbC0xLjMKICogIEZpbGU6IE1HdG9vbC5jCiAqICBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgogKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojcHJhZ21hIHN0cmljdF90eXBlcwoKaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKCiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CiNpZiAhZGVmaW5lZChRVUVSWUNBQ0hFRCkKI2RlZmluZSBRVUVSWUNBQ0hFRCA0MDk2CiNlbmRpZgojaWYgIWRlZmluZWQgKFNFVENBQ0hFRCkKI2RlZmluZSBTRVRDQUNIRUQgNDA5NgojZW5kaWYKI2luY2x1ZGUgPG1vdmluZy5oPgojaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCiNpbmNsdWRlIDx1c2VyaW5mby5oPgojaW5jbHVkZSA8ZGVmaW5lcy5oPgoKI2luY2x1ZGUgIk1HdG9vbC90b29sLmgiCgojaW5jbHVkZSAiTUd0b29sL3Rvb2xsaWIuaCIKCiNkZWZpbmUgWERCRyAxCgpub3NhdmUgb2JqZWN0ICBjbG9uZXI7Cm5vc2F2ZSBvYmplY3QgIG1zZ3RvPU5VTEw7Cm5vc2F2ZSBzdHJpbmcgKm1hbnBhdGg9KHtUT09MX1BBVEgrIi9tYW4uZC8iLAoJCQkgIi9kb2MvZWZ1bi8iLAoJCQkgIi9kb2MvbGZ1bi8iLAoJCQkgIi9kb2Mvdy8iLAoJCQkgIi9kb2MvaGVscGRpci8iLAoJCQkgIi9kb2MvTFBDLyIsCgkJCSAiL2RvYy9zdGQvIiwKCQkJICIvZG9jL2NvbmNlcHRzLyIsCgkJCSAiIn0pOwpub3NhdmUgc3RyaW5nICBtb3JlZmlsZT1OVUxMOwpub3NhdmUgc3RyaW5nICpzY3JpcHRsaW5lPU5VTEw7Cm5vc2F2ZSBzdHJpbmcgKmhpc3Rvcnk9YWxsb2NhdGUoTUFYX0hJU1RPUlkpOwpub3NhdmUgaW50ICAgICBtb3JlZmxhZz1GQUxTRTsKbm9zYXZlIGludCAgICAgbW9yZW9mZnNldD0xOwpub3NhdmUgaW50ICAgICB0ZXJtPU5VTEw7Cm5vc2F2ZSBpbnQgICAgIHNjcmlwdHNpemU9TlVMTDsKbm9zYXZlIGludCAgICAgbm9zdG9yZT1GQUxTRTsKbm9zYXZlIGludCAgICAgeGxpZ2h0PTA7Cm5vc2F2ZSBpbnQgICAgIHBpcGVfaW49RkFMU0U7Cm5vc2F2ZSBpbnQgICAgIHBpcGVfb3V0PUZBTFNFOwpub3NhdmUgaW50ICAgICBwaXBlX292cj1UUlVFOwpub3NhdmUgc3RyaW5nICBwaXBlX2lmPU5VTEw7Cm5vc2F2ZSBzdHJpbmcgIHBpcGVfb2Y9TlVMTDsKbm9zYXZlIGludCAgICAgeHRrPUZBTFNFOwpub3NhdmUgbWFwcGluZyB2YXJpYWJsZT0oW10pOwpub3NhdmUgc3RyaW5nICpjbWRzOwpwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpbmVfYnVmZmVyPShbXSk7CnByaXZhdGUgbm9zYXZlIHN0cmluZyBsaW5lX2J1ZmZlcl9uYW1lPSIiOwpwcml2YXRlIG5vc2F2ZSBzdHJpbmcgbW9yZV9zZWFyY2hleHByPSIiOwppbnQgICAgbW9yZWxpbmVzPU1PUkVfTElORVM7CmludCAgICBtb2RpPShNT0RFX0ZJUlNUfE1PREVfUFJPVEVDVHxNT0RFX1NIT1JUKTsKCiNpbmNsdWRlICJNR3Rvb2wvdG9vbGxpYi5jIgojaW5jbHVkZSAiTUd0b29sL3Rvb2xjbWQuYyIKCiNkZWZpbmUgU2FmZVJldHVybih4KSBcCnsgXAogIGNtZHM9KHt9KTsgXAogIHBpcGVfaW49RkFMU0U7IFwKICBwaXBlX29mPU5VTEw7IFwKICBwaXBlX292cj1UUlVFOyBcCiAgcGlwZV9vdXQ9RkFMU0U7IFwKICBwaXBlX29mPU5VTEw7IFwKICByZXR1cm4gKHgpOyBcCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjaGVjayBzb21lIHNlY3VyaXR5IGFzcGVjdHMKICovCgpzdGF0aWMgaW50IHNlY3VyaXR5KCkKewogIG9iamVjdCBwcmV2OwogCiAgaWYoIHByb2Nlc3NfY2FsbCgpIHx8IGdldHVpZCgpIT1nZXR1aWQoY2xvbmVyKSApIHJldHVybiBGQUxTRTsgLy8gUnVtYXRhCgogIFRLKCJVSUQ6ICIrZ2V0dWlkKE1FKSsiIGNsb25lcjoiK2dldHVpZChjbG9uZXIpKTsKLy8gIFRLKCJwcmV2OiAiK29iamVjdF9uYW1lKFBSRVYpKyIgbWU6IitvYmplY3RfbmFtZShNRSkpOwogIGlmKHByZXY9UFJFVikKICB7CiAgICBpZighY2xvbmVyKQogICAgICByZXR1cm4gVFJVRTsKICAgIGlmKGdldHVpZChwcmV2KT09Uk9PVElEfHxJU19BUkNIKHByZXYpKQogICAgICByZXR1cm4gVFJVRTsKICAgIGlmKHByZXY9PU1FKQogICAgICByZXR1cm4gVFJVRTsKICAgIHJldHVybiBzZWN1cmVfbGV2ZWwoKT49cXVlcnlfd2l6X2xldmVsKGNsb25lcik7IC8vIFJ1bWF0YQogICAgLy9yZXR1cm4gZ2V0dWlkKHByZXYpPT1nZXR1aWQoKSYmZ2V0ZXVpZChwcmV2KT09Z2V0ZXVpZCgpJiZjbG9uZXI9PVJUUDsKICB9CiAgZWxzZQogICAgcmV0dXJuIGNsb25lcj09TlVMTDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG93biB3cml0ZSBmdW5jdGlvbgogKi8KCnN0YXRpYyBpbnQgV3JpdGUoc3RyaW5nIHN0cikKewogIGlmKCFzdHJpbmdwKHN0cikgfHwgc3RyPT0iIikKICAgIHJldHVybiBGQUxTRTsKICBpZighY2xvbmVyICYmIG9iamVjdHAodGhpc19wbGF5ZXIoKSkpCiAgICB3cml0ZShzdHIpOwogIGVsc2UKICAgIHRlbGxfb2JqZWN0KGNsb25lciwgc3RyKTsKICByZXR1cm4gVFJVRTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG93biBjb21tYW5kIGZ1bmN0aW9uCiAqLwoKc3RhdGljIGludCBDb21tYW5kKHN0cmluZyBzdHIpCnsKICBpbnQgaTsKICBUSygiQ29tbWFuZDogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CiAgbm9zdG9yZSsrOwogIGlmKE1PREUoTU9ERV9FQ0hPKSkKICAgIFdMTigiRG9pbmc6ICIrc3RyKTsKICBpPShpbnQpY2xvbmVyLT5jb21tYW5kX21lKHN0cik7CiAgbm9zdG9yZS0tOwogIHJldHVybiBpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb2JqZWN0IHNlYXJjaGluZwogKi8KCnN0YXRpYyB2YXJhcmdzIG9iamVjdCBYRmluZE9iaihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KQp7CiAgb2JqZWN0IG9iaiwgZW52OwogIHN0cmluZyAqc3RyczsKICBpbnQgaSwgcywgY250OwogIAogIGlmKCFzdHIpCiAgICByZXR1cm4gTlVMTDsKICBUSygiWEZpbmRPYmo6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOwogIGVudj1FTlYoY2xvbmVyKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFwuIiwisDAxIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcXiIsICKwMDIiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFwkIiwgIrAwMyIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXFxcIiwgIlxcIik7CiAgaWYgKGZpbmRfb2JqZWN0KHN0cikpIHJldHVybiBmaW5kX29iamVjdChzdHIpOwogIGlmIChmaWxlX3NpemUoc3RyKT4xKSB7CiAgICAgY2FsbF9vdGhlcihzdHIsICI/Pz8iKTsKICAgICByZXR1cm4gZmluZF9vYmplY3Qoc3RyKTsKICB9CiAgcz1zaXplb2Yoc3Rycz1zdHJpcF9leHBsb2RlKHN0ciwgIi4iKSk7CiAgd2hpbGUocy0tKQogIHsKICAgIGlmKHN0cnNbaV09PSJtInx8c3Ryc1tpXT09Im1lIikKICAgICAgc3Ryc1tpXT1STkFNRShjbG9uZXIpOwogICAgZWxzZSBpZihzdHJzW2ldPT0iaCJ8fHN0cnNbaV09PSJoZXJlIikKICAgICAgc3Ryc1tpXT1vYmplY3RfbmFtZShFTlYoY2xvbmVyKSk7CiAgICBpZihvYmo9RmluZE9iaihzdHJzW2krK10sZW52LChzaWxlbnQ/MTowKSkpCiAgICAgIGVudj1vYmo7CiAgICBlbHNlCiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gb2JqOwp9CgpzdGF0aWMgdmFyYXJncyBvYmplY3QgRmluZE9iaihzdHJpbmcgc3RyLCBvYmplY3QgZW52LCBpbnQgc2lsZW50KQp7CiAgb2JqZWN0IG9iaiwgKmludjsKICBzdHJpbmcgdG1wOwogIGludCBudW0sIGU7CiAgCiAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8ICFvYmplY3RwKGVudikpCiAgICByZXR1cm4gTlVMTDsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAisDAxIiwgIi4iKTsKICB3aGlsZShzdHJbZSsrXT09J14nKQogICAgOwogIHN0cj1zdHJbLS1lLi48MV07CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIrAwMiIsICJeIik7CiAgaWYob2JqPVZhclRvT2JqKHN0cikpCiAgICA7CiAgZWxzZSBpZihzdHJbMF09PScDJykKICAgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICKwMDMiLCAiJCIpOwogIGVsc2UgaWYoc3NjYW5mKHN0ciwgIiVkIiwgbnVtKSYmKGludj1hbGxfaW52ZW50b3J5KGVudikpKQogIHsKICAgIGlmKG51bT4wJiZudW08PXNpemVvZihpbnYpKQogICAgICBvYmo9aW52W251bS0xXTsKICAgIGVsc2UKICAgIHsKICAgICAgV0RMTigiU3BlY2lmaWVkIG9iamVjdCBudW1iZXIgb3V0IG9mIHJhbmdlIFsxLSIrc2l6ZW9mKGludikrIl0iKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgfQogIGlmKG9ianx8KG9iaj1wcmVzZW50KHN0ciwgZW52KSl8fAogICAgIChvYmo9ZmluZF9wbGF5ZXIoTE9XRVIoc3RyKSkpfHwKICAgICAob2JqPWZpbmRfbGl2aW5nKHN0cikpfHwKICAgICAob2JqPWZpbmRfb2JqZWN0KGxvbmdfcGF0aChzdHIpKSkpCiAgewogICAgd2hpbGUoZS0tKQogICAgewogICAgICBpZighKG9iaj1FTlYob2JqKSkpCiAgICAgIHsKCVcoIlNwZWNpZmllZCBvYmplY3QgaGFzIG5vIGVudmlyb25tZW50IFsiKTsKCXdoaWxlKGUtLSkKCSAgVygiXiIpOwoJV0RMTihzdHIrIl0iKTsKCXJldHVybiBOVUxMOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICAgIGlmKCFzaWxlbnQpCiAgICAgIFdETE4oIlNwZWNpZmllZCBvYmplY3QgZG9lcyBub3QgZXhpc3QgWyIrc3RyKyJdIik7CiAgcmV0dXJuIG9iajsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG9iamVjdCB2YXJpYWJsZSBoYW5kbGluZwogKi8KCnN0YXRpYyBvYmplY3QgVmFyVG9PYmooc3RyaW5nIHN0cikKewogIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSB8fCBzdHJbMF0hPSckJykKICAgIHJldHVybiBOVUxMOwogIHN3aXRjaChzdHIpCiAgewogICAgY2FzZSAiJG0iOgogICAgY2FzZSAiJG1lIjoKICAgIHJldHVybiBjbG9uZXI7CiAgICBjYXNlICIkaCI6CiAgICBjYXNlICIkaGVyZSI6CiAgICByZXR1cm4gRU5WKGNsb25lcik7CiAgICBkZWZhdWx0OgogICAgcmV0dXJuIHZhcmlhYmxlW3N0clsxLi48MV1dOwogIH0KICByZXR1cm4oTlVMTCk7IC8vbmV2ZXIgcmVhY2hlZAp9CgpzdGF0aWMgc3RyaW5nIFZhclRvRmlsZShzdHJpbmcgc3RyKQp7CiAgcmV0dXJuIHNvdXJjZV9maWxlX25hbWUoVmFyVG9PYmooc3RyKSk7Cn0KCnN0YXRpYyBzdHJpbmcgVmFyVG9QdXJlRmlsZShzdHJpbmcgc3RyKQp7CiAgcmV0dXJuIHB1cmVfZmlsZV9uYW1lKFZhclRvT2JqKHN0cikpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb2JqZWN0IGRlc2NyaXB0aW9uIHByaW50aW5nCiAqLwoKc3RhdGljIHZvaWQgUHJpbnRPYmoob2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpCnsKICBvYmplY3QgaXRlbSwgdG1wOwogIHN0cmluZyBzdHI7CiAgaW50IGk7CgogIFNFQ1VSRTEoKTsKICBpZighb2JqKQogICAgcmV0dXJuOwogIFByaW50U2hvcnQoIlNob3J0OiAiLCBvYmosIGZpbGUpOwogIGlmKCFmaWxlfHxmaWxlPT0iIikKICAgIFdMTigiTG9uZyA6Iik7CiAgZWxzZQogICAgd3JpdGVfZmlsZShmaWxlLCJMb25nIDpcbiIpOwogIGlmKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKICAgIHN0cj1jYXBpdGFsaXplKGdldHVpZChvYmopKTsKICBlbHNlCiAgewogICAgaWYob2JqZWN0X25hbWUob2JqKVswLi4yNl09PSIvZC91bnRlcndlbHQvb2JqZWt0ZS90ZWRkeSMiICYmCiAgICAgICBJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpCiAgICAgIHN0cj0iRWluIFRlZGR5IChzdHVtbSkiOwogICAgZWxzZQogICAgewogICAgICBpZihzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0lOVF9MT05HKSkKCTsKICAgICAgZWxzZSBpZihzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0xPTkcpKQoJOwogICAgICBlbHNlCglzdHI9Ii0gbm8gbG9uZyBkZXNjcmlwdGlvbiAtXG4iOwogICAgfQogIH0KICBpZighZmlsZXx8ZmlsZT09IiIpCiAgICBXKHN0cik7CiAgZWxzZQogICAgd3JpdGVfZmlsZShmaWxlLHN0cik7CiAgRk9SQUxMKGl0ZW0sIG9iaikKICB7CiAgICBpZighaSkKICAgICAgaWYoIWZpbGV8fGZpbGU9PSIiKQoJV0xOKCJDb250ZW50OiIpOwogICAgICBlbHNlCgl3cml0ZV9maWxlKGZpbGUsIkNvbnRlbnQ6XG4iKTsKICAgIFByaW50U2hvcnQoQVJJR0hUKCsraSsiLiAiLCA0LCAiICIpLCBpdGVtLCBmaWxlKTsKICB9Cn0KCnN0YXRpYyBzdHJpbmcgT2JqRmlsZShvYmplY3Qgb2JqKQp7CiAgcmV0dXJuICJbIitzaG9ydF9wYXRoKG9iamVjdF9uYW1lKG9iaikpKyJdIjsKfQoKc3RhdGljIHZhcmFyZ3Mgdm9pZCBQcmludFNob3J0KHN0cmluZyBwcmUsIG9iamVjdCBvYmosIHN0cmluZyBmaWxlKQp7CiAgc3RyaW5nIHN0cjsKCiAgU0VDVVJFMSgpOwogIGlmKCFvYmopCiAgICByZXR1cm47CiAgaWYoTU9ERShNT0RFX1NIT1JUKSkKICB7CiAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQogICAgICBzdHI9Y2FwaXRhbGl6ZShnZXR1aWQob2JqKSk7CiAgICBlbHNlCiAgICB7CiAgICAgIGlmKCEoKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSl8fAoJICAgKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfU0hPUlQpKSkpCglpZihpc19wbGF5ZXIob2JqKSkKCSAgc3RyPUNSTkFNRShvYmopKyIgKGludmlzaWJsZSkiOwoJZWxzZQoJICBzdHI9Ii0gbm8gc2hvcnQgZGVzY3JpcHRpb24gLSI7CiAgICB9CiAgICBzdHI9QUxFRlQoc3ByaW50ZigiJU8gIixzdHIpLCAzNCwgIi4iKSsiICI7CiAgfQogIGVsc2UKICAgIHN0cj0iIjsKICBpZihpbnRlcmFjdGl2ZShvYmopKQogICAgc3RyKz0iaSI7CiAgZWxzZSBpZihsaXZpbmcob2JqKSkKICAgIHN0cis9ImwiOwogIGVsc2UKICAgIHN0cis9Ii4iOwogIHN0cis9KHNoYWRvdyhvYmosIDApID8gInMiIDogIi4iKTsKICBpZighZmlsZXx8ZmlsZT09IiIpCiAgICBXTE4oKHByZStDQVAoc3RyKSsiICIrT2JqRmlsZShvYmopKVswLi43OV0pOwogIGVsc2UKICAgIHdyaXRlX2ZpbGUoZmlsZSwocHJlK0NBUChzdHIpKyIgIitPYmpGaWxlKG9iaikpWzAuLjc5XSsiXG4iKTsKfQoKc3RhdGljIHZhcmFyZ3Mgdm9pZCBEZWVwUHJpbnRTaG9ydChvYmplY3QgZW52LCBpbnQgaW5kZW50LCBzdHJpbmcgcHJlLCBzdHJpbmcgZmlsZSkKewogIGludCBpOwogIG9iamVjdCBpdGVtOwogIHN0cmluZyBzdHI7CiAgCiAgU0VDVVJFMSgpOwogIGlmKCFlbnYpCiAgICByZXR1cm47CiAgZm9yKGk9aW5kZW50LHN0cj0iIjsgaS0tOyBzdHIrPSIgICIpOwogIGlmKHByZSkKICAgIHN0cis9cHJlOwogIGlmKCFmaWxlfHxmaWxlPT0iIikKICAgIFcoc3RyKTsKICBlbHNlCiAgICB3cml0ZV9maWxlKGZpbGUsc3RyKTsKICBpKys7CiAgUHJpbnRTaG9ydCgiIixlbnYsZmlsZSk7CiAgRk9SQUxMKGl0ZW0sIGVudikKICAgIERlZXBQcmludFNob3J0KGl0ZW0saW5kZW50KzEsQVJJR0hUKCgrK2kpKyIuICIsNCwiICIpLGZpbGUpOwp9CgpzdGF0aWMgc3RyaW5nIGJyZWFrX3N0cmluZ19oYXJkKHN0cmluZyBzdHIsIGludCBsZW4sIHN0cmluZyBwcmUpCnsKICBpbnQgcyxwLHQ7CiAgc3RyaW5nIHRtcDsKCiAgaWYoIXN0cnx8IShzPXNpemVvZihzdHIpKSkKICAgIHJldHVybiAiIjsKICB0PWxlbi0ocD1zaXplb2YocHJlKSktMTsKCiAgdG1wPSIiOwogIHdoaWxlKHArcz5sZW4pCiAgewogICAgdG1wKz1wcmUrc3RyWzAuLnRdKyJcbiI7CglzdHI9c3RyW3QrMS4uXTsKCXMtPXQ7CiAgfQogIGlmKHNpemVvZihzdHIpKQogICAgdG1wKz1wcmUrc3RyWzAuLl0rIlxuIjsKICByZXR1cm4gdG1wOwp9CiAgCnN0YXRpYyB2b2lkIGRwcm9wKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYmopCnsKICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcob2JqLT5RdWVyeVByb3Aoa2V5KSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKICBlbHNlCiAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhvYmotPlF1ZXJ5UHJvcChrZXkpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOwp9CgpzdGF0aWMgc3RyaW5nIHByb3BmbGFncyhzdHJpbmcga2V5LCBvYmplY3Qgb2IpCnsKICBpbnQgdG1wOwogIHN0cmluZyAqZmxhZ3M7CiAgdG1wPShpbnQpb2ItPlF1ZXJ5KGtleSwxKTsKICBmbGFncz0oe30pOwogIHRtcCZTQVZFID8JICAgICAgIGZsYWdzKz0oeyJTQVYifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZQUk9URUNURUQgPyAgICAgIGZsYWdzKz0oeyJQUk8ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZTRUNVUkVEID8gICAgICAgIGZsYWdzKz0oeyJTRUMifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZOT1NFVE1FVEhPRCA/ICAgIGZsYWdzKz0oeyJOU00ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZTRVRNTk9URk9VTkQgPyAgIGZsYWdzKz0oeyJTTU4ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZRVUVSWU1OT1RGT1VORCA/IGZsYWdzKz0oeyJRTU4ifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZRVUVSWUNBQ0hFRCA/ICAgIGZsYWdzKz0oeyJRQ0EifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHRtcCZTRVRDQUNIRUQgPyAgICAgIGZsYWdzKz0oeyJTQ0EifSkgOiBmbGFncys9KHsiICAgIn0pOwogIHJldHVybiAiIitpbXBsb2RlKGZsYWdzLCJ8Iik7Cn0KCnN0YXRpYyB2b2lkIGRwcm9wMihzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2IpCnsKICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcGZsYWdzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7CiAgZWxzZQogICAgVyhicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcGZsYWdzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cn0KCnN0YXRpYyBtaXhlZCBwcm9wbWV0aG9kcyhzdHJpbmcga2V5LCBvYmplY3Qgb2IpCnsKICByZXR1cm4gKG1peGVkKW9iLT5RdWVyeShrZXksMik7Cn0KCnN0YXRpYyB2b2lkIGRwcm9wMyhzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2IpCnsKICBpZihwaXBlX291dCYmcGlwZV9vZikKICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcG1ldGhvZHMoa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKICBlbHNlCiAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wbWV0aG9kcyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOwp9CgpzdGF0aWMgdm9pZCBEdW1wUHJvcGVydGllcyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIFNFQ1VSRTEoKTsKICBpZighb2JqKQogICAgcmV0dXJuOwogIFBJUEVfREVMRVRFKHBpcGVfb2YpOwogIHN3aXRjaCAoZmxhZykgewogICAgY2FzZSAwOgogICAgICB3YWxrX21hcHBpbmcoKChtYXBwaW5nICopKG9iai0+X19xdWVyeV9wcm9wZXJ0aWVzKCkpKVswXSwjJ2Rwcm9wLG9iaik7IC8vJykKICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3AyLG9iaik7IC8vJykKICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3AzLG9iaik7IC8vJykKICAgICAgYnJlYWs7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogbW92aW5nIG9iamVjdHMKICovCgpzdGF0aWMgaW50IE1vdmVPYmoob2JqZWN0IG9iajEsIG9iamVjdCBvYmoyLCBpbnQgc2lsZW50KQp7CiAgaW50IGVycjsKICBvYmplY3Qgb2xkZW52OwoKICBTRUNVUkUyKEZBTFNFKTsKICBpZighKG9iajEmJm9iajIpKQogICAgcmV0dXJuIEZBTFNFOwogIG9sZGVudj1FTlYob2JqMSk7CiAgZXJyPShpbnQpb2JqMS0+bW92ZShvYmoyLCBNX1NJTEVOVHxNX05PQ0hFQ0spOwogIGlmKCFzaWxlbnQpCiAgICBzd2l0Y2goZXJyKQogICAgewogICAgICBjYXNlIE1FX1BMQVlFUjoKICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX1BMQVlFUiIpOwogICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICAgIGNhc2UgTUVfVE9PX0hFQVZZOgogICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfVE9PX0hFQVZZIik7CiAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQoJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgICAgY2FzZSBNRV9DQU5UX1RQT1JUX0lOOgogICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfQ0FOVF9UUE9SVF9JTiIpOwogICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICAgIGNhc2UgTUVfQ0FOVF9UUE9SVF9PVVQ6CiAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9DQU5UX1RQT1JUX09VVCIpOwogICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICAgIGRlZmF1bHQ6CiAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCB1bmtub3duIHJldHVybiB2YWx1ZSIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgcmV0dXJuIFRSVUU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBzYXZlIGRlc3RydWN0aW5nIG9mIG9iamVjdHMKICovCgpzdGF0aWMgdm9pZCBEZXN0cnVjdChvYmplY3Qgb2JqKQp7CiAgaWYoIW9iaiB8fCAhdGhpc19vYmplY3QoKSkKICAgIHJldHVybjsKICBjYXRjaChvYmotPnJlbW92ZSgpKTsKICBpZihvYmplY3RwKG9iaikgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKICAgIGRlc3RydWN0KG9iaik7Cn0KCnN0YXRpYyB2b2lkIERlZXBDbGVhbihvYmplY3Qgb2JqKQp7CiAgaWYoIW9iaikKICAgIHJldHVybjsKICBmaWx0ZXIoZmlsdGVyKGRlZXBfaW52ZW50b3J5KG9iaiksICJpc19ub3RfcGxheWVyIiwgTUUpLAoJICAgICAgICJEZXN0cnVjdCIsIE1FKTsKICBpZihpc19ub3RfcGxheWVyKG9iaikpCiAgICBEZXN0cnVjdChvYmopOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogU2hvdyB0aGUgaW5oZXJpdGFuY2UgdHJlZSBvZiBvYmplY3RzCiAqLwoKc3RhdGljIG9iamVjdCAqU3ViTm9kZXMob2JqZWN0IG9iaikKewogIGludCBzOwogIG9iamVjdCAqb2JqczsKICBzdHJpbmcgKmlubGlzdDsKICAKICBpZighb2JqKQogICAgcmV0dXJuIE5VTEw7CiAgaW5saXN0PWluaGVyaXRfbGlzdChvYmopOwogIHM9c2l6ZW9mKGlubGlzdCk7CiAgb2Jqcz0oe30pOwogIHdoaWxlKHMtLT4xKQogICAgb2Jqcz0oe2ZpbmRfb2JqZWN0KGlubGlzdFtzXSl9KStvYmpzOwogIHJldHVybiBvYmpzOwp9CgpzdGF0aWMgdm9pZCBJbmhlcml0YW5jZShvYmplY3Qgb2JqLCBzdHJpbmcgZnVuYywgc3RyaW5nIHByZSkKewogIGludCBpLCBzOwogIG9iamVjdCAqbG47CiAgc3RyaW5nIHN0cjsKICAKICBpZighb2JqKQogICAgcmV0dXJuOwogIHN0cj1wcmUrIiAiK09iakZpbGUob2JqKTsKICBpZihmdW5jKQogIHsKICAgIHN0cj1BTEVGVChzdHIrIiAiLCA1MCwgIi4iKTsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cyhmdW5jLCBvYmopPT1vYmplY3RfbmFtZShvYmopKQogICAgICBzdHIrPUFSSUdIVCgiICIrZnVuYywgMTksICIuIik7CiAgICBlbHNlCiAgICAgIHN0cis9QVJJR0hUKCIiLCAxOSwgIi4iKTsKICB9CiAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCiAgICB3cml0ZV9maWxlKHBpcGVfb2Ysc3RyKyJcbiIpOwogIGVsc2UKICAgIFdMTihzdHIpOwogIGxuPVN1Yk5vZGVzKG9iaik7CiAgZm9yKGk9MDsgaTxzaXplb2YobG4pOyBpKyspCiAgICBsbj1sbi1TdWJOb2RlcyhsbltpXSk7CiAgcz1zaXplb2YobG4pOwogIGZvcihpPTA7IGk8czsgaSsrKQogICAgSW5oZXJpdGFuY2UobG5baV0sIGZ1bmMsIHByZSsiLi4uLi4iKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGZpbGUgbmFtZSBoYW5kbGluZwogKi8KCnN0YXRpYyBzdHJpbmcgWEZpbGUoc3RyaW5nIGZpbGUpCnsKICBUSygiWEZpbGU6IGZpbGU6ICIrKGZpbGU/ZmlsZToiKE5VTEwpIikpOwogIGlmKGZpbGUpCiAgICBzd2l0Y2goZmlsZVswXSkKICAgIHsKICAgICAgY2FzZSAnQCc6CglyZXR1cm4gc291cmNlX2ZpbGVfbmFtZShYRmluZE9iaihmaWxlWzEuLjwxXSkpOwogICAgICBjYXNlICckJzoKCXJldHVybiBzb3VyY2VfZmlsZV9uYW1lKFhGaW5kT2JqKGZpbGUpKTsKICAgICAgZGVmYXVsdDoKCXJldHVybiBvbGRfZXhwbG9kZShsb25nX3BhdGgoZmlsZSksIiMiKVswXTsKICAgIH0KICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIHN0cmluZyBYRmluZEZpbGUoc3RyaW5nIGZpbGUpCnsKICBUSygiWEZpbmRGaWxlOiBmaWxlOiAiKyhmaWxlP2ZpbGU6IihOVUxMKSIpKTsKICBpZihmaWxlPVhGaWxlKGZpbGUpKQogIHsKICAgIGlmKGZpbGVfc2l6ZShmaWxlKT49MCkKICAgICAgcmV0dXJuIGZpbGU7CiAgICBpZihmaWxlWzwzLi48MV0hPSIuYyIgJiYgZmlsZV9zaXplKGZpbGUrIi5jIik+MCkKICAgICAgcmV0dXJuIGZpbGUrIi5jIjsKICB9CiAgV0RMTigiRmlsZSBub3QgZm91bmQgb3Igbm90IHJlYWRhYmxlIFsiK3Nob3J0X3BhdGgoZmlsZSkrIl0iKTsKICByZXR1cm4gTlVMTDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGZpbGUgcHJpbnRpbmcsIHNlYXJjaGluZyBhbmQgZXhlY3V0aW5nCiAqLwoKc3RhdGljIHZvaWQgWE1vcmVGaWxlKHN0cmluZyBmaWxlLCBpbnQgZmxhZykKewogIGludCBzLHNpemU7CiAgCiAgU0VDVVJFMSgpOwogIGlmKCFmaWxlKQogICAgcmV0dXJuOwogIAogIC8vIHRlcm09KHN0cmluZyljbG9uZXItPlF1ZXJ5UHJvcChQX1RUWSkhPSJkdW1iIjsKICBpZigoc2l6ZT0oZmlsZV9zaXplKG1vcmVmaWxlPWxvbmdfcGF0aChmaWxlKSkpKT4wKQogIHsKICAgIGlmKHNpemU+MTAwMDAwKQogICAgICBXRExOKCJXYXJuaW5nOiBsYXJnZSBmaWxlIik7CiAgICBNb3JlRmlsZShOVUxMKTsKICB9CiAgZWxzZSBpZihmbGFnKQogICAgV0RMTigiQ2Fubm90IHJlYWQgZmlsZSIpOwp9CgovKgpzdGF0aWMgc3RyaW5nIHJlYWRfYnVmZmVyKHN0cmluZyBmaWxlbmFtZSwgaW50IHN0YXJ0LCBpbnQgbnVtYmVyKQp7CiAgbWl4ZWQgdG1wOwogIHN0cmluZyByZXN1bHQ7CiAgaW50IGN1cnJlbnQ7CgogIGlmKCFmaWxlbmFtZXx8ZmlsZW5hbWU9PSIiKQogICAgcmV0dXJuICIiOwogIGlmKG51bWJlcjw9MSkKICAgIG51bWJlcj0xOwogIG51bWJlci0tOwogIHJlc3VsdD0iIjsKICBpZihmaWxlbmFtZSE9bGluZV9idWZmZXJfbmFtZSkKICB7CiAgICAvLyBUSygicmVhZF9idWZmZXI6IGluaXRpYWxpemluZyIpOwogICAgbGluZV9idWZmZXI9KFtdKTsKICAgIGxpbmVfYnVmZmVyX25hbWU9ZmlsZW5hbWU7CiAgICBjdXJyZW50PTA7CiAgfQogIGVsc2UKICAgIGN1cnJlbnQ9c3RhcnQ7CgogIHdoaWxlKGN1cnJlbnQ8PXN0YXJ0K251bWJlciAmJiBzdHJpbmdwKCh0bXA9bG9hZF9idWZmZXIoY3VycmVudCsrKSkpKQogICAgaWYoY3VycmVudD49c3RhcnQpCiAgICAgIHJlc3VsdCs9dG1wOwogIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBzdHJpbmcgbG9hZF9idWZmZXIoaW50IGxpbmUpCnsKICBpbnQgaSwgY3VycmVudCwgc3RhcnQsIGxlbmd0aCwgKmlkeDsKCiAgaWYoaW50cChsaW5lX2J1ZmZlcltsaW5lXSkpCiAgewogICAgLy8gVEsoImxvYWRfYnVmZmVyOiBOb3Rmb3VuZDogIitsaW5lKTsKICAgIGN1cnJlbnQ9bGluZTsKICAgIHdoaWxlKGN1cnJlbnQ+MCYmaW50cChsaW5lX2J1ZmZlclstLWN1cnJlbnRdKSk7CiAgICBmb3IoaT1jdXJyZW50O2k8PWxpbmU7aSsrKQogICAgewogICAgICAvLyBUSygibG9hZF9idWZmZXI6IHRyeWluZzogIitpKTsKICAgICAgaWYoaT4wKQoJaWR4PWxpbmVfYnVmZmVyW2ktMV07CiAgICAgIGVsc2UKCWlkeD0oezAsMH0pOwogICAgICBsZW5ndGg9cmVhZF9saW5lKChzdGFydD1pZHhbMF0raWR4WzFdKSk7CiAgICAgIC8vIFRLKCJsb2FkX2J1ZmZlcjogIitzdGFydCsiLyIrbGVuZ3RoKTsKICAgICAgbGluZV9idWZmZXJbaV09KHtzdGFydCxsZW5ndGh9KTsKICAgIH0KICB9CiAgaWR4PWxpbmVfYnVmZmVyW2xpbmVdOwogIHJldHVybgogICAgcmVhZF9ieXRlcyhsaW5lX2J1ZmZlcl9uYW1lLGlkeFswXSxpZHhbMV0pOwp9CgpzdGF0aWMgaW50IHJlYWRfbGluZShpbnQgb2Zmc2V0KQp7CiAgbWl4ZWQgbG9jX2J1ZjsKICBpbnQgbGVuZ3RoLCBwb3M7CgogIC8vIFRLKCJyZWFkX2xpbmU6ICIrb2Zmc2V0KTsKICBsZW5ndGg9MDsKICB3aGlsZSghaW50cCgobG9jX2J1Zj1yZWFkX2J5dGVzKGxpbmVfYnVmZmVyX25hbWUsb2Zmc2V0K2xlbmd0aCwxMDI0KSkpKQogIHsKICAgIGlmKChwb3M9bWVtYmVyKGxvY19idWYsJ1xuJykpPj0wKQogICAgICByZXR1cm4gbGVuZ3RoK3BvcysxOwogICAgbGVuZ3RoKz0xMDI0OwogIH0KICByZXR1cm4gbGVuZ3RoOwp9CiovCgpzdGF0aWMgdm9pZCBNb3JlRmlsZShzdHJpbmcgc3RyKQp7CiAgaW50IGksIG9mZjsKICBzdHJpbmcgZiwgbCwgcjsKICAKICBTRUNVUkUxKCk7CiAgCiAgaWYgKHN0ciAvKiYmIHNpemVvZihzdHIpKi8pCiAgewoJCWlmKCAhc2l6ZW9mKHN0cikgKSBzdHI9IlwwIjsKICAgIGlmKHRlcm0pCiAgICAgIFcoIhtNG1sxTSIpOwogICAgc3dpdGNoKHN0clswXSkKICAgIHsKICAgICAgY2FzZSAncSc6CiAgICAgIGNhc2UgJ3gnOgogICAgICBtb3JlZmxhZz1GQUxTRTsKICAgICAgbW9yZW9mZnNldD0xOwogICAgICBpZihtb3JlZmlsZT09VE1QX0ZJTEV8fG1vcmVmaWxlPT1QSVBFX0ZJTEUpCglybShtb3JlZmlsZSk7CiAgICAgIHJldHVybiBOVUxMOwogICAgICBicmVhazsKICAgICAgY2FzZSAnUCc6CiAgICAgIGNhc2UgJ1UnOgogICAgICBtb3JlZmxhZz1GQUxTRTsKICAgICAgbW9yZW9mZnNldD1tb3Jlb2Zmc2V0LW1vcmVsaW5lczsKICAgICAgY2FzZSAncCc6CiAgICAgIGNhc2UgJ3UnOgogICAgICBtb3Jlb2Zmc2V0PW1vcmVvZmZzZXQtMiptb3JlbGluZXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlICdEJzoKICAgICAgY2FzZSAnTic6CiAgICAgIG1vcmVvZmZzZXQrPW1vcmVsaW5lczsKICAgICAgY2FzZSAwOgkvKiBSRVRVUk4gKi8KICAgICAgY2FzZSAnZCc6CiAgICAgIGlmKG1vcmVmbGFnKQogICAgICB7Cgltb3JlZmxhZz1GQUxTRTsKCW1vcmVvZmZzZXQ9MTsKCWlmKG1vcmVmaWxlPT1UTVBfRklMRSkKCSAgcm0obW9yZWZpbGUpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgICBjYXNlICcvJzoKICAgICAgbW9yZW9mZnNldC0tOwogICAgICBtb3JlX3NlYXJjaGV4cHI9c3RyWzEuLjwxXTsKICAgICAgY2FzZSAnbic6CiAgICAgIGk9bW9yZW9mZnNldC1tb3JlbGluZXMrMTsKICAgICAgaWYobW9yZV9zZWFyY2hleHByPT0iIikKICAgICAgewoJV0RMTigiTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIik7CglyZXR1cm47CiAgICAgIH0KICAgICAgaWYoIXJlZ2V4cCgoeyJkdW1teSJ9KSwgbW9yZV9zZWFyY2hleHByKSkKCVdETE4oIkJhZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKICAgICAgZWxzZQoJd2hpbGUoKGw9cmVhZF9maWxlKG1vcmVmaWxlLCBpKyssIDEpKSYmCgkgICAgICAhc2l6ZW9mKHJlZ2V4cCgoe2x9KSwgbW9yZV9zZWFyY2hleHByKSkpCgkgIDsKICAgICAgaWYobCkKICAgICAgewoJV0xOKCIqKiogU2tpcHBpbmcgLi4uIik7Cgltb3Jlb2Zmc2V0PWktMTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKCVdMTigiKioqIFBhdHRlcm4gbm90IGZvdW5kIik7Cgltb3Jlb2Zmc2V0LT1tb3JlbGluZXM7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJzAnLi4nOSc6CiAgICAgIHNzY2FuZihzdHIsICIlZCIsIGkpOwogICAgICBtb3Jlb2Zmc2V0PWk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlCiAgewogICAgbW9yZW9mZnNldD0xOwogICAgbW9yZWZsYWc9RkFMU0U7CiAgfQogIGlmKG1vcmVvZmZzZXQ8MSkKICAgIG1vcmVvZmZzZXQ9MTsKICBpZihDYXRGaWxlKCkpCiAgICBXKCIqKiogTW9yZTogcSx1LFUsZCxELC88cmVnZXhwPiw8bGluZT4gWyIrKG1vcmVvZmZzZXQtMSkrIl0gKioqICIpOwogIGVsc2UKICB7CiAgICBXKCIqKiogTW9yZTogcSx1LFUsZCxELC88cmVnZXhwPiw8bGluZT4gWyIrKG1vcmVvZmZzZXQtMSkrIj1FT0ZdICoqKiAiKTsKICAgIG1vcmVmbGFnPVRSVUU7CiAgfQogIGlucHV0X3RvKCJNb3JlRmlsZSIpOwogIHJldHVybjsKfQoKLy8gU2NoYWRlIGVpZ2VudGxpY2ggZGFzIGljaCBlcyBuZXVzY2hyZWliZW4gbXVzc3RlLCBhYmVyIGVzIGlzdAovLyBzY2huZWxsZXIgbmV1IGdlc2NocmllYmVuIGFscyBkdXJjaCBkaWUgdW5kb2t1bWVudGllcmVuIGFsdGVuIEZ1bmt0aW9uZW4KLy8gZHVyY2h6dXN0ZWlnZW4uLi4gKnNldWZ6KgovLwkJCQkJICBQYWRyZWljCgpzdGF0aWMgc3RyaW5nIGxhc3RfZmlsZSwgKmxhc3RfZmlsZV9idWZmZXI7CnN0YXRpYyBpbnQgICAgbGFzdF9maWxlX2RhdGUsIGxhc3RfZmlsZV9zaXplLCBsYXN0X2ZpbGVfY29tcGxldGU7CgpzdGF0aWMgc3RyaW5nIHNyZWFkX2xpbmUoaW50IG51bSkKewogICBpZiAoIW1vcmVmaWxlKSByZXR1cm4gIiI7CiAgIGlmIChsYXN0X2ZpbGUhPW1vcmVmaWxlIHx8IGxhc3RfZmlsZV9kYXRlIT1maWxlX3RpbWUobW9yZWZpbGUpKSB7CiAgICAgIGlmICghKGxhc3RfZmlsZT1yZWFkX2J5dGVzKG1vcmVmaWxlLCAwLCA1MDAwMCkpKSByZXR1cm4gIiI7CiAgICAgIGxhc3RfZmlsZV9kYXRlPWZpbGVfdGltZShtb3JlZmlsZSk7CiAgICAgIGxhc3RfZmlsZV9idWZmZXI9ZXhwbG9kZShsYXN0X2ZpbGUsICJcbiIpOwogICAgICBsYXN0X2ZpbGVfc2l6ZT1zaXplb2YobGFzdF9maWxlX2J1ZmZlcik7CiAgICAgIGlmIChzaXplb2YobGFzdF9maWxlKT09NTAwMDAgJiYgbGFzdF9maWxlWzwxXSE9J1xuJykgewoJIGxhc3RfZmlsZV9zaXplLS07IC8vIGxldHp0ZSBaZWlsZSBuaWNodCB2b2xsc3RhZW5kaWcgZ2VsZXNlbgoJIGxhc3RfZmlsZV9jb21wbGV0ZT0wOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGZpbGVfc2l6ZShtb3JlZmlsZSk+NTAwMDApCglsYXN0X2ZpbGVfY29tcGxldGU9MDsKICAgICAgZWxzZSBsYXN0X2ZpbGVfY29tcGxldGU9MTsKICAgICAgbGFzdF9maWxlPW1vcmVmaWxlOwogICB9CiAgIGlmIChudW09PTApIG51bT0xOwogICAvLyBiZWkgenUgZ3Jvc3NlbiBGaWxlcyBuaWNodCBtZWhyIGFsbGVzIGJ1ZmZlcm4uLi4KICAgaWYgKG51bT5sYXN0X2ZpbGVfc2l6ZSkgewogICAgICBpZiAobGFzdF9maWxlX2NvbXBsZXRlKSByZXR1cm4gIiI7CiAgICAgIHJldHVybiAocmVhZF9maWxlKG1vcmVmaWxlLCBudW0sIDEpIHx8ICIiKTsKICAgfQogICByZXR1cm4gbGFzdF9maWxlX2J1ZmZlcltudW0tMV0rIlxuIjsKfQoKc3RhdGljIGludCBDYXRGaWxlKCkKewogIGludCBlbmQ7CiAgc3RyaW5nIGw7CiAgCiAgZW5kPW1vcmVvZmZzZXQrbW9yZWxpbmVzOwogIHdoaWxlKG1vcmVvZmZzZXQ8ZW5kKQovLyAgICBpZigobD1yZWFkX2ZpbGUobW9yZWZpbGUsIG1vcmVvZmZzZXQsIDEpKSE9IiIpCiAgICBpZigobD1zcmVhZF9saW5lKG1vcmVvZmZzZXQpKSE9IiIpCiAgICB7CiAgICAgIG1vcmVvZmZzZXQrKzsKICAgICAgVyhsKTsKICAgIH0KICAgIGVsc2UKICAgICAgcmV0dXJuIEZBTFNFOwovLyAgaWYocmVhZF9maWxlKG1vcmVmaWxlLCBtb3Jlb2Zmc2V0KzEsIDEpIT0iIikKICBpZihzcmVhZF9saW5lKG1vcmVvZmZzZXQrMSkhPSIiKQogICAgcmV0dXJuIFRSVUU7CiAgZWxzZQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgaW50IFhHcmVwRmlsZShzdHJpbmcgcGF0LCBzdHJpbmcgZmlsZSwgaW50IG1vZGUpCnsKICBpbnQgaSwgaiwgZiwgcywgZnNpemU7CiAgc3RyaW5nIHRmaWxlLCAqdG1wLCAqdHMsIHQ7CiAgCiAgU0VDVVJFMihGQUxTRSk7CiAgVEsoIlhHcmVwRmlsZTogcGF0OiAiK3BhdCsiIGZpbGU6ICIrZmlsZSsiIG1vZGU6ICIrbW9kZSk7CiAgaWYoIShwYXQmJmZpbGUpKQogICAgcmV0dXJuIEZBTFNFOwogIHRmaWxlPVRNUF9GSUxFOwogIGZzaXplPWZpbGVfc2l6ZShmaWxlKTsKICBmb3IoaT0wLGY9MDsgaTxmc2l6ZSAmJiB0PXJlYWRfYnl0ZXMoZmlsZSwgaSwgNTAwMDApOyBpKz01MDAwMCkKICAgIHRtcD1zdHJpcF9leHBsb2RlKHQsIlxuIik7CiAgICBpZiAodCAmJiB0WzwxXSE9J1xuJyAmJiBzaXplb2YodCk9PTUwMDAwKSB7CiAgICAgICBpLT1zaXplb2YodG1wWzwxXSk7CiAgICAgICB0bXA9dG1wWzAuLjwyXTsKICAgIH0KICAgIGlmKHM9c2l6ZW9mKHRtcCkpCiAgICB7CiAgICAgIGZvcihqPTA7ajxzO2orKykKICAgICAgewoJaWYoc2l6ZW9mKHRzPXJlZ2V4cCgoeyhtb2RlJlhHUkVQX0lDQVNFP2xvd2VyX2Nhc2UodG1wW2pdKTp0bXBbal0pfSkscGF0KSkpCgl7CgkgIGlmKCEobW9kZSZYR1JFUF9SRVZFUlQpKQoJICAgewoJICAgICBpZighZisrKQoJICAgICAgIHdyaXRlX2ZpbGUodGZpbGUsICIqKiogRmlsZTogIitmaWxlKyIgKioqXG4iKTsKCSAgICAgd3JpdGVfZmlsZSh0ZmlsZSwgdG1wW2pdKyJcbiIpOwoJICAgfQoJfQoJZWxzZSBpZihtb2RlJlhHUkVQX1JFVkVSVCkKCXsKCSAgaWYoIWYrKykKCSAgICB3cml0ZV9maWxlKHRmaWxlLCAiKioqIEZpbGU6ICIrZmlsZSsiICoqKlxuIik7CgkgIHdyaXRlX2ZpbGUodGZpbGUsIHRtcFtqXSsiXG4iKTsKCX0KICAgICAgfQogICAgfQogIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBYRXhlY0ZpbGUoaW50IGxpbmUpCnsKICBpbnQgaTsKICAKICBpZighc2NyaXB0bGluZSkKICAgIHJldHVybjsKICBmb3IoaT1saW5lOyBpPHNjcmlwdHNpemUmJmk8bGluZStFWEVDX0xJTkVTOyBpKyspCiAgewogICAgaWYoIXNjcmlwdGxpbmVbaV0pCiAgICAgIGNvbnRpbnVlOwogICAgaWYoIUNvbW1hbmQoc2NyaXB0bGluZVtpXSkpCiAgICB7CiAgICAgIHNjcmlwdGxpbmU9TlVMTDsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICBpZihpPHNjcmlwdHNpemUpCiAgICBjYWxsX291dCgiWEV4ZWNGaWxlIiwgRVhFQ19USU1FLCBpKTsKICBlbHNlCiAgICBzY3JpcHRsaW5lPU5VTEw7Cn0KCnN0YXRpYyB2b2lkIFhtdHBTY3JpcHQoc3RyaW5nIGRpciwgc3RyaW5nIGZpbGUsIHN0cmluZyBvcHQpCnsKICBpbnQgcywgdDsKICBzdHJpbmcgKmZpbGVzOwogIAogIHM9c2l6ZW9mKGZpbGVzPWdldF9kaXIoZGlyKyIvKiIpKTsKICB3aGlsZShzLS0pCiAgewogICAgdD1zaXplb2YoZmlsZXNbc10pLTE7CiAgICBpZihmaWxlc1tzXSA9PSAiLi4iIHx8IGZpbGVzW3NdID09ICIuIiB8fCBmaWxlc1tzXVt0XSA9PSAnficgfHwKICAgICAgIChmaWxlc1tzXVswXSA9PSAnIycgJiYgZmlsZXNbc11bdF0gPT0gJyMnKSkKICAgICAgY29udGludWU7CiAgICBpZihmaWxlX3NpemUoZGlyKyIvIitmaWxlc1tzXSk9PS0yKQogICAgewogICAgICB3cml0ZV9maWxlKGZpbGUsICJta2RpciAiK2ZpbGVzW3NdKyIgOyBjZCAiK2ZpbGVzW3NdKyJcbiIpOwogICAgICBYbXRwU2NyaXB0KGRpcisiLyIrZmlsZXNbc10sIGZpbGUsIG9wdCk7CiAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgImNkIC4uXG4iKTsKICAgIH0KICAgIGVsc2UKICAgICAgd3JpdGVfZmlsZShmaWxlLCAibXRwIC1yICIrb3B0KyIgIitkaXIrIi8iK2ZpbGVzW3NdKyJcbiIpOwogIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICBwbGF5ZXIgcHJvcGVydGllcyBoYW5kbGluZwogKi8KCnN0YXRpYyBzdHJpbmcgUGxheWVySWRsZShvYmplY3Qgb2JqKQp7CiAgc3RyaW5nIHN0cjsKICBpbnQgaSwgdG1wOwogIAogIGlmKCFvYmopCiAgICByZXR1cm4gTlVMTDsKICBpZigoaT1xdWVyeV9pZGxlKG9iaikpPj02MCkKICB7CiAgICBzdHI9QVJJR0hUKCIiKyhpLzM2MDApLCAyLCAiMCIpOwogICAgaS09KGkvMzYwMCkqMzYwMDsKICAgIHN0cis9IiciK0FSSUdIVCgiIisoaS82MCksIDIsICIwIik7CiAgfQogIGVsc2UKICAgIHN0cj0iLi4uLi4iOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyQWdlKG9iamVjdCBvYmopCnsKICBzdHJpbmcgc3RyOwogIGludCBpLCB0bXA7CiAgCiAgaWYoIW9iaikKICAgIHJldHVybiBOVUxMOwogIGk9KGludClvYmotPlF1ZXJ5UHJvcChQX0FHRSk7CiAgc3RyPSIgIitBUklHSFQoIiIrKGkvNDMyMDApLCA0LCAiLiIpOwogIGktPShpLzQzMjAwKSo0MzIwMDsKICByZXR1cm4gc3RyKyI6IitBUklHSFQoIiIrKGkvMTgwMCksIDIsICIwIik7Cn0KCnN0YXRpYyBzdHJpbmcgY3JuYW1lKG9iamVjdCB3aG8pCnsKICBzdHJpbmcgdWlkLCBsbmFtZTsKCiAgaWYoKHVpZD1nZXR1aWQod2hvKSk9PVJPT1RJRCAmJiAKICAgICBvYmplY3RfbmFtZSh3aG8pWzAuLjddPT0iL3NlY3VyZS8iICYmCiAgICAgKGxuYW1lPShzdHJpbmcpd2hvLT5sb2dpbm5hbWUoKSkpCiAgICByZXR1cm4gQ0FQKGxuYW1lKTsKICByZXR1cm4gQ0FQKHVpZCk7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyV2hvKG9iamVjdCBvYmopCnsKICBvYmplY3QgdG1wOwogIHN0cmluZyBzdHIsIHN0bXA7CiAgc3RyPUFSSUdIVCgiIitMRVZFTChvYmopICAsICAzLCAiICIpOwogIHN0cis9QUxFRlQoIiAiK2NybmFtZShvYmopKyIgIiwgMTIsICIuIik7CiAgc3RyKz1QbGF5ZXJBZ2Uob2JqKTsKICBzdHIrPSgoaW50KW9iai0+UXVlcnlQcm9wKFBfR0VOREVSKT09MSA/ICIgbSAiIDogIiBmICIpOwogIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfRlJPRykpICA/ICJmIiA6ICIuIjsKICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0dIT1NUKSkgPyAiZyIgOiAiLiI7CiAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9JTlZJUykpID8gImkiIDogIi4iOwogIHN0cis9KHF1ZXJ5X2VkaXRpbmcob2JqKXx8cXVlcnlfaW5wdXRfcGVuZGluZyhvYmopID8gImUiIDogIi4iKTsKICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0FXQVkpKSAgPyAiYSIgOiAiLiI7CiAgc3RyKz0iICIrUGxheWVySWRsZShvYmopKyIgIjsKICBzdHIrPSh0bXA9RU5WKG9iaikpID8gT2JqRmlsZSh0bXApIDogIi0gZmFicmljIG9mIHNwYWNlIC0iOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyTWFpbChvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcmV0dXJuIHByZSsibWFpbDogIitvYmotPlF1ZXJ5UHJvcChQX01BSUxBRERSKTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJJUChvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcmV0dXJuIHByZSsiaG9zdDogIitxdWVyeV9pcF9uYW1lKG9iaikrIiAoIitxdWVyeV9pcF9udW1iZXIob2JqKSsiKSI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyUmFjZShvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyB0bXAsIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICBwcmU9cHJlKyJyYWNlOiAiK0FMRUZUKG9iai0+UXVlcnlQcm9wKFBfUkFDRSkrIiAiLCAxMCwgIi4iKSsiIGd1aWxkOiAiOwogIHRtcD0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfR1VJTEQpOwogIHJldHVybiB0bXAgPyBwcmUrdG1wIDogcHJlKyItIG5vbmUgLSI7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyRG9tYWluKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgaW50IGksIHM7CiAgbWl4ZWQgKnVpbmZvOwogIHN0cmluZyAqZG9tYWlucywgcHJlOwogIAogIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOwogIHByZSs9ImRvbWFpbmxvcmQgb2Y6ICI7CiAgdWluZm89KG1peGVkKilNQVNURVItPmdldF91c2VyaW5mbyhnZXR1aWQob2JqKSk7CiAgaWYodWluZm8mJihkb21haW5zPXVpbmZvWzNdKSYmKHM9c2l6ZW9mKGRvbWFpbnMpKSkKICB7CiAgICBmb3IoaT0wOyBpPHM7IGkrKykKICAgIHsKICAgICAgcHJlICs9IENBUChkb21haW5zW2ldKTsKICAgICAgaWYoaTxzLTEpCglwcmUgKz0gIiwgIjsKICAgIH0KICB9CiAgcmV0dXJuIHByZTsKfQoKc3RhdGljIHN0cmluZyBQbGF5ZXJTdGF0cyhvYmplY3Qgb2JqLCBpbnQgZmxhZykKewogIHN0cmluZyBwcmU7CiAgCiAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CiAgcHJlKz0iaHA9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9IUCksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0hQKSwgMywgIjAiKTsKICBwcmUrPSIgc3A9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9TUCksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX1NQKSwgMywgIjAiKTsKICBwcmUrPSIgZm9vZD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX0ZPT0QpLCAzLCAiMCIpOwogIHByZSs9Ii8iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX01BWF9GT09EKSwgMywgIjAiKTsKICBwcmUrPSIgZHJpbms9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9EUklOSyksIDMsICIwIik7CiAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSwgMywgIjAiKTsKICBwcmUrPSIgZXhwcz0iK29iai0+UXVlcnlQcm9wKFBfWFApOwogIHJldHVybiBwcmU7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyU25vb3Aob2JqZWN0IG9iaiwgaW50IGZsYWcpCnsKICBzdHJpbmcgdG1wLCBwcmU7CiAgb2JqZWN0IHZpY3RpbTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICBwcmU9cHJlKyJpcyBzbm9vcGVkIGJ5OiAiOwogIGlmKHZpY3RpbT1xdWVyeV9zbm9vcChvYmopKQogICAgcHJlKz1BUklHSFQoIiAiK2NybmFtZSh2aWN0aW0pLCAxMiwgIi4iKTsKICBlbHNlCiAgICBwcmUrPSIuLi4uLi4uLi4uLi4iOwogIHJldHVybiBwcmU7Cn0KCnN0YXRpYyBzdHJpbmcgUGxheWVyQ21kQXZnKG9iamVjdCBvYmosIGludCBmbGFnKQp7CiAgc3RyaW5nIHByZTsKICAKICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKICByZXR1cm4gcHJlKyJjbWRhdmc6ICIrKGludClvYmotPl9xdWVyeV9jb21tYW5kX2F2ZXJhZ2UoKTsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBtc2cgaW5wdXQgdG8gb2JqZWN0cwogKi8KCnN0YXRpYyB2b2lkIFhNc2dTYXkoc3RyaW5nIHN0cikKewogIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCiAgewogICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CiAgICBzYXkoIltFbmQgb2YgbWVzc2FnZV1cbiIpOwogIH0KICBlbHNlCiAgewogICAgc2F5KHN0cisiXG4iKTsKICAgIGlucHV0X3RvKCJYTXNnU2F5Iik7CiAgfQp9CgpzdGF0aWMgdm9pZCBYTXNnVGVsbChzdHJpbmcgc3RyKQp7CiAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKICB7CiAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKICAgIHRlbGxfb2JqZWN0KG1zZ3RvLCAiW0VuZCBvZiBtZXNzYWdlXVxuIik7CiAgfQogIGVsc2UKICB7CiAgICB0ZWxsX29iamVjdChtc2d0bywgc3RyKyJcbiIpOwogICAgaW5wdXRfdG8oIlhNc2dUZWxsIik7CiAgfQp9CgpzdGF0aWMgdm9pZCBYTXNnU2hvdXQoc3RyaW5nIHN0cikKewogIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCiAgewogICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CiAgICBzaG91dCgiW0VuZCBvZiBtZXNzYWdlXVxuIik7CiAgfQogIGVsc2UKICB7CiAgICBzaG91dChzdHIrIlxuIik7CiAgICBpbnB1dF90bygiWE1zZ1Nob3V0Iik7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb3duIG9iamVjdCBtb3ZpbmcKICovCgppbnQgbW92ZShtaXhlZCBkZXN0KQp7CiAgbW92ZV9vYmplY3QoTUUsIGNsb25lcj9jbG9uZXI6ZGVzdCk7CiAgcmV0dXJuIFRSVUU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvYmplY3QgaWQKICovCgppbnQgaWQoc3RyaW5nIHN0cikKewogIGlmKCFzZWN1cml0eSgpJiZNT0RFKE1PREVfU0NBTkNISykmJlJUUCYmIUlTX0FSQ0goUlRQKSkKICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAoaWQpIFsiK3F1ZXJ5X3ZlcmIoKSsiXSAiKwoJIChQUkVWID8gT2JqRmlsZShQUkVWKSA6ICJbZGVzdHJ1Y3RlZCBvYmplY3RdIikpOwogIHJldHVybiBMT1dFUihzdHIpPT1MT1dFUihUT09MX05BTUUpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogc2hvcnQgYW5kIGxvbmcgZGVzY3JpcHRpb24KICovCgpzdHJpbmcgc2hvcnQoKQp7CiAgcmV0dXJuIF9xdWVyeV9zaG9ydCgpKyIuXG4iOwp9CgpzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKewogIHN0cmluZyBzaDsgLy8gYWRkZWQgYnkgUnVtYXRhCiAgaWYoY2xvbmVyKQogIHsKICAgIGlmKCghc2VjdXJpdHkoKSkmJk1PREUoTU9ERV9TQ0FOQ0hLKSYmIUlTX0FSQ0goUlRQKSkKICAgICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChzaG9ydCkgWyIrcXVlcnlfdmVyYigpKyJdICIrCgkgICAoUFJFViA/IE9iakZpbGUoUFJFVikgOiAiW2Rlc3RydWN0ZWQgb2JqZWN0XSIpKTsKCWlmKCBzaD1RdWVyeShQX1NIT1JUKSApIHJldHVybiBzaDsgLy8gYWRkZWQgYnkgUnVtYXRhCiAgICByZXR1cm4gY2xvbmVyLT5uYW1lKFdFU1NFTikrIiAiK1RPT0xfVElUTEUrIiBbIisKICAgICAgY3RpbWUodGltZSgpKVsxMS4uMThdKyJdIjsKICB9CiAgcmV0dXJuIFRPT0xfVElUTEU7Cn0KCnN0cmluZyBsb25nKCkKewogIHJldHVybiBfcXVlcnlfbG9uZygpOwp9CgpzdHJpbmcgX3F1ZXJ5X2xvbmcoKQp7CiAgaWYoY2xvbmVyJiYhc2VjdXJpdHkoKSYmTU9ERShNT0RFX1NDQU5DSEspJiYhSVNfQVJDSChSVFApKQogIHsKICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAobG9uZykgWyIrcXVlcnlfdmVyYigpKyJdICIrCgkgKFBSRVYgPyBPYmpGaWxlKFBSRVYpIDogIltkZXN0cnVjdGVkIG9iamVjdF0iKSk7CiAgfQogIHJldHVybiAKICAgICJUaGlzIGlzICIrVE9PTF9OQU1FKyIgdmVyc2lvbiAiK1RPT0xfVkVSU0lPTisKICAgICIgKG1haW50YWluZWQgYnkgS2lya0BNb3JnZW5HcmF1ZW4pXG4iKwogICAgIk9yaWdpbmFsIGNvcHlyaWdodCBoZWxkIGJ5IEh5cC5cbiIrCiAgICAiR2FtZWRyaXZlciBwYXRjaGxldmVsOiAiK19fVkVSU0lPTl9fKyIgbWFzdGVyIG9iamVjdDogIitfX01BU1RFUl9PQkpFQ1RfXysKICAgICJcblxuRG8gJ3hoZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiI7Cn0KCnN0cmluZyBuYW1lKG1peGVkIGR1bW15MSwgbWl4ZWQgZHVtbXkyKQp7CiAgcmV0dXJuIF9xdWVyeV9zaG9ydCgpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogbGlnaHQgc3R1ZmYKICovCgppbnQgX3F1ZXJ5X2xpZ2h0KCkKewogIHJldHVybiB4bGlnaHQ7Cn0KCmludCBfc2V0X2xpZ2h0KGludCB4KQp7CiAgcmV0dXJuIHhsaWdodDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEF1dG9sb2FkaW5nCiAqLwoKbWl4ZWQgKl9xdWVyeV9hdXRvbG9hZG9iaigpCnsKICByZXR1cm4gQVVUT0xPQURfQVJHUzsKfQoKdm9pZCBfc2V0X2F1dG9sb2Fkb2JqKG1peGVkICphcmdzKQp7CiAgV0xOKFRPT0xfVElUTEUrIiAuLi4iKTsKICBpZighcG9pbnRlcnAoYXJncykpCiAgICA7CiAgZWxzZSBpZihzaXplb2YoYXJncykhPTMpCiAgICA7CiAgZWxzZSBpZighc3RyaW5ncChhcmdzWzBdKSkKICAgIDsKICBlbHNlIGlmKCFpbnRwKGFyZ3NbMV0pKQogICAgOwogIGVsc2UgaWYoIWludHAoYXJnc1syXSkpCiAgICA7CiAgZWxzZQogIHsKICAgIGlmKChzdHJpbmcpYXJnc1swXSE9VE9PTF9JTlRFUk5BTCkKICAgIHsKICAgICAgV0xOKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOwogICAgICBXTE4oIioqKgkgICAgTkVXIEVESVRJT04gICAgICAqKioiKTsKICAgICAgV0xOKCIqKioJZG8gJ3h0b29sIG5ld3MnIGZvciAgKioqIik7CiAgICAgIFdMTigiKioqCSBtb3JlIGluZm9ybWF0aW9uICAgICoqKiIpOwogICAgICBXTE4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiAgICB9CiAgICBtb2RpPShpbnQpYXJnc1sxXTsKICAgIG1vcmVsaW5lcz0oaW50KWFyZ3NbMl07CiAgICByZXR1cm47CiAgfQogIFcoIihiYWQgYXV0b2xvYWQsIHVzaW5nIGRlZmF1bHQpXG4iKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGNyZWF0aW9uLCB1cGRhdGluZyBhbmQgaW5pdGlhbGl6YXRpb24gc3R1ZmYKICovCgp2b2lkIHVwZGF0ZV90b29sKG1peGVkICphcmdzLCBvYmplY3Qgb2JqKQp7CiAgU0VDVVJFMSgpOwogIGlmKCEob2JqJiZhcmdzKSkKICAgIHJldHVybjsKICBEZXN0cnVjdChQUkVWKTsKICBfc2V0X2F1dG9sb2Fkb2JqKGFyZ3MpOwogIG1vdmUob2JqKTsKfQoKdm9pZCBjcmVhdGUoKQp7CiAgb2JqZWN0IG9iajsKICAKICBpZihtZW1iZXIob2JqZWN0X25hbWUoKSwnIycpPDApCiAgICByZXR1cm47CiAgaWYoIWNsb25lciYmISgoY2xvbmVyPVRQKXx8KGNsb25lcj1FTlYoTUUpKSkmJiFpbnRlcmFjdGl2ZShjbG9uZXIpKQogICAgZGVzdHJ1Y3QoTUUpOwogIGlmKCFJU19MRUFSTkVSKGNsb25lcikpCiAgICBkZXN0cnVjdChNRSk7CiAgU2V0UHJvcChQX05PRFJPUCwiRGFzIHdhZXJlIHp1IGdlZmFlaHJsaWNoLlxuIik7CiAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKICBTZXRQcm9wKFBfTk9CVVksMSk7CiAgaWYoZmlsZV9zaXplKFNBVkVfRklMRSsiLm8iKT4wKQogIHsKICAgIFdETE4oIkxvYWRpbmcgIitUT09MX1RJVExFKyIgc2V0dGluZ3MiKTsKICAgIHJlc3RvcmVfb2JqZWN0KFNBVkVfRklMRSk7CiAgfQogIGlmKE1PREUoTU9ERV9GSVJTVCkpCiAgICBjYWxsX291dCgibW92ZSIsMCxjbG9uZXIpOwogIGNhbGxfb3V0KCJhZGRfaW5zZXJ0X2hvb2siLDEsTUUpOwp9Cgp2b2lkIFRLKHN0cmluZyBzdHIpCnsKICBpZiAoIXh0aykKICAgIHJldHVybjsKICB0ZWxsX29iamVjdChjbG9uZXIsIlhUT09MOiAiK3N0cisiXG4iKTsKfQoKaW50IFh0ayhzdHJpbmcgc3RyKQp7CiAgeHRrPSF4dGs7CiAgV0RMTigiWHRvb2wgaW50ZXJuYWwgdHJhY2luZyAiKyh4dGs/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKTsKICByZXR1cm4gVFJVRTsKfQoKdm9pZCBhZGRfaW5zZXJ0X2hvb2sob2JqZWN0IG9iaikKewogIGlmKG9iamVjdHAob2JqKSkKICAgIGNsb25lci0+QWRkSW5zZXJ0SG9vayhvYmopOwp9Cgp2b2lkIGluaXQoKQp7CiAgb2JqZWN0IGZpcnN0LCBwcmV2OwogIAogIGlmKG1lbWJlcihvYmplY3RfbmFtZSgpLCcjJyk8MCkgcmV0dXJuOwogIGZpcnN0PWZpcnN0X2ludmVudG9yeShFTlYoTUUpKTsKICBpZihNT0RFKE1PREVfUFJPVEVDVCkmJmlzX3BsYXllcihmaXJzdCkmJiFJU19BUkNIKGZpcnN0KSkKICB7CiAgICBXRExOKCJXQVJOSU5HOiAiK2NybmFtZShmaXJzdCkrIiB0cmllZCB0byBtb3ZlIGludG8geW91ciBpbnZlbnRvcnkiKTsKICAgIHRlbGxfb2JqZWN0KGZpcnN0LCAiWW91IGNhbm5vdCBtb3ZlIHlvdXJzZWxmIGludG8gIisKCQljcm5hbWUoY2xvbmVyKSsiJ3MgaW52ZW50b3J5LlxuIik7CiAgICBjYWxsX291dCgiRHJvcE9iaiIsMCxmaXJzdCk7CiAgICByZXR1cm47CiAgfQogIGVsc2UgaWYoTU9ERShNT0RFX0ZJUlNUKSYmZmlyc3QhPU1FKQogICAgbW92ZShjbG9uZXIpOwogIGVsc2UgYWN0aW9ucygpOwp9Cgp2b2lkIERyb3BPYmoob2JqZWN0IG9iaikKewogIGlmKCFvYmp8fCFvYmplY3RwKG9iaikpCiAgICByZXR1cm47CiAgb2JqLT5tb3ZlKEVOVihjbG9uZXIpLE1fTk9DSEVDS3xNX05PX1NIT1cpOwp9CgojZGVmaW5lIEFDVElPTlNcCihbXAogICJ4Y2FsbG91dHMiIDogIlhjYWxsb3V0cyI7MDsxLFwKICAieGNhbGwiICAgICA6ICJYY2FsbCI7MDsxLFwKICAieGNhdCIgICAgICA6ICJYY2F0IjsxOzEsXAogICJ4Y2QiICAgICAgIDogIlhjZCI7MDswLFwKICAieGNsZWFuIiAgICA6ICJYY2xlYW4iOzA7MCxcCiAgInhjbG9uZSIgICAgOiAiWGNsb25lIjswOzAsXAogICJ4dWNsb25lIiAgIDogIlh1Y2xvbmUiOzA7MCxcCiAgInhjbWRzIiAgICAgOiAiWGNtZHMiOzA7MSxcCiAgInhkYmciICAgICAgOiAiWGRiZyI7MDswLFwKICAieGRjbGVhbiIgICA6ICJYZGNsZWFuIjswOzAsXAogICJ4ZGRlcyIgICAgIDogIlhkZGVzIjswOzAsXAogICJ4ZGVzIiAgICAgIDogIlhkZXMiOzA7MCxcCiAgInhkZXN0IiAgICAgOiAiWGRlcyI7MDswLFwKICAieGRsb29rIiAgICA6ICJYZGxvb2siOzA7MSxcCiAgInhkbyIgICAgICAgOiAiWGRvIjswOzAsXAogICJ4ZHVwZGF0ZSIgIDogIlhkdXBkYXRlIjswOzAsXAogICJ4ZWNobyIgICAgIDogIlhlY2hvIjswOzAsXAogICJ4ZXZhbCIgICAgIDogIlhldmFsIjswOzEsXAogICJ4Zm9yYWxsIiAgIDogIlhmb3JhbGwiOzA7MCxcCiAgInhnb3RvIiAgICAgOiAiWGdvdG8iOzA7MCxcCiAgInhoYmVhdHMiICAgOiAiWGhiZWF0cyI7MDsxLFwKICAieGdyZXAiICAgICA6ICJYZ3JlcCI7MTsxLFwKICAieGhlYWQiICAgICA6ICJYaGVhZCI7MTsxLFwKICAieGhlbHAiICAgICA6ICJYaGVscCI7MDswLFwKICAieGludmVudG9yeSI6ICJYaW52ZW50b3J5IjswOzEsXAogICJ4aWRzIiAgICAgIDogIlhpZHMiOzA7MCxcCiAgInhpbmZvIiAgICAgOiAiWGluZm8iOzA7MCxcCiAgInhpbmhlcml0IiAgOiAiWGluaGVyaXQiOzA7MSxcCiAgInhsYWciICAgICAgOiAiWGxhZyI7MDswLFwKICAieGxpZ2h0IiAgICA6ICJYbGlnaHQiOzA7MCxcCiAgInhsb2FkIiAgICAgOiAiWGxvYWQiOzA7MCxcCiAgInhsb29rIiAgICAgOiAiWGxvb2siOzA7MSxcCiAgInhscGMiICAgICAgOiAiWGxwYyI7MDswLFwKICAieG1hbiIgICAgICA6ICJYbWFuIjswOzAsXAogICJ4bW9yZSIgICAgIDogIlhtb3JlIjsxOzAsXAogICJ4bW92ZSIgICAgIDogIlhtb3ZlIjswOzAsXAogICJ4bXNnIiAgICAgIDogIlhtc2ciOzE7MCxcCiAgInhtdHAiICAgICAgOiAiWG10cCI7MDswLFwKICAieHByb2MiICAgICA6ICJYcHJvYyI7MDsxLFwKICAieHByb2YiICAgICA6ICJYcHJvZiI7MDswLFwKICAieHByb3BzIiAgICA6ICJYcHJvcHMiOzA7MSxcCiAgInhxdWl0IiAgICAgOiAiWHF1aXQiOzA7MCxcCiAgInhzY2FuIiAgICAgOiAiWHNjYW4iOzA7MCxcCiAgInhzZXQiICAgICAgOiAiWHNldCI7MDswLFwKICAieHNoIiAgICAgICA6ICJYc2giOzA7MCxcCiAgInhzb3J0IiAgICAgOiAiWHNvcnQiOzE7MSxcCiAgInh0YWlsIiAgICAgOiAiWHRhaWwiOzE7MSxcCiAgInh0ayIgICAgICAgOiAiWHRrIjswOzAsXAogICJ4dG9vbCIgICAgIDogIlh0b29sIjswOzAsXAogICJ4dHJhY2UiICAgIDogIlh0cmFjZSI7MDswLFwKICAieHRyYW5zIiAgICA6ICJYdHJhbnMiOzA7MCxcCiAgInh1cGRhdGUiICAgOiAiWHVwZGF0ZSI7MDswLFwKICAieHdjIiAgICAgICA6ICJYd2MiOzE7MCxcCiAgInh3aG8iICAgICAgOiAiWHdobyI7MDsxLFwKICBdKQoKc3RhdGljIHN0cmluZyBQcmVwYXJlTGluZShzdHJpbmcgc3RyKQp7CiAgcmV0dXJuIHN0cjsKfQoKc3RhdGljIHN0cmluZyBRdW90ZUxpbmUoc3RyaW5nIHN0cikKewogIHN0cmluZyAqdG1wLCp0bXAyOwogIGludCBpLCBpMiwgbGVuLCBsZW4yLCBxZCwgcXM7CgogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcXFwiLCKwQlNITCIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcXCIiLCKwREJMUSIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcXCciLCKwU0dMUSIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcfCIsIrBQSVBFIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwifHwiLCKwT1JPUiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIi0+IiwisExBUlIiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXCQiLCKwRE9MUiIpOwogIHRtcD1yZWdleHBsb2RlKHN0ciwiKFwifCcpIik7CiAgbGVuPXNpemVvZih0bXApOwogIHFkPXFzPTA7CiAgZm9yKGk9MDtpPGxlbjtpKyspCiAgewogICAgaWYoaSUyKQogICAgewogICAgICBpZih0bXBbaV09PSInIikKCXFkPSghcXM/IXFkOnFkKTsKICAgICAgZWxzZQoJcXM9KCFxZD8hcXM6cXMpOwogICAgICBpZigodG1wW2ldPT0iXCIiJiYhcWQpfHwodG1wW2ldPT0iJyImJiFxcykpCgl0bXBbaV09IiI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmKCFxZCkKICAgICAgewoJbGVuMj1zaXplb2YodG1wMj1yZWdleHBsb2RlKHRtcFtpXSwiXFwkW14gXVteIF0qIikpOwoJZm9yKGkyPTA7aTI8bGVuMjtpMisrKQoJICBpZihpMiUyKQoJICB7CgkgICAgVEsoIlF1b3RlTGluZTogIit0bXAyW2kyXVsxLi5dKTsKCSAgICB0bXAyW2kyXT0oc3RyaW5nKVhGaW5kT2JqKCh0bXAyW2kyXSlbMS4uXSk7CgkgIH0KCXRtcFtpXT1pbXBsb2RlKHRtcDIsIiIpOwogICAgICB9CiAgICB9CiAgfQogIGlmKHFkfHxxcykKICAgIHJldHVybiBOVUxMOwogIHN0cj1pbXBsb2RlKHRtcCwiIik7CiAgVEsoIlF1b3RlTGluZTogc3RyOiAiK3N0cik7CiAgcmV0dXJuIHN0cjsKfQoKc3RhdGljIHN0cmluZyBVbnF1b3RlTGluZShzdHJpbmcgc3RyKQp7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisEJTSEwiLCJcXCIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBEQkxRIiwiXCIiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwU0dMUSIsIlwnIik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisERRVU8iLCIiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwU1FVTyIsIiIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBQSVBFIiwifCIpOwogIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBPUk9SIiwifHwiKTsKICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwTEFSUiIsIi0+Iik7CiAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisERPTFIiLCIkIik7CiAgVEsoIlVucXVvdGVMaW5lOiBzdHI6ICIrc3RyKTsKICByZXR1cm4gc3RyOwp9CgpzdGF0aWMgc3RyaW5nICpFeHBsb2RlQ21kcyhzdHJpbmcgc3RyKQp7CiAgc3RyaW5nICp0bXA7CiAgCiAgdG1wPXJlZ2V4cGxvZGUoc3RyLCJcXHx8Pnw+PiIpOwogIHdoaWxlKHRtcFs8MV09PSIiKQogICAgdG1wPXRtcFswLi48Ml07CiAgcmV0dXJuIHRtcDsKfQoKdmFyYXJncyBpbnQgUGFyc2VMaW5lKHN0cmluZyBzdHIpCnsKICBzdHJpbmcgdmVyYiwgYXJnOwogIGludCByZXQ7CiAgCiAgVEsoIlBhcnNlTGluZTogc3RyOiAiKyhzdHI/c3RyOiIiKSk7CiAgaWYoIXNpemVvZihjbWRzKSkKICB7CiAgICAvLyB0aGlzIGlzIGEgc2luZ2xlIGNvbW1hbmQgb3IgYmVnaW5uaW5nIG9mIGEgY29tbWFuZCBwaXBlCiAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKCiAgICAvLyByZXR1cm4gb24gdW5rbm93biBjb21tYW5kcwogICAgaWYoIXZlcmJ8fCFzaXplb2YodmVyYil8fCFHZXRGdW5jKHZlcmIsVFJVRSkpCiAgICAgIHJldHVybiBGQUxTRTsKCiAgICBzdHI9KHN0cmluZyl0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOwogICAgcGlwZV9pbj1GQUxTRTsKICAgIHBpcGVfb2Y9TlVMTDsKICAgIHBpcGVfb3ZyPVRSVUU7CiAgICBwaXBlX291dD1GQUxTRTsKICAgIHBpcGVfb2Y9TlVMTDsKICAgIC8vIHBhc3MgYXJndW1lbnRzIHRvIHNvbWUgc3BlY2lhbCBmdW5jdGlvbnMgdW5wYXJzZWQKICAgIGlmKG1lbWJlcigoeyJ4bHBjIiwieGNhbGwiLCJ4ZXZhbCJ9KSx2ZXJiKT49MCkKICAgIHsKI2lmZGVmIFhEQkcKICAgICAgVEsoIlBhcnNlTGluZTogc3BlY2lhbCBmdW5jOiAiK3ZlcmIpOwojZW5kaWYKICAgICAgcmV0PUNhbGxGdW5jKHZlcmIsc3RyKTsKICAgICAgU2FmZVJldHVybihyZXQpOwogICAgfQogICAgLy8gb2ssIGhlcmUgd2UgZ28KICAgIHBpcGVfaW49cGlwZV9vdXQ9RkFMU0U7CiAgICBwaXBlX2lmPXBpcGVfb2Y9TlVMTDsKICAgIHBpcGVfb3ZyPVRSVUU7CiAgICBpZihmaWxlX3NpemUoUElQRV9GSUxFKT49MCkKICAgICAgcm0oUElQRV9GSUxFKTsKICAgIGlmIChzdHImJnN0ciE9IiIpCSAgCiAgICB7CiAgICAgIGlmKCEoc3RyPVF1b3RlTGluZShzdHIpKSkKICAgICAgewoJV0RMTigiVW50ZXJtaW5hdGVkIHF1b3RhdGlvbiIpOwoJU2FmZVJldHVybihUUlVFKTsKICAgICAgfQogICAgICBjbWRzPUV4cGxvZGVDbWRzKHN0cik7CiAgICB9CiAgICBlbHNlCiAgICAgIGNtZHM9KHsiIn0pOwogICAgYXJnPXN0cmlwX3N0cmluZyhjbWRzWzBdKTsKICB9CiAgZWxzZQogIHsKICAgIGNtZHNbMF09c3RyaXBfc3RyaW5nKGNtZHNbMF0pOwogICAgVEsoIlBhcnNlTGluZTogY21kc1swXTogIitjbWRzWzBdKTsKICAgIGlmKHNzY2FuZihjbWRzWzBdLCIlcyAlcyIsdmVyYixhcmcpIT0yKQogICAgewogICAgICB2ZXJiPWNtZHNbMF07CiAgICAgIGFyZz0iIjsKICAgIH0KICB9CiAgY21kcz1jbWRzWzEuLl07CiAgVEsoIlBhcnNlTGluZTogdmVyYjogIit2ZXJiKTsKICBpZiAoIXZlcmJ8fCFzaXplb2YodmVyYil8fCFHZXRGdW5jKHZlcmIsVFJVRSkpCiAgICBTYWZlUmV0dXJuKEZBTFNFKTsKICBUSygiUGFyc2VMaW5lKDEpOiBhcmc6ICIrYXJnKyIgY21kczogIitzcHJpbnRmKCIlTyIsY21kcykpOwogIHN3aXRjaChzaXplb2YoY21kcykpCiAgewogICAgY2FzZSAwOgogICAgcmV0PUNhbGxGdW5jKHZlcmIsc3RyaXBfc3RyaW5nKFVucXVvdGVMaW5lKGFyZykpKTsKICAgIFNhZmVSZXR1cm4ocmV0KTsKICAgIGJyZWFrOwogICAgCiAgICBjYXNlIDE6CiAgICBXRExOKCJNaXNzaW5nIHJocyBvZiBjb21tYW5kIHBpcGUiKTsKICAgIFNhZmVSZXR1cm4oVFJVRSk7CiAgICBicmVhazsKICAgIAogICAgZGVmYXVsdDoKICAgIHBpcGVfb3V0PVRSVUU7CiAgICBzd2l0Y2goY21kc1swXSkKICAgIHsKICAgICAgY2FzZSAifCI6CiAgICAgIHBpcGVfb2Y9UElQRV9GSUxFOwogICAgICBwaXBlX292cj1UUlVFOwogICAgICBjbWRzPWNtZHNbMS4uXTsKICAgICAgYnJlYWs7CiAgICAgIAogICAgICBjYXNlICI+IjoKICAgICAgcGlwZV9vdnI9VFJVRTsKICAgICAgaWYoc2l6ZW9mKGNtZHMpIT0yKQogICAgICB7CglXRExOKCJJbGxlZ2FsIElPIHJlZGlyZWN0aW9uIik7CglTYWZlUmV0dXJuKFRSVUUpOwogICAgICB9CiAgICAgIHBpcGVfb2Y9Y21kc1sxXTsKICAgICAgY21kcz0oe30pOwogICAgICBicmVhazsKICAgICAgCiAgICAgIGNhc2UgIj4+IjoKICAgICAgcGlwZV9vdnI9RkFMU0U7CiAgICAgIGlmKHNpemVvZihjbWRzKSE9MikKICAgICAgewoJV0RMTigiSWxsZWdhbCBJTyByZWRpcmVjdGlvbiIpOwoJU2FmZVJldHVybihUUlVFKTsKICAgICAgfQogICAgICBwaXBlX29mPWNtZHNbMV07CiAgICAgIGNtZHM9KHt9KTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIFRLKCJQYXJzZUxpbmUoMik6IGFyZzogIithcmcrIiBjbWRzOiAiK3NwcmludGYoIiVPIixjbWRzKSk7CiAgaWYoIUNhbGxGdW5jKHZlcmIsc3RyaXBfc3RyaW5nKGFyZykpKQogICAgU2FmZVJldHVybihGQUxTRSk7CiAgcGlwZV9pbj1waXBlX291dDsKICBwaXBlX2lmPXBpcGVfb2Y7CiAgcGlwZV9vdnI9RkFMU0U7CiAgcGlwZV9vdXQ9RkFMU0U7CiAgcGlwZV9vZj1OVUxMOwogIGlmKHNpemVvZihjbWRzKSkKICAgIGNhbGxfb3V0KCJQYXJzZUxpbmUiLDApOwogIGVsc2UKICAgIFNhZmVSZXR1cm4oVFJVRSk7CiAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBpbnQgQ2FsbEZ1bmMoc3RyaW5nIHZlcmIsIHN0cmluZyBzdHIpCnsKICBzdHJpbmcgZnVuOwoKICBmdW49R2V0RnVuYyh2ZXJiLEZBTFNFKTsKI2lmZGVmIFhEQkcKICBUSygiQ2FsbEZ1bmM6IHZlcmI6ICIrdmVyYisiIHN0cjogIitzdHIpOwogIFRLKCJDYWxsRnVuYzogcmVzb2x2ZWQgZnVuY3Rpb246ICIrKGZ1bj9mdW46Iih1bnJlc29sdmVkKSIpKTsKI2VuZGlmCiAgaWYoc3RyPT0iIikKICAgIHN0cj1OVUxMOwogIHJldHVybiBmdW4/KGludCljYWxsX290aGVyKE1FLGZ1bixzdHIpOkZBTFNFOwp9CgpzdGF0aWMgc3RyaW5nIEdldEZ1bmMoc3RyaW5nIHZlcmIsIGludCB0ZXN0KQp7CiAgc3RyaW5nIGZ1biwqa2V5cyxrZXk7CiAgaW50IGksbGVuOwoKICBUSygiR2V0RnVuYzogdmVyYjogIit2ZXJiKTsKCiAgaWYodmVyYlswLi4wXSE9IngiKSAvLyBBc3N1bWUgYWxsIGNvbW1hbmRzIHN0YXJ0IHdpdGggIngiCiAgICByZXR1cm4gMDsKCiAgaWYgKCEoZnVuPShzdHJpbmcpQUNUSU9OU1t2ZXJiLDBdKSkgeyAvLyBUcnkgZXhhY3QgaGl0IGZpcnN0CiAgICBrZXk9IiI7CiAgICBsZW49c2l6ZW9mKHZlcmIpOwogICAgZm9yIChpPXNpemVvZihrZXlzPW1faW5kaWNlcyhBQ1RJT05TKSktMTtpPj0wO2ktLSkgewogICAgICBUSygiICB0cnlpbmc6ICIra2V5c1tpXSk7CiAgICAgIGlmKHNpemVvZihrZXlzW2ldKT49bGVuJiZrZXlzW2ldWzAuLmxlbi0xXT09dmVyYikgewoJaWYoc2l6ZW9mKGtleSkpIHsKCSAgV0xOKCJEYXMgaXN0IG5pY2h0IGVpbmRldXRpZyAuLi4iKTsKCSAgcmV0dXJuIDA7Cgl9CglmdW49QUNUSU9OU1trZXlzW2ldLDBdOwoJa2V5PWtleXNbaV07CgkvL2JyZWFrOwogICAgICB9CiAgICB9CiAgfSBlbHNlCiAgICBrZXk9dmVyYjsKCiAgaWYodGVzdCkKICAgIHJldHVybiBmdW47CiAgCiAgaWYgKGtleSkgewojaWZkZWYgWERCRwogICAgVEsoIkdldEZ1bmM6IGZ1bjogIitmdW4rIiAoa2V5OiAiK2tleSsiKVxuIisKICAgICAgICJwaXBlX2luOiAiKyhwaXBlX2luPyJUUlVFICAiOiJGQUxTRSAiKSsocGlwZV9pZj9waXBlX2lmOiIoTlVMTCkiKSsiXG4iKwogICAgICAgInBpcGVfb3V0OiAiKyhwaXBlX291dD8iVFJVRSAgIjoiRkFMU0UgIikrKHBpcGVfb2Y/cGlwZV9vZjoiKE5VTEwpIikrIlxuIisKICAgICAgICJwaXBlX292cjogIisocGlwZV9vdnI/IlRSVUUiOiJGQUxTRSIpKTsKI2VuZGlmCiAgICBpZiAocGlwZV9pbiYmIUFDVElPTlNba2V5LFBJUEVfSU5dKQogICAgewogICAgICAvLyB0aGlzIGNvbW1hbmQgZG9lcyBub3QgcmVhZCBwaXBlcwojaWZkZWYgWERCRwogICAgICBUSygiSWxsZWdhbCByaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKI2VuZGlmCiAgICAgIG5vdGlmeV9mYWlsKCJJbGxlZ2FsIHJocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGVsc2UgaWYgKHBpcGVfb3V0JiYhQUNUSU9OU1trZXksUElQRV9PVVRdKQogICAgewogICAgICAvLyB0aGlzIGNvbW1hbmQgZG9lcyBub3QgZmVlZCBwaXBlcwojaWZkZWYgWERCRwogICAgICBUSygiSWxsZWdhbCBsaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKI2VuZGlmCiAgICAgIG5vdGlmeV9mYWlsKCJJbGxlZ2FsIGxocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KICB9CiAgcmV0dXJuIGZ1bjsKfQoKdm9pZCBhY3Rpb25zKCkKewogIGlmICghY2xvbmVyfHwhUlRQfHxjbG9uZXI9PVJUUHx8cXVlcnlfd2l6X2xldmVsKGNsb25lcik8PXF1ZXJ5X3dpel9sZXZlbChSVFApKQogICAgYWRkX2FjdGlvbigiUGFyc2VMaW5lIiwiIiwxKTsKICBhZGRfYWN0aW9uKCJDb21tYW5kU2NhbiIsICIiLCAxKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICB0aGUgY2hlY2tpbmcgc3R1ZmYKICovCgp2b2lkIEluc2VydE5vdGlmeShvYmplY3Qgb2JqKQp7CiAgaWYoIWNsb25lcikKICAgIHJldHVybjsKICBpZihNT0RFKE1PREVfRklSU1QpICYmIGZpbmRfY2FsbF9vdXQoIm1vdmUiKT09LTEpCiAgICBjYWxsX291dCgibW92ZSIsMCxjbG9uZXIpOwogIGlmKE1PREUoTU9ERV9JTlZDSEVDSykpCiAgICB3cml0ZV9uZXdpbnZvYmoob2JqKTsKfQoKc3RhdGljIHZvaWQgVmFyQ2hlY2soaW50IHNob3cpCnsKICBpbnQgaSwgczsKICBmb3JlYWNoKHN0cmluZyBrLCBtaXhlZCB2IDogdmFyaWFibGUpCiAgewogICAgaWYgKHYpIGNvbnRpbnVlOwogICAgaWYoc2hvdykgV0RMTigiKioqIFZhcmlhYmxlICQiK2srIiBoYXMgYmVlbiBkZXN0cnVjdGVkIik7CiAgICBtX2RlbGV0ZSh2YXJpYWJsZSwgayk7CiAgfQp9CgoKaW50IHdyaXRlX25ld2ludm9iaihvYmplY3Qgb2JqKQp7CiAgaWYob2JqKSBXRExOKCIqKiogTmV3IG9iamVjdCBpbiBpbnZlbnRvcnkgIitPYmpGaWxlKG9iaikpOwogIHJldHVybigxKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICBjYXRjaCBhbGwgY29tbWFuZHMsIGFic29yYiBmb3JjZXMgYW5kIGNoZWNrIGhpc3RvcnkKICovCgppbnQgQ29tbWFuZFNjYW4oc3RyaW5nIGFyZykKewogIHN0cmluZyB2ZXJiLCBjbWQ7CiAgb2JqZWN0IHJ0cDsKICBydHA9UlRQOwoKICBpZighY2xvbmVyJiYhKGNsb25lcj1ydHApKSBkZXN0cnVjdChNRSk7CgogIGlmKCghTU9ERShNT0RFX1BST1RFQ1QpKXx8c2VjdXJpdHkoKXx8CiAgICAgcXVlcnlfd2l6X2xldmVsKGNsb25lcik8cXVlcnlfd2l6X2xldmVsKHJ0cCkpCiAgewogICAgdmVyYj1xdWVyeV92ZXJiKCk7CiAgICBpZih2ZXJiJiZEb0hpc3RvcnkodmVyYisoYXJnID8gIiAiK2FyZyA6ICIiKSkpCiAgICAgIHJldHVybiBUUlVFOwogICAgbm9zdG9yZT1GQUxTRTsKICAgIHJldHVybiBGQUxTRTsKICB9CiAgZWxzZQogIHsKICAgIGlmKHJ0cCkKICAgIHsKICAgICAgV0RMTigiWW91ciAiK1RPT0xfVElUTEUrIiBwcm90ZWN0cyB5b3UgZnJvbSBhIGZvcmNlIGJ5ICIrY3JuYW1lKHJ0cCkrCgkgICAiIFsiK3F1ZXJ5X3ZlcmIoKSsoYXJnID8gIiAiK2FyZysiXSIgOiAiXSIpKTsKICAgICAgdGVsbF9vYmplY3QocnRwLCBjcm5hbWUoY2xvbmVyKSsiJ3MgIitUT09MX1RJVExFKwoJCSAgIiBhYnNvcmJlcyB5b3VyIGZvcmNlLlxuIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFdETE4oIllvdXIgIitUT09MX1RJVExFKyIgcHJvdGVjdHMgeW91IGZyb20gYSBmb3JjZSBbIisKCSAgIHF1ZXJ5X3ZlcmIoKSsoYXJnID8gIiAiK2FyZysiXSIgOiAiXSIpKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwogIH0KfQoKaW50IERvSGlzdG9yeShzdHJpbmcgbGluZSkKewogIGludCBpOwogIHN0cmluZyBjbWQsICpzdHJzOwogIAogIFNFQ1VSRTIoRkFMU0UpOwogIGlmKCFzdHJpbmdwKGxpbmUpIHx8ICFzaXplb2YobGluZSkpCiAgICByZXR1cm4gVFJVRTsKICBlbHNlIGlmKGxpbmU9PSIlISIpCiAgewogICAgV0xOKCJDdXJyZW50IGNvbW1hbmQgaGlzdG9yeToiKTsKICAgIGZvcihpPU1BWF9ISVNUT1JZOyBpOyAtLWkpCiAgICAgIGlmKGhpc3RvcnlbaS0xXSkKICAgICAgewoJVygiICIrQVJJR0hUKCIiK2ksIDIsICIgIikrIjogIik7CglpZihzaXplb2YoaGlzdG9yeVtpLTFdKT43MCkKCSAgV0xOKEFMRUZUKGhpc3RvcnlbaS0xXSwgNzAsICIgIikpOwoJZWxzZQoJICBXTE4oaGlzdG9yeVtpLTFdKTsKICAgICAgfQogICAgcmV0dXJuIFRSVUU7CiAgfQogIGVsc2UgaWYobGluZVswLi4xXT09IiUlIiAmJiAoY21kPWhpc3RvcnlbMF0rbGluZVsyLi48MV0pKQogIHsKICAgIENvbW1hbmQoY21kKTsKICAgIHJldHVybiBUUlVFOwogIH0KICBlbHNlIGlmKGxpbmVbMF09PSdeJyYmKHN0cnM9c3RyaXBfZXhwbG9kZShsaW5lLCAiXiIpKSkKICB7CiAgICBpZihzaXplb2Yoc3RycykmJnN0cnNbMF0mJihjbWQ9aGlzdG9yeVswXSkpCiAgICB7CiAgICAgIGlmKHNpemVvZihzdHJzKT09MikKCWNtZD1zdHJpbmdfcmVwbGFjZShjbWQsIHN0cnNbMF0sIHN0cnNbMV0pOwogICAgICBlbHNlCgljbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCBzdHJzWzBdLCAiIik7CiAgICAgIG5vc3RvcmUtLTsKICAgICAgQ29tbWFuZChjbWQpOwogICAgICBub3N0b3JlKys7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQogIH0KICBlbHNlIGlmKGxpbmVbMF09PSclJyAmJiAoc3NjYW5mKGxpbmVbMS4uPDFdLCAiJWQiLCBpKSkpCiAgewogICAgaT0gaT4wID8gaSA6IDE7CiAgICBpPSBpPD1NQVhfSElTVE9SWSA/IGkgOiBNQVhfSElTVE9SWTsKICAgIGlmKGNtZD1oaXN0b3J5W2ktMV0pCiAgICAgIENvbW1hbmQoY21kKTsKICAgIHJldHVybiBUUlVFOwogIH0KICBlbHNlIGlmKGxpbmVbMF09PSclJykKICB7CiAgICBmb3IoaT0wOyBpPE1BWF9ISVNUT1JZOyBpKyspCiAgICB7CiAgICAgIGlmKGhpc3RvcnlbaV0mJgoJIGhpc3RvcnlbaV1bMC4uc2l6ZW9mKGxpbmUpLTJdPT1saW5lWzEuLiA8MV0pCiAgICAgIHsKCUNvbW1hbmQoaGlzdG9yeVtpXSk7CglyZXR1cm4gVFJVRTsKICAgICAgfQogICAgfQogIH0KICBlbHNlIGlmKG5vc3RvcmU8MSkKICAgIGhpc3Rvcnk9KHtsaW5lfSkraGlzdG9yeVswLi5NQVhfSElTVE9SWS0yXTsKICByZXR1cm4gRkFMU0U7Cn0KCg==