ZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9nZW5lcmF0b3IuYyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9nZW5lcmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU0YzJiCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2dlbmVyYXRvci5jCkBAIC0wLDAgKzEsNzQwIEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCitpbmhlcml0ICIvcC9zZXJ2aWNlL3dhcmdvbi9zbS9zdGF0ZW1hY2hpbmUiOworCisjaW5jbHVkZSAiL3Avc2VydmljZS93YXJnb24vc20vc3RhdGVtYWNoaW5lLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIFNUQVRFX0lETEUgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBVEVfSE9VU0UgICAgICAgICAgMQorI2RlZmluZSBTVEFURV9ST09NICAgICAgICAgICAyCisjZGVmaW5lIFNUQVRFX0NIRVNUICAgICAgICAgIDMKKyNkZWZpbmUgU1RBVEVfREVUQUlMICAgICAgICAgNAorI2RlZmluZSBTVEFURV9SREVUQUlMICAgICAgICA1CisjZGVmaW5lIFNUQVRFX0NPTU1BTkQgICAgICAgIDYKKyNkZWZpbmUgU1RBVEVfRklOQUxJWkUgICAgICAgNworI2RlZmluZSBTVEFURV9FWElUUyAgICAgICAgICA4CisKKyNkZWZpbmUgU0lHX0lOSVRJQUxJWkUgICAgICAgMAorI2RlZmluZSBTSUdfSE9VU0UgICAgICAgICAgICAxCisjZGVmaW5lIFNJR19IT1VTRV9ET05FICAgICAgIDIKKyNkZWZpbmUgU0lHX1JPT00gICAgICAgICAgICAgMworI2RlZmluZSBTSUdfRE9fQ0hFU1QgICAgICAgICA0CisjZGVmaW5lIFNJR19ET19ERVRBSUwgICAgICAgIDUKKyNkZWZpbmUgU0lHX0RFVEFJTF9ET05FICAgICAgNgorI2RlZmluZSBTSUdfUkRFVEFJTF9ET05FICAgICA3CisjZGVmaW5lIFNJR19DT01NQU5EX0RPTkUgICAgIDgKKyNkZWZpbmUgU0lHX0RPX0VYSVRTICAgICAgICAgOQorI2RlZmluZSBTSUdfUk9PTV9ET05FICAgICAgIDEwCisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBmaWxlOworcHJpdmF0ZSBub3NhdmUgaW50ICAgIGZpbmFsOworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHJhdW07Citwcml2YXRlIG5vc2F2ZSBpbnQgICAgbnI7Citwcml2YXRlIG5vc2F2ZSBvYmplY3QgaGF1c21laXN0ZXI7Citwcml2YXRlIG5vc2F2ZSBtaXhlZCAgaG1hcmdzOworCitzdHJpbmcgZHVtcChvYmplY3QgZW52LCBpbnQgZmluYWwsIG1peGVkIGFyZ3MpOworCitwcml2YXRlIHN0cmluZyBzcGVjaWFsKHN0cmluZyBzdHIpOworcHJpdmF0ZSB2b2lkIHJlbW92ZU91dHB1dEZpbGUoKTsKK3ByaXZhdGUgdm9pZCBkdW1wSG91c2UoKTsKK3ByaXZhdGUgdm9pZCBkdW1wUm9vbUhlYWRlcigpOworcHJpdmF0ZSB2b2lkIGR1bXBDaGVzdCgpOworcHJpdmF0ZSB2b2lkIGR1bXBEZXRhaWxzKCk7Citwcml2YXRlIHZvaWQgZHVtcFJlYWREZXRhaWxzKCk7Citwcml2YXRlIHZvaWQgZHVtcENvbW1hbmRzKCk7Citwcml2YXRlIHZvaWQgZG9GaW5hbGl6ZSgpOworcHJpdmF0ZSB2b2lkIGR1bXBFeGl0cygpOworcHJpdmF0ZSB2b2lkIGR1bXBSb29tVHJhaWxlcigpOworcHJpdmF0ZSB2b2lkIGRvUmV0dXJuKCk7Citwcml2YXRlIHZvaWQgc1Byb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgc3RyaW5nIHBTdHIpOworc3RhdGljIHZvaWQgbVByb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgbWl4ZWQgbWFwX2xkZmllZCwgaW50IHBvcywgaW50IHNpZ25hbCk7CitzdGF0aWMgdm9pZCBjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpOworcHJpdmF0ZSB2b2lkIHByZXR0eVN0cmluZyhzdHJpbmcgZmlsZSwgc3RyaW5nICpzdHIsIGludCBpbmRlbnQpOworcHJpdmF0ZSB2b2lkIHByZXR0eUFycmF5KHN0cmluZyBmaWxlLCBzdHJpbmcgKmFyciwgaW50IHNlcCk7Citwcml2YXRlIHZvaWQgaGVhZGVyUm9vbSgpOworcHJpdmF0ZSB2b2lkIHRyYWlsZXJSb29tKCk7Citwcml2YXRlIHZvaWQgaGVhZGVySG91c2UoKTsKK3ByaXZhdGUgdm9pZCB0cmFpbGVySG91c2UoKTsKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIAorICBBZGRTdGF0ZShTVEFURV9JRExFLCAwLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfSE9VU0UsICAgICMnZHVtcEhvdXNlLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfUk9PTSwgICAgICMnZHVtcFJvb21IZWFkZXIsIDApOworICBBZGRTdGF0ZShTVEFURV9DSEVTVCwgICAgIydkdW1wQ2hlc3QsIDApOworICBBZGRTdGF0ZShTVEFURV9ERVRBSUwsICAgIydkdW1wRGV0YWlscywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX1JERVRBSUwsICAjJ2R1bXBSZWFkRGV0YWlscywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX0NPTU1BTkQsICAjJ2R1bXBDb21tYW5kcywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX0ZJTkFMSVpFLCAjJ2RvRmluYWxpemUsIDApOworICBBZGRTdGF0ZShTVEFURV9FWElUUywgICAgIydkdW1wRXhpdHMsIDApOworCisgIEFkZFRyYW5zaXRpb24oU01fSU5WQUxJRCwgU0lHX0lOSVRJQUxJWkUsIFNUQVRFX0lETEUsIDApOworCisgIC8vIFp1c3RhbmRzdWViZXJnYWVuZ2UgenVtIFNjaHJlaWJlbiBkZXMgSGF1c2VzCisgIEFkZFRyYW5zaXRpb24oU1RBVEVfSURMRSwgU0lHX0hPVVNFLCBTVEFURV9IT1VTRSwgIydyZW1vdmVPdXRwdXRGaWxlKTsKKyAgQWRkVHJhbnNpdGlvbihTVEFURV9IT1VTRSwgU0lHX0hPVVNFX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOworCisgIC8vIFp1c3RhbmRzdWViZXJnYWVuZ2UgenVtIFNjaHJlaWJlbiBlaW5lcyBSYXVtcworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsICAgICBTSUdfUk9PTSwgICAgICBTVEFURV9ST09NLCAjJ3JlbW92ZU91dHB1dEZpbGUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JPT00sICAgICBTSUdfRE9fQ0hFU1QsICBTVEFURV9DSEVTVCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfUk9PTSwgICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfQ0hFU1QsICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfREVUQUlMLCAgIFNJR19ERVRBSUxfRE9ORSwgIFNUQVRFX1JERVRBSUwpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JERVRBSUwsICBTSUdfUkRFVEFJTF9ET05FLCBTVEFURV9DT01NQU5EKTsKKyAgQWRkVHJhbnNpdGlvbihTVEFURV9DT01NQU5ELCAgU0lHX0NPTU1BTkRfRE9ORSwgU1RBVEVfRklOQUxJWkUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0ZJTkFMSVpFLCBTSUdfRE9fRVhJVFMsICBTVEFURV9FWElUUyk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfRklOQUxJWkUsIFNJR19ST09NX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0VYSVRTLCAgICBTSUdfUk9PTV9ET05FLCBTVEFURV9JRExFLCAjJ2R1bXBSb29tVHJhaWxlcik7CisgIAorICBTdGF0ZVRyYW5zaXRpb24oU0lHX0lOSVRJQUxJWkUpOworfQorCisKKy8vIEVyemV1Z2Ugbm9ybWFsZW4gTFBDLVF1ZWxsY29kZSBhdXMgZWluZW0gSGF1cyBvZGVyIFJhdW0uCisvLworLy8gUGFyYW1ldGVyOgorLy8gICBlbnY6IERhcyBIYXVzIG9kZXIgZGVyIFJhdW0sIGF1cyBkZW0gUXVlbGxjb2RlIGVyemV1Z3Qgd2VyZGVuIHNvbGwKKy8vICAgZmluOiBGYWxscyBnbGVpY2ggMCwgc28gd2lyZCBRdWVsbGNvZGUgZnVlciBUeXBvZml4ZXMgby5hZS4KKy8vICAgICAgICBlcnpldWd0OyBkYXMgZXJ6ZXVndGUgRmlsZSBoZWlzc3QgaW1tZXIgJ2ZpeGVkLmMnLgorLy8gICAgICAgIEFuZGVybmZhbGxzIHdpcmQgUXVlbGxjb2RlIGZ1ZXIgZWluIGVpZ2Vuc3RhZW5kaWdlcyBPYmpla3QKKy8vICAgICAgICBlcnpldWd0LiBEaWVzZXMga2FubiB6LkIuIHp1bSBBbnNjaGx1c3MgYWxzICJNYWdpZXJoYXVzIgorLy8gICAgICAgIHZlcndlbmRldCB3ZXJkZW4uIERpZSBlcnpldWd0ZW4gRmlsZXMgaGVpc3NlbgorLy8gICAgICAgICdyZXAvPG5hbWU+cmF1bTxucj4uYycgYnp3LiAncmVwLzxuYW1lPmhhdXMuYycuIEJlZmluZGV0IHNpY2gKKy8vICAgICAgICBpbiBkZW0gUmF1bSBkaWUgVHJ1aGUsIHdpcmQgenVzYWV0emxpY2ggZGllIERhdGVpCisvLyAgICAgICAgJ3JlcC88bmFtZT50cnVoZS5jJyBnZXNjaHJpZWJlbi4KKy8vCisvLyBSdWVja2dhYmV3ZXJ0OgorLy8gICBEZXIgRGF0ZWluYW1lLCBpbiBkZW4gZGllIERhdGVuIGdlc2NocmllYmVuIHd1cmRlbi4KKworc3RyaW5nCitkdW1wKG9iamVjdCBlbnYsIGludCBmaW4sIG1peGVkIGFyZ3MpCit7CisgIHN0cmluZyBvdXQ7CisgIGludCBudW07CisKKyAgaGF1c21laXN0ZXIgPSBwcmV2aW91c19vYmplY3QoKTsKKyAgaG1hcmdzID0gYXJnczsKKyAgCisgIGlmIChRdWVyeVN0YXRlKCkgIT0gU1RBVEVfSURMRSkKKyAgeworICAgIHdyaXRlKCJEZXIgR2VuZXJhdG9yIGFyYmVpdGV0IG5vY2guLi5cbkJpdHRlIHdhcnRlbiFcbiIpOworICAgIHJldHVybiAiPGtlaW5lIERhdGVpIGdlbmVyaWVydD5cbiI7CisgIH0KKyAgCisgIC8vIEZhbGxzIGVpbiBSYXVtIGdlbmVyaWVydCB3aXJkLCBlcmhhZWx0IDxucj4gZGllIFJhdW1udW1tZXIuCisgIC8vIEJlaSBkZXIgQXVzc2VuYW5zaWNodCBkZXMgSGF1c2VzIHdpcmQgPG5yPiBhdWYgLTEgZ2VzZXR6dC4KKyAgaWYgKHNzY2FuZihvYmplY3RfbmFtZShlbnYpLCAiJXNyYXVtJWQiLCBvdXQsIG51bSkgPCAyKQorICB7CisgICAgbnVtID0gLTE7CisgIH0KKyAgCisgIGlmIChmaW4pCisgIHsKKyAgICBvdXQgPSBQQVRIKyJyZXAvIitlbnYtPlF1ZXJ5T3duZXIoKTsKKworICAgIGlmIChudW0gPj0gMCkKKyAgICB7CisgICAgICBvdXQgKz0gInJhdW0iK251bSsiLmMiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb3V0ICs9ICJoYXVzLmMiOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXQgPSBQQVRIKyJmaXhlZC5jIjsKKyAgfQorCisgIC8vIEluZm9ybWF0aW9uZW4gZnVlciBkaWUgU3RhdGVtYWNoaW5lIHNldHplbgorICBmaWxlID0gb3V0OworICBmaW5hbCA9IGZpbjsKKyAgcmF1bSA9IGVudjsKKyAgbnIgPSBudW07CisKKyAgaWYgKG51bSA+PSAwKQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ST09NKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0hPVVNFKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvLyBTb25kZXJ6ZWljaGVuIFwsICIgdW5kIFRBQiBrb3JyZWt0IHVtd2FuZGVsbgorcHJpdmF0ZSBzdHJpbmcgc3BlY2lhbChzdHJpbmcgcykKK3sKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXFwiKSwgIlxcXFwiKTsKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXHQiKSwgIlxcdCIpOworICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcIiIpLCAiXFxcIiIpOworCisgIHJldHVybiBzOworfQorCisvKioqIEZ1bmt0aW9uZW4genVtIEdlbmVyaWVyZW4gZWluZXIgRGF0ZWkgYXVzIGRlbiBQcm9wZXJ0aWVzIGRlcyBIYXVzZXMgKioqLworCisjZGVmaW5lIEVYSVRfVE1QTCAiXCIvcGxheWVycy8lcy9zZWhlcmhhdXMvJXNyYXVtJWRcIiIKKworcHJpdmF0ZSB2b2lkCityZW1vdmVPdXRwdXRGaWxlKCkKK3sKKyAgY2F0Y2gocm0oZmlsZSkpOworfQorCitwcml2YXRlIHZvaWQKK2R1bXBIb3VzZSgpCit7CisgIGhlYWRlckhvdXNlKCk7CisgIAorICBzUHJvcChmaWxlLCAiUF9TSE9SVCIsIHJhdW0tPlF1ZXJ5UHJvcChQX1NIT1JUKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisgIHNQcm9wKGZpbGUsICJQX0xPTkciLCByYXVtLT5RdWVyeVByb3AoUF9MT05HKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisKKyAgaWYgKGZpbmFsKQorICB7CisgICAgbWl4ZWQgbjsKKworICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiAgU2V0UHJvcChQX05PR0VULCAxKTtcbiIpOworICAgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9HRU5ERVIsICIrCisgICAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW3JhdW0tPlF1ZXJ5UHJvcChQX0dFTkRFUildKworICAgICAgICAgICAgICAgIiApO1xuICBTZXRQcm9wKFBfTkFNRSwgIik7CisgICAgbiA9IHJhdW0tPlF1ZXJ5UHJvcChQX05BTUUpOworCisgICAgaWYgKHN0cmluZ3AobikpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLCAiXCIiK24rIlwiIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKKyAgICB9CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOworICAgIHByZXR0eUFycmF5KGZpbGUsCisgICAgICAgICAgICAgICAgcmF1bS0+UXVlcnlQcm9wKFBfSURTKS0oeyAic2VoZVxyaGF1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iK3JhdW0tPlF1ZXJ5T3duZXIoKSsiaGF1cyIgfSksCisgICAgICAgICAgICAgICAgMCk7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG4iKTsKKyAgfQorICB0cmFpbGVySG91c2UoKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0hPVVNFX0RPTkUpOworfQorCitwcml2YXRlIHZvaWQKK2R1bXBSb29tSGVhZGVyKCkKK3sKKyAgaGVhZGVyUm9vbSgpOworICAKKyAgc1Byb3AoZmlsZSwgIlBfSU5UX1NIT1JUIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisgIHNQcm9wKGZpbGUsICJQX0lOVF9MT05HIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKKworICBpZiAoZmluYWwgJiYgcmF1bS0+UXVlcnlQcm9wKEhfQ0hFU1QpKQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19DSEVTVCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19ERVRBSUwpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZAorZHVtcENoZXN0KCkKK3sKKyAgbWl4ZWQgbjsKKyAgc3RyaW5nIGNmaWxlOworICBvYmplY3QgY2hlc3Q7CisKKyAgY2ZpbGUgPSBQQVRIKyJyZXAvIityYXVtLT5RdWVyeU93bmVyKCkrInRydWhlLmMiOworICBjaGVzdCA9IHByZXNlbnQoVFJVSEUsIHJhdW0pOworICAKKyAgY2F0Y2gocm0oY2ZpbGUpKTsKKworICB3cml0ZV9maWxlKGNmaWxlLAorICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuI2luY2x1ZGUgPG1vdmluZy5oPlxuXG4iCisgICAgICAgICAgICAgImluaGVyaXQgXCIvZC93dWVzdGUvZHVyaWFuL2JlaGFlbHRlclwiO1xuXG4iCisgICAgICAgICAgICAgInZvaWQgY3JlYXRlKClcbntcbiAgaWYoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuXG4iCisgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIiApOworICBzUHJvcChjZmlsZSwgIlBfU0hPUlQiLCBjaGVzdC0+UXVlcnlQcm9wKFBfU0hPUlQpKTsKKyAgc1Byb3AoY2ZpbGUsICJQX0xPTkciLCAgY2hlc3QtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKworICB3cml0ZV9maWxlKGNmaWxlLCAiICBTZXRQcm9wKFBfTk9HRVQsIDEpO1xuIik7CisgIHdyaXRlX2ZpbGUoY2ZpbGUsCisgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKyAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW2NoZXN0LT5RdWVyeVByb3AoUF9HRU5ERVIpXSsKKyAgICAgICAgICAgICAiICk7XG4gIFNldFByb3AoUF9OQU1FLCAiKTsKKworICBuID0gY2hlc3QtPlF1ZXJ5UHJvcChQX05BTUUpOworICBpZiAoc3RyaW5ncChuKSkKKyAgeworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICJcIiIrbisiXCIiKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKKyAgfQorICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOworICBwcmV0dHlBcnJheShjZmlsZSwgY2hlc3QtPlF1ZXJ5UHJvcChQX0lEUyktKHsgVFJVSEUgfSksIDApOworICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG4iKTsKKworICBpZiAoKG49Y2hlc3QtPlF1ZXJ5UHJvcChQX0FESkVDVElWRVMpKSAmJiBzaXplb2YobikpCisgIHsKKyAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIEFkZEFkamVjdGl2ZSggIik7CisgICAgcHJldHR5QXJyYXkoY2ZpbGUsIG4sIDApOworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICIgKTtcbiIpOworICB9CisgIGlmICgobj1jaGVzdC0+UXVlcnlQcm9wKFBfTkFNRV9BREopKSAmJiBzaXplb2YobikpCisgIHsKKyAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIFNldFByb3AoUF9OQU1FX0FESiwgIik7CisgICAgcHJldHR5QXJyYXkoY2ZpbGUsIG4sIDApOworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICIgKTtcbiIpOworICB9CisgIHdyaXRlX2ZpbGUoY2ZpbGUsICJ9XG4iKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPX0RFVEFJTCk7Cit9CisKK3ByaXZhdGUgdm9pZAorZHVtcERldGFpbHMoKQoreworICBtYXBwaW5nIHByb3A7CisgIG1peGVkIGRldDsKKyAgCisgIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9ERVRBSUxTKTsKKworICBpZiAoc2l6ZW9mKHByb3ApKQorICB7CisgICAgZGV0ID0gVkVSV0FMVEVSLT5QQ3J1bmNoKHByb3ApOworICAgIC8vIG5leHQgc3RhdGUgdHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gZG9fbVByb3AgaXMgZG9uZQorICAgIG1Qcm9wKGZpbGUsICJBZGREZXRhaWwiLCBkZXQsIHNpemVvZihkZXQpLTEsIFNJR19ERVRBSUxfRE9ORSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ERVRBSUxfRE9ORSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCitkdW1wUmVhZERldGFpbHMoKQoreworICBtYXBwaW5nIHByb3A7CisgIG1peGVkIHJkZXQ7CisgIAorICBwcm9wID0gcmF1bS0+UXVlcnlQcm9wKFBfUkVBRF9ERVRBSUxTKTsKKworICBpZiAoc2l6ZW9mKHByb3ApKQorICB7CisgICAgcmRldCA9IFZFUldBTFRFUi0+UENydW5jaChwcm9wKTsKKyAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX21Qcm9wIGlzIGRvbmUKKyAgICBtUHJvcChmaWxlLCAiQWRkUmVhZERldGFpbCIsIHJkZXQsIHNpemVvZihyZGV0KS0xLCBTSUdfUkRFVEFJTF9ET05FKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX1JERVRBSUxfRE9ORSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCitkdW1wQ29tbWFuZHMoKQoreworICBtYXBwaW5nIGNvbW07CisgIG1peGVkIGNtZDsKKyAgCisgIGNvbW0gPSByYXVtLT5RdWVyeVByb3AoSF9DT01NQU5EUyk7CisKKyAgaWYgKHNpemVvZihjb21tKSkKKyAgeworICAgIGNtZCA9IFZFUldBTFRFUi0+UENydW5jaChjb21tKTsKKyAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX2NQcm9wIGlzIGRvbmUKKyAgICBjUHJvcChmaWxlLCAiQWRkVXNlckNtZCIsIGNtZCwgc2l6ZW9mKGNtZCktMSwgU0lHX0NPTU1BTkRfRE9ORSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19DT01NQU5EX0RPTkUpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZAorZG9GaW5hbGl6ZSgpCit7CisgIGlmIChmaW5hbCkKKyAgeworICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfRE9fRVhJVFMpOworICB9CisgIGVsc2UKKyAgeworICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK2R1bXBFeGl0cygpCit7CisgIHN0cmluZyAqaywgbzsKKyAgbWFwcGluZyBwcm9wOworICBpbnQgaSwgbnVtOworCisgIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9FWElUUyk7CisgIGsgPSBtX2luZGljZXMocHJvcCk7CisgIGlmIChtZW1iZXIoaywgInJhdXMiKSA+PSAwKQorICB7CisgICAgayAtPSAoeyAicmF1cyIgfSk7CisgICAgd3JpdGVfZmlsZShmaWxlLCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwicmF1c1wiLCBcIiVzXCIpO1xuIiwgcHJvcFsicmF1cyJdKSk7CisgIH0KKyAgCisgIGZvciAoaT1zaXplb2YoayktMTsgaT49MDsgaS0tKQorICB7CisgICAgaWYgKHNzY2FuZihwcm9wW2tbaV1dLCBQQVRIKyIlc3JhdW0lZCIsIG8sIG51bSkgIT0gMikKKyAgICB7CisgICAgICBwcmludGYoIktvbWlzY2hlciBFeGl0ICglTylcbiVzIC0+ICVzXG4iLCByYXVtLCBrW2ldLCBwcm9wW2tbaV1dKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChvID09IHJhdW0tPlF1ZXJ5T3duZXIoKSkKKyAgICAgIHsKKyAgICAgICAgbyA9IHNwcmludGYoRVhJVF9UTVBMLCBvLCBvLCBudW0pOworICAgICAgICB3cml0ZV9maWxlKGZpbGUsIHNwcmludGYoIiAgQWRkRXhpdCggXCIlc1wiLCAlcyk7XG4iLCBrW2ldLCBvKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgXCIlc1wiKTtcbiIsIGtbaV0sIHByb3Bba1tpXV0pKTsKKyAgICAgICAgcHJpbnRmKCJFeGl0IHZvbiAlTyBuYWNoICVzIVxuIiwgcmF1bSwgcHJvcFtrW2ldXSk7CisgICAgICB9CisgICAgfQorICB9CisgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKK30KKworcHJpdmF0ZSB2b2lkCitkdW1wUm9vbVRyYWlsZXIoKQoreworICB0cmFpbGVyUm9vbSgpOworICBkb1JldHVybigpOworfQorCitwcml2YXRlIHZvaWQKK2RvUmV0dXJuKCkKK3sKKyAgaWYgKGhhdXNtZWlzdGVyICE9IDApCisgIHsKKyAgICBhcHBseSgjJ2NhbGxfb3RoZXIsIGhhdXNtZWlzdGVyLCAiR2VuZXJhdGlvbkRvbmUiLCBobWFyZ3MpOworICB9CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitwcml2YXRlIHZvaWQKK3NQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIHN0cmluZyBwU3RyKQoreworICBzdHJpbmcgKnN0cjsKKworICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoICIrcE5hbWUrIiwiKTsKKworICBpZiAoIXBTdHIpCisgIHsKKyAgICB3cml0ZV9maWxlKGYsICIwICk7XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBwU3RyID0gc3BlY2lhbChwU3RyKTsKKworICBpZiAoc2l6ZW9mKHN0cj1vbGRfZXhwbG9kZShwU3RyLCJcbiIpKSA+IDEpCisgIHsKKyAgICBwcmV0dHlTdHJpbmcoZiwgc3RyLCA0KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoc2l6ZW9mKHN0cik9PTApCisgICAgeworICAgICAgc3RyID0gKHsiIn0pOworICAgIH0KKyAgICB3cml0ZV9maWxlKGYsICJcbiAgICAgXCIiK3N0clswXSk7CisKKyAgICBpZiAocFN0cls8MV0gPT0gJ1xuJykKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGYsICJcXG5cIiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgd3JpdGVfZmlsZShmLCAiXCIiKTsKKyAgICB9CisgIH0KKyAgd3JpdGVfZmlsZShmLCAiICk7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK21Qcm9wKHN0cmluZyBmaWxlLCBzdHJpbmcgcE5hbWUsIG1peGVkIGNtZCwgaW50IHBvcywgaW50IHNpZ25hbCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqZXEsIHQxOworICAKKyAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgICIrcE5hbWUrIihcbiAgICAiKTsKKyAgICBlcSA9IGNtZFtpXVswXTsKKyAgICB0MSA9IGNtZFtpXVsxXTsKKworICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAwKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIsICIpOworCisgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNik7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG4iKTsKKyAgfQorCisgIC8vIEZhbGxzIHdpciBkaWUgZXZhbF9jb3N0IGF1c2dlcmVpenQgaGFiZW4sIGFiZXIgbm9jaCBuaWNodAorICAvLyBhbGxlIEVpbnRy5GdlIGJlYXJiZWl0ZXQgd3VyZGVuLCB3aXJkIGpldHp0IGRpZSBuYWVjaHN0ZQorICAvLyBSdW5kZSBnZXN0YXJ0ZXQKKyAgaWYgKGkgPj0gMCkKKyAgeworICAgIGNhbGxfb3V0KCJtUHJvcCIsIDEsIGZpbGUsIHBOYW1lLCBjbWQsIGksIHNpZ25hbCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gQW5zb25zdGVuIHdlY2hzZWxuIHdpciBqZXR6dCBpbiBkZW4gbmFlY2hzdGVuIFp1c3RhbmQKKyAgICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOworICAgIFN0YXRlVHJhbnNpdGlvbihzaWduYWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpCit7CisgIHN0cmluZyB0MSwgdDI7CisgIG1peGVkICBlcTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgICIrcE5hbWUrIihcbiAgICAiKTsKKyAgICBlcSA9IGNtZFtpXVswXTsKKyAgICB0MSA9IGNtZFtpXVsxXTsKKyAgICB0MiA9IGNtZFtpXVsyXTsKKworICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAxKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIsIDAsICIpOworCisgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNCk7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiLCAiKTsKKyAgICAKKyAgICBpZiAodDIpCisgICAgeworICAgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDIpLCAiXG4iKSwgNCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGZpbGUsICIwIik7CisgICAgfQorICAgIAorICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiApO1xuIik7CisgIH0KKworICAvLyBGYWxscyB3aXIgZGllIGV2YWxfY29zdCBhdXNnZXJlaXp0IGhhYmVuLCBhYmVyIG5vY2ggbmljaHQKKyAgLy8gYWxsZSBFaW50cuRnZSBiZWFyYmVpdGV0IHd1cmRlbiwgd2lyZCBqZXR6dCBkaWUgbmFlY2hzdGUKKyAgLy8gUnVuZGUgZ2VzdGFydGV0CisgIGlmIChpID49IDApCisgIHsKKyAgICBjYWxsX291dCgiY1Byb3AiLCAxLCBmaWxlLCBwTmFtZSwgY21kLCBpLCBzaWduYWwpOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIEFuc29uc3RlbiB3ZWNoc2VsbiB3aXIgamV0enQgaW4gZGVuIG5hZWNoc3RlbiBadXN0YW5kCisgICAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKKyAgICBTdGF0ZVRyYW5zaXRpb24oc2lnbmFsKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3ByZXR0eVN0cmluZyhzdHJpbmcgZiwgc3RyaW5nICpzdHIsIGludCBpbmRlbnQpCit7CisgIHN0cmluZyBpbmQ7CisgIGludCBpOworCisgIGluZCA9IGV4dHJhY3QoIlxuICAgICAgICAgICIsMCxpbmRlbnQpOworCisgIGlmICghc2l6ZW9mKHN0cikpCisgIHsKKyAgICB3cml0ZV9maWxlKGYsIGluZCsiIFwiXFxuXCIiKTsKKyAgICByZXR1cm47CisgIH0KKworICB3cml0ZV9maWxlKGYsIGluZCsiIFwiIitzdHJbMF0rIlxcblwiIik7CisKKyAgZm9yIChpPTE7IGk8c2l6ZW9mKHN0cik7IGkrKykKKyAgeworICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIrXCIiK3N0cltpXSsiXFxuXCIiKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3ByZXR0eUFycmF5KHN0cmluZyBmLCBzdHJpbmcgKmFyciwgaW50IHNlcCkKK3sKKyAgaW50IGksajsKKyAgc3RyaW5nIHJlcywgdDEsIHQyOworCisgIHdyaXRlX2ZpbGUoZiwgIih7Iik7CisKKyAgaWYgKHNpemVvZihhcnIpKQorICB7CisgICAgdDEgPSAoIlwiIithcnJbMF0rIlwiIik7CisgICAgcmVzID0gIiAiK3QxOworICAgIHQyID0gIiI7CisKKyAgICBmb3IgKGk9MSwgaj1zaXplb2YoYXJyKTsgaTxqOyBpKyspCisgICAgeworICAgICAgdDIgPSAiXCIiK2FycltpXSsiXCIiOworICAgICAgaWYgKCFzZXApCisgICAgICB7CisJaWYgKChzaXplb2YodDEpICsgc2l6ZW9mKHQyKSkgPiA2OSkKKyAgICAgICAgeworCSAgcmVzICs9ICgiLFxuICAgICAgICIrdDIpOworCSAgdDEgPSB0MjsKKwkgIHQyID0gIiI7CisJfQorCWVsc2UgeworCSAgdDEgKz0gKCIsICIrdDIpOworCSAgcmVzICs9ICgiLCAiK3QyKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlIHsKKwlyZXMgKz0gKCIsXG4gICAgICAgIit0Mik7CisgICAgICB9CisgICAgfQorICB9CisgIHdyaXRlX2ZpbGUoZiwgcmVzICsgIiB9KSIgKTsKK30KKworcHJpdmF0ZSB2b2lkCitoZWFkZXJSb29tKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG5cbiIKKyAgICAgICAgICAgICAgICJpbmhlcml0IFwic3RkL3Jvb21cIjtcbiIKKyAgICAgICAgICAgICAgICJpbmhlcml0IFwiIitQQVRIKyJtb2R1bGVzL3VzZXJjbWRcIjtcblxuIgorICAgICAgICAgICAgICAgImNyZWF0ZSgpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgcm9vbTo6Y3JlYXRlKCk7XG4iCisgICAgICAgICAgICAgICAiICB1c2VyY21kOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0xJR0hULCAxKTtcbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9JTkRPT1JTLCAxKTtcblxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiIKKyAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBSQVVNO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iCisgICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuIgorICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIik7XG4iCisgICAgICAgICAgICAgICAiICBMb2FkKCk7XG5cbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9ERVRBSUxTLCAoW10pKTtcbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9SRUFEX0RFVEFJTFMsIChbXSkpO1xuXG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3RyYWlsZXJSb29tKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLCAifVxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiAgU2F2ZSgxKTtcblxuIgorICAgICAgICAgICAgICAgIiAgeyBvYmplY3QgcmF1bTtcbiIKKyAgICAgICAgICAgICAgICIgICAgaWYgKHJhdW0gPSBmaW5kX29iamVjdChSQVVNTkFNRSgiCisgICAgICAgICAgICAgICAiXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIikpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKKyAgICAgICAgICAgICAgICIgIH1cblxuIgorICAgICAgICAgICAgICAgIiAgY2FsbF9vdXQoXCJyZW1vdmVcIiwwKTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK2hlYWRlckhvdXNlKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iCisgICAgICAgICAgICAgICAiI2luY2x1ZGUgPG1vdmluZy5oPlxuIgorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiIitQQVRIKyJoYXVzLmhcIlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBcInN0ZC90aGluZ1wiO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgSEFVU1RVRVI7XG5cbiIKKyAgICAgICAgICAgICAgICJjcmVhdGUoKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgIHRoaW5nOjpjcmVhdGUoKTtcbiIKKyAgICAgICAgICAgICAgICIgIGhhdXN0dWVyOjpjcmVhdGUoKTtcblxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiIKKyAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBIQVVTO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iCisgICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuIgorICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCJcbiIKKyAgICAgICAgICAgICAgICIgIExvYWQoKTtcblxuIik7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCit0cmFpbGVySG91c2UoKQoreworICBpZiAoZmluYWwpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsIHJlYWRfZmlsZShQQVRIKyJ0b29scy9oYXVzLmFweCIpKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgIHRoaXNfcGxheWVyKCktPm1vdmUoIik7CisgICAgd3JpdGVfZmlsZShmaWxlLCBzcHJpbnRmKEVYSVRfVE1QTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF1bS0+UXVlcnlPd25lcigpLCByYXVtLT5RdWVyeU93bmVyKCksIDApKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAgICAgICAgICAiLFxuXHRcdFx0TV9HTywgMCwgXCJiZXRyaXR0IFwiK25hbWUoV0VOLDEpLCBcImtvbW10IGhlcmVpblwiKTtcbiIKKyAgICAgICAgICAgICAgICIgIHJldHVybiAxO1xufVxuIik7CisgICAgaWYgKCFyYXVtLT5RdWVyeVByb3AoUF9TSE9SVCkpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgICAiXG5zdHJpbmcgc2hvcnQoKVxuIgorICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAiICBzdHJpbmcgcmV0O1xuXG4iCisgICAgICAgICAgICAgICAgICIgIHJldCA9IDo6c2hvcnQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKHByZXZpb3VzX29iamVjdCgpICE9IGVudmlyb25tZW50KCkgJiYgIXJldClcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXQgPVwiXCI7XG5cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHJldDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAgICAgICAgICAiICBTYXZlKDEpO1xuXG4iCisgICAgICAgICAgICAgICAiICB7IG9iamVjdCByYXVtO1xuIgorICAgICAgICAgICAgICAgIiAgICBpZiAocmF1bSA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKCIKKyAgICAgICAgICAgICAgICJcIiIrcmF1bS0+UXVlcnlPd25lcigpKyJcIikpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKKyAgICAgICAgICAgICAgICIgIH1cblxuIgorICAgICAgICAgICAgICAgIiAgY2FsbF9vdXQoXCJyZW1vdmVcIiwwKTtcbn1cbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvdG9vbHMvaGF1cy5hcHggYi9kL3NlaGVyL2hhZXVzZXIvdG9vbHMvaGF1cy5hcHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlMjg3NwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzLmFweApAQCAtMCwwICsxLDI1IEBACisKKyAgQWRkQ21kKCAoeyAiYmV0cml0dCIsICJiZXRyZXRlIiB9KSwgImJldHJpdHQiKTsKK30KKworc3RyaW5nIGxvbmcoKQoreworICBzdHJpbmcgZG9vcjsKKworICBkb29yID0gaGF1c3R1ZXI6OmxvbmcoKTsKKworICByZXR1cm4gUXVlcnlQcm9wKFBfTE9ORykrZG9vcjsKK30KKworc3RhdGljIGludCBiZXRyaXR0KHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGJldHJldGVuP1xuIik7CisKKyAgaWYgKCFzdHIgfHwgIWlkKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKFF1ZXJ5KEhfRE9PUlNUQVQpICYgRF9DTE9TRUQpIHsKKyAgICBwcmludGYoIiVzIHZvbiAlcyBpc3QgenUuXG4iLCBjYXBpdGFsaXplKG5hbWUoV0VSLDEpKSwgY2FwaXRhbGl6ZShvd25lcikpOworICAgIHJldHVybiAxOworICB9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3Rlci5jIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2hhdXNtZWlzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZGUwZQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3Rlci5jCkBAIC0wLDAgKzEsMjQ3IEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCitpbmhlcml0ICJzdGQvdGhpbmciOworaW5oZXJpdCAiL3Avc2VydmljZS93YXJnb24vc20vc3RhdGVtYWNoaW5lIjsKKworI2luY2x1ZGUgIi9wL3NlcnZpY2Uvd2FyZ29uL3NtL3N0YXRlbWFjaGluZS5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworI2RlZmluZSBTVEFURV9JRExFICAgICAgIDAKKyNkZWZpbmUgU1RBVEVfR0VORVJBVElORyAxCisKKyNkZWZpbmUgU0lHX0lOSVQgICAgICAwCisjZGVmaW5lIFNJR19HRU5FUkFURSAgMQorI2RlZmluZSBTSUdfRE9ORSAgICAgIDIKKworcHJpdmF0ZSBzdHJpbmcgZHVtcChpbnQgaGF1cywgaW50IGZpbmFsKTsKK3ByaXZhdGUgdm9pZCBlbnRlckdlbmVyYXRpbmcoc3RyaW5nIG93LCBvYmplY3QgZW52LCBpbnQgbnIsIGludCBmaW4sIGludCBhbGwpOworcHJpdmF0ZSB2b2lkIGRvR2VuZXJhdGluZyhzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCk7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIHRoaW5nOjpjcmVhdGUoKTsKKyAgc3RhdGVtYWNoaW5lOjpjcmVhdGUoKTsKKyAgCisgIFNldFByb3AoIFBfTkFNRSwgIkhhdXNtZWlzdGVyIik7CisgIFNldFByb3AoIFBfU0hPUlQsICJFaW4gSGF1c21laXN0ZXIiICk7CisgIFNldFByb3AoIFBfTE9ORywKKyAgICAgIkRpZXMgaXN0IGRlciBIYXVzbWVpc3RlciBhbGxlciBTZWhlcmhhZXVzZXIuIEVyIGhpbGZ0IFd1cnplbCBiZWkgZGVyXG4iCisgICAgKyJWZXJ3YWx0dW5nIGRlciBIYWV1c2VyLlxuIgorICAgICsiRGVyIEhhdXNtZWlzdGVyIGhhdCBlaW5lbiBibGF1ZW4gS2l0dGVsIGFuIHVuZCBlaW5lIEFicmlzc2Jpcm5lIGdlenVlY2t0LlxuIiApOworICBTZXRQcm9wKCBQX0dFTkRFUixNQUxFKTsKKyAgU2V0UHJvcCggUF9OT0dFVCwgMSk7CisKKyAgQWRkSWQoICJoYXVzbWVpc3RlciIgKTsKKworICBBZGRTdGF0ZShTVEFURV9JRExFLCAwLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfR0VORVJBVElORywgIydkb0dlbmVyYXRpbmcsIDApOworCisgIEFkZFRyYW5zaXRpb24oU01fSU5WQUxJRCwgU0lHX0lOSVQsIFNUQVRFX0lETEUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsIFNJR19HRU5FUkFURSwgU1RBVEVfR0VORVJBVElORywgIydlbnRlckdlbmVyYXRpbmcpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0dFTkVSQVRJTkcsIFNJR19HRU5FUkFURSwgU1RBVEVfR0VORVJBVElORywgIydlbnRlckdlbmVyYXRpbmcpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0dFTkVSQVRJTkcsIFNJR19ET05FLCBTVEFURV9JRExFKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0lOSVQpOworICAKKyAgQWRkQ21kKCAiZ2VuZXJpZXJlIiwgImdlbmVyaWVyZW4iICk7CisgIEFkZENtZCggKHsgInJlaXNzIiwgInJlaXNzZSIgfSksICJhYnJlaXNzZW4iICk7CisgIEFkZENtZCggInZlcmxlZ2UiLCAidmVybGVnZW4iICk7Cit9CisKK3N0YXRpYyBpbnQKK2Jld2VnZShtaXhlZCBkZXN0LCBpbnQgZmxhZ3MsIHN0cmluZyBtc2cxLCBzdHJpbmcgbXNnMikKK3sKKyAgaW50IHJldDsKKworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cxKyIuXG4iKTsKKyAgaWYgKChyZXQgPSBtb3ZlKGRlc3QsIGZsYWdzKSkgPT0gMSkKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cyKyIuXG4iKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdlbmVyaWVyZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudjsKKyAgaW50IG5yLCBmaW4sIGFsbDsKKyAgc3RyaW5nIG93LCAqcGFybTsKKworICBlbnYgPSBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKworICBub3RpZnlfZmFpbCggIlN5bnRheDogZ2VuZXJpZXJlIDxuYW1lPiBbPG5yPl0gW3NvZnQgfCBnYW56XVxuIiApOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBwYXJtID0gb2xkX2V4cGxvZGUoc3RyLCAiICIpOworICBmaW4gPSAxOworCisgIHN3aXRjaCAoc2l6ZW9mKHBhcm0pKSB7CisgICAgY2FzZSAzOgorICAgICAgaWYgKHBhcm1bMl0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHBhcm1bMV0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgICBlbHNlIGlmIChwYXJtWzFdID09ICJnYW56IikgeworCW93ID0gcGFybVswXTsKKwluciA9IChWRVJXQUxURVIpLT5IYXVzUHJvcChvdywgSFBfUk9PTVMpOworCXN0ciA9IG93KyJyYXVtIitucjsKKwlhbGwgPSAxOworCWJyZWFrOworICAgICAgfQorICAgICAgZWxzZSB7CisJbnIgPSB0b19pbnQocGFybVsxXSk7CisJc3RyID0gcGFybVswXSsicmF1bSIrcGFybVsxXTsKKwlvdyA9IHBhcm1bMF07CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxOgorICAgICAgb3cgPSBwYXJtWzBdOworICAgICAgbnIgPSAtMTsKKyAgICAgIHN0ciA9IG93KyJoYXVzIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvdysiLm8iKTwwKSB7CisgICAgd3JpdGUoICJFcyBnaWJ0IGtlaW4gJyIrc3RyKyInIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgU3RhdGVUcmFuc2l0aW9uKFNJR19HRU5FUkFURSwgKHtvdywgZW52LCBuciwgZmluLCBhbGwgfSkgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGVudGVyR2VuZXJhdGluZyhzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCkKK3sKKyAgc3RyaW5nIHN0cjsKKyAgCisgIGlmIChuciA+PSAwKQorICAgIHN0ciA9IG93KyJyYXVtIitucjsKKyAgZWxzZQorICAgIHN0ciA9IG93KyJoYXVzIjsKKworICBiZXdlZ2UoUEFUSCtzdHIsIE1fTk9DSEVDSywgImdlaHQgenVyIEFyYmVpdCIsICJrb21tdCBhbiIpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgIE5hbWUoV0VSKSsiIHp1ZWNrdCBlaW5lbiBCbG9jaywgc2llaHQgc2ljaCBhbGxlcyBnZW5hdSBhbiB1bmQgbWFjaHRcbiIKKyAgICAgICAgICAgICsic2ljaCBoaW4gdW5kIHdpZWRlciBOb3RpemVuLiBEYW5uIG5pY2t0IGVyIHp1ZnJpZWRlbiB1bmQgc3RlY2t0IHNlaW5lblxuIgorICAgICAgICAgICAgIkJsb2NrIHdpZWRlciB3ZWcuXG4iICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvR2VuZXJhdGluZyhzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCkKK3sKKyAgb2JqZWN0IGdlbjsKKyAgc3RyaW5nIHN0ciwgb3V0OworCisgIGdlbiA9IGNsb25lX29iamVjdChQQVRIKyJ0b29scy9nZW5lcmF0b3IiKTsKKyAgb3V0ID0gZ2VuLT5kdW1wKGVudmlyb25tZW50KCksIGZpbiwgKHsgb3csIGVudiwgbnIsIGZpbiwgYWxsIH0pKTsKKyAgCisgIGlmIChuciA+PSAwKQorICAgIHN0ciA9IG93KyJyYXVtIitucjsKKyAgZWxzZQorICAgIHN0ciA9IG93KyJoYXVzIjsKKworICBiZXdlZ2UoZW52LCBNX05PQ0hFQ0ssICJnZWh0IHp1IHNlaW5lbSBBdWZ0cmFnZ2ViZXIgenVydWVjayIsICJrb21tdCBhbiIpOworICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiBJY2ggaGFiZSAnIitzdHIrIicgaW4gZGllIERhdGVpXG4iCisJKyJEZXIgSGF1c21laXN0ZXIgc2FndDogJyIrb3V0KyInIGdlc2NocmllYmVuLCBDaGVmIVxuIik7Cit9CisKK3ZvaWQKK0dlbmVyYXRpb25Eb25lKHN0cmluZyBvdywgb2JqZWN0IGVudiwgaW50IG5yLCBpbnQgZmluLCBpbnQgYWxsKQoreworICBpZiAoYWxsKQorICB7CisgICAgaWYgKG5yID4gMCkKKyAgICB7CisgICAgICBjYWxsX291dCgiU3RhdGVUcmFuc2l0aW9uIiwgMSwKKyAgICAgICAgICAgICAgIFNJR19HRU5FUkFURSwgKHsgb3csIGVudiwgbnItMSwgZmluLCAxIH0pICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBjYWxsX291dCgiU3RhdGVUcmFuc2l0aW9uIiwgMSwKKyAgICAgICAgICAgICAgIFNJR19HRU5FUkFURSwgKHsgb3csIGVudiwgLTEsIGZpbiwgMCB9KSApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPTkUsICh7IG93LCBlbnYsIC0xLCBmaW4sIDAgfSkgKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGFicmVpc3NlbihzdHJpbmcgc3RyKQoreworICBvYmplY3QgaGF1cywgZW52OworICBzdHJpbmcgaWNoLCBtc2c7CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiIHx8IHNzY2FuZihzdHIsICIlcyBhYiIsc3RyKSAhPSAxKSB7CisgICAgbm90aWZ5X2ZhaWwoICJTeW50YXg6IHJlaXNzZSA8bmFtZT4gYWJcbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHIgPSBsb3dlcl9jYXNlKHN0cik7CisgIGlmICghKGhhdXMgPSBWRVJXQUxURVItPkZpbmRlSGF1cyhzdHIpKSkgeworICAgIHdyaXRlKCBjYXBpdGFsaXplKHN0cikrIiBoYXQga2VpbiBIYXVzIVxuIiApOworICAgIHJldHVybiAxOworICB9CisgIGljaCA9IGNhcGl0YWxpemUobmFtZShXRVIpKTsKKyAgZW52ID0gZW52aXJvbm1lbnQoKTsKKyAgYmV3ZWdlKGVudmlyb25tZW50KGhhdXMpLCBNX05PQ0hFQ0ssICJnZWh0IHp1ciBBcmJlaXQiLCAia29tbXQgYW4iKTsKKyAgbXNnID0gaGF1cy0+TmFtZShXRVIpOworCisgIGlmIChWRVJXQUxURVItPkxvZXNjaGVIYXVzKHN0cikgPT0gLTEpIHsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgaWNoKyIgdmVyc3VjaHQgdmVyZ2VibGljaCwgZWluIEhhdXMgYWJ6dXJlaXNzZW4uXG4iICk7CisgICAgbXNnID0gIkRlciBBYnJpc3N2ZXJzdWNoIGlzdCBmZWhsZ2VzY2hsYWdlbiwgQ2hlZiFcbiI7CisgIH0KKyAgZWxzZSB7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIGljaCsiIGJldGFldGlndCBlaW5lIFNpcmVuZS5cbiIrbXNnKyIgd2lyZCB2b24gIituYW1lKFdFTSkrIiBlaW5nZWVibmV0LlxuIik7CisgICAgbXNnID0gbXNnKyIgaXN0IGFiZ2VyaXNzZW4sIENoZWYhXG4iOworICAgIGlmIChoYXVzKSBoYXVzLT5yZW1vdmUoKTsKKyAgfQorICBiZXdlZ2UoZW52LCBNX05PQ0hFQ0ssICJnZWh0IHp1IHNlaW5lbSBBdWZ0cmFnZ2ViZXIgenVydWVjayIsICJrb21tdCBhbiIpOworICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiAiK21zZyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZlcmxlZ2VuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lLCB2b24sIG5hY2g7CisgIG9iamVjdCBoYXVzOworICBpbnQgcmV0OworCisgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsICIlcyBuYWNoICVzIiwgbmFtZSwgbmFjaCkgIT0gMikgeworICAgIG5vdGlmeV9mYWlsKCAiU3ludGF4OiB2ZXJsZWdlIDxuYW1lPiBuYWNoIDx6aWVsPlxuIiApOworICAgIHJldHVybiAwOworICB9CisgIGlmIChuYWNoID09ICJoaWVyIikKKyAgICBuYWNoID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworCisgIG5hbWUgPSBsb3dlcl9jYXNlKG5hbWUpOworCisgIGlmICghKGhhdXMgPSBWRVJXQUxURVItPkZpbmRlSGF1cyhuYW1lKSkpIHsKKyAgICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiAiK2NhcGl0YWxpemUobmFtZSkrIiBoYXQga2VpbiBIYXVzIVxuIiApOworICAgIHJldHVybiAxOworICB9CisgIHZvbiA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGhhdXMpKTsKKyAgcmV0ID0gVkVSV0FMVEVSLT5WZXJsZWdlSGF1cyhuYW1lLCB2b24sIG5hY2gpOworICB3cml0ZSggIkRlciBIYXVzbWVpc3RlciBzYWd0OiAiICk7CisgIHN3aXRjaChyZXQpIHsKKyAgICBjYXNlIC0xMTE6CisgICAgICB3cml0ZSggIkRhcyBoYXN0IER1IG5pY2h0IHp1IGJlc3RpbW1lbiFcbiIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgLTM6CisgICAgICB3cml0ZSggIkRlciBaaWVscmF1bSBsYWVzc3Qgc2ljaCBuaWNodCBsYWRlbiEgVmVybGVnZW4gYWJnZWJyb2NoZW4hXG4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIC00OgorICAgICAgd3JpdGUoICJJbSBaaWVscmF1bSBrYW5uIG5pY2h0IGdlYmF1dCB3ZXJkZW4hXG4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIC01OgorICAgICAgd3JpdGUoICJJbSBIYXVzIHZvbiAiK2NhcGl0YWxpemUobmFtZSkrIiBnaWJ0IGVzIG5vY2ggQXVzZ2FlbmdlIGluIGFuZGVyZSBIYWV1c2VyIVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB3cml0ZSggIk9LLCBDaGVmLCBpY2ggaGFiZSBkYXMgSGF1cyB2ZXJsZWd0IVxuIiApOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3RlcjIuYyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzbWVpc3RlcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM1NDUwCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2hhdXNtZWlzdGVyMi5jCkBAIC0wLDAgKzEsNTM0IEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKworc3RhdGljIHZvaWQgZG9fZ2VuKHN0cmluZyBvdywgb2JqZWN0IGVudiwgaW50IG5yLCBpbnQgZmluLCBpbnQgYWxsKTsKK3ByaXZhdGUgc3RyaW5nIHNwZWNpYWwoc3RyaW5nIHN0cik7Citwcml2YXRlIHN0cmluZyBkdW1wKGludCBoYXVzLCBpbnQgZmluYWwpOworcHJpdmF0ZSB2b2lkIGhlYWRlcihzdHJpbmcgZiwgaW50IGZpbmFsLCBvYmplY3QgaGF1cywgaW50IG5yKTsKK3ByaXZhdGUgdm9pZCB0cmFpbGVyKHN0cmluZyBmLCBpbnQgZmluYWwsIG9iamVjdCBoYXVzLCBpbnQgbnIpOworcHJpdmF0ZSB2b2lkIHNQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIHN0cmluZyBwU3RyKTsKK3ByaXZhdGUgdm9pZCBtUHJvcChzdHJpbmcgZiwgc3RyaW5nIHBOYW1lLCBtYXBwaW5nIHBNYXApOworcHJpdmF0ZSB2b2lkIGNQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIG1hcHBpbmcgY01hcCk7Citwcml2YXRlIHZvaWQgcHJldHR5U3RyaW5nKHN0cmluZyBmLCBzdHJpbmcgKnN0ciwgaW50IGluZGVudCk7Citwcml2YXRlIHZvaWQgcHJldHR5QXJyYXkoc3RyaW5nIGYsIHN0cmluZyAqYXJyLCBpbnQgc2VwKTsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKCBQX05BTUUsICJIYXVzbWVpc3RlciIpOworICBTZXRQcm9wKCBQX1NIT1JULCAiRWluIEhhdXNtZWlzdGVyIiApOworICBTZXRQcm9wKCBQX0xPTkcsCisgICAgICJEaWVzIGlzdCBkZXIgSGF1c21laXN0ZXIgYWxsZXIgU2VoZXJoYWV1c2VyLiBFciBoaWxmdCBXdXJ6ZWwgYmVpIGRlclxuIgorICAgICsiVmVyd2FsdHVuZyBkZXIgSGFldXNlci5cbiIKKyAgICArIkRlciBIYXVzbWVpc3RlciBoYXQgZWluZW4gYmxhdWVuIEtpdHRlbCBhbiB1bmQgZWluZSBBYnJpc3NiaXJuZSBnZXp1ZWNrdC5cbiIgKTsKKyAgU2V0UHJvcCggUF9HRU5ERVIsTUFMRSk7CisgIFNldFByb3AoIFBfTk9HRVQsIDEpOworCisgIEFkZElkKCAiaGF1c21laXN0ZXIiICk7CisKKyAgQWRkQ21kKCAiZ2VuZXJpZXJlIiwgImdlbmVyaWVyZW4iICk7CisgIEFkZENtZCggKHsgInJlaXNzIiwgInJlaXNzZSIgfSksICJhYnJlaXNzZW4iICk7CisgIEFkZENtZCggInZlcmxlZ2UiLCAidmVybGVnZW4iICk7Cit9CisKK3N0YXRpYyBpbnQKK2Jld2VnZShtaXhlZCBkZXN0LCBpbnQgZmxhZ3MsIHN0cmluZyBtc2cxLCBzdHJpbmcgbXNnMikKK3sKKyAgaW50IHJldDsKKworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cxKyIuXG4iKTsKKyAgaWYgKChyZXQgPSBtb3ZlKGRlc3QsIGZsYWdzKSkgPT0gMSkKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgY2FwaXRhbGl6ZShuYW1lKFdFUikpKyIgIittc2cyKyIuXG4iKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdlbmVyaWVyZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudjsKKyAgaW50IG5yLCBmaW4sIGFsbDsKKyAgc3RyaW5nIG93LCAqcGFybTsKKworICBlbnYgPSBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKTsKKworICBub3RpZnlfZmFpbCggIlN5bnRheDogZ2VuZXJpZXJlIDxuYW1lPiBbPG5yPl0gW3NvZnQgfCBnYW56XVxuIiApOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBwYXJtID0gb2xkX2V4cGxvZGUoc3RyLCAiICIpOworICBmaW4gPSAxOworCisgIHN3aXRjaCAoc2l6ZW9mKHBhcm0pKSB7CisgICAgY2FzZSAzOgorICAgICAgaWYgKHBhcm1bMl0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHBhcm1bMV0gPT0gInNvZnQiKQorCWZpbiA9IDA7CisgICAgICBlbHNlIGlmIChwYXJtWzFdID09ICJnYW56IikgeworCW93ID0gcGFybVswXTsKKwluciA9IChWRVJXQUxURVIpLT5IYXVzUHJvcChvdywgSFBfUk9PTVMpOworCXN0ciA9IG93KyJyYXVtIitucjsKKwlhbGwgPSAxOworCWJyZWFrOworICAgICAgfQorICAgICAgZWxzZSB7CisJbnIgPSB0b19pbnQocGFybVsxXSk7CisJc3RyID0gcGFybVswXSsicmF1bSIrcGFybVsxXTsKKwlvdyA9IHBhcm1bMF07CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxOgorICAgICAgb3cgPSBwYXJtWzBdOworICAgICAgbnIgPSAtMTsKKyAgICAgIHN0ciA9IG93KyJoYXVzIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvdysiLm8iKTwwKSB7CisgICAgaWYgKG5yID49IDAgJiYgZmlsZV9zaXplKEhBVVNTQVZFUEFUSCtvdytucisiLm8iKTwwKSB7CisgICAgICB3cml0ZSggIkVzIGdpYnQga2VpbiAnIitzdHIrIichXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBkb19nZW4ob3csIGVudiwgbnIsIGZpbiwgYWxsKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2dlbihzdHJpbmcgb3csIG9iamVjdCBlbnYsIGludCBuciwgaW50IGZpbiwgaW50IGFsbCkKK3sKKyAgc3RyaW5nIHN0ciwgb3V0OworCisgIGlmIChuciA+PSAwKQorICAgIHN0ciA9IG93KyJyYXVtIitucjsKKyAgZWxzZQorICAgIHN0ciA9IG93KyJoYXVzIjsKKworICBiZXdlZ2UoUEFUSCtzdHIsIE1fTk9DSEVDSywgImdlaHQgenVyIEFyYmVpdCIsICJrb21tdCBhbiIpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgTmFtZShXRVIpKyIgenVlY2t0IGVpbmVuIEJsb2NrLCBzaWVodCBzaWNoIGFsbGVzIGdlbmF1IGFuIHVuZCBtYWNodFxuIgorICAgICsic2ljaCBoaW4gdW5kIHdpZWRlciBOb3RpemVuLiBEYW5uIG5pY2t0IGVyIHp1ZnJpZWRlbiB1bmQgc3RlY2t0IHNlaW5lblxuQmxvY2sgd2llZGVyIHdlZy5cbiIgKTsKKyAgb3V0ID0gZHVtcChuciwgZmluKTsKKyAgYmV3ZWdlKGVudiwgTV9OT0NIRUNLLCAiZ2VodCB6dSBzZWluZW0gQXVmdHJhZ2dlYmVyIHp1cnVlY2siLCAia29tbXQgYW4iKTsKKyAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogSWNoIGhhYmUgJyIrc3RyKyInIGluIGRpZSBEYXRlaVxuIgorCSsiRGVyIEhhdXNtZWlzdGVyIHNhZ3Q6ICciK291dCsiJyBnZXNjaHJpZWJlbiwgQ2hlZiFcbiIpOworCisgIGlmIChhbGwpIHsKKyAgICBpZiAobnIgPiAwKQorICAgICAgY2FsbF9vdXQoImRvX2dlbiIsIDEsIG93LCBlbnYsIG5yLTEsIGZpbiwgYWxsKTsKKyAgICBlbHNlCisgICAgICBjYWxsX291dCgiZG9fZ2VuIiwgMSwgb3csIGVudiwgLTEsIGZpbik7CisgIH0KK30KKworc3RhdGljIGludCBhYnJlaXNzZW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGhhdXMsIGVudjsKKyAgc3RyaW5nIGljaCwgbXNnOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIiB8fCBzc2NhbmYoc3RyLCAiJXMgYWIiLHN0cikgIT0gMSkgeworICAgIG5vdGlmeV9mYWlsKCAiU3ludGF4OiByZWlzc2UgPG5hbWU+IGFiXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RyID0gbG93ZXJfY2FzZShzdHIpOworICBpZiAoIShoYXVzID0gVkVSV0FMVEVSLT5GaW5kZUhhdXMoc3RyKSkpIHsKKyAgICB3cml0ZSggY2FwaXRhbGl6ZShzdHIpKyIgaGF0IGtlaW4gSGF1cyFcbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpY2ggPSBjYXBpdGFsaXplKG5hbWUoV0VSKSk7CisgIGVudiA9IGVudmlyb25tZW50KCk7CisgIGJld2VnZShlbnZpcm9ubWVudChoYXVzKSwgTV9OT0NIRUNLLCAiZ2VodCB6dXIgQXJiZWl0IiwgImtvbW10IGFuIik7CisgIG1zZyA9IGhhdXMtPk5hbWUoV0VSKTsKKworICBpZiAoVkVSV0FMVEVSLT5Mb2VzY2hlSGF1cyhzdHIpID09IC0xKSB7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIGljaCsiIHZlcnN1Y2h0IHZlcmdlYmxpY2gsIGVpbiBIYXVzIGFienVyZWlzc2VuLlxuIiApOworICAgIG1zZyA9ICJEZXIgQWJyaXNzdmVyc3VjaCBpc3QgZmVobGdlc2NobGFnZW4sIENoZWYhXG4iOworICB9CisgIGVsc2UgeworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBpY2grIiBiZXRhZXRpZ3QgZWluZSBTaXJlbmUuXG4iK21zZysiIHdpcmQgdm9uICIrbmFtZShXRU0pKyIgZWluZ2VlYm5ldC5cbiIpOworICAgIG1zZyA9IG1zZysiIGlzdCBhYmdlcmlzc2VuLCBDaGVmIVxuIjsKKyAgICBpZiAoaGF1cykgaGF1cy0+cmVtb3ZlKCk7CisgIH0KKyAgYmV3ZWdlKGVudiwgTV9OT0NIRUNLLCAiZ2VodCB6dSBzZWluZW0gQXVmdHJhZ2dlYmVyIHp1cnVlY2siLCAia29tbXQgYW4iKTsKKyAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogIittc2cpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2ZXJsZWdlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmFtZSwgdm9uLCBuYWNoOworICBvYmplY3QgaGF1czsKKyAgaW50IHJldDsKKworICBpZiAoIXN0ciB8fCBzc2NhbmYoc3RyLCAiJXMgbmFjaCAlcyIsIG5hbWUsIG5hY2gpICE9IDIpIHsKKyAgICBub3RpZnlfZmFpbCggIlN5bnRheDogdmVybGVnZSA8bmFtZT4gbmFjaCA8emllbD5cbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobmFjaCA9PSAiaGllciIpCisgICAgbmFjaCA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKworICBuYW1lID0gbG93ZXJfY2FzZShuYW1lKTsKKworICBpZiAoIShoYXVzID0gVkVSV0FMVEVSLT5GaW5kZUhhdXMobmFtZSkpKSB7CisgICAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogIitjYXBpdGFsaXplKG5hbWUpKyIgaGF0IGtlaW4gSGF1cyFcbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB2b24gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChoYXVzKSk7CisgIHJldCA9IFZFUldBTFRFUi0+VmVybGVnZUhhdXMobmFtZSwgdm9uLCBuYWNoKTsKKyAgd3JpdGUoICJEZXIgSGF1c21laXN0ZXIgc2FndDogIiApOworICBzd2l0Y2gocmV0KSB7CisgICAgY2FzZSAtMTExOgorICAgICAgd3JpdGUoICJEYXMgaGFzdCBEdSBuaWNodCB6dSBiZXN0aW1tZW4hXG4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIC0zOgorICAgICAgd3JpdGUoICJEZXIgWmllbHJhdW0gbGFlc3N0IHNpY2ggbmljaHQgbGFkZW4hIFZlcmxlZ2VuIGFiZ2Vicm9jaGVuIVxuIiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAtNDoKKyAgICAgIHdyaXRlKCAiSW0gWmllbHJhdW0ga2FubiBuaWNodCBnZWJhdXQgd2VyZGVuIVxuIiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAtNToKKyAgICAgIHdyaXRlKCAiSW0gSGF1cyB2b24gIitjYXBpdGFsaXplKG5hbWUpKyIgZ2lidCBlcyBub2NoIEF1c2dhZW5nZSBpbiBhbmRlcmUgSGFldXNlciFcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgd3JpdGUoICJPSywgQ2hlZiwgaWNoIGhhYmUgZGFzIEhhdXMgdmVybGVndCFcbiIgKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCisvKioqIEZ1bmt0aW9uZW4genVtIEdlbmVyaWVyZW4gZWluZXIgRGF0ZWkgYXVzIGRlbiBQcm9wZXJ0aWVzIGRlcyBIYXVzZXMgKioqLworCisjZGVmaW5lIEVYSVRfVE1QTCAiXCIvcGxheWVycy8lcy9zZWhlcmhhdXMvJXNyYXVtJWRcIiIKKworcHJpdmF0ZSB2b2lkIGR1bXBfY2hlc3Qoc3RyaW5nIG91dCwgb2JqZWN0IGNoZXN0KQoreworICBtaXhlZCBuOworCisgIGNhdGNoKHJtKG91dCkpOworCisgIHdyaXRlX2ZpbGUob3V0LCAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiNpbmNsdWRlIDxtb3ZpbmcuaD5cblxuIgorCQkgICJpbmhlcml0IFwiL2Qvd3Vlc3RlL2R1cmlhbi9iZWhhZWx0ZXJcIjtcblxuIgorCQkgICJ2b2lkIGNyZWF0ZSgpXG57XG4gIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjtcblxuIgorCQkgICIgIDo6Y3JlYXRlKCk7XG5cbiIgKTsKKyAgc1Byb3Aob3V0LCAiUF9TSE9SVCIsIGNoZXN0LT5RdWVyeVByb3AoUF9TSE9SVCkpOworICBzUHJvcChvdXQsICJQX0xPTkciLCAgY2hlc3QtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKworICB3cml0ZV9maWxlKG91dCwgIiAgU2V0UHJvcChQX05PR0VULCAxKTtcbiIpOworICB3cml0ZV9maWxlKG91dCwgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKwkJICAgICh7Ik5FVVRFUiIsIk1BTEUiLCJGRU1BTEUifSlbY2hlc3QtPlF1ZXJ5UHJvcChQX0dFTkRFUildKworCQkgICAgIiApO1xuICBTZXRQcm9wKFBfTkFNRSwgIik7CisKKyAgbiA9IGNoZXN0LT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgaWYgKHN0cmluZ3AobikpCisgICAgd3JpdGVfZmlsZShvdXQsICJcIiIrbisiXCIiKTsKKyAgZWxzZQorICAgIHByZXR0eUFycmF5KG91dCwgbiwgMCk7CisgIHdyaXRlX2ZpbGUob3V0LCAiICk7XG5cbiAgQWRkSWQoICIpOworICBwcmV0dHlBcnJheShvdXQsIGNoZXN0LT5RdWVyeVByb3AoUF9JRFMpLSh7IFRSVUhFIH0pLCAwKTsKKyAgd3JpdGVfZmlsZShvdXQsICIgKTtcbiIpOworCisgIGlmICgobj1jaGVzdC0+UXVlcnlQcm9wKFBfQURKRUNUSVZFUykpICYmIHNpemVvZihuKSkgeworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4gIEFkZEFkamVjdGl2ZSggIik7CisgICAgcHJldHR5QXJyYXkob3V0LCBuLCAwKTsKKyAgICB3cml0ZV9maWxlKG91dCwgIiApO1xuIik7CisgIH0KKyAgaWYgKChuPWNoZXN0LT5RdWVyeVByb3AoUF9OQU1FX0FESikpICYmIHNpemVvZihuKSkgeworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4gIFNldFByb3AoUF9OQU1FX0FESiwgIik7CisgICAgcHJldHR5QXJyYXkob3V0LCBuLCAwKTsKKyAgICB3cml0ZV9maWxlKG91dCwgIiApO1xuIik7CisgIH0KKyAgd3JpdGVfZmlsZShvdXQsICJ9XG4iKTsKK30KKworcHJpdmF0ZSBzdHJpbmcgZHVtcChpbnQgbnIsIGludCBmaW5hbCkKK3sKKyAgc3RyaW5nIG91dDsKKyAgb2JqZWN0IGVudjsKKyAgbWFwcGluZyBwcm9wOworCisgIGVudiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworCisgIGlmIChmaW5hbCAmJiBlbnYtPlF1ZXJ5UHJvcChIX0NIRVNUKSkKKyAgICBkdW1wX2NoZXN0KFBBVEgrInJlcC8iK2Vudi0+UXVlcnlPd25lcigpKyJ0cnVoZS5jIiwgcHJlc2VudChUUlVIRSwgZW52KSk7CisKKyAgaWYgKGZpbmFsKSB7CisgICAgb3V0ID0gUEFUSCsicmVwLyIrZW52LT5RdWVyeU93bmVyKCk7CisgICAgaWYgKG5yIDwgMCkKKyAgICAgIG91dCArPSAiaGF1cy5jIjsKKyAgICBlbHNlCisgICAgICBvdXQgKz0gInJhdW0iK25yKyIuYyI7CisgIH0KKyAgZWxzZQorICAgIG91dCA9IFBBVEgrImZpeGVkLmMiOworCisgIGNhdGNoKHJtKG91dCkpOworCisgIGhlYWRlcihvdXQsIGZpbmFsLCBlbnYsIG5yKTsKKyAgaWYgKG5yPDApIHsKKyAgICBzUHJvcChvdXQsICJQX1NIT1JUIiwgZW52LT5RdWVyeVByb3AoUF9TSE9SVCkpOworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICBzUHJvcChvdXQsICJQX0xPTkciLCBlbnYtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKyAgICB3cml0ZV9maWxlKG91dCwgIlxuIik7CisKKyAgICBpZiAoZmluYWwpIHsKKyAgICAgIG1peGVkIG47CisKKyAgICAgIHdyaXRlX2ZpbGUob3V0LCAiICBTZXRQcm9wKFBfTk9HRVQsIDEpO1xuIik7CisgICAgICB3cml0ZV9maWxlKG91dCwgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKwkJICAgICAgKHsiTkVVVEVSIiwiTUFMRSIsIkZFTUFMRSJ9KVtlbnYtPlF1ZXJ5UHJvcChQX0dFTkRFUildKworCQkgICAgICAiICk7XG4gIFNldFByb3AoUF9OQU1FLCAiKTsKKyAgICAgIG4gPSBlbnYtPlF1ZXJ5UHJvcChQX05BTUUpOworICAgICAgaWYgKHN0cmluZ3AobikpCisJd3JpdGVfZmlsZShvdXQsICJcIiIrbisiXCIiKTsKKyAgICAgIGVsc2UKKwlwcmV0dHlBcnJheShvdXQsIG4sIDApOworICAgICAgd3JpdGVfZmlsZShvdXQsICIgKTtcblxuICBBZGRJZCggIik7CisgICAgICBwcmV0dHlBcnJheShvdXQsIGVudi0+UXVlcnlQcm9wKFBfSURTKS0oeyAic2VoZVxyaGF1cyIsICJcbiIrZW52LT5RdWVyeU93bmVyKCkrImhhdXMiIH0pLCAwKTsKKyAgICAgIHdyaXRlX2ZpbGUob3V0LCAiICk7XG4iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc1Byb3Aob3V0LCAiUF9JTlRfU0hPUlQiLCBlbnYtPlF1ZXJ5UHJvcChQX0lOVF9TSE9SVCkpOworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICBzUHJvcChvdXQsICJQX0lOVF9MT05HIiwgZW52LT5RdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICBpZiAoc2l6ZW9mKHByb3AgPSBlbnYtPlF1ZXJ5UHJvcChQX0RFVEFJTFMpKSkgeworICAgICAgbVByb3Aob3V0LCAiQWRkRGV0YWlsIiwgcHJvcCk7CisgICAgICB3cml0ZV9maWxlKG91dCwgIlxuIik7CisgICAgfQorICAgIGlmIChzaXplb2YocHJvcCA9IGVudi0+UXVlcnlQcm9wKFBfUkVBRF9ERVRBSUxTKSkpIHsKKyAgICAgIG1Qcm9wKG91dCwgIkFkZFJlYWREZXRhaWwiLCBwcm9wKTsKKyAgICAgIHdyaXRlX2ZpbGUob3V0LCAiXG4iKTsKKyAgICB9CisgICAgaWYgKHNpemVvZihwcm9wID0gZW52LT5RdWVyeVByb3AoSF9DT01NQU5EUykpKQorICAgICAgY1Byb3Aob3V0LCAiQWRkVXNlckNtZCIsIHByb3ApOworCisgICAgd3JpdGVfZmlsZShvdXQsICJcbiIpOworICAgIGlmIChmaW5hbCkgeworICAgICAgc3RyaW5nICprLCBvOworICAgICAgaW50IGksIG51bTsKKworICAgICAgcHJvcCA9IGVudi0+UXVlcnlQcm9wKFBfRVhJVFMpOworICAgICAgayA9IG1faW5kaWNlcyhwcm9wKTsKKyAgICAgIGlmIChtZW1iZXIoaywgInJhdXMiKSA+PSAwKSB7CisJayAtPSAoeyAicmF1cyIgfSk7CisJd3JpdGVfZmlsZShvdXQsIHNwcmludGYoIiAgQWRkRXhpdCggXCJyYXVzXCIsIFwiJXNcIik7XG4iLCBwcm9wWyJyYXVzIl0pKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaT1zaXplb2YoayktMTsgaT49MDsgaS0tKSB7CisJaWYgKHNzY2FuZihwcm9wW2tbaV1dLCBQQVRIKyIlc3JhdW0lZCIsIG8sIG51bSkgIT0gMikKKwkgIHByaW50ZigiS29taXNjaGVyIEV4aXQgKCVPKVxuJXMgLT4gJXNcbiIsIGVudiwga1tpXSwgcHJvcFtrW2ldXSk7CisJZWxzZSB7CisJICBpZiAobyA9PSBlbnYtPlF1ZXJ5T3duZXIoKSkgeworCSAgICBvID0gc3ByaW50ZihFWElUX1RNUEwsIG8sIG8sIG51bSk7CisJICAgIHdyaXRlX2ZpbGUob3V0LCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgJXMpO1xuIiwga1tpXSwgbykpOworCSAgfQorCSAgZWxzZSB7CisJICAgIHdyaXRlX2ZpbGUob3V0LCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgXCIlc1wiKTtcbiIsIGtbaV0sIHByb3Bba1tpXV0pKTsKKwkgICAgcHJpbnRmKCJFeGl0IHZvbiAlTyBuYWNoICVzIVxuIiwgZW52LCBwcm9wW2tbaV1dKTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIHRyYWlsZXIob3V0LCBmaW5hbCwgZW52LCBucik7CisKKyAgcmV0dXJuIG91dDsKK30KKworcHJpdmF0ZSB2b2lkIGhlYWRlcihzdHJpbmcgZiwgaW50IGZpbmFsLCBvYmplY3QgaGF1cywgaW50IG5yKQoreworICBpZiAoZmluYWwpIHsKKyAgICB3cml0ZV9maWxlKGYsICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPiIgKTsKKyAgICBpZiAobnIgPj0gMCkgeworICAgICAgd3JpdGVfZmlsZShmLCAiXG5cbmluaGVyaXQgXCJzdGQvcm9vbVwiO1xuaW5oZXJpdCBcIiIrUEFUSCsibW9kdWxlcy91c2VyY21kXCI7Iik7CisgICAgICB3cml0ZV9maWxlKGYsICJcblxuY3JlYXRlKClcbntcbiAgcm9vbTo6Y3JlYXRlKCk7XG4gIHVzZXJjbWQ6OmNyZWF0ZSgpO1xuXG4iKTsKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIiAgU2V0UHJvcChQX0xJR0hULCAxKTtcbiAgU2V0UHJvcChQX0lORE9PUlMsIDEpO1xuXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB3cml0ZV9maWxlKGYsICJcbiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiNpbmNsdWRlIFwiIitQQVRIKyJoYXVzLmhcIlxuXG4iICk7CisgICAgICB3cml0ZV9maWxlKGYsICJpbmhlcml0IFwic3RkL3RoaW5nXCI7XG5pbmhlcml0IEhBVVNUVUVSO1xuXG4iICk7CisgICAgICB3cml0ZV9maWxlKGYsICJjcmVhdGUoKVxue1xuICB0aGluZzo6Y3JlYXRlKCk7XG4gIGhhdXN0dWVyOjpjcmVhdGUoKTtcblxuIik7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHdyaXRlX2ZpbGUoZiwgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG5cbmluaGVyaXQgIik7CisgICAgd3JpdGVfZmlsZShmLCAoKG5yIDwgMCkgPyAiSEFVUyIgOiAiUkFVTSIgKSApOworICAgIHdyaXRlX2ZpbGUoZiwgIjtcbmluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICJjcmVhdGUoKVxue1xuICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuICA6OmNyZWF0ZSgpO1xuXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICIgIFNldE93bmVyKFwiIitoYXVzLT5RdWVyeU93bmVyKCkrIlwiIik7CisgICAgaWYgKG5yID49IDApCisgICAgICB3cml0ZV9maWxlKGYsICIsICIrbnIpOworICAgIHdyaXRlX2ZpbGUoZiwgIik7XG4gIExvYWQoKTtcblxuIik7CisgICAgaWYgKG5yID49IDApCisgICAgICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoUF9ERVRBSUxTLCAoW10pKTtcbiAgU2V0UHJvcChQX1JFQURfREVUQUlMUywgKFtdKSk7XG5cbiIpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCB0cmFpbGVyKHN0cmluZyBmLCBpbnQgZmluYWwsIG9iamVjdCBoYXVzLCBpbnQgbnIpCit7CisgIGlmIChmaW5hbCkgeworICAgIGlmIChuciA+PSAwKQorICAgICAgd3JpdGVfZmlsZShmLCAifVxuIik7CisgICAgZWxzZSB7CisgICAgICB3cml0ZV9maWxlKGYsIHJlYWRfZmlsZShQQVRIKyJ0b29scy9oYXVzLmFweCIpKTsKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIiAgdGhpc19wbGF5ZXIoKS0+bW92ZSgiKTsKKyAgICAgIHdyaXRlX2ZpbGUoZiwgc3ByaW50ZihFWElUX1RNUEwsIGhhdXMtPlF1ZXJ5T3duZXIoKSwgaGF1cy0+UXVlcnlPd25lcigpLCAwKSk7CisgICAgICB3cml0ZV9maWxlKGYsICIsXG5cdFx0XHRNX0dPLCAwLCBcImJldHJpdHQgXCIrbmFtZShXRU4sMSksIFwia29tbXQgaGVyZWluXCIpO1xuIgorCQkgICAgIiAgcmV0dXJuIDE7XG59XG4iKTsKKyAgICAgIGlmICghaGF1cy0+UXVlcnlQcm9wKFBfU0hPUlQpKQorCXdyaXRlX2ZpbGUoZiwgIlxuc3RyaW5nIHNob3J0KClcbntcbiAgc3RyaW5nIHJldDtcblxuIgorCQkgICAgICAiICByZXQgPSA6OnNob3J0KCk7XG4iCisJCSAgICAgICIgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBlbnZpcm9ubWVudCgpICYmICFyZXQpXG4iCisJCSAgICAgICIgICAgcmV0ID1cIlwiO1xuXG4gIHJldHVybiByZXQ7XG59XG4iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgd3JpdGVfZmlsZShmLCAiICBTYXZlKDEpO1xuXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICIgIHsgb2JqZWN0IHJhdW07XG4gICAgaWYgKHJhdW0gPSBmaW5kX29iamVjdCgiKTsKKyAgICBpZiAobnIgPj0gMCkKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIlJBVU1OQU1FKFwiIitoYXVzLT5RdWVyeU93bmVyKCkrIlwiLCAiK25yKyIpKSlcbiIpOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIkhBVVNOQU1FKFwiIitoYXVzLT5RdWVyeU93bmVyKCkrIlwiKSkpXG4iKTsKKyAgICB3cml0ZV9maWxlKGYsICIgICAgICByYXVtLT5Mb2FkKCk7XG4gIH1cblxuICBjYWxsX291dChcInJlbW92ZVwiLDApO1xufVxuIik7CisgIH0KK30KKworcHJpdmF0ZSBzdHJpbmcgc3BlY2lhbChzdHJpbmcgcykKK3sKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXFwiKSwgIlxcXFwiKTsKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXHQiKSwgIlxcdCIpOworICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcIiIpLCAiXFxcIiIpOworCisgIHJldHVybiBzOworfQorCitwcml2YXRlIHZvaWQgc1Byb3Aoc3RyaW5nIGYsIHN0cmluZyBwTmFtZSwgc3RyaW5nIHBTdHIpCit7CisgIHN0cmluZyAqc3RyOworICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoICIrcE5hbWUrIiwiKTsKKyAgaWYgKCFwU3RyKSB7CisgICAgd3JpdGVfZmlsZShmLCAiMCApO1xuIik7CisgICAgcmV0dXJuOworICB9CisgIHBTdHIgPSBzcGVjaWFsKHBTdHIpOworICBpZiAoc2l6ZW9mKHN0cj1vbGRfZXhwbG9kZShwU3RyLCJcbiIpKSA+IDEpCisgICAgcHJldHR5U3RyaW5nKGYsIHN0ciwgNCk7CisgIGVsc2UgeworICAgIGlmIChzaXplb2Yoc3RyKT09MCkKKyAgICAgIHN0ciA9ICh7IiJ9KTsKKyAgICB3cml0ZV9maWxlKGYsICJcbiAgICAgXCIiK3N0clswXSk7CisgICAgaWYgKHBTdHJbPDFdID09ICdcbicpCisgICAgICB3cml0ZV9maWxlKGYsICJcXG5cIiIpOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIlwiIik7CisgIH0KKyAgd3JpdGVfZmlsZShmLCAiICk7XG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIG1Qcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIG1hcHBpbmcgcE1hcCkKK3sKKyAgc3RyaW5nICplcSwgdDE7CisgIG1peGVkIGNtZDsKKyAgaW50IGksajsKKworICBpZiAoc2l6ZW9mKHBNYXApID09IDApCisgICAgcmV0dXJuOworCisgIGNtZCA9IFZFUldBTFRFUi0+UENydW5jaChwTWFwKTsKKworICBmb3IgKGk9c2l6ZW9mKGNtZCktMTsgaT49MDsgaS0tKSB7CisgICAgd3JpdGVfZmlsZShmLCAiICAiK3BOYW1lKyIoXG4gICAgIik7CisgICAgZXEgPSBjbWRbaV1bMF07CisgICAgdDEgPSBjbWRbaV1bMV07CisKKyAgICBwcmV0dHlBcnJheShmLCBlcSwgMCk7CisgICAgd3JpdGVfZmlsZShmLCAiLCAiKTsKKworICAgIHByZXR0eVN0cmluZyhmLCBvbGRfZXhwbG9kZShzcGVjaWFsKHQxKSwgIlxuIiksIDYpOworICAgIHdyaXRlX2ZpbGUoZiwgIiApO1xuIik7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIGNQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIG1hcHBpbmcgY01hcCkKK3sKKyAgc3RyaW5nIHQxLCB0MjsKKyAgbWl4ZWQgY21kLCBlcTsKKyAgaW50IGksajsKKworICBjbWQgPSBWRVJXQUxURVItPlBDcnVuY2goY01hcCk7CisKKyAgZm9yKCBpPXNpemVvZihjbWQpLTE7IGk+PTA7IGktLSkgeworICAgIHdyaXRlX2ZpbGUoZiwgIiAgIitwTmFtZSsiKFxuICAgICIpOworICAgIGVxID0gY21kW2ldWzBdOworICAgIHQxID0gY21kW2ldWzFdOworICAgIHQyID0gY21kW2ldWzJdOworCisgICAgcHJldHR5QXJyYXkoZiwgZXEsIDEpOworICAgIHdyaXRlX2ZpbGUoZiwgIiwgMCwgIik7CisKKyAgICBwcmV0dHlTdHJpbmcoZiwgb2xkX2V4cGxvZGUoc3BlY2lhbCh0MSksICJcbiIpLCA0KTsKKyAgICB3cml0ZV9maWxlKGYsICIsICIpOworICAgIGlmICh0MikKKyAgICAgIHByZXR0eVN0cmluZyhmLCBvbGRfZXhwbG9kZShzcGVjaWFsKHQyKSwgIlxuIiksIDQpOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZiwgIjAiKTsKKyAgICB3cml0ZV9maWxlKGYsICIgKTtcbiIpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBwcmV0dHlTdHJpbmcoc3RyaW5nIGYsIHN0cmluZyAqc3RyLCBpbnQgaW5kZW50KQoreworICBzdHJpbmcgaW5kOworICBpbnQgaTsKKworICBpbmQgPSBleHRyYWN0KCJcbiAgICAgICAgICAiLDAsaW5kZW50KTsKKworICBpZiAoIXNpemVvZihzdHIpKSB7CisgICAgd3JpdGVfZmlsZShmLCBpbmQrIiBcIlxcblwiIik7CisgICAgcmV0dXJuOworICB9CisgIHdyaXRlX2ZpbGUoZiwgaW5kKyIgXCIiK3N0clswXSsiXFxuXCIiKTsKKyAgZm9yIChpPTE7IGk8c2l6ZW9mKHN0cik7IGkrKykgeworICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIrXCIiK3N0cltpXSsiXFxuXCIiKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQgcHJldHR5QXJyYXkoc3RyaW5nIGYsIHN0cmluZyAqYXJyLCBpbnQgc2VwKQoreworICBpbnQgaSxqOworICBzdHJpbmcgcmVzLCB0MSwgdDI7CisKKyAgd3JpdGVfZmlsZShmLCAiKHsiKTsKKworICBpZiAoc2l6ZW9mKGFycikpIHsKKyAgICB0MSA9ICgiXCIiK2FyclswXSsiXCIiKTsKKyAgICByZXMgPSAiICIrdDE7CisgICAgdDIgPSAiIjsKKworICAgIGZvciAoaT0xLCBqPXNpemVvZihhcnIpOyBpPGo7IGkrKykgeworICAgICAgdDIgPSAiXCIiK2FycltpXSsiXCIiOworICAgICAgaWYgKCFzZXApIHsKKwlpZiAoKHNpemVvZih0MSkrc2l6ZW9mKHQyKSk+NjkpIHsKKwkgIHJlcyArPSAoIixcbiAgICAgICAiK3QyKTsKKwkgIHQxID0gdDI7CisJICB0MiA9ICIiOworCX0KKwllbHNlIHsKKwkgIHQxICs9ICgiLCAiK3QyKTsKKwkgIHJlcyArPSAoIiwgIit0Mik7CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJcmVzICs9ICgiLFxuICAgICAgICIrdDIpOworICAgICAgfQorICAgIH0KKyAgfQorICB3cml0ZV9maWxlKGYsIHJlcyArICIgfSkiICk7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzdG9vbC5jIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2hhdXN0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9oYXVzdG9vbC5jCkBAIC0wLDAgKzEsMTgyIEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworaW5oZXJpdCAic3RkL3NlY3VyZV90aGluZyI7CisKK3ByaXZhdGUgaW50IHNlY3VyZSgpCit7CisgIHJldHVybiAodGhpc19pbnRlcmFjdGl2ZSgpICYmIChJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwKKwkJCQkgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkgPT0gInd1cnplbCIpKTsKK30KKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gQWRyZXNzdmVyemVpY2huaXMiICk7CisgIFNldFByb3AoUF9MT05HLAorICAgICAiTWl0IGRpZXNlbSBBZHJlc3N2ZXJ6ZWljaG5pcyBrb2VubmVuIGRpZSByaWNodGlnZW4gTGV1dGUgT3JkbnVuZyBpbiBkZW5cbiIKKyAgICArIld1c3QgZGVyIFNlaGVyaGF1c2FuZ2VsZWdlbmhlaXRlbiBicmluZ2VuLlxuIgorICAgICsiRGllIHJpY2h0aWdlbiBMZXV0ZT9cbiIKKyAgICArIkphOiBNYW4gbXVzcyBzY2hvbiBFcnptYWdpZXIgc2VpbiBvZGVyIFd1cnplbCBoZWlzc2VuISA7KVxuIgorICAgICsiRHUga2FubnN0IGVzIHVlYnJpZ2VucyBsZXNlbiFcbiIgKTsKKyAgU2V0UHJvcChQX05BTUUsICJBZHJlc3N2ZXJ6ZWljaG5pcyIpOworICBTZXRQcm9wKFBfUkVBRF9NU0csCisgICAgICJFcyBzdGVoZW4gZm9sZ2VuZGUgQmVmZWhsZSB6dXIgVmVyZnVlZ3VuZzpcbiIKKyAgICArImNoZWNrZWQgPG5hbWU+IFsrLy1dIDxucj5cbiIKKyAgICArInJlcFxuIgorICAgICsibWttYWlsIDxuYW1lPlxuIgorICAgICk7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIFNldFByb3AoUF9XRUlHSFQsIDEwMCk7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwgMSk7CisgIFNldFByb3AoUF9ORVZFUkRST1AsIDEpOworICBTZXRQcm9wKFBfTk9EUk9QLCAxKTsKKworICBBZGRJZCggKHsgInZlcnplaWNobmlzIiwgImFkcmVzc3ZlcnplaWNobmlzIiwgImhhdXN0b29sIiB9KSApOworCisgIEFkZENtZCgiY2hlY2tlZCIsICJjaGVja2VkIik7CisgIEFkZENtZCgicmVwIiwgInJlcG9ydCIpOworICBBZGRDbWQoIm1rbWFpbCIsICJta21haWwiKTsKK30KKworI2RlZmluZSBDSEVDS0VEIFBBVEgrImxvZy9DSEVDS0VEIgorc3RhdGljIGludAorY2hlY2tlZChzdHJpbmcgc3RyKQoreworICBtYXBwaW5nIGRyaW47CisgIHN0cmluZyBuYW1lLCAqbGluZXMsICppbmQsIHBtOworICBpbnQgbnIsIGk7CisgIGNsb3N1cmUgaHA7CisKKyAgaWYgKCFzZWN1cmUoKSkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiU3ludGF4OiBjaGVja2VkIDxuYW1lPiBbKy8tXSA8bnI+XG4iICk7CisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikKKyAgICByZXR1cm4gMDsKKworICBpZiAoZmlsZV9zaXplKENIRUNLRUQpID4gMCkKKyAgICBsaW5lcyA9IGV4cGxvZGUocmVhZF9maWxlKENIRUNLRUQpLCAiXG4iKSAtICh7IiJ9KTsKKyAgZWxzZQorICAgIGxpbmVzID0gKHt9KTsKKworICBmb3IgKGRyaW4gPSAoW10pLCBpPXNpemVvZihsaW5lcyktMTsgaT49MDsgaS0tKSB7CisgICAgaWYgKHNzY2FuZihsaW5lc1tpXSwgIiVzJXQlZCIsIG5hbWUsIG5yKSA9PSAyKQorICAgICAgZHJpbiArPSAoWyBuYW1lIDogbnItMSBdKTsKKyAgfQorICBsaW5lcyA9ICh7IH0pOworICBwbSA9ICIiOworICBocCA9IHN5bWJvbF9mdW5jdGlvbigiSGF1c1Byb3AiLCBWRVJXQUxURVIpOworCisgIGlmIChzc2NhbmYoc3RyLCAiJXMgJWQiLCBuYW1lLCBucik9PTIgfHwgc3NjYW5mKHN0ciwgIiVzICVzICVkIiwgbmFtZSwgcG0sIG5yKSA9PSAzKSB7CisgICAgaWYgKCFmdW5jYWxsKGhwLCBuYW1lLCBIUF9FTlYpKSB7CisgICAgICB3cml0ZShjYXBpdGFsaXplKG5hbWUpKyIgaGF0IGdhciBrZWluIEhhdXMhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobnIgPCAwKSB7CisgICAgICB3cml0ZSgiWnVtIEFiemllaGVuIG5pbW0gYml0dGUgJ2NoZWNrZWQgPG5hbWU+IC0gPG5yPichXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobWVtYmVyKGRyaW4sIG5hbWUpKQorICAgICAgaSA9IGRyaW5bbmFtZV07CisgICAgc3dpdGNoKHBtKSB7CisgICAgICBjYXNlICIrIjoKKwlpZiAoaStuciA+IGZ1bmNhbGwoaHAsIG5hbWUsIEhQX1JPT01TKSkgeworCSAgcHJpbnRmKCIlZCBSYWV1bWU/IFdpZSBzb2xsIGRhcyBnZWhlbj9cbiIsIGkrbnIpOworCSAgcmV0dXJuIDE7CisJfQorCWRyaW5bbmFtZV0gKz0gbnI7CisJYnJlYWs7CisgICAgICBjYXNlICItIjoKKwlpZiAoaS1uciA8IDApIHsKKwkgIHdyaXRlKCJTb3ZpZWxlIFJhZXVtZSBrYW5uc3QgRHUgIitjYXBpdGFsaXplKG5hbWUpKyIgZ2FyIG5pY2h0IGFiemllaGVuLi4uXG4iKTsKKwkgIHJldHVybiAxOworCX0KKwlkcmluW25hbWVdIC09IG5yOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlpZiAobnIgPiBmdW5jYWxsKGhwLCBuYW1lLCBIUF9ST09NUykpIHsKKwkgIHByaW50ZigiJXMgbmF0IGtlaW5lICVkIFJhZXVtZSFcbiIsY2FwaXRhbGl6ZShuYW1lKSxucik7CisJICByZXR1cm4gMTsKKwl9CisJZHJpbltuYW1lXSA9IG5yOworICAgIH0KKyAgICBybShDSEVDS0VEKTsKKyAgICBmb3IgKGk9c2l6ZW9mKGluZD1zb3J0X2FycmF5KG1faW5kaWNlcyhkcmluKSwjJzwpKS0xOyBpPj0wOyBpLS0pCisgICAgICB3cml0ZV9maWxlKENIRUNLRUQsIHNwcmludGYoIiVzICVkXG4iLGluZFtpXSwgMStkcmluW2luZFtpXV0pKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3JlcG9ydCgpCit7CisgIHN0cmluZyAqcmVwLCAqaGVhZCwgbmFtZTsKKyAgaW50IGksIGxwLCBucjsKKworICBpZiAoZmlsZV9zaXplKCIvbG9nL3JlcG9ydC93dXJ6ZWwucmVwIik8PTApIHsKKyAgICB3cml0ZSgiS2VpbiB3dXJ6ZWwucmVwIChKaXBwaWVoISA7KVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXAgPSBvbGRfZXhwbG9kZShyZWFkX2ZpbGUoIi9sb2cvcmVwb3J0L3d1cnplbC5yZXAiKSwiXG4iKTsKKyAgbHAgPSBzaXplb2YoUEFUSCktMTsKKworICBmb3IgKGk9c2l6ZW9mKHJlcCktMjsgaT49MDsgaS09MikgeworICAgIGhlYWQgPSBvbGRfZXhwbG9kZShyZXBbaV0sICIgIik7CisgICAgaWYgKGhlYWRbNF1bMC4ubHBdID09IFBBVEgpIHsKKyAgICAgIG5hbWUgPSBvbGRfZXhwbG9kZShoZWFkWzRdLCIvIilbPDFdOworICAgICAgbnIgPSB0b19pbnQobmFtZVs8MS4uPDFdKTsKKyAgICAgIG5hbWUgPSBuYW1lWzAuLjw2XTsKKyAgICAgIGhlYWRbMl0gPSBjYXBpdGFsaXplKGhlYWRbMl0pOworICAgICAgd3JpdGVfZmlsZShQQVRIKyJyZXAvIituYW1lLAorCQkgc3ByaW50ZigiJXMgaW4gUmF1bSAlZDpcbiVzXG4iLAorCQkJIGltcGxvZGUoaGVhZFswLi4yXSwiICIpLG5yLHJlcFtpKzFdKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoUEFUSCsicmVwL3d1cnplbC5yZXAiLHNwcmludGYoIiVzXG4lc1xuIiwgcmVwW2ldLCByZXBbaSsxXSkpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citta21haWwoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGYsZm07CisKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgbm90aWZ5X2ZhaWwoICJTeW50YXg6IG1rbWFpbCA8bmFtZT5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCEoZj0oVkVSV0FMVEVSKS0+SGF1c1Byb3Aoc3RyLCBIUF9FTlYpKSkgeworICAgIHByaW50ZigiJXMgaGF0IGtlaW4gSGF1cyFcbiIsIHN0cik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZm0gPSBQQVRIK3N0cisiLm1haWwiOworCisgIHdyaXRlX2ZpbGUoZm0sICJcCisgIEh1aHUhXG5cCitcblwKK0RhIER1IE1hZ2llciBiaXN0LCBicmF1Y2hzdCBEdSBhdWNoIGtlaW4gU2VoZXJoYXVzIG1laHIuIERhbWl0IERlaW5lXG5cCitCZXNjaHJlaWJ1bmdlbiBhYmVyIG5pY2h0IHZlcmxvcmVuIHNpbmQsIGZpbmRlc3QgRHUgZGllIEZpbGVzIERlaW5lc1xuXAorSGF1c2VzIGluIC9wbGF5ZXJzLyIrc3RyKyIvc2VoZXJoYXVzLy5cblwKK1xuXAorU29sbCBEZWluIEhhdXMgd2VpdGVyaGluIGFuIGRlciBqZXR6aWdlbiBTdGVsbGUgc3RlaGVuIGJsZWliZW5cblwKKygiK2YrIiksXG5cCitzbyBrbGFlcmUgZGFzIGJpdHRlIG1pdCBkZW0gZG9ydCB6dXN0YWVuZGlnZW4gTWFnaWVyIHNvd2llIGRlbiB6dXN0YWVuLVxuXAorZGlnZW4gUmVnaW9uc21hZ2llcm4gKHdlaWwgZXMgc2ljaCBqZXR6dCB1bSBkZW4gQW5zY2hsdXNzIHZvbiBGaWxlcyBhblxuXAorZWluIEdlYmlldCBoYW5kZWx0KS5cblwKK1xuXAorISEgRGFzIEhhdXMgd2lyZCBhdWYgamVkZW4gRmFsbCBuYWNoIEVuZGUgZGVyIEhhdXNzcGVycmUgYWJnZXJpc3NlbiAhIVxuXAorXG5cCisgIFdhcmdvbi5cbiIpOworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2xpc3RlLmMgYi9kL3NlaGVyL2hhZXVzZXIvdG9vbHMvbGlzdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMmIzOWEyCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2xpc3RlLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgIi4uL2hhdXMuaCIKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworbWFwcGluZyBtZWdhbWFwOworCitjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpOworICBkb19kdW1wKCk7Cit9CisKK2RvX2R1bXAoKQoreworICBzdHJpbmcgKm93LCB0eXA7CisgIGludCBpLCByLCByMjsKKyAgb3cgPSBtX2luZGljZXMobWVnYW1hcCk7CisgIG93ID0gc29ydF9hcnJheShvdywjJzwpOworICBpID0gc2l6ZW9mKG93KS0xOworICBmb3Iocj0wLCByMj0wOyBpPj0wOyBpLS0pIHsKKyAgICByID0gbWVnYW1hcFtvd1tpXSxIUF9ST09NU107CisgICAgaWYgKElTX0xFQVJORVIob3dbaV0pKSBwcmludGYoIiUxM3MgJWQgTUFHSUVSKCVkKVxuIiwgb3dbaV0scixxdWVyeV93aXpfbGV2ZWwob3dbaV0pKTsKKyAgICBlbHNlIGlmICghSVNfU0VFUihvd1tpXSkpIHByaW50ZigiJTEzcyAlZCBLRUlOIFNFSEVSIE1FSFJcbiIsIG93W2ldLCByKTsKKyAgfQorICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30K