ZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvYWNjZXNzX3JpZ2h0cy5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9hY2Nlc3NfcmlnaHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1Y2Q1OAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvYWNjZXNzX3JpZ2h0cy5jCkBAIC0wLDAgKzEsNSBAQAoraW50IGFjY2Vzc19yaWdodHMoc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlKSB7CisgIGlmKHVzZXIgPT0gInN3aWZ0IiAmJiBmaWxlIT0iYXV0b2xvYWRlcnRydWhlLmMiKQorICAgIHJldHVybiAxOyAgLy8gU3dpZnQgaGF0IGF1ZiBkaWUgTW9lYmVsIFp1Z3JpZmYuCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9hdXRvbG9hZGVydHJ1aGUuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvYXV0b2xvYWRlcnRydWhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyY2UxNwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvYXV0b2xvYWRlcnRydWhlLmMKQEAgLTAsMCArMSwxMDE1IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBBdWZiZXdhaHJ1bmd0cnVoZSBmdWVyIEF1dG9sb2FkLU9iamVrdGUKKy8vCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBaZXNzdHJhCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworLy8jaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPGNsYXNzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSAiL2Qvc2VoZXIvaGFldXNlci9oYXVzLmgiCisKKyNkZWZpbmUgSURTICAgICAwCisjZGVmaW5lIE5BTUUgICAxCisjZGVmaW5lIEFMREFUQSAgMgorCisjZGVmaW5lIExPRyh4LHkpIGxvZ19maWxlKHgsc3ByaW50ZigiJXMgWyVzLCAlTywgJU9dOiAlc1xuIixkdGltZSh0aW1lKCkpLFwKKyAgICAgICh1dWlkP3V1aWQ6IiAiKSxQTCxvYmplY3RfbmFtZShNRSkseSkpCisjZGVmaW5lIFNUT1JFTE9HKHgpIExPRygiemVzc3RyYS9BTFRSVUhFX1NUT1JFLmxvZyIseCkKKyNkZWZpbmUgUElDS0xPRyh4KSBMT0coInplc3N0cmEvQUxUUlVIRV9QSUNLLmxvZyIseCkKKworI2RlZmluZSBJVEVNTE9HKHgpIGxvZ19maWxlKCJ6ZXNzdHJhL0FMVFJVSEVfSVRFTVMubG9nIixcCisgICAgc3ByaW50ZigiJXMgWyVPXTogJXNcbiIsZHRpbWUodGltZSgpKSxcCisgICAgICB0aGlzX2ludGVyYWN0aXZlKCl8fFBMLHgpKQorCisjZGVmaW5lIEVSUkxPRyh4KSBMT0coInplc3N0cmEvQUxUUlVIRS5FUlIiLHgpCisKKyN1bmRlZiBCUworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCw3OCkKKworI2RlZmluZSBWRVJTSU9OX09CSiAiNSIKKworI2lmZGVmIE1BSU5UQUlORVIKKyN1bmRlZiBNQUlOVEFJTkVSCisjZW5kaWYKKyNkZWZpbmUgTUFJTlRBSU5FUiAoeyJ6ZXNzdHJhIn0pCisKKy8vIFNhdmVmaWxlIGRlciBCbHVlcHJpbnQKKyNpZmRlZiBTQVZFRklMRQorI3VuZGVmIFNBVkVGSUxFCisjZW5kaWYKKyNkZWZpbmUgU0FWRUZJTEUgX19GSUxFX19bLi48M10KKworI2RlZmluZSBERUJVRyh4KSAgICBpZiAoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSxNQUlOVEFJTkVSWzBdKSlcCisgICAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSxNQUlOVEFJTkVSWzBdKSxcCisgICAgICAgICAgICAgICAgICAgICAgIkFMVHJ1aGU6ICIreCsiXG4iKQorCisjZGVmaW5lIEFDQ0VTUyAobXlfc2VjdXJlX2xldmVsKCkgPj0gQVJDSF9MVkwpCisKKy8vIERpZXNlIDQgc2luZCBmdWVyIGRpZSBCbHVlcHJpbnQgKE1hc3RlciBhbGxlciBUcnVoZW4pCittYXBwaW5nIHdoaXRlbGlzdD0oW10pOyAvLyBlcmxhdWJ0ZSBBdXRvbG9hZGVyLCBhbGxlIGFuZGVyZW4gbmljaHQgZXJsYXVidC4KK21hcHBpbmcgYmxhY2tsaXN0PShbXSk7IC8vIGJlcmVpdHMgZXhwbGl6aXQgZHVyY2ggRU0rIGFiZ2VsZWhudGUgQXV0b2xvYWRlcgorbWFwcGluZyB2b3JzY2hsYWVnZT1tX2FsbG9jYXRlKDEsMik7IC8vIHZvcnNjaGxhZWdlIGRlciBTcGllbGVyCittYXBwaW5nIGRhdGE9KFtdKTsgIC8vIGhpZXIgc3BlaWNoZXJ0IGRpZSBCUCBhbGxlIERhdGVuIGRlciBUcnVoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gV0lDSFRJRzogZGllc2VzIE1hcHBpbmcgd2lyZCBpbiAvc2VjdXJlL21lbW9yeQorICAgICAgICAgICAgICAgICAgICAvLyBhYmdlbGVndCB1bmQgbXVzcyBhdWNoIGJlaW0gTmV1bGFkZW4gZ2dmLiB2b24gZG9ydAorICAgICAgICAgICAgICAgICAgICAvLyB3aWVkZXIgYWJnZWhvbHQgd2VyZGVuLiBBdXNzZXJkZW0gdGVpbGVuIHNpY2ggYWxsZQorICAgICAgICAgICAgICAgICAgICAvLyBUcnVoZW4gZWluZXMgU3BpZWxlcnMgdW5kIGRpZXNlIEJsdWVwcmludCBkaWUgTWFwcGluZ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gZGFyaW4sIGRhbWl0IEFlbmRlcnVuZ2VuIHNvZm9ydCBpbiBhbGxlbiBUcnVoZW4gdW5kIGRlbQorICAgICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgYmVrYW5udCBzaW5kLgorCisvKiBkaWUgZWluemVsbmVuIFRydWhlbiBzcGVpY2hlcm4gaW4gYXV0b2xvYWRlci4gRm9ybWF0OiAKKyAgIDMgV2VydGUgcHJvIEtleSwgS2V5cyBzaW5kIGRpZSBOYW1lbiBkZXIgQmx1ZXByaW50cyBkZXIgT2JqZWt0ZToKKyAgIChbPGJsdWVwcmludD46IDxQX0lEUz47IDxvYi0+bmFtZSgpPjsgPFBfQVVUT0xPQURPQko+IF0pCisgICAqLworbm9zYXZlIG1hcHBpbmcgYXV0b2xvYWRlcj1tX2FsbG9jYXRlKDEsMyk7Citub3NhdmUgc3RyaW5nIHV1aWQ7IC8vIFVVSUQgZGVzIEVpZ2VudHVlbWVycworbm9zYXZlIG9iamVjdCBvYl9pbl9iZXdlZ3VuZzsgLy8gdWVibGVyIEhhY2sgZWlnZW50bGljaC4gOi0oCisKK3ZvaWQgTm90aWZ5SW5zZXJ0KG9iamVjdCBvYiwgb2JqZWN0IG9sZGVudik7CitzdGF0aWMgbWFwcGluZyBRdWVyeURhdGEoKTsKK3N0YXRpYyBtYXBwaW5nIFNldERhdGEobWl4ZWQgZGF0YSk7Citwcm90ZWN0ZWQgdm9pZCBzYXZlX21lKCk7Citwcm90ZWN0ZWQgdm9pZCBjaGVja19jb250ZW50KCk7CisKK25vbWFzayBwcml2YXRlIGludCBteV9zZWN1cmVfbGV2ZWwoKTsgLy9BcmdzLgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisKKyAgLy8gSmEsIGVzIGlzIEFic2ljaHQsIGRhc3MgZGFzIGNyZWF0ZSBkZXIgQlAgZXJzdCBzcGFldGVyIGFiZ2Vicm9jaGVuIHdpcmQhCisgIHN3aWZ0X3N0ZF9jb250YWluZXI6OmNyZWF0ZSgpOworCisgIHNldGV1aWQoZ2V0dWlkKE1FKSk7CisKKyAgLy8gZmFsbHMgZGllcyBkaWUgQlAgaXN0OgorICAvLyAxLiBkYXMgU2F2ZWZpbGUgenUgbGFkZW4uCisgIC8vIDIuIHZlcnN1Y2hlbiwgZGllIHRydWhlbmRhdGVuIHZvbiAvc2VjdXJlL21lbW9yeSB6dSBob2xlbiwgZGFtaXQgbmFjaCBkZW0KKyAgLy8gICAgTmV1bGFkZW4gZGVyIE1hc3RlciB1bmQgZGllIENsaWVudCBpbW1lciBuYWNoIF9kaWVzZWxiZW5fIE1hcHBpbmdzCisgIC8vICAgIGhhYmVuLgorICBpZiAoIWNsb25lcChNRSkpCisgIHsKKyAgICAvLyBTYXZlZmlsZSByZXN0YXVyaWVyZW4gKGF1Y2ggd2VubiBkYXRhIGltIE1lbW9yeSBpc3QsIG11c3MgZGFzIHNlaW4sCisgICAgLy8gZGFtaXQgZGllIGFuZGVyZW4gVmFyaWFibGVuIHdpZWRlciBlaW5nZWxlc2VuIHNpbmQpLgorICAgIHJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgICAvLyBqZXR6dCBEYXRlbiBhdXMgTWVtb3J5IGhvbGVuLCBzb2Zlcm4gdmVyZnVlZ2JhcgorICAgIG1hcHBpbmcgdG1wID0gIi9zZWN1cmUvbWVtb3J5Ii0+TG9hZCgidHJ1aGVuZGF0ZW4iKTsKKyAgICBpZiAobWFwcGluZ3AodG1wKSkKKyAgICB7CisgICAgICAvLyBEYXRlbiBhdXMgU2F2ZWZpbGUgZHVyY2ggZGllIHZvbSBNZW1vcnkgZXJzZXR6ZW4KKyAgICAgIGRhdGEgPSB0bXA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBLZWluZSBEYXRlbiBpbiBNZW1vcnkuIEpldHp0IGluIGplZGVtIEZhbGwgZGVuIFBvaW50ZXIgYXVmIGRhcyBNYXBwaW5nIGRhdGEgaW4KKyAgICAgIC8vIC9zZWN1cmUvbWVtb3J5IGFibGVnZW4KKyAgICAgIGlmICgiL3NlY3VyZS9tZW1vcnkiLT5TYXZlKCJ0cnVoZW5kYXRlbiIsZGF0YSkgIT0gMSkKKyAgICAgIHsKKyAgICAgICAgcmFpc2VfZXJyb3IoIkNvdWxkIG5vdCBzYXZlIG1lbW9yeSB0byAvc2VjdXJlL21lbW9yeS4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gYnJhdWNoZW4gQ2xvbmVzIG5pY2h0LgorICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICBkYXRhPTA7IC8vIGJyYXVjaGVuIENsb25lcyBuaWNodC4KKyAgfQorCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUga2xlaW5lLCBtYWdpc2NoZSBIb2x6dHJ1aGUiKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIkhvbHp0cnVoZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfTkFNRV9BREosKHsia2xlaW4iLCAibWFnaXNjaCJ9KSk7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkRpZSBrbGVpbmUgSG9senRydWhlIGlzdCBhdXMgc3RhYmlsZW0gRWljaGVuaG9seiBnZWZlcnRpZ3QuIEVpZ2VudGxpY2ggIgorICAgICAic2FlaGUgc2llIHJlY2h0IHVuc2NoZWluYmFyIGF1cywgd2FlcmVuIGRhIG5pY2h0IGRpZSB2aWVsZW4ga3Vuc3R2b2xsZW4gIgorICAgICAiUnVuZW4gYW4gZGVuIFNlaXRlbiB1bmQgYXVmIGRlbSBEZWNrZWwuIikKKyAgICArIkBAY250X3N0YXR1c0BAIik7CisKKyAgQWRkSWQoKHsiYXV0b2xvYWRlcnRydWhlIiwgImhvbHp0cnVoZSIsICJ0cnVoZSJ9KSk7CisKKyAgLy8gZGVuIFJlc3Qgdm9tIENyZWF0ZSBicmF1Y2h0IGRpZSBCUCBuaWNodC4KKyAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisKKyAgU2V0UHJvcChQX0xPR19GSUxFLCJ6ZXNzdHJhL0FMVFJVSEUucmVwIik7CisKKyAgU2V0UHJvcChQX1dFSUdIVCwgMzAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIC8vIGRpZSBkcmVpIGhpZXIgc2luZCBpbiBkaWVzbWUgRmFsbCBlaWdlbnRsaWNoIHZvZWxsaWcgb2huZSBCZWRldXR1bmcKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOworICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBzaW5kIGVoIGltbWVyIDAgZWNodGUgT2JqZWt0ZSBkcmluLgorCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIChbTUFUX09BSzo0OSwgTUFUX01JU0NfTUFHSUM6NTAsIE1BVF9KT0ZJVU06IDFdKSApOworICBTZXRQcm9wKFBfSU5GTywgQlMoIkluIGRpZXNlIHN0YWJpbGUgVHJ1aGUga2FubnN0IER1IGJlc3RpbW10ZSAiCisgICAgICAgICJBdXRvbG9hZC1PYmpla3RlIGhpbmVpbmxlZ2VuIHVuZCBzaWUgbGFnZXJuLCB3ZW5uIER1IHNpZSBnZXJhZGUgIgorICAgICAgICAibmljaHQgYnJhdWNoc3QuIChNaXQgJ2RlcG9uaWVyZSA8d2FzPicga2FubnN0IER1IGV0d2FzIGluIGRlciAiCisgICAgICAgICJUcnVoZSB6dXIgQXVmYmV3YWhydW5nIGRlcG9uaWVyZW4sIG1pdCAnZW50bmVobWUgPHdhcz4gb2RlciAiCisgICAgICAgICInbmltbSA8d2FzPiBhdXMgdHJ1aGUnIGthbm5zdCBEdSBlaW5lbiBHZWdlbnN0YW5kIHdpZWRlciAiCisgICAgICAgICJoZXJhdXNuZWhtZW4uKSIpKTsKKworICAvLyBQcm9wIGZ1ZXIgcmVib290ZmVzdGUgTW9lYmVsCisgIC8vIERlciBlbmRndWVsdGlnZSBXZXJ0IChVVUlEIGRlcyBTcGllbGVycykgd2lyZCBwZXIgU2V0QmVzaXR6ZXIoKSBnZXNldHp0LAorICAvLyBzb2JhbGQgZGllIFRydWhlIGRhcyBlcnN0ZSBNYWwgaW4gZWluIFNlaGVyaGF1cyBiZXdlZ3Qgd3VyZGUuCisgIFNldFByb3AoSF9GVVJOSVRVUkUsIDEpOworCisgIEFEKCh7InBsYXR6IiwiZ3JvZXNzZSJ9KSwgCisgICAgICBCUygiRGllIFRydWhlIGlzdCByZWNodCBrbGVpbiwgYWJlciBtZXJrd3VlcmRpZ2Vyd2Vpc2UgIgorICAgICAgICAic2NoZWludCBzaWUgdmllbCBtZWhyIGFuIEdlZ2Vuc3RhZW5kZW4gYXVmbmVobWVuIHp1IGtvZW5uZW4sIGFscyAiCisgICAgICAgICJlcyB2b24gaWhyZXIgR3JvZXNzZSBoZXIgc2NoZWludC4iKSk7CisgIEFEKCh7ImdlZ2Vuc3RhbmQiLCJnZWdlbnN0YWVuZGUifSksCisgICAgICBCUygiRGllIFRydWhlIHNjaGVpbnQgendhciB2aWVsZW4gR2VnZW5zdGFlbmRlbiBQbGF0eiB6dSBiaWV0ZW4sIGFiZXIgIgorICAgICAgICAiZGFmdWVyIG5pbW10IHNpZSBuaWNodCBqZWRlbiBHZWdlbnN0YW5kIGF1Zi4iKSk7CisgIEFEKCh7ImhvbHoiLCJlaWNoZW5ob2x6In0pLAorICAgICAgQlMoIkRhcyBFaWNoZW5ob2x6IGlzdCBzZWhyIHN0YWJpbC4gRXMgaXN0IGdhbnogZ2xhdHQgZ2VzY2hsaWZmZW4gdW5kICIKKyAgICAgICAgInRyYWVndCB2aWVsZSBrdW5zdHZvbGxlIFJ1bmVuIGluIHNpY2guIikpOworICBBRCgoeyJzZWl0ZW4iLCJzZWl0ZSJ9KSwKKyAgICAgIEJTKCJEaWUgVHJ1aGUgaGF0IDQgU2VpdGVuLCBkaWUgYWxsZXNhbXQgbWl0IFJ1bmVuIHZlcnppZXJ0IHNpbmQuIikpOworICBBRCgoeyJib2RlbiJ9KSwKKyAgICAgIEJTKCJEZXIgQm9kZW4gZGVyIFRydWhlIHRyYWVndCBrZWluZXJsZWkgUnVuZW4uIikpOworICBBRCgoeyJkZWNrZWwifSksCisgICAgICBCUygiQXVjaCBkZXIgRGVja2VsIGRlciBUcnVoZSBpc3QgbWl0IFJ1bmVuIHZlcnppZXJ0LiIpKTsKKyAgQUQoKHsicnVuZW4iLCJydW5lIn0pLAorICAgICAgQlMoIkRpZSBSdW5lbiBiZWRlY2tlbiBhbGxlIDQgU2VpdGVuIHVuZCBkZW4gRGVja2VsIGRlciBUcnVoZS4gTWFuICIKKyAgICAgICAgImhhdCBzaWUgendlaWZlbGxvcyBpbiBtdWVoc2FtZXIgQXJiZWl0IGF1cyBkZW0gaGFydGVuIEhvbHogIgorICAgICAgICAiZ2VzY2huaXR6dC4gQW5zY2hsaWVzc2VuZCB3dXJkZW4gc2llIG9mZmVuYmFyIG1pdCBlaW5lbSAiCisgICAgICAgICJNZXRhbGwgZ2VmdWVsbHQuIER1IHZlcnN0ZWhzdCB6d2FyIHVlYmVyaGF1cHQgbmljaHQsIHdhcyAiCisgICAgICAgICJkaWUgUnVuZW4gYmVkZXV0ZW4sIGFiZXIgc2llIHNpbmQgYmVzdGltbXQgbWFnaXNjaCwgZGVubiB3YW5uIGltbWVyICIKKyAgICAgICAgIkR1IGRlbiBEZWNrZWwgb2VmZm5lc3Qgb2RlciBzY2hsaWVzc3Qgb2RlciBHZWdlbnN0YWVuZGUgaGluZWlubGVnc3QgIgorICAgICAgICAib2RlciBoZXJhdXNuaW1tc3QsIGxldWNodGVuIGRpZSBSdW5lbiBoZWxsIGF1Zi4iKSk7CisgIEFEKCh7Im1ldGFsbCJ9KSwKKyAgICAgIEJTKCJXYXMgZGFzIHdvaGwgZnVlciBlaW4gTWV0YWxsIHNlaW4gbWFnPyBad2VpZmVsbG9zIGhhdCBlcyBhdWNoIHdhcyAiCisgICAgICAgICJtaXQgTWFnaWUgenUgdHVuLiIpKTsKKyAgQUQoKHsibWFnaWUifSksCisgICAgICBCUygiSW4gZGllc2VyIFRydWhlIHNjaGVpbnQgdmllbCBNYWdpZSB6dSBzdGVja2VuLCB3ZW5uIHNlbGJzdCBlaW4gIgorICAgICAgICAiV2VsdHVudGVyZ2FuZyBpaHIgbmljaHRzIGFuaGFiZW4ga2Fubi4iKSk7CisgIEFEKCh7ImFyYmVpdCIsImZlcnRpZ3VuZyJ9KSwKKyAgICAgIEJTKCJEaWUgRmVydGlndW5nIGRpZXNlciBUcnVoZSBtdXNzIHNlaHIgYXVmd2VuZGlnIGdld2VzZW4gc2Vpbi4gIgorICAgICAgICAiS2VpbiBXdW5kZXIsIGRhc3MgZGllIFRydWhlIHNvIHRldWVyIGlzdC4iKSk7CisgIEFEKCh7Ind1bmRlciJ9KSwKKyAgICAgIEJTKCJFaW4gV3VuZGVyIHNjaGVpbnQgZXMgenUgc2Vpbi4iKSk7CisgIEFEKCh7IndlbHR1bnRlcmdhbmciLCJhcm1hZ2VkZG9uIn0pLAorICAgICAgQlMoIkRpciBzY2hhdWRlcnQgYmVpbSBHZWRhbmtlbiBhbiBkZW4gV2VsdHVudGVyZ2FuZy4iKSk7CisgIEFEKCh7ImdlZGFua2VuIn0pLAorICAgICAgQlMoIkRlbmsgZG9jaCBsaWViZXIgYW4gd2FzIGFuZGVyZXMuLi4iKSk7CisKKyAgQWRkQ21kKCJkZXBvbmllcnxkZXBvbmllcmUmQFBSRVNFTlQiLCJjbWRfZGVwb25pZXJlIiwKKyAgICAgICJXYXMgbW9lY2h0ZXN0IER1IGluIGRlciBFaWNoZW5ob2x6dHJ1aGUgZGVwb25pZXJlbj8iKTsKKyAgQWRkQ21kKCJlbnRuaW1tfGVudG5laG1lfGVudG5laG0iLCJjbWRfZW50bmVobWVuIik7CisKKyAgLy8gYmVpIGRpZXNlciBUcnVoZSB3YWVyZSBkYXMgRXJsYXViZW4gdm9lbGxpZyBzaW5ubG9zLiA7LSkKKyAgUmVtb3ZlQ21kKCh7InNlcmxhdWJlIn0pKTsKKworfQorCisvLyBrZWluZSBUcnVoZW4gemVyc3RvZXJlbiwgZGllIGlyZ2VuZGVpbmVuIElOaGFsdCBoYWJlbi4KK2ludCB6ZXJ0cnVlbW1lcm4oc3RyaW5nIHN0cikgeworICAvLyBhdXMgc3dpZnRfc3RkX2NvbnRhaW5lcgorICBzdHJpbmcgbmZfc3RyOworICBuZl9zdHI9IlN5bnRheDogemVydHJ1ZW1tZXIgW09iamVrdC1JZF1cbiIKKyAgICAgICAgKyJCc3AuOiAgIHplcnRydWVtbWVyICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXG4iOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIrbmZfc3RyKTsKKyAgaWYocHJlc2VudChzdHIpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgeworICAgIHdyaXRlKCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgIituYW1lKFdFTiwxKSsiIHplcnRydWVtbWVybiEiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gT2JqZWt0ZSBlbnRoYWx0ZW4/IFdlbm4gamEsIGFiYnJ1Y2guCisgIGlmIChzaXplb2YoYXV0b2xvYWRlcikpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygiRHUgd2lsbHN0IGdlcmFkZSB6dW0gU2NobGFnIGF1c2hvbGVuLCB1bSAiCisgICAgICAgICAgK25hbWUoV0VOLDEpKyAiIHp1IHplcnRydWVtbWVybiwgYWxzIERpciBlaW5mYWVsbHQsIGRhc3MgIgorICAgICAgICAgICtRdWVyeVByb25vdW4oV0VSKSsgIiBqYSBnYXIgbmljaHQgbGVlciBpc3QhIE5lbmUsIHdlciB3ZWlzcywgb2IgIgorICAgICAgICAgICJEdSBkYXMgbmljaHQgbm9jaCBicmF1Y2hlbiBrb2VubnRlc3QuIikpOworICAgIHJldHVybiAxOworICB9CisgIC8vIHNvbnN0IGdlZXJidGVuIEtyYW0gYXVzZnVlaHJlbi4KKyAgcmV0dXJuIDo6emVydHJ1ZW1tZXJuKHN0cik7Cit9CisKKy8vIFplc3N0cmEsIDEuNy4wNywgZnVlcnMgSG9lcnJvaHIKK3N0cmluZyBHZXRPd25lcigpIHtyZXR1cm4gInplc3N0cmEiO30KKworLy8gUHJ1ZWZ0IGRhcyBPYmpla3QgYXVmIEVpZ251bmcgZnVlciBkaWUgVHJ1aGUsIHNwZWljaGVydCBzZWluZSBEYXRlbiB1bmQKKy8vIHplcnN0b2VydCBlcyBhbnNjaGxpZXNzZW5kLiBOT0RST1AtT2JqZWt0ZSBrb2VubmVuIG51ciBzbyBpbiBkaWUgVHJ1aGUKKy8vIGdlbGVndCB3ZXJkZW4sIGFsbGUgYW5kZXJlbiBrb2VubmVuIGF1Y2ggbWl0ICJzdGVja2UgLi4uIGluIHRydWhlIgorLy8gZGVwb25pZXJ0IHdlcmRlbiwgd29yYXVmaGluIGViZW5mYWxscyBQcmV2ZW50SW5zZXJ0KCkgdW5kIE5vdGlmeUluc2VydCgpCisvLyBkdXJjaGxhdWZlbiB3ZXJkZW4uCitwcm90ZWN0ZWQgaW50IGNtZF9kZXBvbmllcmUoc3RyaW5nIGNtZCwgbWl4ZWQgYXJncykgeworICBpZiAoIW9iamVjdHAoUEwpKSByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbChOYW1lKFdFUiwxKSsiIGlzdCBkb2NoIGdlc2NobG9zc2VuIVxuIik7CisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpIT1DTlRfU1RBVFVTX09QRU4pIHJldHVybiAwOworICAKKyAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgaW4gZGVyIEVpY2hlbmhvbHp0cnVoZSBkZXBvbmllcmVuP1xuIik7CisgIGlmICghc3RyaW5ncChjbWQpIHx8ICFzaXplb2YoY21kKSAKKyAgICAgIHx8ICFwb2ludGVycChhcmdzKSB8fCAhc2l6ZW9mKGFyZ3MpKSByZXR1cm4gMDsKKyAgb2JqZWN0IG9iPWFyZ3NbMF07CisgIGlmICghb2JqZWN0cChvYikpIHJldHVybiAwOworICAvLyB3dWVyZGUgZGllIFRydWhlIGRhcyBPYmpla3QgdWViZXJoYXVwdCBhdWZuZWhtZW4/IEZlaGxlcmF1c2dhYmUgZHVyY2gKKyAgLy8gUHJldmVuSW5zZXJ0KCkKKyAgaWYgKFByZXZlbnRJbnNlcnQob2IpKSByZXR1cm4gMTsKKyAgLy8gQXVzemllaGVuLi4uIFNjaGFkZSwgZGFzcyBEb1Vud2VhciBuaXggdmVybnVlbmZ0aWdlcyBhbiBSdWVja2dhYmV3ZXJ0CisgIC8vIGhhdC4gOi0oCisgIGlmIChvYmplY3RwKG9iLT5RdWVyeVByb3AoUF9XT1JOKSkpIHsKKyAgICBvYi0+RG9VbndlYXIoKTsKKyAgICBpZiAob2JqZWN0cChvYi0+UXVlcnlQcm9wKFBfV09STikpKSB7CisgICAgICB0ZWxsX29iamVjdChQTCwgQlMoIkR1IG11c3N0ICIrIG9iLT5uYW1lKFdFTiwxKSsgInp1bmFlY2hzdCBlaW5tYWwgIgorICAgICAgICAgICAgImF1c3ppZWhlbiEiKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgLy8gd2Vnc3RlY2tlbgorICBpZiAob2JqZWN0cChvYi0+UXVlcnlQcm9wKFBfV0lFTERFRCkpKSB7CisgICAgb2ItPkRvVW53aWVsZCgpOworICAgIGlmIChvYmplY3RwKG9iLT5RdWVyeVByb3AoUF9XSUVMREVEKSkpIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBCUygiRHUgbXVzc3QgIisgb2ItPm5hbWUoV0VOLDEpKyAienVuYWVjaHN0IGVpbm1hbCAiCisgICAgICAgICAgICAid2Vnc3RlY2tlbiEiKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgLy8gTk9fQ0hFQ0sgdW5kIFNpbGVudC1CZXdlZ3VuZywgTWVsZHVuZ2VuIGFuIGRlbiBTcGllbGVyIHNlbGJlciBtYWNoZW4uCisgIHRlbGxfb2JqZWN0KFBMLCBCUygiRHUgc3RlY2tzdCAiKyBvYi0+bmFtZShXRU4sMSkgKyAiIGluICIgKyBuYW1lKFdFTiwxKSArCisgICAgICAiLiIpKTsKKyAgICAKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksQlMoUEwtPk5hbWUoV0VSKSArICIgbGVndCAiICsgb2ItPm5hbWUoV0VOLDApICsKKyAgICAgICIgaW4gIiArIG5hbWUoV0VOLDEpICsgIiBoaW5laW4uIiksKHtQTH0pKTsKKyAgb2ItPm1vdmUoTUUsIE1fTk9DSEVDS3xNX1NJTEVOVCk7CisgIHJldHVybiAxOworfQorCisvLyBhbHRlcm5hdGl2ZSB6dW0gIm5pbW0gYmxhIGF1cyB0cnVoZSIuIFNwaWVsZXIgd29sbHRlbiB3YXMga3VyemVzIGRhZnVlcgorLy8gaGFiZW4uCitwcm90ZWN0ZWQgaW50IGNtZF9lbnRuZWhtZW4oc3RyaW5nIGNtZCkgeworICBpbnQgcmVzOworICBtaXhlZCBub2dldDsKKworICBpZiAoIW9iamVjdHAoUEwpKSByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbChOYW1lKFdFUiwxKSsiIGlzdCBkb2NoIGdlc2NobG9zc2VuIVxuIik7CisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpIT1DTlRfU1RBVFVTX09QRU4pIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKEJTKCJXYXMgbW9lY2h0ZXN0IER1IGF1cyAiK25hbWUoV0VNLDEpKyAiIGVudG5laG1lbj9cbiIpKTsKKyAgaWYgKCFzdHJpbmdwKGNtZCkgfHwgIXNpemVvZihjbWQpKSByZXR1cm4gMDsKKworICBvYmplY3QgKm9icz1wcmVzZW50X29iamVjdHMoY21kKTsKKworICBpZiAoIXNpemVvZihvYnMpIHx8ICFvYmplY3RwKG9ic1swXSkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gTk9HRVQgaXN0IGhpZXIgYmxvZWQuIFNvIGlzdCBlcyB6d2FyIGF1Y2ggbmljaHQgcmljaHRpZyBkb2xsLi4uICpzZXVmeioKKyAgLy8gRGllIGhpZXIgaXN0L3dhZXJlIGFiZXIgbmVuIHVlYmxlciBIYWNrLCBlcnN0bWFsIGF1c2tvbW1lbnRpZXJ0IGxhc3Nlbi4KKyAgLy8gYWxzbywgUF9OT0dFVCBzaWNoZXJuLgorICAvKmlmICghY2xvc3VyZXAobm9nZXQ9b2ItPlF1ZXJ5KFBfTk9HRVQsRl9RVUVSWV9NRVRIT0QpKSkgeworICAgIG5vZ2V0PW9iLT5RdWVyeShQX05PR0VULEZfVkFMVUUpOworICAgIG9iLT5TZXQoUF9OT0dFVCwwLEZfVkFMVUUpOworICB9CisgIGVsc2UgeworICAgIG9iLT5TZXQoUF9OT0dFVCwwLEZfUVVFUllfTUVUSE9EKTsKKyAgfSovCisgIC8vIG5laG1lbi4KKyAgcmVzPVBMLT5waWNrX29iaihvYnNbMF0pOworICAvLyBQX05PR0VUIHp1cnVlY2tzY2hyZWliZW4uIChKYSwgd2VubiBlaW5lIENsb3N1cmUgYWxzIEZfVkFMVUUgZHJpbnN0ZWh0LAorICAvLyBsYW5kZXQgZGllIGpldHp0IGFscyBGX1FVRVJZX01FVEhPRCBpbSBPYmpla3QuCisgIC8qaWYgKGNsb3N1cmVwKG5vZ2V0KSkgeworICAgIG9iLT5TZXQoUF9OT0dFVCxub2dldCxGX1FVRVJZX01FVEhPRCk7CisgIH0KKyAgZWxzZQorICAgIG9iLT5TZXQoUF9OT0dFVCxub2dldCxGX1ZBTFVFKTsKKyovCisgIHJldHVybihyZXMpOworfQorCisvLyBIaWVyIHdpcmQgYXVjaCBkYXMgUHJldmVudEluc2VydCgpIHZvbiBkZXIgQmx1ZXByaW50IGdlcnVmZW4uIERhcworLy8gZXJsZWljaHRlcnQgZXMsIGRpZSBMaXN0ZSBhbiBlcmxhdWJ0ZW4gT2JqZWt0ZW4genUgYWVuZGVybiwgb2huZSBkYXNzIG1hbgorLy8gYWxsZSBDbG9uZXMgZXJzZXR6ZW4gbXVzcy4KK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKSB7CisgIHN0cmluZyBvbmFtZTsKKyAgLy8gRGFzIE9iamVrdCwgd2FzIGRpZSBUcnVoZSBnZXJhZGUgc2VsYmVyIGJld2VndCwgd2lyZCBpZ25vcmllcnQuCisgIGlmICghb2JqZWN0cChvYikgfHwgb2JfaW5fYmV3ZWd1bmc9PW9iKSByZXR1cm4gMDsKKyAgCisgIG9uYW1lPUJMVUVfTkFNRShvYik7CisgIAorICAvLyBQcnVlZnVuZyBpbiBDbG9uZW46CisgIGlmIChjbG9uZXAoTUUpKQorICB7CisgICAgLy8gbnVyIEVpZ2VudHVlbWVyCisgICAgaWYgKCFzdHJpbmdwKHV1aWQpIHx8ICFzaXplb2YodXVpZCkpIHsKKyAgICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgICAgdGVsbF9vYmplY3QoUEwsQlMoc3ByaW50ZigiJXMgZ2Vob2VydCBEaXIgbmljaHQsIGRhaGVyIGthbm5zdCBEdSAiCisgICAgICAgICAgICAiYXVjaCBrZWluZSBHZWdlbnN0YWVuZGUgaW4gJXMgbGVnZW4uIiwKKyAgICAgICAgICAgIE5hbWUoV0VSLDEpLFF1ZXJ5UHJvbm91bihXRU4pKSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghb2JqZWN0cChQTCkgfHwgZ2V0dXVpZChQTCkhPXV1aWQpIHsKKyAgICAgIGlmIChvYmplY3RwKFBMKSkKKyAgICAgICAgdGVsbF9vYmplY3QoUEwsQlMoc3ByaW50ZigiTnVyICVzIGRhcmYgR2VnZW5zdGFlbmRlIGluICVzICIKKyAgICAgICAgICAiaGluZWlubGVnZW4uIixjYXBpdGFsaXplKGV4cGxvZGUodXVpZCwiXyIpWzBdKSxuYW1lKFdFTiwxKSkpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvLyBqZWRlcyBPYmpla3QgbnVyIGVpbm1hbC4KKyAgICBpZiAobWVtYmVyKGF1dG9sb2FkZXIsb25hbWUpKSB7CisgICAgICBpZiAob2JqZWN0cChQTCkpCisgICAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKE5hbWUoV0VSLDEpKyAiIGthbm4gdm9uIGVpbmVtIEdlZ2Vuc3RhbmQgamV3ZWlscyAiCisgICAgICAgICAgIm51ciBlaW4gRXhlbXBsYXIgYXVmbmVobWVuLCBlcyBpc3QgYWJlciBiZXJlaXRzICIKKyAgICAgICAgICArb2ItPm5hbWUoV0VSLDApICsgIiBpbiAiICsgUXVlcnlQcm9ub3VuKFdFTSkgKyAiLiIpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvLyBqZXR6dCBFcmxhdWJuaXNsaXN0ZSBkZXIgQlAgZnJhZ2VuLgorICAgIGlmIChvYmplY3RwKGJsdWVwcmludChNRSkpKQorICAgICAgcmV0dXJuIGJsdWVwcmludChNRSktPlByZXZlbnRJbnNlcnQob2IpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsb2FkX29iamVjdChsb2FkX25hbWUoTUUpKS0+UHJldmVudEluc2VydChvYik7CisgIH0KKyAgLy8gRW5kZSBmdWVyIFBydWVmdW5nIGZ1ZXIgQ2xvbmUuCisKKyAgLy8gYWIgaGllciBqZXR6dCBkaWUgUHJ1ZWZ1bmcgZHVyY2ggZGllIEJQLgorICAvLyBLZWluZSAoZnJlaWdlZ2ViZW5lcikgQXV0b2xvYWRlcj8gSGF0IGluIGRpZXNlbSBDb250YWluZXIgbml4IHZlcmxvcmVuIQorICBpZiggIW9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikgKSB7CisgICAgaWYgKG9iamVjdHAoUEwpKQorICAgICAgdGVsbF9vYmplY3QoUEwsQlMoIkluICIrbmFtZShXRU4sMSkKKyAgICAgICAgICAgICsiIGthbm5zdCBEdSBudXIgQXV0b2xvYWQtT2JqZWt0ZSBoaW5laW5sZWdlbi4gIikpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKG1lbWJlcihibGFja2xpc3Qsb25hbWUpKSB7CisgICAgaWYgKG9iamVjdHAoUEwpKQorICAgICAgdGVsbF9vYmplY3QoUEwsQlMoIkluICIrbmFtZShXRU4sMSkKKyAgICAgICAgICAgICsiIGthbm5zdCBEdSBudXIgZGFmdWVyIGVybGF1YnRlIEF1dG9sb2FkLU9iamVrdGUgaGluZWlubGVnZW4uICIKKyAgICAgICAgICAgICtvYi0+TmFtZShXRVIsMSkgKyAiIHd1cmRlIGV4cGxpeml0IGFscyBuaWNodCBlcnd1ZW5zY2h0ICIKKyAgICAgICAgICAgICJiZWZ1bmRlbi4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoIW1lbWJlcih3aGl0ZWxpc3Qsb25hbWUpKSB7CisgICAgaWYgKCFtZW1iZXIodm9yc2NobGFlZ2Usb25hbWUpKSB7CisgICAgICB2b3JzY2hsYWVnZVtvbmFtZSwwXT1vYi0+bmFtZShXRVIsMCkgfHwgIiI7CisgICAgICB2b3JzY2hsYWVnZVtvbmFtZSwxXT1vYi0+c2hvcnQoKSB8fCAiIjsKKyAgICB9CisgICAgaWYgKG9iamVjdHAoUEwpKQorICAgICAgdGVsbF9vYmplY3QoUEwsQlMoIkluICIrbmFtZShXRU4sMSkKKyAgICAgICAgICAgICsiIGthbm5zdCBEdSBudXIgZGFmdWVyIGVybGF1YnRlIEF1dG9sb2FkLU9iamVrdGUgaGluZWlubGVnZW4uICIKKyAgICAgICAgICAgICtvYi0+TmFtZShXRVIsMSkgKyAiIGlzdCBtb21lbnRhbiBuaWNodCBhdWYgZGVyIExpc3RlLiBEZXIgIgorICAgICAgICAgICAgIkdlZ2Vuc3RhbmQgd3VyZGUgamV0enQgYWxzIFZvcnNjaGxhZyBnZXNwZWljaGVydC4gQml0dGUgaGFiICIKKyAgICAgICAgICAgICJldHdhcyBHZWR1bGQsIGJpcyBzaWNoIGplbWFuZCBkZW4gR2VnZW5zdGFuZCBhbmdlc2NoYXV0IGhhdC4iKSk7CisgICAgLy8gZ2dmLiByZXNldCByZWFrdGl2aWVyZW4gdW5kIE1haW50YWluZXIgaW5mb3JtaWVyZW4uCisgICAgaWYgKCFxdWVyeV9uZXh0X3Jlc2V0KCkpCisgICAgICBzZXRfbmV4dF9yZXNldCgxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBnZXRyYWdlbmVzPworICBpZiAob2ItPlF1ZXJ5UHJvcChQX1dPUk4pKSB7CisgICAgICBvYi0+RG9VbndlYXIoMCk7CisgICAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX1dPUk4pKSB7IC8vQVJHTC4gR1JVTU1FTC4KKyAgICAgICAgaWYgKG9iamVjdHAoUEwpKQorICAgICAgICAgIHRlbGxfb2JqZWN0KFBMLEJTKCJXaWxsc3QgRHUgIitvYi0+bmFtZShXRU4sMSkgKyAiIG5pY2h0IGVyc3RtYWwgIgorICAgICAgICAgICAgICAgICJhdXN6aWVoZW4/IikpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgfQorICAvLyBlbnRoYWVsdCBlcyBpcmdlbmR3ZWxjaGUgYW5kZXJlbiBPYmpla3RlPworICBpZiAoc2l6ZW9mKGFsbF9pbnZlbnRvcnkob2IpKSkgeworICAgICAgaWYgKG9iamVjdHAoUEwpKQorICAgICAgICB0ZWxsX29iamVjdChQTCxCUyhvYi0+TmFtZShXRVIsMSkgKyAiIGlzdCBuaWNodCBsZWVyLiIpKTsKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgLy8gYW5kZXJlIEVpbnNjaHJhZW5rdW5nZW4sIGFscyBoaWVyIGdlcHJ1ZWZ0IHdlcmRlbiwgZ2lidCBlcyBuaWNodC4KKyAgcmV0dXJuIDA7Cit9CisKKy8vIGhpZXIgaXN0IGRhcyBPYmpla3QgamV0enQgaW4gZGVyIFRydWhlLCBkLmguIERhdGVuIHNwZWljaGVybiB1bmQgT2JqZWt0CisvLyBkZXN0cnVjdGVuLiA7KQordm9pZCBOb3RpZnlJbnNlcnQob2JqZWN0IG9iLCBvYmplY3Qgb2xkZW52KSB7CisKKyAgLy8gRGFzIE9iamVrdCwgd2FzIGRpZSBUcnVoZSBnZXJhZGUgc2VsYmVyIGJld2VndCwgd2lyZCBpZ25vcmllcnQuCisgIGlmICghb2JqZWN0cChvYikgfHwgb2I9PW9iX2luX2Jld2VndW5nKQorICAgIHJldHVybjsKKyAgU1RPUkVMT0coc3ByaW50ZigiJXMgZGVwb25pZXJ0ICVzIFslT10sIERhdGVuOiAlTyIsZ2V0dWlkKFBMKSxvYi0+bmFtZShXRU4sMCksCisgICAgICAgIG9iLG9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikpKTsKKyAgLy8gbm9ldGlnIHNpbmQgZGllIElEcywgZGVuIE5hbWVuIHVuZCBkaWUgQVVUT0xPQURPQkotRGF0ZW4gZGVzIE9iamVrdHMuCisgIC8vIDstKQorICBhdXRvbG9hZGVyW0JMVUVfTkFNRShvYiksQUxEQVRBXT1vYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopOworICBhdXRvbG9hZGVyW0JMVUVfTkFNRShvYiksSURTXT1vYi0+UXVlcnlQcm9wKFBfSURTKTsKKyAgLy8gT2JqZWt0ZSwgZGllIDAgYWxzIHNob3J0IGxpZWZlcm4sIGtyaWVnZW4gZWluZSBTdGFuZGFyZC1TaG9ydCB1bmQgd2VyZGVuCisgIC8vIHNpY2h0YmFyIGdlbWFjaHQsIGRhIHNpZSBzb25zdCBuaWNodCB3aWVkZXJ6dWZpbmRlbiBzaW5kLiBPYmpla3RlLCBkaWUKKyAgLy8gdW5zaWNodGJhciBzZWluIHNvbGxlbiwgZHVlcmZlbiBuaWNodCBlcmxhdWJ0IHdlcmRlbi4KKyAgLy8gVE9ETyBlaW5lIElEIGFscyBTaG9ydCBuZWhtZW4/CisgIGF1dG9sb2FkZXJbQkxVRV9OQU1FKG9iKSxOQU1FXT1jYXBpdGFsaXplKChvYi0+c2hvcnQoKXx8IjxVbmJla2FubnQ+LlxuIilbLi48M10pOworICAvLyBuYWNoIGRlbSBNb3ZlIGRpZSByZWFsZW4gT2JqZWt0ZSBkZXN0cnVjdGVuLgorICBjYWxsX291dCgjJ2NoZWNrX2NvbnRlbnQsIDApOworICBzYXZlX21lKCk7Cit9CisKKy8vIE9iamVrdCB3dXJkZSBlbnRub21tZW4sIGFsc28gYXVzIGRlciBMaXN0ZSBkZXIgZW50aGFsdGVuZW4gQXV0b2xvYWRlcgorLy8gbG9lc2NoZW4uIEF1c3NlcmRlbSBPYmpla3Qga29uZmlndXJpZXJlbi4gRGllcyB3aXJkIGVyc3QgaGllciBnZW1hY2h0IHVuZAorLy8gbmljaHQgaW4gY3JlYXRlX29iamVjdCgpLCBkYW1pdCBlcyBzbyBhZWhubGljaCB3aWUgbW9lZ2xpY2ggenVtIGNsb25lbiBkZXIKKy8vIEF1dG9sb2FkZXIgYmVpbSBlcnN0ZWxsZW4gZGVzIFNwaWVsZXJvYmpla3RlcyB3aXJkIChkb3J0IHdpcmQgZXJzdCBiZXdlZ3QsCisvLyBkYW5uIGtvbmZpZ3VyaWVydCkuCit2b2lkIE5vdGlmeUxlYXZlKG9iamVjdCBvYiwgb2JqZWN0IGRlc3QpIHsKKyAgc3RyaW5nIGVycm9yLCBvbmFtZTsKKyAKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIAorICBvbmFtZT1CTFVFX05BTUUob2IpOworICBpZiAoIW1lbWJlcihhdXRvbG9hZGVyLG9uYW1lKSkgeworICAgIC8vIERhcyBzb2xsdGUgZGVmaW5pdGl2IG5pY2h0IHBhc3NpZXJlbi4KKyAgICBFUlJMT0coc3ByaW50ZigiR2VnZW5zdGFuZCAoJU8pIHd1cmRlIGVudG5vbW1lbiwgZGVyIG5pY2h0ICIKKyAgICAgICJnZXNwZWljaGVydCB3YXIhIixvYikpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIHdlbm4ga2VpbiBGZWhsZXI6IE9iamVrdCBhdXMgTGlzdGUgbG9lc2NoZW4uIFNvbnN0IHdpcmQgZGFzIE9iamVrdAorICAvLyB6ZXJzdG9lcnQuIERhbWl0IGJsZWliZW4gZGllIEF1dG9sb2FkZXItRGF0ZW4gaGllciBlcmhhbHRlbiB1bmQgZGVyCisgIC8vIFNwaWVsZXIgaGF0IGtlaW4gZGlzZnVua3Rpb25hbGVzIE9iamVrdCBpbSBJbnZlbnRhci4KKyAgaWYgKGVycm9yKSB7CisgICAgRVJSTE9HKHNwcmludGYoIkZlaGxlciBiZWltIEtvbmZpZ3VyaWVyZW4gdm9uICVPLiBGZWhsZXJtZWxkdW5nOiAlTy4iCisgICAgICAgICJEYXRlbjogJU8iLG9iLGVycm9yLGF1dG9sb2FkZXJbb25hbWUsQUxEQVRBXSkpOworICAgIG9iLT5yZW1vdmUoMSk7CisgICAgaWYgKG9iamVjdHAob2IpKQorICAgICAgZGVzdHJ1Y3Qob2IpOworICB9CisgIGVsc2UgeworICAgIFBJQ0tMT0coc3ByaW50ZigiT2JqZWt0ICglTykgd3VyZGUgZW50bm9tbWVuLiIsb2IpKTsKKyAgICBtX2RlbGV0ZShhdXRvbG9hZGVyLG9uYW1lKTsKKyAgICAvLyBzcGVpY2hlcm4KKyAgICBzYXZlX21lKCk7CisgIH0KK30KKworcHJvdGVjdGVkIHZvaWQgY2hlY2tfY29udGVudCgpIHsKKyAgLy8gd2VubiBPYmpla3RlIG5vY2ggaW4gZGVyIFRydWhlIHNpbmQsIGFsc28gbmljaHQgZXJmb2xncmVpY2ggaW4KKyAgLy8gZWluZW4gU3BpZWxlciBiZXdlZ3Qgd3VyZGVuLCB3ZXJkZW4gemVyc3RvZXJ0LiBEYXRlbnZlcmx1c3QgZ2lidCBlcworICAvLyBoaWVyYmVpIG5pY2h0LCB3ZWlsIGRpZSBEYXRlbiBkZXIgQXV0b2xvYWRlciBudXIgZHVyY2ggTm90aWZ5TGVhdmUoKQorICAvLyBnZWxvZXNjaHQgd2VyZGVuLgorICBmb3JlYWNoKG9iamVjdCBvYjogYWxsX2ludmVudG9yeSgpKSB7CisgICAgb2ItPnJlbW92ZSgxKTsKKyAgICBpZiAob2JqZWN0cChvYikpIGRlc3RydWN0KG9iKTsKKyAgfQorfQorCisvLyBoaWVyIG5vY2htYWwgc2NoYXVlbiwgb2IgZGFzIE9iamVrdCBhdWNoIGluIGRlbiByaWNodGlnZW4gU3BpZWxlciBiZXdlZ3QKKy8vIHdpcmQuLi4gRmFsbHMgZGFzIG1vdmUgZGFubiBoaWVyIGFiZ2Vicm9jaGVuIHdpcmQsIHdpcmQgZGFzIE9iamVrdCBpbQorLy8gbmFlY2hzdGVuIEhCIHZvbiBkZXIgVHJ1aGUgemVyc3RvZXJ0LiAoY2hrX2NvbnRlbnRzKCkpCit2YXJhcmdzIGludCBQcmV2ZW50TGVhdmUob2JqZWN0IG9iLCBtaXhlZCBkZXN0KSB7CisgIG9iamVjdCBvYjI7CisgIAorICAvL0RFQlVHKHNwcmludGYoIlByZXZlbnRMZWF2ZSgpOiBPYjogJU8sIERlc3Q6ICVPICglTykiLAorICAvLyAgICAgICAgb2IsZGVzdCwob2JqZWN0cChkZXN0KT8iT2JqZWt0IjoiTm9uLU9iamVjdCIpKSk7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkgcmV0dXJuIDA7IAorICAvLyBmYWxscyBzdHJpbmcgdWViZXJnZWJlbiwgZXJzdG1hbCB6dWcuIFNwaWVsZXIgZmluZGVuLgorICBpZiAoc3RyaW5ncChkZXN0KSAmJiBzaXplb2YoZGVzdCkpCisgICAgZGVzdD1maW5kX3BsYXllcihkZXN0KTsKKworICAvLyByaWNodGlnZXMgSU50ZXJhY3RpdmU/IERhbm4gZGFyZiBkYXMgT2JqZWt0IHJhdXMuIFNvbnN0IG5pY2h0LiA7LSkKKyAgaWYgKCFvYmplY3RwKGRlc3QpIHx8ICFpbnRlcmFjdGl2ZShkZXN0KSB8fCBnZXR1dWlkKGRlc3QpIT11dWlkKQorICAgICAgcmV0dXJuIDE7CisKKyAgLy8gcHJ1ZWZlbiwgb2IgZGVyIFNwaWVsZXIgc2Nob24gZWluIE9iamVrdCBkaWVzZXIgQmx1ZXByaW50IGRhYmVpIGhhdC4gV2VubgorICAvLyBqYSwgQWJicnVjaCwgZGFzIGtvZW5udGUgc29uc3QgenV2aWVsZSBQcm9ibGVtZSBnZWJlbi4KKyAgaWYgKG9iamVjdHAob2IyPXByZXNlbnRfY2xvbmUob2IsZGVzdCkpKSB7CisgICAgdGVsbF9vYmplY3QoZGVzdCxCUygiRHUgaGFzdCBiZXJlaXRzICIrb2IyLT5uYW1lKFdFTiwwKSArCisgICAgICAgICIgZGFiZWkuIFp3ZWkgR2VnZW5zdGFlbmRlIGRpZXNlciBBcnQga2FubnN0IGR1IG5pY2h0IGdsZWljaHplaXRpZyAiCisgICAgICAgICJtaXQgRGlyIGhlcnVtdHJhZ2VuLiIpKTsKKyAgICByZXR1cm4gMTsgLy9uaWNodCByYXVzbmVobWVuLgorICB9CisgIHJldHVybiAwOworfQorCisvLyBPYmpla3RlIGF1c2dlYmVuLCBkaWUgaGllciBhbmdlYmxpY2ggZHJpbiBzaW5kLiA7LSkgR2lidCBhYmVyIG51ciBkaWUKKy8vIEF1dG9sb2FkZXIgYXVzLCBrZWluZSBlY2h0ZW4gT2JqZWt0LCBkaWUgQ29udGFpbmVyIHNpbmQuIEFsbGVyZGluZ3Mgc29sbHRlCisvLyBzb3dhcyBlaCBuaWNodCB2b3Jrb21tZW4uIDstKQorLy8gZmxhZ3M6IDEgLSByZXR1cm4gYXJyYXksIDIgLSBkb24ndCBjb2xsZWN0IGVxdWFsIG9iamVjdHMgJworLy8gZmxhZ3M6IDQgLSBkb24ndCBhcHBlbmQgaW5mb3MgZm9yIHdpemFyZHMKK3ZhcmFyZ3MgbWl4ZWQgbWFrZV9pbnZsaXN0KG9iamVjdCB2aWV3ZXIsIG1peGVkIGludiwgaW50IGZsYWdzKSB7CisgIGludCBpc3dpejsKKyAgbWl4ZWQgb2JqczsKKworICBpc3dpeiA9IElTX0xFQVJORVIoIHZpZXdlciApICYmIHZpZXdlci0+UXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pOworICAvLyBNYXBwaW5nIGJlbnV0emVuLCB1bSBtdWx0aXBsZW4gT3ZlcmhlYWQgZnVlciBhbGxva2F0aW9uIGltIGZvcmVhY2goKSB6dQorICAvLyB2ZXJtZWlkZW4uCisgIG9ianM9bV9hbGxvY2F0ZShzaXplb2YoYXV0b2xvYWRlciksMSk7CisgIGZvcmVhY2goc3RyaW5nIG9uYW1lLCBzdHJpbmcgKmlkcywgc3RyaW5nIHNoOiBhdXRvbG9hZGVyKSB7CisgICAgaWYgKGlzd2l6ICYmICEoZmxhZ3MgJiA0KSkKKyAgICAgIG9ianNbb25hbWVdPXNoICsgIi4gWyIrb25hbWUrIl0iOworICAgIGVsc2UKKyAgICAgIG9ianNbb25hbWVdPXNoICsgIi4iOworICB9CisgIGlmKGZsYWdzICYgMSkgcmV0dXJuKG1fdmFsdWVzKG9ianMpLSh7IiJ9KSk7CisgIGlmKCFzaXplb2YoYXV0b2xvYWRlcikpIHJldHVybiAiIjsKKyAgcmV0dXJuIHNwcmludGYoIiUiKyhzaXplb2Yob2JqcykgPiA2ID8gIiMiIDogIj0iKSsiLTc4cyIsCisgICAgICAgICAgICAgICAgIGltcGxvZGUobV92YWx1ZXMob2JqcyktKHsiIn0pLCAiXG4iKSkgKyAiXG4iOworfQorCisvLyBlcnpldWd0IGRhcyBiZW5hbm50ZSBPYmpla3QgdW5kIGxpZWZlcnQgZXMgenVydWVjay4gTGllZmVydCAwIGltIEZlaGxlcmZhbGwuCisvLyBhdXNzZXJkZW0gYmV3ZWd0IGVzIGRhcyBPYmpla3QgaW4gZGllIFRydWhlLCBkYW1pdCBlcyBlaW4gRW52IGhhdCB1bmQgZGllCisvLyBUcnVoZSB2aWEgTm90aWZ5TGVhdmUoKSBtaXRrcmllZ3QsIGRhc3MgZXMgdGF0c2FlY2hsaWNoIGVudG5vbW1lbiB3dXJkZS4KK3ByaXZhdGUgb2JqZWN0IGNyZWF0ZV9vYmplY3Qoc3RyaW5nIG9uYW1lKSB7CisgIHN0cmluZyBlcnJvcjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCBub2dldDsKKyAgaWYgKCFtZW1iZXIoYXV0b2xvYWRlcixvbmFtZSkpIHJldHVybiAwOworCisgIC8vQmx1ZXByaW50IGZpbmRlbiAoamEsIGRhcyBpc3QgbmljaHQgdW5iZWRpbmd0IG5vZXRpZywgbWFuIGtvZW5udGUgYXVjaAorICAvL2RpcmVrdCBjbG9uZW4pCisgIGlmIChlcnJvcj1jYXRjaChvYj1sb2FkX29iamVjdChvbmFtZSk7cHVibGlzaCkgfHwKKyAgICAgICFvYmplY3RwKG9iKSkgeworICAgIEVSUkxPRyhzcHJpbnRmKCJLb25udGUgJXMgbmljaHQgbGFkZW4vZmluZGVuLiBGZWhsZXI6ICVPIiwKKyAgICAgICAgICBvbmFtZSxlcnJvcikpOworICAgIHJldHVybiAwOworICB9CisgIC8vIGNsb25lbgorICBpZiAoZXJyb3I9Y2F0Y2gob2I9Y2xvbmVfb2JqZWN0KG9uYW1lKTtwdWJsaXNoKSB8fAorICAgICAgIW9iamVjdHAob2IpKSB7CisgICAgRVJSTE9HKHNwcmludGYoIktvbm50ZSAlcyBuaWNodCBjbG9uZW4uIEZlaGxlcjogJU8iLAorICAgICAgICBvbmFtZSxlcnJvcikpOworICAgIHJldHVybiAwOworICB9CisgIC8vIGtvbmZpZ3VyaWVyZW4KKyAgZXJyb3I9Y2F0Y2gob2ItPlNldFByb3AoUF9BVVRPTE9BRE9CSixhdXRvbG9hZGVyW29uYW1lLEFMREFUQV0pO3B1Ymxpc2gpOworCisgIC8vT2JqZWt0IGJld2VnZW4sIGRhYmVpIE9iamVrdCBpbiBnbG9iLiBWYXIuIG1lcmtlbiwgZGFtaXQgUHJldmVudEluc2VydCgpCisgIC8vdW5kIE5vdGlmeUluc2VydCgpIGVzIGlnbm9yaWVyZW4uICpzZXVmeioKKyAgb2JfaW5fYmV3ZWd1bmc9b2I7CisgIG9iLT5tb3ZlKE1FLE1fTk9DSEVDSyk7CisgIG9iX2luX2Jld2VndW5nPTA7CisKKyAgLy8gamV0enQgbm9jaCBuZW4gQ2FsbG91dCBzdGFydGVuLCBkYW1pdCBkYXMgT2JqZWt0IHplcnN0b2VydCB3aXJkLCB3ZW5uIGVzCisgIC8vIG5pY2h0IHdpcmtsaWNoIGluIGVpbmVuIFNwaWVsZXIgYmV3ZWd0IHdpcmQuCisgIGNhbGxfb3V0KCMnY2hlY2tfY29udGVudCwxKTsKKworICByZXR1cm4ob2IpOworfQorCisvLyBTY2hhdWVuLCBvYiBkaWUgdHJ1aGUgZWluIE9iamVrdCBtaXQgcGFzc2VuZGVyIElEIGVudGhhZWx0LiBXZW5uCisvLyBqYSwgZGFzIE9iamVrdCBlcnpldWdlbiB1bmQgenVydWVja2xpZWZlcm4uIAorLy8gRGllc2UgRnVua3Rpb24gaGF0IGVpbmUgUmVpaGUgdm9uIE5hY2h0ZWlsZW4gYnp3LiBEZWZpeml0ZW4gZ2d1ZS4gZGVyCisvLyBub3JtYWxlcndlaXNlIGluIENvbnRhaW5lcm4gZGVmaW5pZXJ0ZW4gRnVua3Rpb246CisvLyAtIE51ciBkYXMgZXJzdGUgT2JqZWt0LCBhdWYgZGFzIGlkIHBhc3N0LiBJY2ggaGFiIGVyc3RtYWwga2VpbmUgTHVzdCwKKy8vICAgaGllciBtZWhyZXJlIE9iamVrdGUgenUgZXJ6ZXVnZW4uIE1hbCBzY2hhdWVuLCBvYiBlcyBzbyBnZWh0LiBBdWNoIHdhZXJlCisvLyAgIGVzIGVpbiBQcm9ibGVtLCB3ZW5uIHZpZWxlIE9iamVrdCBkaWUgRXZhbGdyZW56ZSBiencuIG5pY2h0IGFsbGUgaW4gZGVuCisvLyAgIFNwaWVsZXIgYmV3ZWd0IHdlcmRlbiwgbmFjaGRlbSBzaWUgZXJ6ZXVndCB3dXJkZW4uCisvLyAtIGtlaW5lIGtvbXBsZXhlbiBBdXNkcnVlY2tlLCBudXIgcmVpbmUgSURzLgorLy8gSWNoIGhhbHRlIGRlbiBBdWZ3YW5kIGZ1ZXIgbmljaHQgZ2VyZWNodGZlcnRpZ3QuCitvYmplY3QgKnByZXNlbnRfb2JqZWN0cyggc3RyaW5nIGNvbXBsZXhfZGVzYyApIHsKKyAgb2JqZWN0IG9iOworICBpZiAoIXN0cmluZ3AoY29tcGxleF9kZXNjKSB8fCAhc2l6ZW9mKGNvbXBsZXhfZGVzYykpCisgICAgICByZXR1cm4gKHt9KTsKKyAgLy8gZGllc2UgRnVua3Rpb24gbGllZmVydCBudXIgT2JqZXRlIHp1cnVlY2ssIHdlbm4gZGVyIHJpY2h0aWdlIEludGVyYWN0aXZlCisgIC8vIHZlcnN1Y2h0LCBzaWUgenUgZW50bmVobWVuLiA7LSkKKyAgaWYgKCFvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwKKyAgICAgIGdldHV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSE9dXVpZCkKKyAgICAgIHJldHVybiAoe30pOworCisgIC8vICJhbGxlcyIgbGllZmVydCBkYXMgZXJzdGJlc3RlIE9iamVrdC4KKyAgaWYgKGNvbXBsZXhfZGVzYz09ImFsbGVzIiAmJiBzaXplb2YoYXV0b2xvYWRlcikpCisgIHsKKyAgICBzdHJpbmcgb25hbWU9bV9pbmRpY2VzKGF1dG9sb2FkZXIpWzBdOworICAgIG9iPWNyZWF0ZV9vYmplY3Qob25hbWUpOworICAgIGlmIChvYmplY3RwKG9iKSkgcmV0dXJuICh7b2J9KTsKKyAgfQorCisgIC8vIHVlYmVyIGFsbGUgRWludHJhZWdlIGdlaGVuLCBiaXMgZWluZSBJRCBzdGltbXQsIGVyc3RlcyBwYXNzZW5kZXMgT2JqZWt0CisgIC8vIGVyemV1Z2VuIHVuZCBpbiBlaW5lbSBBcnJheSB6dXJ1ZWNrbGllZmVybi4KKyAgZm9yZWFjaChzdHJpbmcgb25hbWUsIHN0cmluZyAqaWRzOiBhdXRvbG9hZGVyKSB7CisgICAgaWYgKG1lbWJlcihpZHMsY29tcGxleF9kZXNjKT09LTEpIGNvbnRpbnVlOworICAgIG9iPWNyZWF0ZV9vYmplY3Qob25hbWUpOworICAgIGJyZWFrOyAvL29iamVrdCBnZWZ1bmRlbiwgZmVydGlnIGhpZXIKKyAgfQorICBpZiAob2JqZWN0cChvYikpIHJldHVybiAoe29ifSk7CisgIHJldHVybiAoe30pOyAvLyBuaXggZ2VmdW5kZW4KK30KKworCisKKy8vICoqKioqKioqKioqKioqKioqKiogVmVyd2FsdHVuZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gcmVnaXN0cmllcnQgZGllIFRydWhlIGF1ZiBkZW4gamV3ZWlsaWdlbiBFaWdlbnR1ZW1lci4KK3Byb3RlY3RlZCB2b2lkIFNldEJlc2l0emVyKHN0cmluZyB1bnVzZWQsIHN0cmluZyBuZXd1dWlkKSB7CisgIGlmICghc3RyaW5ncChuZXd1dWlkKSB8fCAhc2l6ZW9mKG5ld3V1aWQpKSByZXR1cm47CisgIC8vIHdlbm4gc2Nob24gcmVnaXN0cmllcnQsIGFiYnJlY2hlbgorICBpZiAoc3RyaW5ncCh1dWlkKSAmJiBzaXplb2YodXVpZCkpIHJldHVybjsKKworICB1dWlkPW5ld3V1aWQ7CisgIFNldChIX0ZVUk5JVFVSRSx1dWlkLEZfVkFMVUUpOyAvL1NldG1ldGhvZGUgdW1nZWhlbiwgc29uc3QgUmVrdXJzaW9uIAorICAvLyBhYiBqZXR6dCBudXIgbm9jaCB2b24gZGVyIFRydWhlIHNlbGJlci4KKyAgU2V0KEhfRlVSTklUVVJFLFNFQ1VSRUQsRl9NT0RFX0FTKTsKKyAgCisgIC8vIERhdGVuIGZ1ZXIgZGVuIEJlbnV0emVyIGF1cyBkZXIgQmx1ZXByaW50IGhvbGVuIChCUCBsaWVmZXJ0IEtFSU5FIEtvcGllCisgIC8vIHVuZCBlcyBkYXJmIEtFSU5FIGdlbWFjaHQgd2VyZGVuISk6CisgIGF1dG9sb2FkZXI9KG1hcHBpbmcpbG9hZF9uYW1lKCktPkdldERhdGEodXVpZCk7CisgIAorICAvLyBrZWluZSBEYXRlbiBnZWtyaWVndD8gLT4gRmVobGVyIGxvZ2dlbgorICBpZiAoIW1hcHBpbmdwKGF1dG9sb2FkZXIpKQorICB7CisgICAgRVJSTE9HKHNwcmludGYoIktlaW5lIGd1ZWx0aWdlbiBEYXRlbiB2b20gVHJ1aGVubWFzdGVyIChCUCkgZXJoYWx0ZW4uICIKKyAgICAgICAgImluaXRpYWxpc2llcmUgbWl0IGxlZXJlbSBNYXBwaW5nLiA6LSgiKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAiS2VpbmUgZ3VlbHRpZ2VuIERhdGVuIHZvbSBUcnVoZW5tYXN0ZXIgKEJQKSBmdWVyIFVVSUQgJXMgIgorICAgICAgICAgICJlcmhhbHRlbi5cbiIsdXVpZCkpOworICB9Cit9CisKKy8vIFNldC1GdW5rdGlvbgorc3RyaW5nIF9zZXRfaF9mdXJuaXR1cmUobWl4ZWQgYXJnKSB7CisgIGlmIChzdHJpbmdwKGFyZykpCisgIHsKKyAgICBTZXRCZXNpdHplcigwLGFyZyk7IC8vIGJyaWNodCBhYiwgd2VubiBiZXJlaXRzIHJlZ2lzdHJpZXJ0LgorICB9CisgIHJldHVybih1dWlkKTsKK30KKworLy8gRmFsbHMgZGFzIFNwZWljaGVybiBpbiBkZXIgQlAgbmljaHQga2xhcHB0ZSwgcnVmZW4gZGllIENsb25lcyBkaWVzZQorLy8gRnVua3Rpb24uIFNjaHJlaWJlbiBkZXIgRGF0ZW4gaW4gaW4gTG9nZmlsZSB6dXIgUmVzdGF1cmllcmVuIHBlciBIYW5kLgorcHJpdmF0ZSB2b2lkIEVtZXJnZW5jeVN0b3JlKGludCByZXMpIHsKKyAgICBFUlJMT0coc3ByaW50ZigiRW1lcmdlbmN5U3RvcmUoKSBjYWxsZWQuIFJ1ZWNrZ2FiZXdlcnQgZGVzICIKKyAgICAgICAgIlRydWhlbm1hc3RlciAoQlApIHdhcjogJU8uIFNwZWljaGVyZSBEYXRlbiBpbiBMb2dmaWxlLiAiLHJlcykpOworICAgIHdyaXRlX2ZpbGUoX19ESVJfXysiQUxUUlVIRS5OT1RGQUxMREFURU4iLAorICAgICAgICBzcHJpbnRmKCJEYXRlbiBmdWVyICVPOlxuJU9cbiIsdXVpZCxhdXRvbG9hZGVyKSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHNhdmVfbWUoKSB7CisgIGludCByZXM7CisgIC8vIG51ciBCUCBzcGVpY2hlcm4KKyAgaWYgKCFjbG9uZXAoTUUpKQorICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgZWxzZQorICB7CisgICAgaWYgKG9iamVjdHAoYmx1ZXByaW50KE1FKSkpCisgICAgICByZXM9KGludClibHVlcHJpbnQoTUUpLT5TdG9yZURhdGEodXVpZCxhdXRvbG9hZGVyKTsKKyAgICBlbHNlCisgICAgICByZXM9KGludClsb2FkX29iamVjdChsb2FkX25hbWUoTUUpKS0+U3RvcmVEYXRhKHV1aWQsYXV0b2xvYWRlcik7CisKKyAgICBpZiAocmVzIT0xKQorICAgICAgRW1lcmdlbmN5U3RvcmUocmVzKTsgLy8gRGF0ZW4gaW4gZWluZW0gTm90ZmFsbC1Mb2dmaWxlIGFibGVnZW4uCisgIH0KK30KKworCisvLyBkaWVzZSBGdW5rdGlvbiB3aXJkIHZvbSBTZWhlcmhhdXNyYXVtIGdlcnVmZW4sIHNvYmFsZCBlaW4gcmVib290ZmVzdGVzCisvLyBNb2ViZWxzdHVlY2sgZXJ6ZXVndCB1bmQga29uZmlndXJpZXJ0IHd1cmRlLgordm9pZCBwb3N0X2NyZWF0ZSgpIHsKKyAgICBpZiAoIWNsb25lcCgpKSByZXR1cm47CisKKyAgICAvLyB3ZW5uIGpldHp0IGtlaW4gRW52OiBkZXN0cnVjdGVuCisgICAgaWYgKCFvYmplY3RwKGVudmlyb25tZW50KCkpKSB7CisgICAgICAgIHJlbW92ZSgxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvL2JlaW0gU2NocmFua21hc3RlciByZWdpc3RyaWVyZW4KKyAgICBTQ0hSQU5LTUFTVEVSLT5SZWdpc3RlckNudChNRSwgUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9zdGQiKQorICAgICAgKyI6IitRdWVyeVByb3AoImNudF92ZXJzaW9uX29iaiIpLCBlbnZpcm9ubWVudCgpLT5RdWVyeU93bmVyKCksCisgICAgICAgZW52aXJvbm1lbnQoKSk7Cit9CisKKy8vIGRpZXNlIEZ1bmt0aW9uIHdpcmQgdm9tIFNjaHJhbmttYXN0ZXIgZ2VydWZlbiwgd2VubiBkaWVzZXIgbWVpbnQsIGRhc3MKKy8vIGRpZXNlcyBPYmpla3QgbmV1IGVyc3RlbGx0IHdlcmRlbiBzb2xsdGUuCitpbnQgVXBkYXRlTWUoKQoreworICBpZiAoIWNsb25lcCgpKQorICAgIHJldHVybiAwOworICBpZiAoIW9iamVjdHAoZW52aXJvbm1lbnQoKSkpCisgICAgcmV0dXJuIDE7CisgIG9iamVjdCBvYj1jbG9uZV9vYmplY3QobG9hZF9uYW1lKE1FKSk7CisgIGlmIChvYmplY3RwKG9iKSkgeworICAgIG9iamVjdCBvbGRlbnY9ZW52aXJvbm1lbnQoKTsKKyAgICAvLyBVVUlEIHVlYmVydHJhZ2VuCisgICAgb2ItPlNldFByb3AoSF9GVVJOSVRVUkUsIHV1aWQpOworICAgIC8vIGhpZXJoaWVyIGJld2VnZW4sIGRhYmVpIHdlcmRlbiBVVUlEIHVuZCBEYXRlbiB2b24gZGVyIG5ldWVuIFRydWhlIG1laXN0CisgICAgLy8gYXV0b21hdGlzY2ggZ2Vob2x0LgorICAgIG9iLT5tb3ZlKG9sZGVudixNX05PQ0hFQ0spOworICAgIC8vIGpldHp0IGVyc3QgcG9zdF9jcmVhdGUoKSBydWZlbiEKKyAgICBvYi0+cG9zdF9jcmVhdGUoKTsKKyAgICAvLyBkaWVzZXMgT2JqZWt0IHJhdXNiZXdlZ2VuIChkYW1pdCBkYXMgU2VoZXJoYXVzIGVzIGF1c3RyYWVndCkuCisgICAgbW92ZSgiL3Jvb20vdm9pZCIsTV9OT0NIRUNLKTsKKyAgICAvLyBTZWhlcmhhdXNyYXVtIHNwZWljaGVybiAoa29lbm50ZSB0ZXVlciBzZWluISkKKyAgICBvbGRlbnYtPlNhdmUoMSk7CisgICAgLy8gc2VsYnN0emVyc3RvZXJlbgorICAgIC8vIF9fSU5UX01BWF9fIGJlZGV1dGV0OiBuaWNodCBzcGVpY2hlcm4sIGRpZSBuZXVlIFRydWhlIGhhdCBkaWUgZGF0ZW4KKyAgICAvLyBzY2hvbiBhdXMgZGVyIEJQIGFiZ2VmcmFndC4KKyAgICByZW1vdmUoX19JTlRfTUFYX18pOworICB9CisgIHJldHVybigxKTsKK30KKworLy8gYmVpIFNlbGJzdHplcnN0b2VydW5nIHNwZWljaGVybiBiencuIERhdGVuIGFuIGRpZSBCbHVlcHJpbnQgdWViZXJtaXR0ZWxuCisvLyB1bmQgYmVpbSBTY2hyYW5rbWFzdGVyIGFibWVsZGVuLgordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgc3RyaW5nIHVpZD0iIjsKKworICAvLyBCbHVlcHJpbnQgc3BlaWNoZXJuIGltIFNhdmVmaWxlLCBDbG9uZXMgdWViZXJ0cmFnZW4gZGllIERhdGVuIGhpZXIgYW4gZGllCisgIC8vIEJsdWVwcmludC4gQ2xvbmVzIG51ciwgd2VubiBuaWNodCBfX0lOVF9NQVhfXyB1ZWJlcmdlYmVuIHd1cmRlLgorICBpZiAoc2lsZW50IT1fX0lOVF9NQVhfXyB8fCAhY2xvbmVwKCkpCisgICAgc2F2ZV9tZSgpOworCisgIGlmIChjbG9uZXAoKSkgeworICAgIC8vIENsb25lIG1lbGRlbiBzaWNoIGJlaW0gU2NocmFua21hc3RlciBhYi4KKyAgICBpZiAob2JqZWN0cChlbnZpcm9ubWVudCgpKSkgeworICAgICAgICB1aWQ9ZW52aXJvbm1lbnQoKS0+UXVlcnlPd25lcigpOworICAgIH0KKyAgICAvL2JlaW0gU2NocmFua21hc3RlciBkZXJlZ2lzdHJpZXJlbgorICAgIFNDSFJBTktNQVNURVItPlJlbW92ZUNudChNRSx1aWQpOworICB9CisgIHJldHVybig6OnJlbW92ZShzaWxlbnQpKTsKK30KKworLy8gKioqKioqKioqKioqKioqKiogTlVSIEJMVUVQUklOVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIG5ldWVuIEF1dG9sb2FkZXIgenVsYXNzZW4gKG51ciBFTSshKQordmFyYXJncyBpbnQgQWRkQXV0b2xvYWRlcihzdHJpbmcgcGF0aCxzdHJpbmcgbmFtKSB7CisgIG9iamVjdCBvYjsKKyAgaWYgKGNsb25lcChNRSkpIHJldHVybiAwOworICBpZiAoIXN0cmluZ3AocGF0aCkgfHwgIXNpemVvZihwYXRoKSkgcmV0dXJuIC0xOworICBpZiAoIUFDQ0VTUykgcmV0dXJuIC0yOworICAvL2lmICghQVJDSF9TRUNVUklUWSkgcmV0dXJuIC0yOworICBpZiAobWVtYmVyKHdoaXRlbGlzdCxwYXRoKSkgcmV0dXJuIC0zOworICBpZiAoY2F0Y2gob2I9bG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkKKyAgICAgIHx8ICFvYmplY3RwKG9iKSkKKyAgICAgIHJldHVybiAtNDsKKyAgLy8gd2VubiBOYW1lIG5pY2h0IGFuZ2VnZWJlbiB1bmQgYXVjaCBuaWNodCBhdXMgQlAgZXJtaXR0ZWxiYXI6IEFiYnJ1Y2guCisgIGlmICghc3RyaW5ncChuYW0pIHx8ICFzaXplb2YobmFtKSkgeworICAgICAgbmFtPW9iLT5uYW1lKFdFUiwwKTsKKyAgICAgIGlmICghc3RyaW5ncChuYW0pIHx8ICFzaXplb2YobmFtKSkgcmV0dXJuIC01OworICB9CisgIElURU1MT0coc3ByaW50ZigiJXMgZXJsYXVidDogJXMgKCVzKVxuIixnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSwKKyAgICAgICAgICBwYXRoLG5hbSkpOworICB3aGl0ZWxpc3QrPShbcGF0aDpjYXBpdGFsaXplKG5hbSldKTsKKyAgaWYgKG1lbWJlcih2b3JzY2hsYWVnZSxwYXRoKSkKKyAgICBtX2RlbGV0ZSh2b3JzY2hsYWVnZSxwYXRoKTsKKyAgc2F2ZV9tZSgpOworICByZXR1cm4oMSk7Cit9CisKKy8vIEF1dG9sb2FkZXIgYXVzIEVybGF1Ym5pc2xpc3RlIGVudGZlcm5lbiAobnVyIEVNKyEpCitpbnQgUmVtb3ZlQXV0b2xvYWRlcihzdHJpbmcgcGF0aCkgeworICBpZiAoY2xvbmVwKE1FKSkgcmV0dXJuIDA7CisgIGlmICghc3RyaW5ncChwYXRoKSB8fCAhc2l6ZW9mKHBhdGgpKSByZXR1cm4gLTE7CisgIGlmICghQUNDRVNTKSByZXR1cm4gLTI7CisgIC8vaWYgKCFBUkNIX1NFQ1VSSVRZKSByZXR1cm4gLTI7CisgIGlmICghbWVtYmVyKHdoaXRlbGlzdCxwYXRoKSkgcmV0dXJuIC0zOworICBJVEVNTE9HKHNwcmludGYoIiVzIHdpZGVycnVmdCBFcmxhdWJuaXM6ICVzICglcylcbiIsZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksCisgICAgICAgICAgcGF0aCx3aGl0ZWxpc3RbcGF0aF0pKTsKKyAgd2hpdGVsaXN0LT0oW3BhdGhdKTsKKyAgc2F2ZV9tZSgpOworICByZXR1cm4oMSk7Cit9CisKKy8vIGVybGF1YnRlIEF1dG9sb2FkZXIgYWJmcmFnZW4KK21hcHBpbmcgUXVlcnlBdXRvbG9hZGVyKCkgeworICByZXR1cm4oY29weSh3aGl0ZWxpc3QpKTsKK30KKworLy8gbmV1ZW4gQXV0b2xvYWRlciBpbiBCbGFja2xpc3QgZWludHJhZ2VuIChudXIgRU0rISkKK3ZhcmFyZ3MgaW50IEFkZEJsYWNrbGlzdChzdHJpbmcgcGF0aCwgc3RyaW5nIG5hbSkgeworICBvYmplY3Qgb2I7CisgIGlmIChjbG9uZXAoTUUpKSByZXR1cm4gMDsKKyAgaWYgKCFzdHJpbmdwKHBhdGgpIHx8ICFzaXplb2YocGF0aCkpIHJldHVybiAtMTsKKyAgaWYgKCFBQ0NFU1MpIHJldHVybiAtMjsKKyAgLy9pZiAoIUFSQ0hfU0VDVVJJVFkpIHJldHVybiAtMjsKKyAgCisgIGlmIChtZW1iZXIoYmxhY2tsaXN0LHBhdGgpKSByZXR1cm4gLTM7CisKKyAgaWYgKGNhdGNoKG9iPWxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpCisgICAgICB8fCAhb2JqZWN0cChvYikpCisgICAgICByZXR1cm4gLTQ7CisgIC8vIHdlbm4gTmFtZSBuaWNodCBhbmdlZ2ViZW4gdW5kIGF1Y2ggbmljaHQgYXVzIEJQIGVybWl0dGVsYmFyOiBBYmJydWNoLgorICBpZiAoIXN0cmluZ3AobmFtKSB8fCAhc2l6ZW9mKG5hbSkpIHsKKyAgICAgIG5hbT1vYi0+bmFtZShXRVIsMCk7CisgICAgICBpZiAoIXN0cmluZ3AobmFtKSB8fCAhc2l6ZW9mKG5hbSkpIHJldHVybiAtNTsKKyAgfQorICAvLyBnZ2YuIGVybGF1YnRlbiBlbnRmZXJuZW4uCisgIGlmIChtZW1iZXIod2hpdGVsaXN0LHBhdGgpKQorICAgIFJlbW92ZUF1dG9sb2FkZXIocGF0aCk7CisgIElURU1MT0coc3ByaW50ZigiJXMgdmVyYmlldGV0OiAlcyAoJXMpXG4iLGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLAorICAgICAgICAgIHBhdGgsbmFtKSk7CisKKyAgYmxhY2tsaXN0Kz0oW3BhdGg6Y2FwaXRhbGl6ZShuYW0pXSk7CisKKyAgaWYgKG1lbWJlcih2b3JzY2hsYWVnZSxwYXRoKSkKKyAgICBtX2RlbGV0ZSh2b3JzY2hsYWVnZSxwYXRoKTsKKworICBzYXZlX21lKCk7CisgIHJldHVybigxKTsKK30KKworLy8gQXV0b2xvYWRlciBhdXMgQmxhY2tsaXN0IGVudGZlcm5lbiAobnVyIEVNKyEpCitpbnQgUmVtb3ZlQmxhY2tsaXN0KHN0cmluZyBwYXRoKSB7CisgIGlmIChjbG9uZXAoTUUpKSByZXR1cm4gMDsKKyAgaWYgKCFzdHJpbmdwKHBhdGgpIHx8ICFzaXplb2YocGF0aCkpIHJldHVybiAtMTsKKyAgaWYgKCFBQ0NFU1MpIHJldHVybiAtMjsKKyAgLy9pZiAoIUFSQ0hfU0VDVVJJVFkpIHJldHVybiAtMjsKKyAgaWYgKG1lbWJlcihibGFja2xpc3QscGF0aCk9PS0xKSByZXR1cm4gLTM7CisgIElURU1MT0coc3ByaW50ZigiJXMgbG9lc2NodDogJXMgKCVzKSB2b24gQmxhY2tsaXN0XG4iLGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLAorICAgICAgICAgIHBhdGgsYmxhY2tsaXN0W3BhdGhdKSk7CisgIGJsYWNrbGlzdC09KFtwYXRoXSk7CisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuKDEpOworfQorCisvLyBnZXNwZXJydGUgQXV0b2xvYWRlciBhYmZyYWdlbgorbWFwcGluZyBRdWVyeUJsYWNrbGlzdCgpIHsKKyAgcmV0dXJuKGNvcHkoYmxhY2tsaXN0KSk7Cit9CisKKy8vIHZvcnNjaGxhZWdlIGFiZnJhZ2VuCit2YXJhcmdzIG1peGVkIFF1ZXJ5Vm9yc2NobGFlZ2UoaW50IGZvcm1hdCkgeworICBzdHJpbmcgcmVzPSJcbiI7CisgIGlmICghZm9ybWF0KSByZXR1cm4oY29weSh2b3JzY2hsYWVnZSkpOworCisgIGZvcmVhY2goc3RyaW5nIG9uYW1lLCBzdHJpbmcgbmFtLCBzdHJpbmcgc2g6IHZvcnNjaGxhZWdlKSB7CisgICAgcmVzKz1zcHJpbnRmKCIlLjc4czpcbiAgICUuMzdzLCUuMzdzXG4iLG9uYW1lLG5hbSxzaCk7IAorICB9CisKKyAgaWYgKGZvcm1hdD09MiAmJiBvYmplY3RwKFBMKSkKKyAgICB0ZWxsX29iamVjdChQTCxyZXMpOworICBlbHNlCisgICAgcmV0dXJuIHJlczsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFdpcmQgZGllc2UgZnVua3Rpb24gaW4gZGVyIEJsdWVwcmludCBnZXJ1ZmVuLCBsaWVmZXJ0IHNpZSBkaWUgRGF0ZW4gZnVlcgorLy8gZWluZSBUcnVoZSBtaXQgZGllc2VyIFVVSUQgenVydWVjay4gQWJlciBudXIgZGFubiwgd2VubiBkaWUgYXVjaCB2b24gZWluZXIKKy8vIHRydWhlIGFiZ2VydWZlbiB3aXJkIHVuZCBrZWluZW0gYmVsaWViaWdlbiBhbmRlcmVuIE9iamVrdCBvZGVyIHdlbm4gZWluIEVNCisvLyBhYmZyYWd0LgorbWFwcGluZyBHZXREYXRhKHN0cmluZyB1aWQpIHsKKyAgaWYgKGNsb25lcChNRSkpIHJldHVybiAwOworICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgeworICAgIGlmICghb2JqZWN0cChwcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOworICAgIGlmIChibHVlcHJpbnQocHJldmlvdXNfb2JqZWN0KCkpICE9IE1FCisgICAgICAgICYmIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gX19GSUxFX19bLi48M10KKyAgICAgICAgJiYgIUFDQ0VTUykKKyAgICAgICAgcmV0dXJuKDApOworICB9CisgIGlmICghc3RyaW5ncCh1aWQpKSByZXR1cm4gKFtdKTsKKworICBpZiAoIW1lbWJlcihkYXRhLCB1aWQpKQorICAgIGRhdGFbdWlkXSA9IG1fYWxsb2NhdGUoMSwzKTsKKworICAvLyBBYnNpY2h0bGljaCBrZWluZSBLb3BpZSwgZGFtaXQgZGllIFRydWhlbiAoZmFsbHMgamVtYW5kIG1laHJlcmUga2F1ZnQpCisgIC8vIHNpY2ggYWxsZSBlaW5lIEtvcGllIGRlcyBNYXBwaW5ncyB0ZWlsZW4uCisgIHJldHVybiBkYXRhW3VpZF07Cit9CisKKy8vIExvZXN0IGRpZSBTcGVpY2hlcnVuZyBkZXIgRGF0ZW4gaW0gU2F2ZWZpbGUgYXVzLCBkZW5uIGlyZ2VuZHdlbGNoZSBEYXRlbgorLy8gaGFiZW4gc2ljaCBpbiBlaW5lbSBDbG9uZSBnZWFlbmRlcnQsIHdlbGNoZSBub2NoIGF1ZiBkaWUgUGxhdHRlIG11ZXNzZW4uCisvLyBEaWVzZSBGdW5rdGlvbiBzcGVpY2hlcnRlIGZydWVoZXIgRGF0ZW4gYXVzIGRlbiBDbG9uZXMgd2llZGVyIGltIE1hcHBpbmcKKy8vIGRlcyBNYXN0ZXJzIChkZXIgQmx1ZXByaW50KS4gRGllcyBpc3QgaGV1dGUgbmljaHQgbWVociBzbywgd2VpbCBhbGxlIFRydWhlbgorLy8gKGVpbmVzIEJlbnV0emVycykgc2ljaCBkYXRhW3VpZF0gdGVpbGVuLiBEYWhlciB3aXJkIGhpZXIgZWluIEZlaGxlcgorLy8gYXVzZ2Vsb2VzdCwgd2VubiBlcyB2b24gZWluZXIgVHJ1aGUgZWluIE1hcHBpbmcga3JpZWd0LCB3ZWxjaGVzIG5pY2h0CisvLyBpZGVudGlzY2ggKCEpIG1pdCBkZW0gZGF0YVt1aWRdIGlzdC4KKy8vIGxpZWZlcnQgMCBpbSBGZWhsZXJmYWxsIQoraW50IFN0b3JlRGF0YShzdHJpbmcgdWlkLCBtYXBwaW5nIHRtcCkgeworCisgIGlmIChjbG9uZXAoTUUpKSByZXR1cm4gMDsKKworICAvLyBBYmVyIG51ciBkYW5uLCB3ZW5uIGRpZSBhdWNoIHZvbiBlaW5lciB0cnVoZSBhYmdlcnVmZW4gd2lyZCB1bmQga2VpbmVtCisgIC8vIGJlbGllYmlnZW4gYW5kZXJlbiBPYmpla3Qgb2RlciB3ZW5uIGVpbiBFTSBzZXR6dC4KKyAgaWYgKGV4dGVybl9jYWxsKCkpCisgIHsKKyAgICBpZiAoIW9iamVjdHAocHJldmlvdXNfb2JqZWN0KCkpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGJsdWVwcmludChwcmV2aW91c19vYmplY3QoKSkgIT0gTUUgCisgICAgICAgICYmIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gX19GSUxFX19bLi48M10KKyAgICAgICAgJiYgIUFDQ0VTUykKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmICghc3RyaW5ncCh1aWQpIHx8ICFtYXBwaW5ncCh0bXApKQorICAgIHJldHVybigwKTsKKworICAvLyB0bXAgbXVzcyBhdWYgX2Rhc3NlbGJlXyBNYXBwaW5nIHplaWdlbiB3aWUgZGF0YVt1aWRdLiBXZW5uIGRhcyBuaWNodCBkZXIKKyAgLy8gRmFsbCBpc3QsIGlzdCB3YXMgc2NoaWVmZ2VsYXVmZW4uIEplZGVuZmFsbHMgd2lyZCBkYW5uIGhpZXIgbmVuIEZlaGxlcgorICAvLyBhdXNnZWxvZXN0LgorICBpZiAodG1wICE9IGRhdGFbdWlkXSkKKyAgeworLy8gICAgaWYocHJvZ3JhbV90aW1lKHByZXZpb3VzX29iamVjdCgpKSA8IDE0MDA1MjU2OTQpCisvLyAgICAgIGRhdGFbdWlkXT10bXA7CisvLyAgICBlbHNlCisgICAgICByYWlzZV9lcnJvcigiU3RvcmVEYXRhKCkgZ2VydWZlbiB1bmQgRGF0ZW4gc2luZCBuaWNodCBpZGVudGlzY2ggIgorICAgICAgICAgICJtaXQgZGVuIGJlcmVpdHMgYmVrYW5udGVuLlxuIik7CisgIH0KKworICAvLyBBYnNpY2h0bGljaCBrZWluZSBLb3BpZSwgZGFtaXQgc2ljaCBhbGxlIFRydWhlbiBkYXMgTWFwcGluZyB0ZWlsZW4uCisgIC8vZGF0YVt1aWRdPXRtcDsKKworICAvLyBTYXZlZmlsZSBtdXNzIG5hdHVlcmxpY2ggZ2VzY2hyaWViZW4gd2VyZGVuLCBmdWVyIGRlbiBuYWVjaHN0ZW4gUmVib290LgorICBpZiAoZmluZF9jYWxsX291dCgjJ3NhdmVfbWUpPT0tMSkKKyAgICAgIGNhbGxfb3V0KCMnc2F2ZV9tZSwxMCk7IC8vIFNwZWljaGVydm9yZ2FlbmdlIGdnZi4gc2FtbWVsbiAodXBkIC1hciAuLi4pCisgIHJldHVybigxKTsKK30KKworLy8gTWFpbnRhaW5lciB1ZWJlciBUcnVoZW52b3JzY2hsYWVnZSBpbmZvcm1pZXJlbgordm9pZCByZXNldCgpIHsKKworICBpZiAoY2xvbmVwKCkgfHwgIXNpemVvZih2b3JzY2hsYWVnZSkpIHsKKyAgICAvLyBvaG5lIFZvcnNjaGxhZWdlIGlzdCBhdWNoIGtlaW4gcmVzZXQgbm9ldGlnLgorICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgc2V0X25leHRfcmVzZXQoMTIwMDApOyAvLyBhbGxlIDMtNGggcmVpY2h0LgorICBmb3JlYWNoKHN0cmluZyB1aWQ6IE1BSU5UQUlORVIpIHsKKyAgICBvYmplY3QgcGw9ZmluZF9wbGF5ZXIodWlkKTsKKyAgICBpZiAob2JqZWN0cChwbCkgJiYgcXVlcnlfaWRsZShwbCkgPCAxODAwKQorICAgICAgdGVsbF9vYmplY3QocGwsQlMoIkVzIGdpYnQgbmV1ZSBPYmpla3R2b3JzY2hsYWVnZSBmdWVyIGRpZSAiCisgICAgICAgICJBdXRvbG9hZGVydHJ1aGUuIEJpdHQgc2NoYXUgZGEgZG9jaCBiZWkgR2VsZWdlbmhlaXQgbWFsIGRydWViZXIuIikpOworICB9Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyAqKioqKioqKioqKioqKioqIFNPTlNUSUdFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vICpzZXVmeioKKy8vIHNlY3VyZV9sZXZlbCgpIGF1cyBkZXIgc2ltdWxfZWZ1biBpc3QgaGllciBtb21lbnRhbiBuaWNodCBicmF1Y2hiYXIsIHdlaWwKKy8vIGRvcnQgYXVjaCBwL3NlaGVyL21vZWJlbC9hdXRvbG9hZGVydHJ1aGUgaW4gZGVyIENhbGxlcmtldHRlIHN0ZWh0IHVuZCBkYXMKKy8vIGVpbiBsZXZsZSB2b24gMCBoYXQuICpzZXVmeioKK25vbWFzayBwcml2YXRlIGludCBteV9zZWN1cmVfbGV2ZWwoKSB7CisgIGludCAqbGV2ZWw7CisgIC8va2V0dGUgZGVyIENhbGxlciBkdXJjaGxhdWZlbiwgZGVuIG5pZWRyaWdzdGVuIExldmVsIGluIGRlciBLZXR0ZQorICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKKyAgLy92b24gMC4KKyAgLy9jYWxsZXJfc3RhY2soMSkgZnVlZ3QgZGVtIFJ1ZWNrZ2FiZWFycmF5IHRoaXNfaW50ZXJhY3RpdmUoKSBoaW56dSBiencuIDAsCisgIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgorICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgorICAvL0lOdGVyYWN0aXZlIGdlYmVuIG11c3MuCisgIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQorICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCisgICAgICAgIHJldHVybihxdWVyeV93aXpfbGV2ZWwoZ2V0ZXVpZChjYWxsZXIpKSk7CisgICAgICAgcmV0dXJuKDApOyAvLyBrZWluIE9iamVrdCBkYSwgMC4KKyAgICAgIH0gKTsKKyAgcmV0dXJuKG1pbihsZXZlbCkpOyAvL2RlbiBrbGVpbnN0ZW4gV2VydCBpbSBBcnJheSB6dXJ1ZWNrZ2ViZW4gKGdnZi4gMCkKK30KKworCisvLyBkZWJ1Z2tyYW0KK21peGVkIF9xdWVyeV9jb250ZW50KCkgeworICAvL2RlZXBfY29weSwgZGFtaXQgbmljaHQgamVtYW5kIGVpbmZhY2ggc28gYW4gZGVuIERhdGVuIHJ1bWJhc3RlbG4ga2Fubi4KKyAgcmV0dXJuKGRlZXBfY29weShhdXRvbG9hZGVyKSk7Cit9CisKK21peGVkIF9xdWVyeV9vd25lcigpIHsKKyAgcmV0dXJuKHV1aWQpOworfQorCitpbnQgRGVsZXRlRGF0YShzdHJpbmcgdWlkKSB7CisgIGlmIChjbG9uZXAoTUUpKSByZXR1cm4gMDsKKyAgaWYgKCFzdHJpbmdwKHVpZCkgfHwgIXNpemVvZih1aWQpKSByZXR1cm4gLTE7CisgIGlmICghQUNDRVNTKSByZXR1cm4gLTI7CisgIC8vaWYgKCFBUkNIX1NFQ1VSSVRZKSByZXR1cm4gLTI7CisgIG1fZGVsZXRlKGRhdGEsdWlkKTsKKyAgc2F2ZV9tZSgpOworICByZXR1cm4oMSk7Cit9CisKK21peGVkIHRlc3RmdW4oKSB7cmV0dXJuICJiaW4gZGFcbiI7fQorCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2tsZWlkZXJzY2hyYW5rLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2tsZWlkZXJzY2hyYW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMDliNAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva2xlaWRlcnNjaHJhbmsuYwpAQCAtMCwwICsxLDIwOCBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgS2xlaWRlcnNjaHJhbmsKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDE3LjAzLjIwMDEKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFN3aWZ0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKyNpbmNsdWRlIDxhbnNpLmg+Citpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKKyNkZWZpbmUgVkVSU0lPTl9PQkogIjMiCisKK3N0cmluZyBzdHJhbGw7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICBzd2lmdF9zdGRfY29udGFpbmVyOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEtsZWlkZXJzY2hyYW5rIik7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkluIGRpZXNlbSBtYXNzaXZlbiBIb2x6c2NocmFuayBrYW5uc3QgRHUgZGllIEF1c3J1ZXN0dW5nIGZ1ZXIgZWluZSAiCisgICAgKyJoYWxiZSBBcm1lZSB1bnRlcmJyaW5nZW4uIE1laHJlcmUgUmVnYWxlIHNvcmdlbiBkYWZ1ZXIsIGRhc3MgYWxsZXMgIgorICAgICsic2VpbmVuIGdlb3JkbmV0ZW4gUGxhdHogZmluZGV0LCBkYW1pdCBEdSBlcyBhdWNoIHNjaG5lbGwgIgorICAgICsid2llZGVyZmluZGVzdC4iKSsiQEBjbnRfc3RhdHVzQEAiKTsKKyAgQWRkSWQoKHsia2xlaWRlcnNjaHJhbmsiLCAiaG9senNjaHJhbmsiLCAic2NocmFuayJ9KSk7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIFZFUlNJT05fT0JKKTsKKyAgU2V0UHJvcChQX05BTUUsICJLbGVpZGVyc2NocmFuayIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9NSVNDX1dPT0QsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKyAgU2V0UHJvcCgib2JqX2NtZCIsICJzbGlzdGUgW09iamVrdC1JZF0gW0tsZWlkdW5ncy0vUnVlc3R1bmdzdHlwfFwiYWxsZXNcIl1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyIgIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwZW46IEhlbG1lLCBVbWhhZW5nZSwgUnVlc3R1bmdlbiwgSG9zZW4sIFNjaHVoZSxcbiIKKyAgICAgICAgICAgICAgICAgICAgKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzY2h1aGUsIEd1ZXJ0ZWwsIEFtdWxldHRlLCBSaW5nZSwgS29lY2hlcixcbiIKKyAgICAgICAgICAgICAgICAgICAgKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGlsZGUsIFNvbnN0aWdlc1xuIik7CisgIEFEKCh7InJlZ2FsIiwgInJlZ2FsZSJ9KSwgQlMoIkR1cmNoIGRpZSBSZWdhbGUga29tbXQgZXR3YXMgT3JkbnVuZyBpbiBkaWUgIgorICAgICsidmllbGVuIFNhY2hlbiwgZGllIG1hbiBpbiBkZW4gU2NocmFuayBzdGVja2VuIGthbm4uIER1IGthbm5zdCBEaXIgei5CLiAiCisgICAgKyJlaW5lIExpc3RlIGJlc3RpbW10ZXIgS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXBlbiBkZXMgU2NocmFua2luaGFsdGVzICIKKyAgICArIm1pdCBkZW0gQmVmZWhsIFwic2xpc3RlXCIgYW5zY2hhdWVuLiAoRGFzIGdlaHQgbmF0dWVybGljaCBudXIgYmVpICIKKyAgICArIm9mZmVuZW0gU2NocmFuayEiKSk7CisKKyAgQWRkQ21kKCh7InNsaXN0ZSJ9KSwgImF1Zmxpc3R1bmciKTsKK30KKwordmFyYXJncyBpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpCit7CisgIC8vIE51ciBSdWVzdHVuZy9LbGVpZHVuZyBoYXQgaW4gZGllc2VtIENvbnRhaW5lciB3YXMgdmVybG9yZW4hCisgIGlmICgob2ItPklzQ2xvdGhpbmcoKSB8fCBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKQorICAgICAgJiYgIW9iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkgKQorICB7CisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7CisgIH0KKworICB3cml0ZSggQlMoIkluICIrbmFtZShXRU4sMSkrIiBrYW5uc3QgRHUgbnVyIFJ1ZXN0dW5ncy0vS2xlaWR1bmdzc3R1ZWNrZSBsZWdlbiEiKSk7CisgIHJldHVybiAxOworfQorCitpbnQgYXVmbGlzdHVuZzIoc3RyaW5nIHdhcywgc3RyaW5nIG5mX3N0cjEsIHN0cmluZyBuZl9zdHIyLCBpbnQgYWxsZXMpCit7CisgIHN0cmluZyBvYnNob3J0LCBzdWNoZSwgKnN0cnM7CisgIG9iamVjdCAqb2JzOworICBpbnQgaTsKKyAgbWFwcGluZyBzdWNob2JzOworICBzd2l0Y2god2FzKQorICB7CisgICAgY2FzZSAiaGVsbWUiICAgICAgOiBzdWNoZT1BVF9IRUxNRVQ7IGJyZWFrOworICAgIGNhc2UgInVtaGFlbmdlIiAgIDogc3VjaGU9QVRfQ0xPQUs7IGJyZWFrOworICAgIGNhc2UgInJ1ZXN0dW5nZW4iIDogc3VjaGU9QVRfQVJNT1VSOyBicmVhazsKKyAgICBjYXNlICJob3NlbiIgICAgICA6IHN1Y2hlPUFUX1RST1VTRVJTOyBicmVhazsKKyAgICBjYXNlICJzY2h1aGUiICAgICA6IHN1Y2hlPUFUX0JPT1Q7IGJyZWFrOworICAgIGNhc2UgImhhbmRzY2h1aGUiIDogc3VjaGU9QVRfR0xPVkU7IGJyZWFrOworICAgIGNhc2UgImd1ZXJ0ZWwiICAgIDogc3VjaGU9QVRfQkVMVDsgYnJlYWs7CisgICAgY2FzZSAiYW11bGV0dGUiICAgOiBzdWNoZT1BVF9BTVVMRVQ7IGJyZWFrOworICAgIGNhc2UgInJpbmdlIiAgICAgIDogc3VjaGU9QVRfUklORzsgYnJlYWs7CisgICAgY2FzZSAia29lY2hlciIgICAgOiBzdWNoZT1BVF9RVUlWRVI7IGJyZWFrOworICAgIGNhc2UgInNjaGlsZGUiICAgIDogc3VjaGU9QVRfU0hJRUxEOyBicmVhazsKKyAgICBjYXNlICJzb25zdGlnZXMiICA6IHN1Y2hlPUFUX01JU0M7IGJyZWFrOworICAgIGRlZmF1bHQgICAgICAgICAgIDogd3JpdGUoIkZlaGxlcjogVW5ndWVsdGlnZXIgS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXAuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJGb2xnZW5kZSBUeXBlbiBnaWJ0IGVzOlxuIituZl9zdHIxK25mX3N0cjIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IGJyZWFrOworICB9CisgIG9icz1hbGxfaW52ZW50b3J5KCk7CisgIHN1Y2hvYnM9KFtdKTsKKyAgZm9yKGk9MDtpPHNpemVvZihvYnMpO2krKykKKyAgeworICAgIG9ic2hvcnQ9b2JzW2ldLT5RdWVyeVByb3AoUF9TSE9SVCk7CisgICAgaWYob2JzaG9ydD09Ik5pY2h0cyBiZXNvbmRlcmVzIikgLy8ga2VpbmUgUF9TSE9SVCA/CisgICAgICBvYnNob3J0PW9ic1tpXS0+TmFtZShXRVIpOyAgICAgLy8gICBIb2ZmZW4gd2lyIG1hbCBkYXNzIGRhcyBPYmouIG5lbiBOYW1lbiBoYXQuCisgICAgaWYob2JzW2ldLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSk9PXN1Y2hlKSAgICAvLyBHZXN1Y2h0ZXIgQXJtb3VyVHlwZSBnZWZ1bmRlbi4uLgorICAgIHsKKyAgICAgIGlmKHN1Y2hvYnNbb2JzaG9ydF0pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBfU0hPUlQgZGVzIE9iai4gc2Nob24gaW0gbWFwcGluZz8KKyAgICAgIHsKKyAgICAgICAgaWYoIG9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKSApCisgICAgICAgICAgc3VjaG9ic1tvYnNob3J0XSs9b2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpOyAvLyAgIERhbm4gZGVuIFphZWhsZXIgdW0gQW1vdW50IGhvY2ghCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNob2JzW29ic2hvcnRdKz0xOyAgICAgICAgICAgICAgICAgICAgIC8vICAgRGFubiBkZW4gWmFlaGxlciB1bSAxIGhvY2ghCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCBvYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCkgKQorICAgICAgICAgIHN1Y2hvYnMrPShbb2JzaG9ydDogb2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNob2JzKz0oW29ic2hvcnQ6IDFdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3Rycz1tX2luZGljZXMoc3VjaG9icyk7CisgIGlmKHNpemVvZihzdHJzKSkKKyAgeworICAgIGlmKCFhbGxlcykKKyAgICB7CisgICAgICBzdHJhbGwrPU5hbWUoV0VSLDEpKyIgZW50aGFlbHQgZm9sZ2VuZGUgIitDQVAod2FzKSsiOlxuIjsKKyAgICAgIHN0cmFsbCs9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc3RyYWxsKz1BTlNJX0JPTEQrIj09PSAiK0NBUCh3YXMpKyI6XG4iK0FOU0lfTk9STUFMOworICAgIGZvcihpPTA7aTxzaXplb2Yoc3Rycyk7aSsrKQorICAgIHsKKyAgICAgIGlmKHN1Y2hvYnNbc3Ryc1tpXV0gPiAxKQorICAgICAgICBzdHJhbGwrPXN0cnNbaV0rIi4gKCIrc3VjaG9ic1tzdHJzW2ldXSsiKVxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyYWxsKz1zdHJzW2ldKyIuXG4iOworICAgIH0KKyAgfQorICBlbHNlCisgICAgaWYoIWFsbGVzKQorICAgICAgc3RyYWxsKz1OYW1lKFdFUiwxKSsiIGVudGhhZWx0IGtlaW5lICIrQ0FQKHdhcykrIiFcbiI7CisgIHJldHVybiAxOworfQorCitpbnQgYXVmbGlzdHVuZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnN0cnMsIG9iX2lkLCB3YXMsIG5mX3N0cjEsbmZfc3RyMjsKKyAgc3RyYWxsPSIiOworICBuZl9zdHIxPSIgICAoSGVsbWUsIFVtaGFlbmdlLCBSdWVzdHVuZ2VuLCBIb3NlbiwgU2NodWhlLCBIYW5kc2NodWhlLFxuIgorICAgICAgICAgKyIgICAgR3VlcnRlbCwgQW11bGV0dGUsIFJpbmdlLCBLb2VjaGVyLCBTY2hpbGRlLCBTb25zdGlnZXMpXG4iOworICBuZl9zdHIyPSJTeW50YXg6IHNsaXN0ZSBbT2JqZWt0LUlkXSBbS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXB8XCJhbGxlc1wiXVxuIgorICAgICAgICAgKyJCc3AuOiAgIHNsaXN0ZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiAiKyJoZWxtZVxuIgorICAgICAgICAgKyIgICAgICAgIHNsaXN0ZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiBhbGxlc1xuIjsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyMik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihwcmVzZW50KHN0cik9PVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICB7CisgICAgd3JpdGUoIkZlaGxlcjogRXMgZmVobHQgZWluIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwLiBGb2xnZW5kZSBUeXBlbiBnaWJ0IGVzOlxuIgorICAgICAgICAgK25mX3N0cjErbmZfc3RyMik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3Rycz1vbGRfZXhwbG9kZShzdHIsICIgIik7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IER1IG11c3N0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFuZ2ViZW4hXG4iCisgICAgICAgICAgICAgK25mX3N0cjIpOworICBpZiggc2l6ZW9mKHN0cnMpIDwgMiApIHJldHVybiAwOyAgIC8vIE51ciAxIFBhci4gdW5kIGRlciBpc3QgbmljaHQgZGllIE9iamVrdC1JZAorICBpZiggc2l6ZW9mKHN0cnMpID09IDIgKSAgIC8vIEFuemFobCBQYXIuID0gMgorICB7CisgICAgb2JfaWQ9c3Ryc1swXTsKKyAgICB3YXM9c3Ryc1sxXTsKKyAgICBpZiggSVNUX1pBSEwod2FzKSApICAgICAvLyBPYmpla3QtSWQgei5CLiBtaXQgInNjaHJhbmsgMiIgYW5nZXNwcm9jaGVuPworICAgICAgaWYocHJlc2VudChvYl9pZCsiICIrd2FzKT09VE8pICAgLy8gRmFsbHMgZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCB1bmQga2VpbiAzLiBQYXIhCisgICAgICB7CisgICAgICAgIHdyaXRlKCJGZWhsZXI6IEVzIGZlaGx0IGVpbiBLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cC4gRm9sZ2VuZGUgVHlwZW4gZ2lidCBlczpcbiIKKyAgICAgICAgICAgICAgK25mX3N0cjErbmZfc3RyMik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKCBzaXplb2Yoc3RycykgPT0gMyApCisgIHsKKyAgICBvYl9pZD1zdHJzWzBdKyIgIitzdHJzWzFdOworICAgIHdhcz1zdHJzWzJdOworICB9CisgIGVsc2UgICAgICAgIC8vIEFuemFobCBlcmZvcmRlcmxpY2hlciBQYXJhbWV0ZXIgdWViZXJzY2hyaXR0ZW4hCisgICAgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQob2JfaWQpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZihRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSE9Q05UX1NUQVRVU19PUEVOKQorICB7CisgICAgd3JpdGUoIkRhenUgbXVlc3N0ZSAiK25hbWUoV0VSLDEpKyIgZ2VvZWZmbmV0IHNlaW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorLy8tLS0gSGllciBpc3QgUGFyYW1ldGVycHJ1ZWZ1bmcgenUgRW5kZS4KKyAgd2FzPUxPV0VSKHdhcyk7CisgIGlmKHdhcyE9ImFsbGVzIikKKyAgICBhdWZsaXN0dW5nMih3YXMsIG5mX3N0cjEsIG5mX3N0cjIsIDApOworICBlbHNlCisgIHsKKyAgICBhdWZsaXN0dW5nMigiaGVsbWUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigidW1oYWVuZ2UiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigicnVlc3R1bmdlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJob3NlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzY2h1aGUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigiaGFuZHNjaHVoZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJndWVydGVsIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImFtdWxldHRlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInJpbmdlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImtvZWNoZXIiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigic2NoaWxkZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzb25zdGlnZXMiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgfQorICBUUC0+TW9yZShzdHJhbGwpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva29tbW9kZS5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9rb21tb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMmI1MAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva29tbW9kZS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIEtvbW1vZGUKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDE3LjAzLjIwMDEKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFN3aWZ0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiMyIKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIHN3aWZ0X3N0ZF9jb250YWluZXI6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIEtvbW1vZGUiKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICAiRGllc2Ugcm9idXN0ZSBLb21tb2RlIGF1cyBFaWNoZW5ob2x6IHBhc3N0IGVpbmZhY2ggaW4gamVkZW4gUmF1bS4gIgorICAgICsiTWFuIGthbm4gamVkZSBNZW5nZSBaZXVnIGRhcmluIHZlcnN0YXVlbiwgdW5kIGRpZSB2aWVsZW4gU2NodWJsYWRlbiAiCisgICAgKyJsYXNzZW4gZXMgZWluZmFjaCB2ZXJzY2h3aW5kZW4uIFNvIGVpbiBNb2ViZWxzdHVlY2sgZ2Vob2VydCBlaW5mYWNoICIKKyAgICArImluIGplZGVzIEhhdXMhIikrIkBAY250X3N0YXR1c0BAIik7CisgIEFkZElkKCh7ImtvbW1vZGUifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiS29tbW9kZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTAwKTsgICAgIC8vIE1laHIgc29sbHRlIG5pY2h0IHNlaW4sIGx0LiBUaWFtYWsuCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX09BSywgTUFUX01JU0NfTUFHSUN9KSApOworICBTZXRQcm9wKFBfSU5GTywgIlZlcnN1Y2hzIG1hbCBtaXQ6IFwic2tvbW1hbmRvcyAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIlwiICFcbiIpOworCisgIEFEKCh7InNjaHVibGFkZW4ifSksIEJTKCJFcyBzaW5kIHZpZWxlLCBhYmVyIHp1bSBHbHVlY2sgbXVzc3QgRHUgc2llIG5pY2h0ICIKKyAgICArImVpbnplbG4gYW5zcHJlY2hlbi4gRHUga2FubnN0IGVpbmZhY2ggYWxsZXMgaW4gIituYW1lKFdFTiwxKSsiIHN0ZWNrZW4uIikpOworICBBRCgoeyJtb2ViZWxzdHVlY2sifSksIEJTKE5hbWUoV0VSLDEpKyIgaXN0IGdlbWVpbnQuIikpOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9rdWVobHNjaHJhbmsuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva3VlaGxzY2hyYW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmMWRmNAotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwva3VlaGxzY2hyYW5rLmMKQEAgLTAsMCArMSw0NSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgS3VlaGxzY2hyYW5rCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAxNy4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCitpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKKyNkZWZpbmUgVkVSU0lPTl9PQkogIjMiCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICBzd2lmdF9zdGRfY29udGFpbmVyOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEt1ZWhsc2NocmFuayIpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJEaWVzZXIgc3RyYWhsZW5kd2Vpc3NlIEt1ZWhsc2NocmFuayBkZXIgRmlybWEgQnJvc2NoIHVlYmVyemV1Z3QgZHVyY2ggIgorICAgICsiZWluIGxlaXNlcyBTdW1tZW4gdm9uIHNlaW5lciBGdW5rdGlvbiwgYXVjaCB3ZW5uIER1IG5pY2h0IHdlaXNzdCwgd29oZXIgIgorICAgICsiZXIgZGVuIFN0cm9tIGRhZnVlciBuaW1tdC4gVmVybXV0bGljaCBhdWYgbWFnaXNjaGUgV2Vpc2UuIEFiZXIgRHUga2VubnN0ICIKKyAgICArImRhcyBqYSwgbWl0IE1hZ2llIGxhZXNzdCBzaWNoIGZhc3QgYWxsZXMgZXJrbGFlcmVuLiBHdXQgZGFzcyBkZXIgIgorICAgICsiS3VlaGxzY2hyYW5rIHNvIGdyb3NzIGlzdCwgbWFuIGtvZW5udGUgZWluZW4gYXVzZ2V3YWNoc2VuZW4gRWlzYmFlcmVuICIKKyAgICArImRhcmluIHVudGVyYnJpbmdlbiAtIGFiZXIgZGVyIGR1ZXJmdGUgd29obCB3YXMgZGFnZWdlbiBoYWJlbi4iKQorICAgICsiQEBjbnRfc3RhdHVzQEAiKTsKKyAgQWRkSWQoKHsia3VlaGxzY2hyYW5rIiwgInNjaHJhbmsifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiS3VlaGxzY2hyYW5rIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTAwKTsgICAgIC8vIE1laHIgc29sbHRlIG5pY2h0IHNlaW4sIGx0LiBUaWFtYWsuCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX01JU0NfTUVUQUwsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKworICBBRCgoeyJzdHJvbSJ9KSwgQlMoIktlaW5lIEFobnVuZywgd28gIituYW1lKFdFUiwxKSsiIGRlbiBoZXJuaW1tdCwgYWJlciAiCisgICAgKyJ3aWUgZ2VzYWd0LCBiZXN0aW1tdCBpc3QgTWFnaWUgaW0gU3BpZWwuIikpOworCisgIEFkZFNvdW5kcygoeyJzdW1tZW4ifSksIEJTKCJEYXMgU3VtbWVuIGRlcyBLdWVobHNjaHJhbmtzIHVlYmVyemV1Z3QgRGljaCBkYXZvbiwgIgorICAgICsiZGFzcyBlciBhbiBpc3QuIikpOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9sZXNlcHVsdC5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9sZXNlcHVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjgzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL2xlc2VwdWx0LmMKQEAgLTAsMCArMSw1NTkgQEAKKy8vIEVpbmlnZXIgQ29kZSB3dXJkZSBhdXMgZGVtIFF1ZXN0dGFnZWJ1Y2ggZGVzIFRlbXBlbHMgdWViZXJub21tZW4uCisvLyBEYSBtYW4gZGFzIEJ1Y2gsIHNvYmFsZCBlcyBpbSBhdWZnZXN0ZWxsdGVuIExlc2VwdWx0IGRlcyBTcGllbGVycworLy8gYWJnZWxlZ3Qgd3VyZGUsIGF1Y2ggbGVzZW4ga29lbm5lbiBtdXNzLCBzaW5kIGRpZSBGdW5rdGlvbmVuIHVuZAorLy8gRGV0YWlscyBhdWNoIHdlaXRlcmhpbiBzaW5udm9sbC4gS2F1ZmVuIGthbm4gZXMgamVkZXIgU2VoZXIsIGFiZXIKKy8vIG51dHplbiBrYW5uIG1hbiBlcyBudXIgbWl0IGRlbSB2b24gSGVscyBBdmF0YXIgdWViZXJyZWljaHRlbiBCdWNoLgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSAiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbW9lYmVsLmgiCisjaW5jbHVkZSAiL2Qvc2VoZXIvaGFldXNlci9oYXVzLmgiCisjaW5jbHVkZSAiL2QvYW5mYWVuZ2VyL2Fyay9rbm9jaGVudGVtcGVsL2ZpbGVzLmgiCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworc3RhdGljIHN0cmluZyBvd25lcjsKK3N0cmluZyBsZShzdHJpbmcga2V5KTsKK3N0cmluZyBpbihzdHJpbmcga2V5KTsKK2ludCBjbWRfZWludHJhZ2VuKHN0cmluZyBzdHIpOworaW50IGNtZF9sZXNlbihzdHJpbmcgc3RyKTsKK2ludCB0YWtlX3BhZ2Uoc3RyaW5nIHN0cik7CitpbnQgZHJvcF9ib29rKHN0cmluZyBzdHIpOworaW50IGNtZF9ibGFldHRlcm4oc3RyaW5nIHN0cik7CitpbnQgY21kX29lZmZuZW4oc3RyaW5nIHN0cik7CitpbnQgY21kX3NjaGxpZXNzZW4oc3RyaW5nIHN0cik7Cit2b2lkIEFkZFRoZU9sZERldGFpbHMoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKQorIHsKKyAgc2V0X25leHRfcmVzZXQoLTEpOworICByZXR1cm47CisgfQorCisgOjpjcmVhdGUoKTsKKworb3duZXI9IkFub255bXVzIjsKKworQWRkRGV0YWlsKCJmaW5nZXIiLEJTKAorIkRlaW5lIEZpbmdlciBzb2xsdGVuIHNjaG9uIHZvcnNpY2h0aWcgc2Vpbiwgd2VubiBzaWUgZGFzIFplZGVyIisKKyJuaG9seiBiZXJ1ZWhyZW4uIEVpbmVyc2VpdHMsIGRhbWl0IER1IERpY2ggbmljaHQgdmVybGV0enQsIGFuZCIrCisiZXJlcnNlaXRzLCBkYW1pdCBEdSBuaWNodHMgYmVzY2htdXR6dC4iLDc4KSk7CitBZGREZXRhaWwoKHsiaG9seiIsInplZGVybmhvbHoiLCJ6ZWRlciJ9KSxCUygKKyJBdXMgZWluZW0gZWluemlnZW4gc3RhcmtlbiBTdGFtbSBlaW5lciBaZWRlciBiZWFyYmVpdGV0LCBpc3QgZCIrCisiaWVzZXMgZWRsZSBMZXNlcHVsdCBzY2hvbiBldHdhcyBzZWhyIEZlaW5lcyB1bmQgRGVrb3JhdGl2ZXMuIiw3OCkpOworQWRkRGV0YWlsKCh7InN0YW1tIiwiemVkZXJuc3RhbW0iLCJob2x6c3RhbW0ifSksQlMoCisiRGVyIFplZGVybnN0YW1tIGlzdCB3YWhybGljaCBrdW5zdHZvbGwgdmVyZWRlbHQgd29yZGVuLCBzZWluIGsiKworInJhZWZ0aWdlcyBCcmF1biB3dXJkZSBoZXJ2b3JyYWdlbmQgenVyIEdlbHR1bmcgZ2VicmFjaHQuIiw3OCkpOworQWRkRGV0YWlsKCh7ImJyYXVuIiwiZHVua2VsYnJhdW4ifSksQlMoCisiRGVyIGR1bmtlbGJyYXVuZSBTdGFtbSBnbGFlbnp0IHd1bmRlcnNjaG9lbiwgd2VubiBMaWNodCBhdWYgaWgiKworIm4gZmFlbGx0LiBFaW4gc2VociBhbmdlbmVobWVzIEhvbHosIGRhcyBmdWVyIGRhcyBMZXNlcHVsdCB2ZXJ3IisKKyJlbmRldCB3dXJkZS4iLDc4KSk7CitBZGREZXRhaWwoImdlbHR1bmciLEJTKAorIkphLCBkaWVzZXMgSG9seiBnZWZhZWxsdCBEaXIgc2VociwgZGFzIGdhbnplIFB1bHQgaXN0IGVpbiBiZW1lIisKKyJya2Vuc3dlcnRlcyBLdW5zdHdlcmsuIiw3OCkpOworQWRkRGV0YWlsKCh7Imt1bnN0Iiwid2VyayIsImt1bnN0d2VyayJ9KSxCUygKKyJJbW1lciB3aWVkZXIgZmFlbGx0IERlaW4gYmV3dW5kZXJuZGVyIEJsaWNrIGF1ZiBkYXMgTGVzZXB1bHQuIiw3OCkpOworQWRkRGV0YWlsKCJibGljayIsQlMoCisiV2FjaHNhbSB1bmQgZmxpbmsgd2llIGltbWVyLCBoYXQgZXIgamVkb2NoIGVpbiB3ZW5pZyBwYXVzaWVydCwiKworIiBpbmRlbSBlciBtdWVzc2lnIGF1ZiBkZW0gTGVzZXB1bHQgcnVodC4iLDc4KSk7CitBZGREZXRhaWwoKHsiZmVpbmVzIiwiZGVrb3JhdGl2ZXMifSksQlMoCisiRGFzIHRlaWx3ZWlzZSBlY2tpZ2UgdW5kIGRhbm4gd2llZGVyIHNhbmZ0IGdlc2Nod3VuZ2VuZSwgcnVuZGUiKworIiBMZXNlcHVsdCBzaWVodCBzY2hvbiB6aWVtbGljaCByZXByYWVzZW50YXRpdiBhdXMuIiw3OCkpOworQWRkRGV0YWlsKCJ6ZWRlciIsQlMoCisiVm9uIGlociBpc3QgbnVybWVociBkYXMgUHVsdCBnZWJsaWViZW4sIGFsbGVyZGluZ3MgZmluZGVzdCBEdSwiKworIiBkYXNzIGVzIG5pY2h0IGRlciBzY2hsZWNodGVzdGUgVGVpbCBpc3QuIiw3OCkpOworQWRkRGV0YWlsKCJ0ZWlsIixCUygKKyJEdSBzaWVoc3QgbnVyIGRlbiBiZWFyYmVpdGV0ZW4gVGVpbCBkZXIgWmVkZXIgdm9yIERpci4iLDc4KSk7CitBZGREZXRhaWwoImV4ZW1wbGFyIixCUygKKyJFcyBpc3QgZ2FueiBrbGFyIHp1IHNlaGVuLCBkYXNzIGVzIHNpY2ggbnVyIHVtIGVpbmUgWmVkZXIgaGFuZCIrCisiZWx0LCBhdXMgZGVyIGRpZXNlcyBQdWx0IGVudHN0YW5kLiIsNzgpKTsKK0FkZERldGFpbCgoeyJoYW5kd2VyayIsImt1bnN0In0pLEJTKAorIlRhdHNhZWNobGljaCBpc3QgZGllc2VzIExlc2VwdWx0IGVpbiBzZWhyIHNjaG9lbmVzIEJlaXNwaWVsIGhvIisKKyJlY2hzdGVyIGhhbmR3ZXJrbGljaGVyIEt1bnN0LiIsNzgpKTsKK0FkZERldGFpbCgiYmVpc3BpZWwiLEJTKAorIkVpbiB3ZWl0ZXJlcyBzdGVodCBoaWVyIGR1bW1lcndlaXNlIG5pY2h0IGhlcnVtLiIsNzgpKTsKKworIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIjEiKTsKKyBTZXRQcm9wKFBfTkFNRSwiTGVzZXB1bHQiKTsKKyBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKyBTZXRQcm9wKFBfVkFMVUUsMTApOworIFNldFByb3AoUF9XRUlHSFQsNTAwMDAwKTsKKyBTZXRQcm9wKFBfTk9HRVQsIkRhcyBMZXNlcHVsdCBpc3QgRGlyIHZpZWwgenUgc2Nod2VyLlxuIik7CisgU2V0UHJvcChQX05PU0VMTCwiRHUgYmVoYWVsdHN0IGRhcyBMZXNlcHVsdCBsaWViZXIuXG4iKTsKKyBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfQ0VEQVI6MTAwXSkpOworIFNldFByb3AoSF9GVVJOSVRVUkUsMSk7CisgU2V0UHJvcChQX0lORk8sQlMoCisgIkF1ZiBkaWVzZXMgTGVzZXB1bHQga2FubiBtYW4gZWluIGdhbnogYmVzdGltbXRlcyBzY2h3YXJ6ZXMgQnUiKworICJjaCBsZWdlbi4gRG9ydCBsaWVndCBlcyBwZXJmZWt0LCB1bSBkYXJpbiB6dSBibGFldHRlcm4gdW5kIHp1IisKKyAiIGxlc2VuLiBBdXNzZXJkZW0gYmlyZ3QgZXMgc2ljaGVyIG5vY2ggR2VoZWltbmlzc2UuIiw3OCkpOworCisgQWRkSWQoKHsicHVsdCIsImxlc2VwdWx0IiwiXG5sZXNlcHVsdF9hcmsifSkpOworCisgQWRkQ21kKCJlaW50cmFnZW4mcXVlc3R8YXVmZ2FiZXxsb2VzdW5nfGVybGVibmlzfGFiZW50ZXVlciIsCisgIydjbWRfZWludHJhZ2VuLCJXYXMgd2lsbHN0IER1IGhpZXIgZGVubiBlaW50cmFnZW4gP1xuIik7CisgQWRkQ21kKCh7ImxpZXMiLCJsZXNlIiwibGVzIn0pLCMnY21kX2xlc2VuKTsKKyBBZGRDbWQoIm5pbW0iLCMndGFrZV9wYWdlKTsKKyBBZGRDbWQoKHsibGVnZSIsImxlZyJ9KSwjJ2Ryb3BfYm9vayk7CisgQWRkQ21kKCJibGFldHRlcnxibGFldHRyZXxibGFldHRlcmUmaW4mYnVjaHx0YWdlYnVjaHwiCisgInRlbXBlbHRhZ2VidWNoIiwjJ2NtZF9ibGFldHRlcm4sIldvcmluIHdpbGxzdCBEdSBibGFldHRlcm4gP3wiCisgIldpbGxzdCBEdSBpbSBUYWdlYnVjaCBibGFldHRlcm4gPyIpOworIEFkZENtZCgib2VmZm5lJkBJRHxidWNofHRhZ2VidWNofHRlbXBlbHRhZ2VidWNoIiwjJ2NtZF9vZWZmbmVuLAorICJXYXMgd2lsbHN0IER1IG9lZmZuZW4/XG4iKTsKKyBBZGRDbWQoInNjaGxpZXNzZXxzY2hsaWVzcyZASUR8YnVjaHx0YWdlYnVjaHx0ZW1wZWx0YWdlYnVjaCIsCisgIydjbWRfc2NobGllc3NlbiwiV2FzIHdpbGxzdCBEdSBzY2hsaWVzc2VuP1xuIik7CisKKyBpZiAoTVFUQk1BU1RFUi0+UXVlcnlUYWdlYnVjaEF1ZlB1bHQodGhpc19wbGF5ZXIoKSkpCisgQWRkVGhlT2xkRGV0YWlscygpOworfQorCit2b2lkIFNldE93bmVyKHN0cmluZyBzdHIpCit7Cisgb3duZXI9c3RyOworfQorCitzdHJpbmcgUXVlcnlPd25lcigpCit7CisgcmV0dXJuIG93bmVyOworfQorCitzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKK3sKKyBpZiAoKG93bmVyPT0iQW5vbnltdXMiKXx8CisgICAgICAhdGhpc19wbGF5ZXIoKXx8CisgICAgICAhKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKSkKKyByZXR1cm4gIkVpbiB3dW5kZXJzY2hvZW5lcyBMZXNlcHVsdCBhdXMgZHVua2VsYnJhdW5lbSBaZWRlcm5ob2x6IjsKKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpPT1vd25lcikKKyByZXR1cm4KKyAiRWluIHd1bmRlcnNjaG9lbmVzIExlc2VwdWx0LCBhdWYgZGVtIERlaW4gVGFnZWJ1Y2ggZGVzIFRlbXBlbHMgcnVodCI7CisgZWxzZSByZXR1cm4KKyAiRWluIHd1bmRlcnNjaG9lbmVzIExlc2VwdWx0LCBkYXMgZWluIGd1ZWxkZW5lcyBCdWNoIHRyYWVndCI7Cit9CisKK3N0cmluZyBfcXVlcnlfbG9uZygpCit7CisgaWYgKChvd25lcj09IkFub255bXVzIil8fAorICAgICAgIXRoaXNfcGxheWVyKCl8fAorICAgICAgIShNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkpCisgcmV0dXJuIEJTKAorICJWb3JzaWNodGlnIGZhZWhyc3QgRHUgbWl0IGRlbiBGaW5nZXJuIHVlYmVyIGRhcyBkdW5rZWxicmF1bmUgSG9sei4iKworICIgV2FzIER1IHNwdWVyc3QsIGZ1ZWhsdCBzaWNoIGt1ZWhsIHVuZCBhbmdlbmVobSBhbiwgZGllIFplZGVyLCBkaWUiKworICIgZnVlciBkaWVzZXMgYmVzdGF1bmVuc3dlcnRlIExlc2VwdWx0IGhlcmhhbHRlbiBtdXNzdGUsIHd1cmRlIHZvcnMiKworICJpY2h0aWcgdW5kIGFldXNzZXJzdCBrdW5zdGZlcnRpZyBiZWFyYmVpdGV0LiBFaW4gd2lya2xpY2ggc2Nob2VuZXMiKworICIgRXhlbXBsYXIgaG9semhhbmR3ZXJrbGljaGVyIEt1bnN0LiIsNzgpOworIGlmIChnZXR1aWQodGhpc19wbGF5ZXIoKSk9PW93bmVyKQorIHsKKyAgaWYgKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKQorICByZXR1cm4gQlMoCisgICJWb3JzaWNodGlnIGZhZWhyc3QgRHUgbWl0IGRlbiBGaW5nZXJuIHVlYmVyIGRhcyBkdW5rZWxicmF1bmUgSG9seiIrCisgICIuIFdhcyBEdSBzcHVlcnN0LCBmdWVobHQgc2ljaCBrdWVobCB1bmQgYW5nZW5laG0gYW4sIGRpZSBaZWRlciwgZCIrCisgICJpZSBmdWVyIGRpZXNlcyBiZXN0YXVuZW5zd2VydGUgTGVzZXB1bHQgaGVyaGFsdGVuIG11c3N0ZSwgd3VyZGUgdiIrCisgICJvcnNpY2h0aWcgdW5kIGFldXNzZXJzdCBrdW5zdGZlcnRpZyBiZWFyYmVpdGV0LiBFaW4gd2lya2xpY2ggc2NobyIrCisgICJlbmVzIEV4ZW1wbGFyIGhvbHpoYW5kd2Vya2xpY2hlciBLdW5zdCwgRHUgYmlzdCBmcm9oLCBkaWVzZXMgTGVzZSIrCisgICJwdWx0IGVyc3RhbmRlbiB6dSBoYWJlbi4gQXVmIGRlbSBMZXNlcHVsdCBzaWVoc3QgRHUgRGVpbiBzY2h3YXJ6ZSIrCisgICJzIFRhZ2VidWNoIGRlcyBLbm9jaGVudGVtcGVscywgaW4gZGVtIER1IG51biBudXIgbm9jaCBsZXNlbiBrYW5ucyIrCisgICJ0LCBkZW5uIERlaW5lIEFiZW50ZXVlciBkb3J0IHNpbmQgdm9sbHN0YWVuZGlnIHp1IFBhcGllciBnZWJyYWNodCIrCisgICIuIEFsbGVyZGluZ3Mga2FubnN0IER1IGF1Y2ggbm9jaCBlaW4gd2VuaWcgd2VpdGVyIGRyaW4gaGVydW1ibGFldCIrCisgICJ0ZXJuLCB3ZW5uIER1IG1hZ3N0LiIsNzgpOworICByZXR1cm4gQlMoCisgICJWb3JzaWNodGlnIGZhZWhyc3QgRHUgbWl0IGRlbiBGaW5nZXJuIHVlYmVyIGRhcyBkdW5rZWxicmF1bmUgSG9seiIrCisgICIuIFdhcyBEdSBzcHVlcnN0LCBmdWVobHQgc2ljaCBrdWVobCB1bmQgYW5nZW5laG0gYW4sIGRpZSBaZWRlciwgZCIrCisgICJpZSBmdWVyIGRpZXNlcyBiZXN0YXVuZW5zd2VydGUgTGVzZXB1bHQgaGVyaGFsdGVuIG11c3N0ZSwgd3VyZGUgdiIrCisgICJvcnNpY2h0aWcgdW5kIGFldXNzZXJzdCBrdW5zdGZlcnRpZyBiZWFyYmVpdGV0LiBFaW4gd2lya2xpY2ggc2NobyIrCisgICJlbmVzIEV4ZW1wbGFyIGhvbHpoYW5kd2Vya2xpY2hlciBLdW5zdCwgRHUgYmlzdCBmcm9oLCBkaWVzZXMgTGVzZSIrCisgICJwdWx0IGVyc3RhbmRlbiB6dSBoYWJlbi4gRWluIHdlbmlnIGdydWViZWxuIGxhZXNzdCBEaWNoIGRpZSBUYXRzYSIrCisgICJjaGUsIGRhc3MgZGFzIExlc2VwdWx0IGxlZXIgaXN0LiBXYXMgbWFuIGRvcnQgd29obCBwbGF0emllcmVuIGthbiIrCisgICJuID8iLDc4KTsKKyB9CisgcmV0dXJuIEJTKAorICJWb3JzaWNodGlnIGZhZWhyc3QgRHUgbWl0IGRlbiBGaW5nZXJuIHVlYmVyIGRhcyBkdW5rZWxicmF1bmUgSG9sei4iKworICIuIFdhcyBEdSBzcHVlcnN0LCBmdWVobHQgc2ljaCBrdWVobCB1bmQgYW5nZW5laG0gYW4sIGRpZSBaZWRlciwgZGkiKworICJlIGZ1ZXIgZGllc2VzIGJlc3RhdW5lbnN3ZXJ0ZSBMZXNlcHVsdCBoZXJoYWx0ZW4gbXVzc3RlLCB3dXJkZSB2b3IiKworICJzaWNodGlnIHVuZCBhZXVzc2Vyc3Qga3Vuc3RmZXJ0aWcgYmVhcmJlaXRldC4gRWluIHdpcmtsaWNoIHNjaG9lbmUiKworICJzIEV4ZW1wbGFyIGhvbHpoYW5kd2Vya2xpY2hlciBLdW5zdCwgRHUgYmlzdCBlaW4gd2VuaWcgbmVpZGlzY2guIisKKyAiIisoTVFUQk1BU1RFUi0+UXVlcnlUYWdlYnVjaEF1ZlB1bHQodGhpc19wbGF5ZXIoKSk/IiBBdWYgZGVtIExlc2VwIisKKyAidWx0IHd1cmRlIGVpbiBzY2h3YXJ6ZXMgQnVjaCBhYmdlbGVndCwgZGFzIHNlaHIgd2VydHZvbGwgYXVzc2llaHQuIjoKKyAiIERhcyBMZXNlcHVsdCBzaWVodCBvaG5lIGRhenVnZWhvZXJpZ2VzIEJ1Y2ggZWluIHdlbmlnIGVpbnNhbSBhdXMuIikrIi4iLDc4KTsKK30KKwordm9pZCBBZGRUaGVPbGREZXRhaWxzKCkKK3sKKyBBZGREZXRhaWwoKHsiYnVjaCIsImJ1ZWNobGVpbiIsInRhZ2VidWNoIn0pLEJTKAorICJEaWVzIGlzdCBlaW4ga2xlaW5lcyBCdWVjaGxlaW4gYXVzIEdvbGQsIGF1ZiBkZW0gZWluIE5hbWUgaW4gIisKKyAic2Nod2FyemVuIExldHRlcm4gc3RlaHQuIEFuc29uc3RlbiBpc3QgZGVyIEVpbmJhbmQgc2NobGljaHQsICIrCisgImRhcyBQYXBpZXIgc2Nob24gYXVzZnVlaHJsaWNoIGJlc2NocmllYmVuIHVuZCB2b20gdmllbGVuIEJsYWUiKworICJ0dGVybiBoaWVyIHVuZCBkYSBhdWNoIHNjaG9uIGVpbiB3ZW5pZyBnZWtuaWNrdC4iLDc4KSk7CisgQWRkRGV0YWlsKCJibGFldHRlcm4iLEJTKAorICJKYSwgZGFzIHNjaG9lbmUgQnVlY2hsZWluIGlzdCB2b24gaGFldWZpZ2VtIEJsYWV0dGVybiBuaWNodCBzIisKKyAiY2hvZW5lciBnZXdvcmRlbiwgYWJlciBpcmdlbmRldHdhcyBNYWdpc2NoZXMgaGF0IGVzIHNjaG9uIGFuICIrCisgInNpY2guIEFiIHVuZCBhbiBtYWdzdCBEdSBpbW1lciB3aWVkZXIgZWlubWFsIGhlcnVtYmxhZXR0ZXJuLiIsNzgpKTsKKyBBZGREZXRhaWwoIm1hZ2lzY2hlcyIsQlMoCisgIkVzIGlzdCBuaWNodCBzbyBlaW5mYWNoIHp1IGVyZ3J1ZW5kZW4sIGluZGVtIG1hbiBlaW5tYWwgZ2VuYXUiKworICJlciBoaW5zaWVodC4iLDc4KSk7CisgQWRkRGV0YWlsKCJsZWRlciIsQlMoCisgIkRhcyBMZWRlciBpc3QgZ2xhdHQgdW5kIHZvbGxrb21tZW4gZ3VlbGRlbi4gTnVyIGRpZSBzY2h3YXJ6ZW4iKworICIgTGV0dGVybiBnZWJlbiBlaW5lbiBhbmdlbmVobWVuIEtvbnRyYXN0IGFiLiBJcmdlbmR3aWUgc2VsdHNhIisKKyAibSwgZGVubiBEdSBmaW5kZXN0LCBkYXNzIFNjaHdhcnogdW5kIEdvbGQgZWlnZW50bGljaCB1bWdla2VociIrCisgInQgbWVociBTaW5uIG1hY2hlbi4iLDc4KSk7CisgQWRkRGV0YWlsKCJzaW5uIixCUygKKyAiVmllbGxlaWNodCBpc3QgYWJlciBhdWNoIGFsbGVzIGJlc3RlbnMsIHVuZCBudXIgRGVpbiBWZXJzdGFuZCIrCisgIiB3aWxsIGRhcyBuaWNodCBuYWNodm9sbHppZWhlbi4iLDc4KSk7CisgQWRkRGV0YWlsKCJ2ZXJzdGFuZCIsQlMoCisgIkphLCBhdWNoIER1IGthbm5zdCBpaG0gbmljaHQgaW1tZXIgZm9sZ2VuLCBhbHNvIHd1bmRlcmUgRGljaCAiKworICJuaWNodCwgd2FydW0gZGllc2VzIExlZGVyIGhpZXIgZ29sZGVuIHZlcmZhZXJidCBpc3QgdW5kIGRpZSBCIisKKyAidWNoc3RhYmVuIGRhcmF1ZiBzY2h3YXJ6LiIsNzgpKTsKKyBBZGREZXRhaWwoKHsibGV0dGVybiIsImJ1Y2hzdGFiZW4ifSksQlMoCisgIkR1IGthbm5zdCBzaWUgbGVzZW4uIiw3OCkpOworIEFkZERldGFpbCgoeyJuYW1lIiwibmFtZW4ifSksQlMoCisgIk1hbiBrYW5uIGlobiBnZW5hdXNvIGxlc2VuIHdpZSBkaWUgQnVjaHN0YWJlbi4iLDc4KSk7CisgQWRkRGV0YWlsKCJrb250cmFzdCIsQlMoCisgIkRpZSBCdWNoc3RhYmVuIGhlYmVuIHNpY2ggd2lya2xpY2ggZGV1dGxpY2ggdm9tIGd1ZWxkZW5lbiBMZWQiKworICJlciBkZXMgRWluYmFuZHMgYWIuIiw3OCkpOworIEFkZERldGFpbCgiZWluYmFuZCIsQlMoCisgIkVzIGlzdCBrZWluIGF1ZndhZW5kaWdlciBFaW5iYW5kLCBmdWVyd2Foci4gRGVubm9jaCBmYXN6aW5pZXIiKworICJ0IGRpZSBQcmFjaHQsIGRpZSBtaXQgZGVuIHNjaHdhcnplbiBMZXR0ZXJuIGtvbnRyYXN0aWVydC4iLDc4KSk7CisgQWRkRGV0YWlsKCJwcmFjaHQiLEJTKAorICJTbyBtdXNzIG1hbiBkZW4gZ29sZGVuZW4gRWluYmFuZCB3b2hsIG5lbm5lbi4iLDc4KSk7CisgQWRkRGV0YWlsKCh7InBhcGllciIsInNlaXRlbiIsImJ1Y2hzZWl0ZW4iLCJzZWl0ZSIsImJ1Y2hzZWl0ZSJ9KSxCUygKKyAiRGFzIFBhcGllciBpc3Qgdm9uIGd1dGVyIFF1YWxpdGFldCwgZGllIEJ1Y2hzZWl0ZW4gbGFzc2VuIHNpYyIrCisgImggc2ljaGVyIGVpbmZhY2ggYmVzY2hyZWliZW4uIiw3OCkpOworIEFkZERldGFpbCgoeyJzY2h3YXJ6ZSBidWNoc2VpdGVuIiwic2Nod2FyemUgYnVjaHNlaXRlIiwKKyAic2Nod2FyemUgYnVjaHNlaXRlIn0pLEJTKAorICJUYXRzYWVjaGxpY2gsIGJlaW0gQmxhZXR0ZXJuIHNpZWhzdCBEdSBlaW5pZ2Ugc2Nod2FyemUgQnVjaHNlIisKKyAiaXRlbiwgZGllIHVuYmVzY2hyaWViZW4gc2luZC4gV2FzIGhhdCBkaWVzIHp1IGJlZGV1dGVuID8iLDc4KSk7CisgQWRkRGV0YWlsKCJxdWFsaXRhZXQiLEJTKAorICJEdSBzaWVoc3QsIGRhc3MgZGFzIFBhcGllciBmZXN0IHVuZCBibHVldGVud2Vpc3MgaXN0LiIsNzgpKTsKKyBBZGRSZWFkRGV0YWlsKCh7ImJ1Y2giLCJidWVjaGxlaW4iLCJ0YWdlYnVjaCJ9KSxCUygKKyAiRGFzIEJ1Y2ggaGF0IGVpbiBJbmhhbHRzdmVyemVpY2huaXMuIFdlbm4gZG9ydCBldHdhcyBzdGVodCwgayIrCisgImFubnN0IER1IGRhcyBvZGVyIGRpZSBLYXBpdGVsIHNpY2hlciBsZXNlbi4iLDc4KSk7CisgQWRkRGV0YWlsKCJrYXBpdGVsIixCUygKKyAiTGllcyBudXIgaW0gSW5oYWx0c3ZlcnplaWNobmlzIG5hY2gsIHZpZWxsZWljaHQgaGF0IGRhcyBCdWNoICIrCisgImJlcmVpdHMgZWluIG9kZXIgbWVocmVyZSBLYXBpdGVsLiIsNzgpKTsKKyBBZGRSZWFkRGV0YWlsKCJrYXBpdGVsIixCUygKKyAiV2VsY2hlcyBLYXBpdGVsIHdpbGxzdCBEdSBkZW5uIGxlc2VuID8gU2llIHNpbmQgc2ljaGVyIGR1cmNobiIrCisgInVtbWVyaWVydCwgd2VubiBtYW4gc2Nob24gZXR3YXMgaW0gQnVjaCBuaWVkZXJnZXNjaHJpZWJlbiBoYXQuIiw3OCkpOworIEFkZFJlYWREZXRhaWwoKHsibmFtZSIsIm5hbWVuIiwiYnVjaHN0YWJlbiIsImxldHRlcm4ifSksIydsZSk7CisgQWRkUmVhZERldGFpbCgoeyJpbmhhbHQiLCJpbmhhbHRzdmVyemVpY2huaXMifSksIydpbik7CisgU2V0UHJvcChQX01BVEVSSUFMLChbTUFUX0xFQVRIRVI6MTAsTUFUX1BBUEVSOjE1LE1BVF9DRURBUjo3NV0pKTsKK30KKworaW50IGRyb3BfYm9vayhzdHJpbmcgc3RyKQoreworIGlmICghc3RyaW5ncChzdHIpKQorIHJldHVybiAwOworIGlmIChzdHJzdHIobG93ZXJfY2FzZShzdHIpLCJwdWx0IiwwKT09LTEpCisgcmV0dXJuIDA7Cisgbm90aWZ5X2ZhaWwoQlMoCisgIldpbGxzdCBEdSBldHdhcyBhdWYgZGFzIFB1bHQgbGVnZW4gPyBFaW4gQnVjaCB3YWVyZSBwYXNzZW5kLCAiKworICJhYmVyIGVzIHNvbGx0ZSBzY2hvbiBldHdhcyBCZXNvbmRlcmVzIHNlaW4uIiw3OCkpOworIGlmIChzdHJzdHIobG93ZXJfY2FzZShzdHIpLCJidWNoIiwwKT09LTEmJgorICAgICBzdHJzdHIobG93ZXJfY2FzZShzdHIpLCJidWVjaGxlaW4iLDApPT0tMSkKKyByZXR1cm4gMDsKKyBub3RpZnlfZmFpbChCUygKKyAiRGFzIGlzdCBuaWNodCBEZWluIExlc2VwdWx0LCBEdSBsYWVzc3QgZXMgYmVzc2VyIGluIFJ1aGUuIiw3OCkpOworIGlmIChnZXR1aWQodGhpc19wbGF5ZXIoKSkhPW93bmVyKQorIHJldHVybiAwOworIG5vdGlmeV9mYWlsKEJTKAorICJBdWYgZGVtIFB1bHQgbGllZ3Qgc2Nob24gZWluIGdvbGRlbmVzIEJ1Y2guIiw3OCkpOworIGlmIChNUVRCTUFTVEVSLT5RdWVyeVRhZ2VidWNoQXVmUHVsdCh0aGlzX3BsYXllcigpKSkKKyByZXR1cm4gMDsKKyBub3RpZnlfZmFpbChCUygKKyAiRW50d2VkZXIgaGFzdCBEdSBEaWNoIG5vY2ggbmljaHQgYWxzIHd1ZXJkaWcgZXJ3aWVzZW4sIGluZGVtICIrCisgIkR1IGFsbGUgQXVmZ2FiZW4gaW0gS25vY2hlbnRlbXBlbCBlcmZ1ZWxsdCBoYXN0IG9kZXIgRHUgaGFzdCAiKworICJkZW0gQXZhdGFyIGRlcyBXYWVjaHRlcnMgZGVyIE5hY2h0LCBNaHVuJ2RhZSBIZWwsIG5vY2ggbmljaHQgIisKKyAiRGVpbmUgQXVmd2FydHVuZyBnZW1hY2h0IHVuZCBpaG0gZ2V6ZWlndCwgZGFzcyBEdSB3dWVyZGlnIGJpcyIrCisgInQsIGVpbiBnZWVpZ25ldGVzIEJ1Y2ggenUgZW1wZmFuZ2VuLiBBdWYgYWxsZSBGYWVsbGUga2FubnN0IEQiKworICJ1IGhpZXIgbm9jaCBuaWNodHMgYXVmIGRhcyBQdWx0IGxlZ2VuLiIsNzgpKTsKKyBpZiAoIXByZXNlbnRfY2xvbmUoT0JKKCJidWVjaGxlaW5faW52ZXJzIiksdGhpc19wbGF5ZXIoKSkpCisgcmV0dXJuIDA7CisgTVFUQk1BU1RFUi0+QWRkQnVjaEF1ZlB1bHQodGhpc19wbGF5ZXIoKSk7CisgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhCUygKKyAiVm9yc2ljaHRpZyBzY2hsYWVnc3QgRHUgRGVpbiBndWVsZGVuZXMgVGFnZWJ1Y2ggYXVmLCBkYXMgRGlyICIrCisgIk1odW4nZGFlIEhlbCwgZGFzIEF2YXRhciBkZXMgV2FlY2h0ZXJzIGRlciBOYWNodCwgdWViZXJyZWljaHQiKworICIgaGF0LiBEdSBsZWdzdCBlcyBzYWNodGUgYXVmIGRhcyBQdWx0IHVuZCBtZXJrc3QsIGRhc3MgZXMgc29mIisKKyAib3J0IGVpbmUgbWFnaXNjaGUgVmVyYmluZHVuZyBtaXQgZGVtIExlc2VwdWx0IGVpbmdlaHQuIEVzIGlzdCIrCisgIiBudW4gdW50cmVubmJhciBtaXQgZGllc2VtIHZlcmJ1bmRlbi4iLDc4KSxNVF9NQUdJQyxNQV9VU0UpOworIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLEJTKAorIHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsiIGxlZ3Qgdm9yc2ljaHRpZyBlaW4gZ3VlbGRlbmVzIEJ1Y2ggIisKKyAibWl0IHNjaHdhcnplbiBMZXR0ZXJuIGF1Zmdlc2NobGFnZW4gYXVmIGRlbSBMZXNlcHVsdCBhYiB1bmQgYiIrCisgImV0cmFjaHRldCBkaWVzZXMgZGFubiBlaHJmdWVyY2h0aWcgdW5kIHp1dGllZnN0IHp1ZnJpZWRlbi4iLDc4KSwKKyAoe3RoaXNfcGxheWVyKCl9KSk7CisgcmV0dXJuIDE7Cit9CisKK2ludCBjbWRfYmxhZXR0ZXJuKHN0cmluZyBzdHIpCit7Cisgbm90aWZ5X2ZhaWwoQlMoCisgIkF1ZiBkZW0gTGVzZXB1bHQgbGllZ3QgZG9jaCBnYXIga2VpbiBUYWdlYnVjaC4iLDc4KSk7CisgaWYgKCEoTVFUQk1BU1RFUi0+UXVlcnlUYWdlYnVjaEF1ZlB1bHQoZmluZF9wbGF5ZXIob3duZXIpKSkpCisgcmV0dXJuIDA7Cisgbm90aWZ5X2ZhaWwoQlMoCisgIkRhcyBpc3QgbmljaHQgRGVpbiBUYWdlYnVjaCwgRHUgbGFlc3N0IGVzIGxpZWJlciBpbiBGcmllZGVuLiIsNzgpKTsKKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpIT1vd25lcikKKyByZXR1cm4gMDsKKyB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKEJTKAorICJEdSBibGFldHRlcnN0IGVpbiB3ZW5pZyBkdXJjaCBEZWluIFRhZ2VidWNoIHVuZCBzdG9lc3N0IGF1ZiBlIisKKyAiaW5pZ2UgcmFldHNlbGhhZnRlIHNjaHdhcnplIFNlaXRlbi4gV2FzIG1hZyBlcyBkYW1pdCBhdWYgc2ljaCIrCisgIiBoYWJlbiA/IE9iIER1IHNpZSBoZXJhdXNuZWhtZW4ga2FubnN0ID8iLDc4KSxNVF9MT09LLE1BX0xPT0spOworIHJldHVybiAxOworfQorCitpbnQgdGFrZV9wYWdlKHN0cmluZyBzdHIpCit7CisgaWYgKCFzdHJpbmdwKHN0cikpCisgcmV0dXJuIDA7CisgaWYgKHByZXNlbnQoc3RyLGVudmlyb25tZW50KCkpKQorIHJldHVybiAwOworIG5vdGlmeV9mYWlsKEJTKAorICJXbyBzaWVoc3QgRHUgZGVubiBoaWVyIGVpbiBCdWNoID8iLDc4KSk7CisgaWYgKCEoTVFUQk1BU1RFUi0+UXVlcnlUYWdlYnVjaEF1ZlB1bHQodGhpc19wbGF5ZXIoKSkpJiYKKyAgICAgc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwiYnVjaCIpIT0tMSkKKyByZXR1cm4gMDsKKyBpZiAoKG93bmVyIT1nZXR1aWQodGhpc19wbGF5ZXIoKSkpJiYKKyAgICAgc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwiYnVjaCIpIT0tMSkKKyBub3RpZnlfZmFpbChCUygKKyAiRGllcyBpc3QgbmljaHQgRGVpbiBMZXNlcHVsdCBvZGVyIERlaW4gQnVjaCBkYXJhdWYsIGRlc2hhbGIgbCIrCisgImFlc3N0IER1IGVzIHZvcnNpY2h0c2hhbGJlciBsaWVnZW4uIiw3OCkpOworIHJldHVybiAwOworIGlmICgob3duZXIhPWdldHVpZCh0aGlzX3BsYXllcigpKSkmJgorICAgICBzdHJzdHIobG93ZXJfY2FzZShzdHIpLCJzZWl0ZSIpIT0tMSkKKyBub3RpZnlfZmFpbChCUygKKyAiRGllIEVpZ2VudHVlbWVyaW4gb2RlciBkZXIgRWlnZW50dWVtZXIgZGVzIExlc2VwdWx0cyBoYWV0dGUgcyIrCisgImljaGVyIGV0d2FzIGRhZ2VnZW4sIHdlbm4gRHUgZGFzIEJ1Y2ggemVyc3RvZXJzdCwgYWxzbyBsYWVzc3QiKworICIgRHUgZXMgbGllYmVyLiIsNzgpKTsKKyByZXR1cm4gMDsKKyAvLyBIZWlsdW5nIDF4IGFsbGUgNiBTdHVuZGVuLgorIGlmICh0aGlzX3BsYXllcigpLT5jaGVja19hbmRfdXBkYXRlX3RpbWVkX2tleSgyMTYwMCwiQXJrX0hlbHNfU2Nod2FyemVzX0J1Y2giKT09LTEpCisgeworICBvYmplY3QgbzsKKyAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhCUygKKyAgIkR1IHJlaXNzdCBlcnN0IHZvcnNpY2h0aWcgZWluZSBzY2h3YXJ6ZSBTZWl0ZSB1bmQgZGFubiBlaW5lIisKKyAgIiB3ZWl0ZXJlIGF1cyBkZW0gZ29sZGVuZW4gQnVjaC4gRGFubiB1ZWJlcmZhZWxsdCBEaWNoIGVpbmUgIisKKyAgImtsZWluZSBTY2h3YWVjaGUsIGRpZSBEaWNoIHZvciB3ZWl0ZXJlbSBaZXJzdG9lcmVuIGlubmVoYWx0IisKKyAgImVuIGxhZXNzdC4gRHUgc29sbHRlc3QgSGVscyBHcm9zc3p1ZWdpZ2tlaXQgbmljaHQgdWViZXJzY2hhIisKKyAgImV0emVuLiIsNzgpLE1UX0ZFRUwsTUFfVEFLRSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLEJTKAorICB0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiByZWlzc3QgendlaSBTZWl0ZW4gYXVzIGRlbSBCdWNoLCAiKworICAiZGFzIGF1ZiBkZW0gUHVsdCBsaWVndC4gRGFubiBoYWVsdCAiK3RoaXNfcGxheWVyKCktPlF1ZXJ5UHJvbm91bihXRVIpKyIiKworICAiIGlubmUsIHdhaHJzY2hlaW5saWNoIGZvbGd0ICIrdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9ub3VuKFdFUikrIiIrCisgICIgZWluZXIga2x1Z2VuIEVpbmdlYnVuZy4iLDc4KSk7CisgIG89Y2xvbmVfb2JqZWN0KE9CSigicmVnX3NlaXRlIikpOworICBpZiAoby0+bW92ZSh0aGlzX3BsYXllcigpKSE9TU9WRV9PSykKKyAgeworICAgby0+cmVtb3ZlKDEpOworICAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZyhCUygKKyAgICJEdSBrYW5uc3QgZGllIGVyc3RlIFNlaXRlIG5pY2h0IG1laHIgdHJhZ2VuLCBzaWUgbG9lc3Qgc2ljIisKKyAgICJoIGVpbmZhY2ggYXVmLiIsNzgpLE1UX01BR0lDLE1BX1JFTU9WRSk7CisgIH0KKyAgLy8gRGllIGVyc3RlIFNlaXRlIGJlaGFuZGVsdCwgaGllciwgZmFsbHMgbWFuIGF1Y2ggZGllIHp3ZWl0ZQorICAvLyBTZWl0ZSBuaWNodCB0cmFnZW4ga2FubiBvZGVyIG1pdCBkZXIgZXJzdGVuIGFtIExpbWl0IGlzdC4KKyAgbz1jbG9uZV9vYmplY3QoT0JKKCJyZWdfc2VpdGUiKSk7CisgIGlmIChvLT5tb3ZlKHRoaXNfcGxheWVyKCkpIT1NT1ZFX09LKQorICB7CisgICBvLT5yZW1vdmUoMSk7CisgICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKEJTKAorICAgIkR1IGthbm5zdCBkaWUgendlaXRlIFNlaXRlIG5pY2h0IG1laHIgdHJhZ2VuLCBzaWUgbG9lc3Qgc2kiKworICAgImNoIGVpbmZhY2ggYXVmLiIsNzgpLE1UX01BR0lDLE1BX1JFTU9WRSk7CisgIH0KKyAgcmV0dXJuIDE7CisgfQorIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coQlMoCisgIlZlcmdlYmxpY2ggcmVpc3N0IER1IG1laHIgb2RlciB3ZW5pZ2VyIHZvcnNpY2h0aWcgYW4gZWluaWdlbiIrCisgIiBzY2h3YXJ6ZW4gU2VpdGVuIGltIEJ1Y2ggaGVydW0sIGRvY2ggc2llIGJsZWliZW4gc3RvZXJyaXNjaCIrCisgIi4gRXMgd2lyZCB3b2hsIGVpbiB3ZW5pZyBkYXVlcm4sIGJpcyBEdSBkYXMgd2llZGVyIHZlcnN1Y2hlbiIrCisgIiBrYW5uc3QuIiw3OCksTVRfTUFHSUMsTUFfVVNFKTsKKyB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxCUygKKyB0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiByZWlzc3QgaW0gQnVjaCBhdWYgZGVtIExlc2VwdWx0IGhlIisKKyAicnVtLiIsNzgpLCh7dGhpc19wbGF5ZXIoKX0pKTsKKyByZXR1cm4gMTsKK30KKworaW50IGNtZF9sZXNlbihzdHJpbmcgc3RyKQoreworaW50IGs7CisgaWYoIXN0cikgcmV0dXJuIDA7CisgaWYgKG93bmVyPT0iQW5vbnltdXMiKQorIHsKKyAgd3JpdGUgKEJTKAorICAiRGllc2VzIExlc2VwdWx0IHNjaGVpbnQgbmllbWFuZGVtIHp1IGdlaG9lcmVuIC4uLiBlcyBsb2VzdCBzIisKKyAgImljaCBkYWhlciBlaW5mYWNoIGF1ZiwgYWxzIER1IGRhcmF1ZiBldHdhcyBsZXNlbiB3aWxsc3QuIiw3OCkpOworICByZW1vdmUoMSk7CisgIHJldHVybiAxOworIH0KKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpIT1vd25lcikKKyB7CisgIG5vdGlmeV9mYWlsKEJTKAorICAiRGllc2VzIFRhZ2VidWNoIGdlaG9lcnQgIitjYXBpdGFsaXplKG93bmVyKSsiLCBuaWNodCBEaXIsIER1IisKKyAgIiBiaXN0IGVpZ2VudGxpY2ggbmljaHQgc28gcmVjaHQgYW4gZGVtIGludGVyZXNzaWVydCwgd2FzIG1hbiIrCisgICIgaW4gZGVtIEJ1Y2ggbmllZGVyZ2VzY2hyaWViZW4gaGF0LiBTaWNoZXIgaXN0IGVzIHVlYmVydHJpZWIiKworICAiZW4gbGFuZ2F0bWlnIGZvcm11bGllcnQgdW5kIHN0aW1tdCBuaWNodCBnZW5hdSBtaXQgZGVtIHVlYmVyIisKKyAgImVpbiwgd2FzIHdpcmtsaWNoIGdlc2NoYWguIE1hbiBrZW5udCBkYXMgamEuIiw3OCkpOworICByZXR1cm4gMDsKKyB9CisgaWYgKHN0cnN0cihsb3dlcl9jYXNlKHN0ciksImthcGl0ZWwiLDApIT0tMSYmCisgICAgIHNzY2FuZihsb3dlcl9jYXNlKHN0ciksImthcGl0ZWwgJWQiLGspIT0xKQorIHsKKyAgd3JpdGUgKEJTKAorICAiV2lsbHN0IER1IGVpbiBLYXBpdGVsIGF1cyBkZW0gQnVjaCBsZXNlbiA/IERhbm4gZ2liIGJpdHRlIGVpIisKKyAgIm5lIFppZmZlciBhbi4iLDc4KSk7CisgIHJldHVybiAxOworIH0KKyBpZiAoaz4wKQorIHsKKyAgTVFUQk1BU1RFUi0+TGllc1F1ZXN0KGssdGhpc19wbGF5ZXIoKSk7CisgIHJldHVybiAxOworIH0KKyByZXR1cm4gMDsKK30KKworaW50IGNtZF9laW50cmFnZW4oc3RyaW5nIHN0cikKK3sKK2ludCBpOworIGlmICghKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKSkKKyB7CisgIG5vdGlmeV9mYWlsKEJTKAorICAiRHUgZmluZGVzdCBoaWVyIG5pY2h0cywgd29yaW4gRHUgZXR3YXMgZWludHJhZ2VuIGtvZW5udGVzdC4iLDc4KSk7CisgIHJldHVybiAwOworIH0KKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpIT1vd25lcikKKyB7CisgIG5vdGlmeV9mYWlsKEJTKAorICAiRGllc2VzIFRhZ2VidWNoIGdlaG9lcnQgIitjYXBpdGFsaXplKG93bmVyKSsiLCBuaWNodCBEaXIsIER1IisKKyAgIiBrYW5uc3QgZGFyaW4gbmljaHRzIGVpbnRyYWdlbi4iLDc4KSk7CisgIHJldHVybiAwOworIH0KKyBub3RpZnlfZmFpbChCUygKKyAiRGVpbmUgTWlzc2lvbmVuIGltIEtub2NoZW50ZW1wZWwgLi4uIGJlc3NlciBnZXNhZ3QsIGRlbSBXeXJtdCIrCisgImVtcGVsLCBzaWUgc2luZCBhbGxlc2FtdCB0YXBmZXIgdm9uIERpciBlcmZ1ZWxsdCB3b3JkZW4uIER1IGsiKworICJhbm5zdCBoaWVyIG5pY2h0cyB3ZWl0ZXIgbWVociBlaW50cmFnZW4sIHNpY2hlciBhYmVyIHZvbiBkZXIgIisKKyAiYXJrYW5lbiBNYWNodCBkZXMgQnVjaGVzIHByb2ZpdGllcmVuLCB3ZW5uIER1IGVzIGVpbm1hbCBkdXJjaCIrCisgImJsYWV0dGVyc3QuIiw3OCkpOworIHJldHVybiAwOworfQorCitzdHJpbmcgY2FsY19uYW1lKCkKK3sKK3N0cmluZyAqbmFtOworc3RyaW5nIHJlczsKK2ludCBpLGo7CisgcmVzPSIiOworIGlmIChvd25lcj09IiIpCisgcmV0dXJuICIiOworIG5hbT1leHBsb2RlKHVwcGVyc3RyaW5nKG93bmVyKSwiIik7CisgaWYgKGo9c2l6ZW9mKG5hbSkpCisgeworICBzd2l0Y2goaikKKyAgeworICAgY2FzZSAzLi40OgorICAgIHJlcz0iICAgICAgICAgICI7CisgICAgYnJlYWs7CisgICBjYXNlIDU6CisgICAgcmVzPSIgICAgICAgICI7CisgICAgYnJlYWs7CisgICBjYXNlIDc6CisgICAgcmVzPSIgICAgICAiOworICAgIGJyZWFrOworICAgY2FzZSA5OgorICAgIHJlcz0iICAgICI7CisgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgIHJlcz0iICAgIjsKKyAgfQorICBmb3IgKGk9MDtpPGo7aSsrKQorICB7CisgICByZXMrPW5hbVtpXSsiICI7CisgIH0KKyB9CisgcmV0dXJuIHJlczsKK30KKworc3RyaW5nIGxlKHN0cmluZyBrZXkpCit7CisgcmV0dXJuICJcbiIrCisgIiAgICBEZSBUZW1wbHVtIE9zIEhlbFxuXG4iKworIGNhbGNfbmFtZSgpKyJcblxuIjsKK30KKworc3RyaW5nIGluKHN0cmluZyBrZXkpCit7CisgaWYgKG93bmVyIT1nZXR1aWQodGhpc19wbGF5ZXIoKSkpCisgcmV0dXJuICJEb3J0IHN0ZWh0IGFsbGVyZGluZ3MgbmljaHRzLiBTZWx0c2FtLlxuIjsKKyByZXR1cm4gTVFUQk1BU1RFUi0+TGllc0luaGFsdChmaW5kX3BsYXllcihvd25lcikpOworfQorCisvLyBEYXMgaGllciBiZXplaWNobmV0IGRlbiBVcmhlYmVyIGRlcyBNb2ViZWxzdHVlY2tzLgorLy8gTmljaHQgbWVpbmUgSWRlZSEKK3N0cmluZyBHZXRPd25lcigpIHsgcmV0dXJuICJBcmsiOyB9CisKK2ludCBjbWRfb2VmZm5lbihzdHJpbmcgc3RyKQoreworIGlmIChzdHJzdHIobG93ZXJfY2FzZShzdHIpLCJwdWx0IikhPS0xKQorIHsKKyAgdGhpc19wbGF5ZXIoKS0+UmVjZWl2ZU1zZygKKyAgIkR1IGthbm5zdCBkYXMgUHVsdCBuaWNodCBvZWZmbmVuLCBudXIgZXR3YXMgenVtIExlc2VuIGRhcmF1ZmxlZ2VuLiIsCisgIE1UX0xPT0ssTUFfRkVFTCk7CisgIHJldHVybiAxOworIH0KKyBpZiAoc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwiYnVjaCIpIT0tMSkKKyB7CisgIGlmICghKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKSkKKyAgcmV0dXJuIDA7CisgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICJEYXMgc2Nod2FyemUgQnVjaCBpc3QgZG9jaCBzY2hvbiBnZW9lZmZuZXQuIixNVF9MT09LLE1BX0ZFRUwpOworICByZXR1cm4gMTsKKyB9CisgLy8gQWxsZXMgYW5kZXJlIHBlciBEZWZhdWx0LgorIHJldHVybiAwOworfQorCitpbnQgY21kX3NjaGxpZXNzZW4oc3RyaW5nIHN0cikKK3sKKyBpZiAoc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwicHVsdCIpIT0tMSkKKyB7CisgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICJEdSBrYW5uc3QgZGFzIFB1bHQgbmljaHQgc2NobGllc3Nlbi4iLE1UX0xPT0ssTUFfRkVFTCk7CisgIHJldHVybiAxOworIH0KKyBpZiAoc3Ryc3RyKGxvd2VyX2Nhc2Uoc3RyKSwiYnVjaCIpIT0tMSkKKyB7CisgIGlmICghKE1RVEJNQVNURVItPlF1ZXJ5VGFnZWJ1Y2hBdWZQdWx0KHRoaXNfcGxheWVyKCkpKSkKKyAgcmV0dXJuIDA7CisgIHRoaXNfcGxheWVyKCktPlJlY2VpdmVNc2coCisgICJEYXMgQnVjaCBibGVpYnQgdHJvdHogRGVpbmVyIEJlbXVlaHVuZ2VuIGVpbmZhY2ggb2ZmZW4uIixNVF9MT09LLE1BX0ZFRUwpOworICByZXR1cm4gMTsKKyB9CisgZWxzZSByZXR1cm4gMDsKK30KKworbWl4ZWQgX3F1ZXJ5X25vZ2V0KCkKK3sKKyBpZiAoZ2V0dWlkKHRoaXNfcGxheWVyKCkpIT1vd25lcikKKyByZXR1cm4gQlMoCisgIkRpZXMgaXN0IG9mZmVuc2ljaHRsaWNoIG5pY2h0IERlaW4gUHVsdCwgZGVzaGFsYiBsYWVzc3QgIisKKyAiRHUgZXMgYXVjaCBiZXNzZXIgbGllZ2VuLiIsNzgpOworIHJldHVybiAwOworfQorCitzdHJpbmcgX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKK3sKKyByZXR1cm4gUXVlcnlPd25lcigpOworfQorCitzdHJpbmcgX3NldF9hdXRvbG9hZG9iaihzdHJpbmcgcykKK3sKKyByZXR1cm4gUXVlcnlPd25lcigpOworfQorCisvLyBCZWltIEthdWYgc2V0emVuIHdpciBlcnN0bWFsIG51ciBkZW4gRWlnZW50dWVtZXIuCisvLyBJc3QgYXVzIFN3aWZ0cyBDb250YWluZXIsIGRlciBkaWVzZSBGdW5rdGlvbiBpbQorLy8gTm90aWZ5TW92ZSgpIGF1ZnJ1ZnQuCitwcm90ZWN0ZWQgdm9pZCBTZXRCZXNpdHplcihzdHJpbmcgdWlkLCBzdHJpbmcgdXVpZCkKK3sKKyBTZXRPd25lcih1aWQpOworIE1RVEJNQVNURVItPkFkZExlc2VwdWx0KGZpbmRfcGxheWVyKHVpZCl8fGZpbmRfbmV0ZGVhZCh1aWQpKTsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbW9lYmVsLmggYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL21vZWJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmM0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL21vZWJlbC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX1NFSEVSTU9FQkVMX0hfCisjZGVmaW5lIF9TRUhFUk1PRUJFTF9IXworCisjZGVmaW5lIExBREVOKHgpICIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC8iK3gKKyNkZWZpbmUgUkFVTV9WT1JfTEFERU4gIi9kL3VudGVyd2VsdC93dXJ6ZWwvZG9yZi9uc3RyMiIKKyNkZWZpbmUgSURFRU5fTE9HICJpZGVlbi5sb2ciCisjZGVmaW5lIFNIVkVSV0FMVEVSICIvZC9zZWhlci9oYWV1c2VyL2hhdXN2ZXJ3YWx0ZXIiCisjZGVmaW5lIFZFUkFOVFdPUlRMSUNIRVJfTUFHSUVSICJTZWxldmVuIiAKKy8vIERlciBFcmhhZWx0IEJ1Zy1NYWlscyBkZXIgU3BpZWxlciEKKyNkZWZpbmUgU0NIUkFOS01BU1RFUiBsb2FkX29iamVjdChMQURFTigic2NocmFua21hc3RlciIpKQorCisjZW5kaWYgLy8gX1NFSEVSTU9FQkVMX0hfCisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbXVlbGxjb250YWluZXIuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvbXVlbGxjb250YWluZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk1ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9tdWVsbGNvbnRhaW5lci5jCkBAIC0wLDAgKzEsOTIgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIE11ZWxsY29udGFpbmVyCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAxNy4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCitpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKKyNkZWZpbmUgVkVSU0lPTl9PQkogIi4wMDMiCisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICBzd2lmdF9zdGRfY29udGFpbmVyOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIE11ZWxsY29udGFpbmVyIik7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkVpbiBncm9zc2VyIENvbnRhaW5lciBhdXMgU3RhaGwsIGF1cyBkZW0gZXMgbmljaHQgZ2VyYWRlIGFuZ2VuZWhtIGR1ZnRldC4gIgorICAgICsiT2ZmZW5zaWNodGxpY2ggd2VyZGVuIGRvcnQgYWxsZSBTYWNoZW4gZW50c29yZ3QsIGRpZSBTZWhlciBuaWNodCBnZXJuZSBpbiAiCisgICAgKyJpaHJlbSBIYXVzIG9kZXIgYXVmIGRlciBTdHJhc3NlIGhlcnVtbGllZ2VuIHNlaGVuLiIpCisgICAgKyJAQGNudF9zdGF0dXNAQCIpOworICBBZGRJZCgoeyJtdWVsbGNvbnRhaW5lciIsICJjb250YWluZXIifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiTXVlbGxjb250YWluZXIiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMDApOyAgICAgICAgIC8vIEdld2ljaHQgNSBLZworICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMTAwMDAwMCk7ICAvLyBFcyBwYXNzZW4gZnVlciAxMDAwIGtnIFNhY2hlbiByZWluLgorICBTZXRQcm9wKFBfV0VJR0hUX1BFUkNFTlQsIDEwMCk7ICAvLyBEYWZ1ZXIgbWFjaHQgZXIgYXVjaCBuaXggbGVpY2h0ZXIgOikKKyAgU2V0UHJvcChQX01BWF9PQkpFQ1RTLCAxMDApOyAgICAgLy8gTWVociBzb2xsdGUgbmljaHQgc2VpbiwgbHQuIFRpYW1hay4KKyAgU2V0UHJvcChQX1ZBTFVFLCAwKTsgICAgICAgICAgICAgLy8gS2VpbiBtYXRlcmllbGxlciBXZXJ0LiBJc3QgZWggbmljaHQgdmVya2F1ZmJhci4KKyAgU2V0UHJvcChQX05PQlVZLCAxKTsgICAgICAgICAgICAgLy8gV2lyZCBpbSBMYWRlbiB6ZXJzdG9lcnQsIGZhbGxzIGVyIHZlcmthdWZ0IHdpcmQuCisgIFNldFByb3AoUF9OT0dFVCwgIkRhcyBnZWh0IG5pY2h0LiAiK05hbWUoV0VSLDEpKyIgaGFmdGV0IHdpZSBtYWdpc2NoIGFtIEJvZGVuLlxuIik7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfU1RFRUwsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKworICBBZGRTbWVsbHMoKHsiY29udGFpbmVyIiwgImR1ZnQiLCAiZ2VzdGFuayJ9KSwgQlMoIkF1cyAiK25hbWUoV0VNLDEpKyIgc3Rpbmt0IGVzICIKKyAgICArInNjaG9uIGdhbnogc2Nob2VuLCBhYmVyIERlaW5lIE5hc2UgaXN0IGphIGFsbGVyaGFuZCBnZXdvZWhudC4iKSk7CisKKyAgQWRkQ21kKCh7IndpcmYiLCAid2VyZiIsICJ3ZXJmZSJ9KSwgIndlZ3dlcmZlbiIpOworfQorCitpbnQgd2Vnd2VyZmVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3YXMsaW53YXM7CisgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IHdvIGhpbmVpbiB3ZXJmZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKCBzc2NhbmYoc3RyLCAiJXMgaW4gJXMiLCB3YXMsIGlud2FzKSAhPSAyKQorICAgIHJldHVybiAwOworICBpZiggcHJlc2VudChpbndhcyk9PVRPICkgICAvLyBEaWVzIE9iamVrdCBpc3QgZ2VtZWludCEKKyAgeworICAgIFRQLT5jb21tYW5kX21lKCJzdGVja2UgIitzdHIpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOyAgCit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKQoreworICBpZiggbGl2aW5nKG9iKSApCisgIHsKKyAgICB3cml0ZSggQlMoIkxlYmV3ZXNlbiBrYW5uc3QgRHUgbmljaHQgaW4gIituYW1lKFdFTiwxKSsiIHdlcmZlbiEiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiggb2ItPlF1ZXJ5UHJvcChQX1ZBTFVFKSApCisgIHsKKyAgICB3cml0ZSggQlMoIk51ciBEaW5nZSBvaG5lIG1hdGVyaWVsbGVuIFdlcnQgbGFzc2VuIHNpY2ggaW4gIgorICAgICAgK25hbWUoV0VOLDEpKyIgd2VyZmVuLiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmKCBvYi0+UXVlcnlQcm9wKFBfQ1VSU0VEKSApCisgIHsKKyAgICB3cml0ZSggQlMoIlZlcmZsdWNodGUgRGluZ2Uga2FubnN0IER1IG5pY2h0IGluICIrbmFtZShXRU4sMSkrIiB3ZXJmZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIGludCBpOworICBvYmplY3QgKmludjsKKyAgOjpyZXNldCgpOworICBpbnY9YWxsX2ludmVudG9yeShUTyk7CisgIGlmKGludiAmJiBzaXplb2YoaW52KSkKKyAgeworICAgIGZvcihpPXNpemVvZihpbnYpLTE7aT49MDtpLS0pCisgICAgICBkZXN0cnVjdChpbnZbaV0pOworICAgIHRlbGxfcm9vbShFVE8sIEJTKCJBdXMgIituYW1lKFdFTSwxKSsiIGVydG9lbnQga3VyeiBlaW4gS25pc3Rlcm4gdW5kIEtuYWNrZW4sICIKKyAgICAgICAgICAgKyJkYW5uIGlzdCB3aWVkZXIgUnVoZS4iKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvcHJlaXNsaXN0ZS50eHQgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ByZWlzbGlzdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTc4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ByZWlzbGlzdGUudHh0CkBAIC0wLDAgKzEsMTAyIEBACisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEIEUgUiAgIFMgQyBIIFIgQSBFIE4gSyBFIFIgICAtICAgUCBSIEUgSSBTIEwgSSBTIFQgRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSGVyemxpY2ggd2lsbGtvbW1lbiBpbSBTQ0hSQUVOS0VSLiBCZWkgdW5zIGZpbmRlbiBTaWUKK2RhcyBpZGVhbGUgTW9iaWxpYXIgZnVlciBJaHIgU2VoZXJoYXVzLiBXZWcgbWl0IGRlcgorVW5vcmRudW5nIHp1aGF1cywgYnJpbmdlbiBTaWUgaWhyZSBBdXNydWVzdHVuZyB1ZWJlci0KK3NpY2h0bGljaCB1bmQgd29obHNvcnRpZXJ0IGluIHVuc2VyZW4gZWRsZW4gTW9lYmVsLQorc3R1ZWNrZW4gdW50ZXIuIFdpciBob2ZmZW4sIHVuc2VyZSBBdXN3YWhsIGZpbmRldAorSWhyZW4gR2VmYWxsZW4uCisKK0FOTUVSS1VORzogRGllIFdhcmVuLCBkaWUgaGllciBhdWZnZWxpc3RldCBzaW5kLCBzaW5kIE5JQ0hUIFJFQk9PVEZFU1QgIQorICAgICAgICAgICBFdnRsLiB3ZXJkZW4gd2lyIGRpZXMgenUgZWluZW0gc3BhZXRlcmVuIFplaXRwdW5rdCBpbnMgQXVnZQorICAgICAgICAgICBmYXNzZW4sIGltIE1vbWVudCBpc3QgZXMgbmljaHQgc28sIHdpciB2ZXJzdWNoZW4gbGllYmVyLCBkaWUKKyAgICAgICAgICAgTW9lYmVsc3R1ZWNrZSB6dSB2ZXJiZXNzZXJuLCB1bSBzaWUgYXVjaCBhbiBkaWUgdW5nZXdvZWhubGljaHN0ZW4KKyAgICAgICAgICAgT2JqZWt0ZSBpbSBNb3JnZW5HcmF1ZW4gYW56dXBhc3Nlbi4KKworQXJ0Li1Oci4gICBOYW1lICAgICAgICAgICAgIEJlc2NocmVpYnVuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlaXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMSAgICAgICAgIEtvbW1vZGUgICAgICAgICAgRWluZSByb2J1c3RlIEtvbW1vZGUgYXVzIEVpY2hlbmhvbHouIFNpZSAgICAzLjc5OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N0IGluIGplZGVuIFJhdW0gdW5kIGJpZXRldCBqZWRlIE1lbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdHogenVtIFZlcnN0YXVlbiB2b24gRGluZ2VuIGFsbGVyIEFydC4KKworIDIgICAgICAgICBLbGVpZGVyc2NocmFuayAgIEVpbiBtYXNzaXZlciBIb2x6c2NocmFuaywgaW4gZGVtIFNpZSAgICAgICAgNS44OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbGVpZGVyIHVuZCBSdWVzdHVuZ2VuIGFsbGVyIEFydCB1bnRlci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ2VuIGtvZW5uZW4uIERlciBTY2hyYW5rIHZlcmZ1ZWd0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWViZXIgZWluIEtvbW1hbmRvIHp1ciBBdWZsaXN0dW5nIHZvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1ZXN0dW5nc3R5cGVuLgorCisgMyAgICAgICAgIFNwaW5kICAgICAgICAgICAgRWluIGdyb3NzZXIsIGVpbmZhY2hlciBTdGFobHNjaHJhbmsuIERhcmluICA1LjI5OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3NlbiBzaWNoIEtsZWlkZXIgdW5kIFJ1ZXN0dW5nZW4gYWxsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnQgdW50ZXJicmluZ2VuLiBEZXIgU3BpbmQgdmVyZnVlZ3QgdWViZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaW4gS29tbWFuZG8genVyIEF1Zmxpc3R1bmcgdm9uIFJ1ZXN0dW5ncy0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbi4KKworIDQgICAgICAgICBLdWVobHNjaHJhbmsgICAgIEVpbiBzdHJhaGxlbmR3ZWlzc2VyIEt1ZWhsc2NocmFuayBhdXMgZGVtICAgMy40OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXVzZSBCcm9zY2guIFBhc3N0IGluIGplZGUgS3VlY2hlLiBEYXJpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZWliZW4gSWhyZSBTcGVpc2VuIHVuZCBHZXRyYWVua2UgZnJpc2NoIQorCisgNSAgICAgICAgIFdhZmZlbnNjaHJhbmsgICAgRWluIG1hc3NpdmVyIEhvbHpzY2hyYW5rIG1pdCBGYWVjaGVybiBmdWVyICA1Ljg5OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhZmZlbiBhbGxlciBBcnQuIEplZGUgV2FmZmVuZ2F0dHVuZyBoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaHJlbiBlaW5lbmVuIFBsYXR6LCBlcyBnaWJ0IGVpbiBLb21tYW5kbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp1ciBBdWZsaXN0dW5nIHZvbiBXYWZmZW50eXBlbi4KKworIDYgICAgICAgICBXYWZmZW50cnVoZSAgICAgIEVpbmUgU3RhaGx0cnVoZSBtaXQgdmVyc2NoaWVkZW5lbiBGYWVjaGVybiAgNS4zOTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6dXIgQXVmbmFobWUgdm9uIFdhZmZlbiBhbGxlciBBcnQuIERpZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWhlIHZlcmZ1ZWd0IHVlYmVyIGVpbiBLb21tYW5kbyB6dXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWZsaXN0dW5nIHZvbiBXYWZmZW50eXBlbi4KKworIDcgICAgICAgICBUcmVzb3IgICAgICAgICAgIFNpY2hlcm4gU2llIElociBWZXJtb2VnZW4gZ2VnZW4gRWluYnJ1Y2ggICAgNC40OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmQgRGllYnN0YWhsLiBXaWU/IEdhbnogZWluZmFjaDogTWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllc2VtIHN0YWJpbGVuLCBmZXVlcnNpY2hlcmVuIFRyZXNvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmQgSWhyZSBXZXJ0c2FjaGVuIHNpY2hlci4KKworIDggICAgICAgICBaYXViZXJraXN0ZSAgICAgIFNpbmQgU2llIFphdWJlcmVyPyBPZGVyIGVpbmZhY2ggbnVyIFNhbW1sZXIgNy45OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyIHZvbiBaYXViZXJlci1Lb21wb25lbnRlbj8gRGFubiBoYWJlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpciBlaW4gTW9lYmVsc3R1ZWNrIGZ1ZXIgU2llLCBkYXMgU2llIGhhYmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVlc3NlbiEgQXVzIG1hZ2lzY2hlbSBCaXJuYmF1bWhvbHogZ2VmZXJ0aWd0LgorCisgOSAgICAgICAgIE11ZWxsY29udGFpbmVyICAgRGVyIEVyc2F0eiBmdWVyIGRlbiBNdWVsbHNjaGx1Y2tlci4gICAgICAgICAgIDk5OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pZSBtZWhyIGJyYXVjaGVuIFNpZSBlaW5lbiBMYWRlbiBhdWZzdWNoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVyIHVtIHdlcnRsb3NlbiBQbHVuZGVyIGxvc3p1d2VyZGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorMTAgICAgICAgICBTY2hsdWVzc2VsYnJldHQgIFNpZSBoYWJlbiBkdXJjaCBJaHJlIEFiZW50ZXVlciBlaW5lbiBTYWNrICAgICA0OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xsIFNjaGx1ZXNzZWw/IERpZXNlcyBCcmV0dCBzY2hhZmZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkbnVuZy4KKworMTEgICAgICAgICBEdXNjaGthYmluZSAgICAgIEVuZGxpY2ggYXVjaCBmdWVyIElociBadWhhdXNlOiAgICAgICAgICAgICAgMy40OTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaW5lIHVsdHJhbW9kZXJuZSBXYXNjaGdlbGVnZW5oZWl0LiBTaWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga29lbm5lbiBzb2dhciBzZWxic3QgZWluc3RlbGxlbiwgd29taXQgU2llIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpY2ggd2FzY2hlbiB3b2xsZW4hCisKKzEyICAgICAgICAgbWFnLiBIb2x6dHJ1aGUgICBIYWJlbiBhdWNoIFNpZSBQcm9ibGVtZSBtaXQgZWluZW0gdWViZXItICAgNzQuOTk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sbGVuIEludmVudGFyPyBXaXIgaGFiZW4gamV0enQgZGllCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9lc3VuZyBmdWVyIFNpZTogZGllc2Uga2xlaW5lIEhvbHp0cnVoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbW10IGlocmUgZXdpZ2VuIE9iamVrdGUgYXVmIHVuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXdhaHJ0IHNpZSBzaWNoZXIgdWViZXIgZGVuIG5hZWNoc3RlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlbHR1bnRlcmdhbmcgaGluYXVzIGF1ZiEKKyAKKzEzICAgICAgICAgVml0cmluZSAgICAgICAgICBHZWhvZXJlbiBTaWUgYXVjaCB6dSBkZW4gdGFwZmVyZW4gSGVsZGVuLCAgNDkuOTk5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllIHNpY2ggYmVyZWl0cyBQb2thbGUgdmVyZGllbnQgaGFiZW4/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhbm4gc29sbHRlbiBTaWUgc2ljaCBkaWVzZSBWaXRyaW5lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp1bGVnZW4sIGRhbWl0IElocmUgUG9rYWxlIGVpbmUgcGFzc2VuZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbWdlYnVuZyBlcmhhbHRlbiB1bmQgYXVjaCBiZWltIFdlbHQtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50ZXJnYW5nIGdlc2NodWV0enQgc2luZC4KKworMTQgICAgICAgICBMZXNlcHVsdCAgICAgICAgIERhcyBoYXQgbWFuIHNpY2ggcmVkbGljaCB2ZXJkaWVudCEgRWluZSAgICA2MC4wMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hvZW5lIEJlbG9obnVuZywgd2VubiBtYW4gc2NobGllc3NsaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuIGtub2VjaGVybmVuIFRlbXBlbCBtYWwgc28gcmljaHRpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZmdlcmFldW10IGhhdC4gVW5kIHp3YXIgdm9sbHN0YWVuZGlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGRhc3Mgc2VsYnN0IGRlciBUb3RlbmdvdHQgc3RhdW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZGxpY2gga29lbm5lbiBTaWUsIHdlbm4gZXIgZXMgZGVubiBkYW5uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjaCB6dWZyaWVkZW4gaXN0LCBkYXMgVGFnZWJ1Y2ggaGllcmF1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFibGVnZW4gdW5kIGluIGFsbGVyIFJ1aGUgYmxhZXR0ZXJuLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FubS4gZGVyIEdlc2NoYWVmdHNsZWl0dW5nOgorV2lyIGJlbXVlaGVuIHVucywgSWhyZW0gR2VzY2htYWNrIHVuZCBJaHJlbiBCZWR1ZXJmbmlzc2VuIGdlcmVjaHQgenUgd2VyZGVuLgorRmFsbHMgU2llIFZlcmJlc3NlcnVuZ3N2b3JzY2hsYWVnZSBoYWJlbiwgb2RlciBmYWxscyBTaWUgTW9lYmVsc3R1ZWNrZSBmdWVyIElocgorSGF1cyBpbiB1bnNlcmVtIEFuZ2Vib3QgdmVybWlzc2VuLCBzbyBzZXR6ZW4gU2llIGRvY2ggYml0dGUgZWluZSBlbnRzcHJlY2hlbmRlCitJZGVlIGltIExhZGVuIGFiLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NobHVlc3NlbGJyZXR0LmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaGx1ZXNzZWxicmV0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmFjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaGx1ZXNzZWxicmV0dC5jCkBAIC0wLDAgKzEsNjc5IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgU2NobHVlc3NlbGJyZXR0CisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAwMi4wNi4yMDAxCisvLyBPcmlnaW5hbDogICAgICAgICAgICBTd2lmdAorLy8gTmV1ZSBWZXJzaW9uOiAgICAgICAgU2VsZXZlbgorLy8g3GJlcm5vbW1lbjogICAgICAgICAgMjMuMDEuMjAwNgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIENoYW5nZWxvZworICAgKiAyMS4wNi4yMDA3LCBaZXNzdHJhCisgICAgIGltIGluaGVyaXQgYWJzLiBQZmFkIGR1cmNoIExBREVOKHgpIGVyc2V0enQuCisgICAqIDAxLjA3LjIwMDcsIFplc3N0cmEKKyAgICAgR2V0T3duZXIoKSBkZWZpbmllcnQuCisgICAqIDExLjA1LjIwMTUsIEFyYXRob3JuCisgICAgIHdlaXRyYWV1bWlnIHVlYmVyYXJiZWl0ZXQgenVyIEJlaGVidW5nIHZvbiBGZWhsZnVua3Rpb25lbgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBydHRfY2hlY2tzCisKKyNpbmNsdWRlICIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbGFkZW4uaCIKKyNpbmNsdWRlIDxhbnNpLmg+Citpbmhlcml0ICBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIzIgorLy8gWnVyIEluZGl6aWVydW5nIGRlcyBNYXBwaW5ncyA8aGFrZW4+CisjZGVmaW5lIEhPT0tfT0IgICAgMAorI2RlZmluZSBIT09LX0xBQkVMIDEKKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBLZXlEZXNjcmlwdGlvbihpbnQga2V5bnVtKTsKK3ByaXZhdGUgaW50IElzVmFsaWRLZXkob2JqZWN0IG9iKTsKK3ByaXZhdGUgaW50IEdldE5leHRGcmVlU2xvdCgpOworcHJpdmF0ZSBvYmplY3QgR2V0S2V5Rm9yTGFiZWwoc3RyaW5nIGxhYmVsKTsKK3ByaXZhdGUgaW50IEdldEhvb2tOdW1iZXJGb3JLZXkob2JqZWN0IG9iKTsKK3ByaXZhdGUgdm9pZCBDb25zb2xpZGF0ZUludmVudG9yeSgpOworCisvLyBTdHJ1a3R1cjogKFsgaGFrZW5fbnIgOiBvYmpla3Q7IGJlc2NocmlmdHVuZyBdKQorcHJpdmF0ZSBtYXBwaW5nIGhha2VuPShbOjJdKTsKK3ByaXZhdGUgaW50IGhvb2tsaXN0X2xvbmcgPSAwOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKFRPKSkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjpjcmVhdGUoKTsKKyAgCisgIGZvcmVhY2goaW50IGk6IDEuLjE2KSB7CisgICAgbV9hZGQoaGFrZW4sIGkpOworICB9CisKKyAgLy8gREVCVUchIFNvbnN0IGZ1bmt0aW9uaWVydCdzIGF1c3NlcmhhbGIgdm9uIFNlaGVyaGFldXNlcm4gbmljaHQuCisgIFNldFByb3AoInRlc3QiLDEpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gU2NobHVlc3NlbGJyZXR0Iik7CisgIFNldChQX0xPTkcsIGZ1bmN0aW9uIHN0cmluZyAoKSB7CisgICAgc3RyaW5nIHRleHQgPSBCUygKKyAgICAgICJFaW4ga2xlaW5lcyBCcmV0dCBhdXMgSG9seiwgYW4gZGVtIGluIDIgUmVpaGVuIGplIDggSGFrZW4gYmVmZXN0aWd0ICIKKyAgICAgICJzaW5kLCBhbiBkaWUgbWFuIGluc2dlc2FtdCAxNiBTY2hsdWVzc2VsIGhhZW5nZW4ga2Fubi4gVW0gZGllICIKKyAgICAgICJVZWJlcnNpY2h0IG5pY2h0IHp1IHZlcmxpZXJlbiwgYmVmaW5kZXQgc2ljaCB1ZWJlciBqZWRlbSBkZXIgSGFrZW4gIgorICAgICAgImVpbiBrbGVpbmVzIFNjaGlsZGNoZW4gYXVzIFNjaGllZmVyLCBkYXMgc2ljaCBiZXNjaHJpZnRlbiBsYWVzc3QuICIKKyAgICAgICJBdWYgZGllc2UgV2Vpc2UgZ2VodCBkZXIgU2lubiB1bmQgWndlY2sgZGVzIFNjaGx1ZXNzZWxzLCBkZXIgYW4gIgorICAgICAgImRpZXNlbSBIYWtlbiBydWh0LCBuaWNodCB2ZXJsb3Jlbi4gUHJha3Rpc2NoZXJ3ZWlzZSBoYWVuZ3QgYW4gZWluZXIgIgorICAgICAgIlNjaG51ciBlaW4gU3R1ZWNrIEtyZWlkZSB2b24gZGVtIEJyZXR0IGhlcmFiLCBtaXQgZGVtIER1IGRpZSAiCisgICAgICAiU2NoaWxkY2hlbiBiZXNjaHJpZnRlbiBrYW5uc3QuIik7CisgICAgdGV4dCArPSBLZXlEZXNjcmlwdGlvbigwKTsKKyAgICByZXR1cm4gdGV4dDsgCisgIH0sIEZfUVVFUllfTUVUSE9EKTsKKworICBBZGRJZCgoeyJzY2hsdWVzc2VsYnJldHQiLCJicmV0dCJ9KSk7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIFZFUlNJT05fT0JKKTsKKyAgU2V0UHJvcChQX0NOVF9TVEFUVVMsIDApOworICBTZXRQcm9wKFBfTkFNRSwgIlNjaGx1ZXNzZWxicmV0dCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBTZXRQcm9wKFBfV0VJR0hULCAxMDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDEgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTYpOworICAvLyBNYW4gc29sbCBuaWNodHMgdWViZXIgZGVuIG5vcm1hbGVuIE1lY2hhbmlzbXVzIHJlaW5zdGVja2VuIG9kZXIgCisgIC8vIHJhdXNuZWhtZW4ga29lbm5lbi4gV2lyZCB2b24gcHV0X2FuZF9nZXQuYyBnZXBydWVmdC4KKyAgU2V0UHJvcChQX0NPTlRBSU5FUiwgMCk7CisgIFNldFByb3AoUF9OT0lOU0VSVF9NU0csIEJTKCJBbiBkYXMgU2NobHVlc3NlbGJyZXR0IGthbm5zdCBEdSBudXIgIgorICAgICJTY2hsdWVzc2VsIGhhZW5nZW4uXG5TeW50YXg6ICdoYWVuZ2UgPHNjaGx1ZXNzZWw+IGFuIGJyZXR0Jy4iKSk7CisgIFNldFByb3AoUF9OT0dFVCwgIkRhcyBnZWh0IG5pY2h0LiAiK05hbWUoV0VSLDEpKworICAgICIgbGFlc3N0IHNpY2ggbmljaHQgYmV3ZWdlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX09BSywgTUFUX01JU0NfTUFHSUN9KSApOworICBTZXRQcm9wKFBfSU5GTywgIlZlcnN1Y2gncyBtYWwgbWl0OiBcInNrb21tYW5kb3Mgc2NobHVlc3NlbGJyZXR0XCIuXG4iKTsKKworICBBRCgoeyJob2x6In0pLCBCUygiRWNodGUsIHJvYnVzdGUgRWljaGUuIikpOworCisgIFJlbW92ZUNtZCgoeyJzY2hsaWVzc2UiLCJzY2hsaWVzcyIsIm9lZmZuZSJ9KSk7CisKKyAgQWRkQ21kKCh7InVudCIsICJ1bnRlcnN1Y2hlIiwgImJldHJhY2h0ZSIsICJiZXRyYWNodCIsICJiZXRyIiwKKyAgICAgICAgICAgInNjaGF1ZSIsICJzY2hhdSJ9KSwgInVudF9oYWtlbiIpOworICBBZGRDbWQoKHsiaGFlbmciLCAiaGFlbmdlIn0pLCAic2NobHVlc3NlbF9hbl9oYWtlbl9oYWVuZ2VuIik7CisgIEFkZENtZCgoeyJuaW1tIn0pLCAic2NobHVlc3NlbF92b25faGFrZW5fbmVobWVuIik7CisgIEFkZENtZCgic2Jlc2NocmlmdGUiLCAiY21kX2Jlc2NocmlmdGVuIik7CisgIEFkZENtZCgic2xpc3RlIiwgImNtZF9zbGlzdGUiKTsKK30KKworLyoqKioqIEtPTU1BTkRPRlVOS1RJT05FTiAqKioqKi8KKworLy8gS29uZmlndXJhdGlvbiBkZXIgU2NobHVlc3NlbGxpc3RlLCBlbnR3ZWRlciAiYWxsZSIgYW56ZWlnZW4gb2RlciBudXIgZGllCisvLyBiZWxlZ3RlbiBIYWtlbi4KK3N0YXRpYyBpbnQgY21kX3NsaXN0ZShzdHJpbmcgc3RyKSB7CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6ICdzbGlzdGUgYWxsZXxiZWxlZ3RlJy5cbiIpOworICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIHN0ciA9PSAiYWxsZSIgKSB7CisgICAgaWYgKCAhaG9va2xpc3RfbG9uZyApIHsKKyAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiT2ssIGVzIHdlcmRlbiBqZXR6dCBpbW1lciBhbGxlIEhha2VuICIKKyAgICAgICAgImF1ZmdlbGlzdGV0LiIpKTsKKyAgICAgIGhvb2tsaXN0X2xvbmcgPSAxOworICAgIH0KKyAgICBlbHNlIAorICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEaWUgRWluc3RlbGx1bmcgd2FyIHNjaG9uICdhbGxlJy4iKSk7CisgIH0KKyAgZWxzZSBpZiAoIHN0ciA9PSAiYmVsZWd0ZSIgKSB7CisgICAgaWYgKCBob29rbGlzdF9sb25nICkgeworICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJPaywgZXMgd2VyZGVuIGpldHp0IG51ciBkaWUgYmVsZWd0ZW4gSGFrZW4gIgorICAgICAgICAiYXVmZ2VsaXN0ZXQuIikpOworICAgICAgaG9va2xpc3RfbG9uZyA9MDsKKyAgICB9CisgICAgZWxzZSAKKyAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiRGllIEVpbnN0ZWxsdW5nIHdhciBzY2hvbiAnYmVsZWd0ZScuIikpOworICB9CisgIGVsc2UgCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvLyBIYWtlbiB1bnRlcnN1Y2hlbi4gT2huZSBBbmdhYmUgZGVyIE51bW1lciB3ZXJkZW4gYWxsZSBhdXNnZWdlYmVuLAorLy8gYW5zb25zdGVuIGRlciBnZXd1ZW5zY2h0ZSwgc29mZXJuIGVzIGRpZXNlbiBnaWJ0Lgorc3RhdGljIGludCB1bnRfaGFrZW4oc3RyaW5nIHN0cikgeworICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8IHN0cnN0cihzdHIsICJoYWtlbiIpID09IC0xICkKKyAgICByZXR1cm4gMDsKKyAgCisgIGludCBoYWtlbm5yOworICBpZiAoIHNzY2FuZihzdHIsICJoYWtlbiAlZCIsIGhha2VubnIpICE9IDEgKSB7CisgICAgc3RyaW5nIGRldCA9IEtleURlc2NyaXB0aW9uKGhha2VubnIpOworICAgIHRlbGxfb2JqZWN0KFRQLCBzaXplb2YoZGV0KSA/IGRldCA6ICJEaWUgSGFrZW4gc2luZCBhbGxlIGxlZXIuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG5vdGlmeV9mYWlsKCJXZWxjaGVuIEhha2VuIG1vZWNodGVzdCBEdSB1bnRlcnN1Y2hlbj8gRXMgZ2lidCBudXIgZGllICIKKyAgICAiSGFrZW4gMSBiaXMgMTYuXG4iKTsKKyAgaWYoIGhha2VubnI8MSB8fCBoYWtlbm5yID4gMTYgKQorICAgIHJldHVybiAwOworCisvLyAgYXVzZ2FiZV9oYWtlbihoYWtlbm5yKTsKKyAgdGVsbF9vYmplY3QoVFAsIEtleURlc2NyaXB0aW9uKGhha2VubnIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFNjaGx1ZXNzZWwgYXVmaGFlbmdlbi4KK3N0YXRpYyBpbnQgc2NobHVlc3NlbF9hbl9oYWtlbl9oYWVuZ2VuKHN0cmluZyBzdHIpIHsKKyAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgd29yYW4gaGFlbmdlbj9cbiIpOworICBpZighc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIG5vdGlmeV9mYWlsKCJEYXMgZGFyZnN0IER1IG5pY2h0LlxuIik7CisgIGlmKCFlcmxhdWJ0KCkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyaW5nIHdhcywgd29yYW47CisgIG5vdGlmeV9mYWlsKCJGb2xnZW5kZSBTeW50YXggdmVyc3RlaHQgRGVpbiBTY2hsdWVzc2VsYnJldHQ6XG4iCisgICAgIiAgXCJoYWVuZ2UgPHNjaGx1ZXNzZWxuYW1lPiBhbiBoYWtlbiBbbnJdXCIgb2RlclxuIgorICAgICIgIFwiaGFlbmdlIDxzY2hsdWVzc2VsbmFtZT4gYW4gW3NjaGx1ZXNzZWxdYnJldHRcIi5cbiIpOworICBpZiAoIHNzY2FuZihzdHIsICIlcyBhbiAlcyIsIHdhcywgd29yYW4pICE9IDIgKQorICAgIHJldHVybiAwOworCisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGFuIGRhcyBTY2hsdWVzc2VsYnJldHQgaGFlbmdlbj9cbiIpOworICBpZiAoICFzdHJpbmdwKHdhcykgKSAKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiV29yYW4gd2lsbHN0IER1IGRhcyBkZW5uIGhhZW5nZW4/XG4iKTsKKyAgaWYgKCBzdHJzdHIod29yYW4sICJoYWtlbiIsIDApPT0tMSAmJiAhaWQod29yYW4pICkKKyAgICByZXR1cm4gMDsKKworICAvLyBUZXN0LCBvYiBlcyBPYmpla3RlIGRpZXNlcyBOYW1lbnMgZ2lidC4KKyAgb2JqZWN0ICpvYnMgPSBUUC0+ZmluZF9vYnMod2FzLCBQVVRfR0VUX05PTkUpOworICAvLyBBdXMgZGVyIExpc3RlIGRlciBnZWZ1bmRlbmVuIE9iamVrdGUgYWxsZSByYXVzZmlsdGVybiwgZGllIGtlaW5lCisgIC8vIFNjaGx1ZXNzZWwgc2luZC4gQWxzIFNjaGx1ZXNzZWwgZ2VsdGVuIGhpZXIgYWxsZSBPYmpla3RlLCBkaWUgZGllCisgIC8vIElEICJzY2hsdWVzc2VsIiBoYWJlbiBvZGVyIGRpZSBtaXR0ZWxzIFF1ZXJ5RG9vcktleSgpIGVpbmVyIGJlc3RpbW10ZW4KKyAgLy8gVHVlciB6dWdlb3JkbmV0IHNpbmQuCisgIG9icyA9IGZpbHRlcihvYnMsICMnSXNWYWxpZEtleSk7CisgIG5vdGlmeV9mYWlsKCJLZWluZShuKSBTY2hsdWVzc2VsIG1pdCBkZW0gTmFtZW4gZ2VmdW5kZW4uXG4iKTsKKyAgaWYgKCAhc2l6ZW9mKG9icykgKQorICAgIHJldHVybiAwOworCisgIGludCBuciA9IEdldE5leHRGcmVlU2xvdCgpOworICBub3RpZnlfZmFpbCgiQW0gU2NobHVlc3NlbGJyZXR0IGlzdCBrZWluIEhha2VuIG1laHIgZnJlaS5cbiIpOworICBpZiAoICFuciApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gV2VubiBudXIgZWluIFNjaGx1ZXNzZWwgZ2VmdW5kZW4gd3VyZGUsIHdpcmQgZ2VuYXVlciBnZXNjaGF1dCwgb2IKKyAgLy8gZGVyIFNwaWVsZXIgZ2VzYWd0IGhhdCwgd28gZGVyIGhpbnNvbGwuCisgIGlmICggc2l6ZW9mKG9icykgPT0gMSApIHsKKyAgICBpZiAoIHdvcmFuICE9ICJoYWtlbiIgfHwgIWlkKHdvcmFuKSApCisgICAgICBzc2NhbmYod29yYW4sICJoYWtlbiAlZCIsIG5yKTsKKyAgfQorCisgIG5vdGlmeV9mYWlsKCJFcyBnaWJ0IG51ciBkaWUgSGFrZW4gMSBiaXMgMTYuXG4iKTsKKyAgaWYgKCBuciA8IDEgfHwgbnIgPiAxNiApCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIkRlciBIYWtlbiBpc3QgbmljaHQgbWVociBmcmVpLlxuIik7CisgIGlmICggb2JqZWN0cChoYWtlbltucixIT09LX09CXSkgKQorICAgIHJldHVybiAwOworCisgIC8vIEFsbGUgZ2VmdW5kZW5lbiBTY2hsdWVzc2Vsb2JqZWt0ZSBhbnMgQnJldHQgaGFlbmdlbi4KKyAgZm9yZWFjaCggb2JqZWN0IGtleSA6IG9icyApIHsKKyAgICBzd2l0Y2ggKGtleS0+bW92ZShNRSwgTV9QVVQpKSB7CisgICAgICAvLyBEaWUgS2FwYXppdGFldCBpc3QgdWViZXIgUF9NQVhfT0JKRUNUUyBiZWdyZW56dC4gQWxsZQorICAgICAgLy8gU2NobGVpZmVuZHVyY2hsYWV1ZmUsIGRpZSBkaWUgS2FwYXppdGFldHNncmVuemUgZXJyZWljaGVuLCBsYW5kZW4KKyAgICAgIC8vIGluIGRlZmF1bHQgdW5kIGJlZW5kZW4gZGFtaXQgZGllIFNjaGxlaWZlLiBEYWhlciBtdWVzc2VuIHNpZSAKKyAgICAgIC8vIG5pY2h0IGdlc29uZGVydCBiZWhhbmRlbHQgd2VyZGVuLgorICAgICAgY2FzZSBNT1ZFX09LIDoKKyAgICAgICAgLy8gRmFsbHMgZGFzIEJyZXR0IHZvbGwgc2VpbiBzb2xsdGUsIGFiZXIgZmFlbHNjaGxpY2hlcndlaXNlIAorICAgICAgICAvLyBkZW5ub2NoIGVpbiB3ZWl0ZXJlciBTY2hsdWVzc2VsIGhpbmVpbmJld2VndCB3dXJkZSwgaXN0IG5yPT0wLAorICAgICAgICAvLyB1bmQgZXMgd2lyZCBlaW4gRmVobGVyIGF1c2dlbG9lc3QsIGRhbWl0IG5pY2h0IGhpbnRlcmhlciBlaW4KKyAgICAgICAgLy8gU2NobHVlc3NlbCBhbiBIYWtlbiAwIGhhZW5ndC4KKyAgICAgICAgaWYgKCAhbnIgKSB7CisgICAgICAgICAgcmFpc2VfZXJyb3IoIkZlaGxlcjogSGFrZW4gMCBkYXJmIG5pY2h0IGJlbGVndCB3ZXJkZW4uIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBoYWVuZ3N0ICIrb2JzWzBdLT5uYW1lKFdFTiwxKSsiIGFuIEhha2VuICIrCisgICAgICAgICAgbnIrIi4iKSk7CisgICAgICAgIC8vIE51ciB3ZW5uIGVpbiBTY2hsdWVzc2VsIGVyZm9sZ3JlaWNoIGRyYW5nZWhhZW5ndCB3dXJkZSwgd2lyZCBlcgorICAgICAgICAvLyBpbiBkaWUgTGlzdGUgZWluZ2V0cmFnZW4uIEV0d2FpZ2UgQmVzY2hyaWZ0dW5nZW4gYmxlaWJlbiBiZXN0ZWhlbiwKKyAgICAgICAgaGFrZW5bbnIsIEhPT0tfT0JdID0ga2V5OworICAgICAgICAvLyB1bmQgbnVyIGRhbm4gd2lyZCBkZXIgbmFlY2hzdGUgU2xvdCBwcm9iaWVydC4gV2VubiBudXIgZWluIAorICAgICAgICAvLyBTY2hsdWVzc2VsIHZlcmFyYmVpdGV0IHdpcmQsIGlzdCBkYXMgaGllciB1bnNjaGFlZGxpY2gsIHdlaWwgZXMgCisgICAgICAgIC8vIG5pY2h0IG5vY2htYWwgYXVzZ2V3ZXJ0ZXQgd2lyZC4KKyAgICAgICAgbnIgPSBHZXROZXh0RnJlZVNsb3QoKTsKKyAgICAgICAgLy8gU2NobHVlc3NlbCB3dXJkZSB2ZXJhcmJlaXRldCB1bmQgTWVsZHVuZyBhdXNnZWdlYmVuCisgICAgICAgIG9icyAtPSAoe2tleX0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTUVfQ0FOVF9MRUFWRV9FTlYgOgorICAgICAgY2FzZSBNRV9DQU5UX0JFX0lOU0VSVEVEIDoKKyAgICAgIGNhc2UgTUVfQ0FOVF9CRV9EUk9QUEVEIDoKKyAgICAgICAgLy8gU2NobHVlc3NlbCB3dXJkZSBuaWNodCBlcmZvbGdyZWljaCBkcmFuZ2VoYWVuZ3QuCisgICAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUyhrZXktPk5hbWUoV0VSLDEpKyIgd2VpZ2VydCBzaWNoLCBhbnMgIgorICAgICAgICAgICJTY2hsdWVzc2VsYnJldHQgZ2VoYWVuZ3QgenUgd2VyZGVuLiIpKTsKKyAgICAgICAgLy8gTWVsZHVuZyB3dXJkZSBhdXNnZWdlYmVuLCBuaWNodHMgd2VpdGVyIHp1IHR1bi4KKyAgICAgICAgb2JzIC09ICh7a2V5fSk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gVE9PX01BTllfT0JKRUNUUyB3aXJkIG5pY2h0IGhpZXIgYmVoYW5kZWx0LCBzb25kZXJuIHdlaXRlciB1bnRlbiwKKyAgICAgIC8vIHVtIGVpbmUgQXVmbGlzdHVuZyBkZXIgU2NobHVlc3NlbG5hbWVuIGF1c2dlYmVuIHp1IGtvZW5uZW4sIHN0YXR0CisgICAgICAvLyBlaW5lIFplaWxlIHBybyBTY2hsdWVzc2VsLiBEaWUgYW5kZXJlbiBSdWVja2dhYmV3ZXJ0ZSB2b24gbW92ZSgpIAorICAgICAgLy8gc2luZCBiZWkgZGllc2VyIEFydCBkZXIgQmV3ZWd1bmcgbmljaHQgenUgZXJ3YXJ0ZW4uCisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gRnVlciBhbGxlIHVlYnJpZ2VuIHdhciB3b2hsIFRPT19NQU5ZX09CSkVDVFMgZGVyIFJ1ZWNrZ2FiZXdlcnQsIGRlbm4KKyAgLy8gZGFzIFNjaGx1ZXNzZWxicmV0dCBlcmxhdWJ0IG51ciBQX01BWF9PQkpFQ1RTID0gMTYuCisgIGlmICggc2l6ZW9mKG9icykgKSB7CisgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJGdWVyICIrQ291bnRVcChvYnMtPm5hbWUoV0VOKSkrIiBpc3QgbGVpZGVyIGtlaW4gIgorICAgICAgIkhha2VuIG1laHIgYW0gU2NobHVlc3NlbGJyZXR0IGZyZWkuIikpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBTY2hsdWVzc2VsIGFibmVobWVuCitzdGF0aWMgaW50IHNjaGx1ZXNzZWxfdm9uX2hha2VuX25laG1lbihzdHJpbmcgc3RyKSB7CisgIGlmKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApIAorICAgIHJldHVybiAwOworCisgIHN0cmluZyB3YXMsIHdvcmF1czsKKyAgaWYgKCBzc2NhbmYoc3RyLCAiJXMgYXVzICVzIiwgd2FzLCB3b3JhdXMpICE9IDIgJiYgCisgICAgICAgc3NjYW5mKHN0ciwgIiVzIHZvbiAlcyIsIHdhcywgd29yYXVzKSAhPSAyICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiRGFzIGRhcmZzdCBEdSBuaWNodCFcbiIpOworICBpZighZXJsYXVidCgpKSAKKyAgICByZXR1cm4gMDsKKyAKKyAgbm90aWZ5X2ZhaWwoIldvcmF1cyB3aWxsc3QgRHUgZGFzIGRlbm4gbmVobWVuP1xuIik7CisgIGlmICggIWlkKHdvcmF1cykgJiYgc3Ryc3RyKHdvcmF1cywgImhha2VuIiwgMCkgPT0gLTEgKSAKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIHZvbSBTY2hsdWVzc2VsYnJldHQgbmVobWVuP1xuIik7CisgIGlmKCAhc3RyaW5ncCh3YXMpICkgCisgICAgcmV0dXJuIDA7CisgIAorICBub3RpZnlfZmFpbCgiRGFzIFNjaGx1ZXNzZWxicmV0dCBpc3QgZG9jaCBhYmVyIGxlZXIuXG4iKTsKKyAgaWYgKCAhc2l6ZW9mKGFsbF9pbnZlbnRvcnkoTUUpKSApCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGhha2VubnI7CisgIG9iamVjdCAqa2V5cyA9ICh7fSk7CisgIC8vIEVzIG11ZXNzZW4gYXVjaCBTY2hsdWVzc2VsIHZvbiBiZXN0aW1tdGVuIEhha2VuIGFiZ2Vub21tZW4KKyAgLy8gd2VyZGVuIGtvZW5uZW4sIG5pY2h0IG51ciBqZXdlaWxzIGRlciBlcnN0ZSBtaXQgZGVyIGFuZ2VnZWJlbmVuIElELgorICAvLyBEaWVzIGhhdCBhdWNoIFByaW8gZ2VnZW51ZWJlciBkZXIgYWxsZ2VtZWluZW4gQmVncmlmZnNzdWNoZSBtaXQKKyAgLy8gZmluZF9vYnMoKS4KKyAgaWYgKCBzc2NhbmYod29yYXVzLCAiaGFrZW4gJWQiLCBoYWtlbm5yKSA9PSAxICkgeworICAgIG5vdGlmeV9mYWlsKCJFcyBnaWJ0IG51ciBkaWUgSGFrZW4gMSBiaXMgMTYuXG4iKTsKKyAgICBpZiAoIGhha2VubnIgPCAxIHx8IGhha2VubnIgPiAxNiApIAorICAgICAgcmV0dXJuIDA7CisgICAgbm90aWZ5X2ZhaWwoIkFuIGRpZXNlbSBIYWtlbiBoYWVuZ3QgYWJlciBkb2NoIGtlaW4gU2NobHVlc3NlbC5cbiIpOworICAgIGlmICggIW9iamVjdHAoaGFrZW5baGFrZW5ucixIT09LX09CXSkgKQorICAgICAgcmV0dXJuIDA7CisgICAgCisgICAga2V5cyArPSAoeyBoYWtlbltoYWtlbm5yLEhPT0tfT0JdIH0pOworICB9CisKKyAgLy8gS2VpbmVyIGdlZnVuZGVuPyBWaWVsbGVpY2h0IGlzdCBqYSBlaW5lciBtaXQgZWluZXIgYmVzdGltbXRlbiAKKyAgLy8gQmVzY2hyaWZ0dW5nIGdlbWVpbnQ/CisgIGlmICggIXNpemVvZihrZXlzKSApIHsKKyAgICAvLyBTY2hsdWVzc2VsIG1pdCBkZW0gYW5nZWdlYmVuZW4gTmFtZW4gc3VjaGVuCisgICAga2V5cyA9IFRQLT5maW5kX29icyh3YXMrIiBpbiBicmV0dCBpbiByYXVtIik7CisgICAgLy8gSGFrZW5udW1tZXIgZXJtaXR0ZWxuLCB3ZW5uIGVpbmUgQmVzY2hyaWZ0dW5nIGFuZ2VnZWJlbiB3dXJkZS4KKyAgICBzdHJpbmcgd2FudGVkX2Rlc2M7CisgICAgc3NjYW5mKHdhcywgInNjaGx1ZXNzZWwgZnVlciAlcyIsIHdhbnRlZF9kZXNjKTsKKyAgICBvYmplY3Qgd2FudGVkX2tleSA9IEdldEtleUZvckxhYmVsKHdhbnRlZF9kZXNjKTsKKyAgICBpZiAoIG9iamVjdHAod2FudGVkX2tleSkgKQorICAgICAga2V5cyArPSAoe3dhbnRlZF9rZXl9KTsKKyAgfQorICAvLyBJbW1lciBub2NoIG5peCBnZWZ1bmRlbj8gRGFubiBtdXNzIHNpY2ggZGVyIFNwaWVsZXIgd2FzIGFuZGVyZXMgCisgIC8vIGVpbmZhbGxlbiBsYXNzZW4uCisgIG5vdGlmeV9mYWlsKCJBbSBTY2hsdWVzc2VsYnJldHQgaGFlbmd0IGtlaW4gc29sY2hlciBTY2hsdWVzc2VsLlxuIik7CisgIGlmICggIXNpemVvZihrZXlzKSApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gQWxsZSBnZWZ1bmRlbmVuIFNjaGx1ZXNzZWwgdmVyYXJiZWl0ZW4uIEFsbGUsIGRpZSBuaWNodCBiZXdlZ3Qgd2VyZGVuCisgIC8vIGtvZW5uZW4sIHZlcmJsZWliZW4gaW4gZGVyIExpc3RlLgorICBmb3JlYWNoKCBvYmplY3Qga2V5IDoga2V5cyApIHsKKyAgICBpbnQgY3VycmVudF9ob29rID0gR2V0SG9va051bWJlckZvcktleShrZXkpOworICAgIGlmICgga2V5LT5tb3ZlKFRQLE1fR0VUKSA9PSBNT1ZFX09LICkgeworICAgICAga2V5cyAtPSAoeyBrZXkgfSk7CisgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIkR1IG5pbW1zdCAiK2tleS0+bmFtZShXRU4sMSkrIiB2b24gSGFrZW4gIisKKyAgICAgICAgY3VycmVudF9ob29rKyIgYWIuIikpOworICAgICAgLy8gU2NobHVlc3NlbCBhdXN0cmFnZW47IGJlc3RlaGVuZGUgQmVzY2hyaWZ0dW5nZW4gYmxlaWJlbiBlcmhhbHRlbgorICAgICAgaGFrZW5bY3VycmVudF9ob29rLCBIT09LX09CXSA9IDA7CisgICAgfQorICB9CisgIC8vIFZvbiBhbGxlbiBuaWNodCB2b20gSGFrZW4gZ2Vub21tZW5lbiBTY2hsdWVzc2VsbiBkaWUgTmFtZW4gZXJtaXR0ZWxuCisgIC8vIHVuZCBhdWZsaXN0ZW4uCisgIGlmICggc2l6ZW9mKGtleXMpICkgeworICAgIHRlbGxfb2JqZWN0KFRQLCBCUyhjYXBpdGFsaXplKENvdW50VXAoa2V5cy0+bmFtZShXRVIsMSkpKSsiICIrCisgICAgICAoc2l6ZW9mKGtleXMpPT0xPyJrb25udGUiOiJrb25udGVuIikrIiBuaWNodCB2b20gU2NobHVlc3NlbGJyZXR0ICIKKyAgICAgICJhYmdlbm9tbWVuIHdlcmRlbi4iKSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFZlcmZ1ZWdiYXJlIEtvbW1hbmRvcyBhdWZsaXN0ZW4uCit2YXJhcmdzIGludCBza29tbWFuZG9zKHN0cmluZyBzdHIpIHsKKyAgbm90aWZ5X2ZhaWwoICJGZWhsZXI6IERpZXNlciBCZWZlaGwgYmVub2V0aWd0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFscyAiCisgICAgKyJQYXJhbWV0ZXIuXG5CZWlzcGllbDogc2tvbW1hbmRvcyBbc2NobHVlc3NlbF1icmV0dFxuIik7CisgIAorICBpZiggIWlkKHN0cikgKSByZXR1cm4gMDsKKworICB3cml0ZSgKKyAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAiPT09PT09PT09PVxuIgorICAgICJBa3R1ZWxsZSBWZXJzaW9uOiAiK1F1ZXJ5UHJvcCgiY250X3ZlcnNpb25fc3RkIikrCisgICAgICBRdWVyeVByb3AoImNudF92ZXJzaW9uX29iaiIpKyJcbiIrCisgICAgQlMoTmFtZShXRVIsMSkrIiBrYW5uIG51ciBpbiBkaWVzZW0gU2VoZXJoYXVzIHZlcndlbmRldCB3ZXJkZW4sICIKKyAgICAiZGEgIitRdWVyeVByb25vdW4oV0VSKSsiIHNwZXppZWxsIGRhZnVlciBnZWthdWZ0IHd1cmRlLiAiKworICAgIENBUChRdWVyeVByb25vdW4oV0VSKSkrIiB2ZXJmdWVndCB1ZWJlciBmb2xnZW5kZSBLb21tYW5kb3M6IikrCisgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgIi0tLS0tLS1cbiIKKyAgICAic2VybGF1YmUgW3NjaGx1ZXNzZWxdYnJldHQgW3NwaWVsZXJuYW1lfFwiaGF1c2ZyZXVuZGVcInxcInp3ZWl0aWVzXCJdXG4iCisgICAgIiAgRXJsYXVidCBQZXJzb25lbiwgIituYW1lKFdFTiwxKSsiIG1pdHp1YmVudXR6ZW4uXG4iCisgICAgIiAgc2VybGF1YmUgb2huZSBBbmdhYmUgZWluZXMgQXJndW1lbnRzIGxpc3RldCBhbGxlIFBlcnNvbmVuIG1pdCBadWdyaWZmICIKKyAgICAgICJhdWZcbiAgIituYW1lKFdFTiwxKSsiIGF1Zi5cblxuIgorICAgICJ2ZXJzY2hpZWJlIFtzY2hsdWVzc2VsXWJyZXR0IG5hY2ggW2F1c2dhbmddXG4iCisgICAgIiAgRGFtaXQga2FubnN0IER1ICIrbmFtZShXRU4sMSkrIiBpbm5lcmhhbGIgRGVpbmVzIFNlaGVyaGF1c2VzICIKKyAgICAidmVyc2NoaWViZW4uXG5cbiIKKyAgICAic3ZlcnN0ZWNrZSBbc2NobHVlc3NlbF1icmV0dFxuIgorICAgICIgIERhbWl0IG1hY2hzdCBEdSAiK25hbWUoV0VOLDEpKyIgdW5zaWNodGJhci5cbiIKKyAgICAic2hvbGUgW3NjaGx1ZXNzZWxdYnJldHQgaGVydm9yXG4iCisgICAgIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB3aWVkZXIgc2ljaHRiYXIuXG4iCisgICAgInplcnRydWVtbWVyIFtzY2hsdWVzc2VsXWJyZXR0XG4iCisgICAgIiAgRGFtaXQgemVyc3RvZXJzdCBEdSBkYXMgU2NobHVlc3NlbGJyZXR0LlxuIgorICAgICJzYmVzY2hyaWZ0ZSBoYWtlbiA8bnI+IG1pdCA8dGV4dD58bmljaHRzXG4iCisgICAgIiAgRWluZSBCZXNjaHJpZnR1bmcgYW4gZWluZW0gSGFrZW4gYW5icmluZ2VuIG9kZXIgbG9lc2NoZW4uXG4iCisgICAgInNsaXN0ZSBsYW5nfGt1cnpcbiIKKyAgICAiICBTY2hsdWVzc2VsYW56ZWlnZSBrb25maWd1cmllcmVuOiBhbGxlIG9kZXIgbnVyIGJlbGVndGUgYXVmbGlzdGVuLlxuIgorICAgICJoYWVuZ2UgPHNjaGx1ZXNzZWxuYW1lPiBhbiBoYWtlbiBbbnJdXG4iCisgICAgImhhZW5nZSA8c2NobHVlc3NlbG5hbWU+IGFuIFtzY2hsdWVzc2VsXWJyZXR0XG4iCisgICAgIiAgRGFtaXQgaGFlbmdzdCBEdSBlaW5lbiBTY2hsdWVzc2VsIGFuIGRhcyBCcmV0dC5cbiIKKyAgICAibmltbSBzY2hsdWVzc2VsIHZvbiBoYWtlbiA8bnI+XG4iCisgICAgIm5pbW0gPHNjaGx1ZXNzZWxuYW1lPiB2b24gW3NjaGx1ZXNzZWxdYnJldHRcbiIKKyAgICAibmltbSBzY2hsdWVzc2VsIGZ1ZXIgPGJlc2NocmlmdHVuZz4gdm9uIFtzY2hsdWVzc2VsXWJyZXR0LlxuIgorICAgICIgIERhbWl0IG5pbW1zdCBEdSBlaW5lbiBTY2hsdWVzc2VsIHZvbSBTY2hsdWVzc2VsYnJldHQuXG4iCisgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgIj09PT09PT09PT1cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlcmxhdWJuaXNfbGlzdGUoKQoreworICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgeworICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgQmVyZWNodGlndW5nZW4gIgorICAgICAgK25hbWUoV0VTU0VOLDEpKyIgYWJmcmFnZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIAorICBzdHJpbmcgKnN0cnM7CisgIHN0cmluZyBzdHIgPSAKKyAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAiPT09PT09PT09PVxuIjsKKyAgaWYgKCBoYXVzZXJsYXVibmlzICkgeworICAgIHN0cnMgPSBTSFZFUldBTFRFUi0+SGF1c1Byb3AoTE9XRVIoUXVlcnlIYXVzYmVzaXR6ZXIoKSksIDIpOworICAgIHN0ciArPSAiRm9sZ2VuZGUgRnJldW5kZSBEZWluZXMgSGF1c2VzIGR1ZXJmZW4gIituYW1lKFdFTiwxKSsKKyAgICAgICIgbWl0YmVudXR6ZW46XG4iOworICAgIGlmKHNpemVvZihzdHJzKSkgeworICAgICAgc3RyICs9IEJTKENvdW50VXAoc3RycykpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHN0ciArPSBCUygiRHUgaGFzdCBrZWluZXIgUGVyc29uIFp1Z3JpZmYgYXVmIERlaW4gSGF1cyBnZXdhZWhydC4uLiIpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzdHIrPSBCUygiRGllIEZyZXVuZGUgRGVpbmVzIEhhdXNlcyBkdWVyZmVuICIrbmFtZShXRU4sMSkrCisgICAgICAiIG5pY2h0IG1pdGJlbnV0emVuLiIpOworICB9CisKKyAgc3RyICs9IAorICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICItLS0tLS0tLS0tXG4iOworCisgIGlmKCB6d2VpdGllZXJsYXVibmlzIT0iIiApIHsKKyAgICBpZiggendlaXRpZWVybGF1Ym5pcz09Z2V0ZXVpZChUUCkgKQorICAgICAgc3RyICs9IEJTKCJBbGxlIERlaW5lIFp3ZWl0aWVzIGR1ZXJmZW4gIituYW1lKFdFTiwxKSsiIG1pdGJlbnV0emVuLiIpOworICAgIGVsc2UKKyAgICAgIHN0ciArPSBCUygiQWxsZSBad2VpdGllcyB2b24gIitDQVAoendlaXRpZWVybGF1Ym5pcykrIiBkdWVyZmVuICIKKyAgICAgICAgK25hbWUoV0VOLDEpKyIgbWl0YmVudXR6ZW4uIik7CisgICAgc3RyICs9CisgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICItLS0tLS0tLS0tXG4iOworICB9CisgIAorICBzdHJzPVF1ZXJ5UHJvcCgiY250X2VybGF1Ym5pcyIpOworCisgIGlmKHNpemVvZihzdHJzKSkgeworICAgIHN0ciArPSBCUygiRm9sZ2VuZGUgc29uc3RpZ2UgUGVyc29uZW4gZHVlcmZlbiAiK25hbWUoV0VOLDEpKworICAgICAgIiBtaXRiZW51dHplbjoiKTsKKyAgICBzdHIgKz0gQ291bnRVcChzdHJzKTsKKyAgfQorICBlbHNlIHsKKyAgICBzdHIgKz0gQlMoIkVzIGdpYnQga2VpbmUgc29uc3RpZ2VuIFBlcnNvbmVuLCBkaWUgIituYW1lKFdFTiwxKSsKKyAgICAgICIgbWl0YmVudXR6ZW4gZHVlcmZlbi4iKTsKKyAgfQorICBzdHIgKz0KKyAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAiPT09PT09PT09PVxuIjsKKyAgCisgIHJldHVybiAxOworfQorCisvLyBIYWtlbiBiZXNjaHJpZnRlbi4KK3N0YXRpYyBpbnQgY21kX2Jlc2NocmlmdGVuKHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nIG5mbSA9ICJTeW50YXg6IHNiZXNjaHJpZnRlIGhha2VuIDxoYWtlbm51bW1lcj4gbWl0ICIKKyAgICAiPHRleHQ+fG5pY2h0c1xuIgorICAgICJGdWVyIDx0ZXh0PiBrYW5uc3QgRHUgZWluZW4gYmVsaWViaWdlbiBUZXh0IG1pdCBiaXMgenUgMzAgWmVpY2hlbiAiCisgICAgImFuZ2ViZW4sXG4iCisgICAgIiduaWNodHMnIGxvZXNjaHQgZGllIEJlc2NocmlmdHVuZyBlaW5lcyBTY2hpbGRlcy5cbiI7CisKKyAgbm90aWZ5X2ZhaWwoIkRhcyBkYXJmc3QgRHUgbmljaHQhXG4iKTsKKyAgaWYoIWVybGF1YnQoKSkgCisgICAgcmV0dXJuIDA7CisgIAorICBzdHJpbmcgdGV4dDsKKyAgaW50IGhucjsKKyAgc3RyID0gVFAtPl91bnBhcnNlZF9hcmdzKDApOworICBub3RpZnlfZmFpbChuZm0pOworICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkgCisgICAgcmV0dXJuIDA7CisgIGlmICggc3NjYW5mKHN0ciwiaGFrZW4gJWQgbWl0ICVzIiwgaG5yLCB0ZXh0KSE9MiApCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIldlbGNoZW4gSGFrZW4gbW9lY2h0ZXN0IER1IGJlc2NocmlmdGVuP1xuIituZm0pOworICBpZighaG5yKSAKKyAgICByZXR1cm4gMDsKKyAgCisgIG5vdGlmeV9mYWlsKCJFcyBnaWJ0IG51ciBkaWUgSGFrZW4gMSBiaXMgMTYuXG4iKTsKKyAgaWYgKCBobnIgPCAxIHx8IGhuciA+IDE2ICkgCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIldvbWl0IG1vZWNodGVzdCBEdSBkZW4gSGFrZW4gYmVzY2hyaWZ0ZW4/XG4iK25mbSk7CisgIGlmKCAhc3RyaW5ncCh0ZXh0KSB8fCAhc2l6ZW9mKHRleHQpICkKKyAgICByZXR1cm4gMDsKKworICBub3RpZnlfZmFpbCgiRGVyIFRleHQgc29sbHRlIG5pY2h0IGxhZW5nZXIgYWxzIDMwIFplaWNoZW4gc2Vpbi5cbiIpOworICBpZihzaXplb2YodGV4dCkgPiAzMCkgCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCBsb3dlcl9jYXNlKHRleHQpID09ICJuaWNodHMiICkgeworICAgIGlmICggc3RyaW5ncChoYWtlbltobnIsSE9PS19MQUJFTF0pICkgeworICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJTb3JnZmFlbHRpZyB3aXNjaHN0IER1IGRpZSBCZXNjaHJpZnR1bmcgZGVzICIKKyAgICAgICAgIkhha2VucyAiK2hucisiIHdlZy4iKSk7CisgICAgICBoYWtlbltobnIsSE9PS19MQUJFTF09MDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZWxsX29iamVjdChUUCwgQlMoIkR1IG11c3N0IERpY2ggZ2VpcnJ0IGhhYmVuLiBIYWtlbiAiK2hucisiIGlzdCAiCisgICAgICAgICJnYXIgbmljaHQgYmVzY2hyaWZ0ZXQuIikpOworICAgIH0KKyAgfQorICBlbHNlIGlmICggbG93ZXJfY2FzZSh0ZXh0KSA9PSAic2NobHVlc3NlbCIgKSB7CisgICAgdGVsbF9vYmplY3QoVFAsIEJTKAorICAgICAgIkR1IHNvbGx0ZXN0IERpciBldHdhcyBBdXNzYWdla3JhZWZ0aWdlcmVzIGVpbmZhbGxlbiBsYXNzZW4uIikpOworICB9CisgIGVsc2UgeworICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiRHUgYmVzY2hyaWZ0ZXN0IGRhcyBTY2hpbGRjaGVuIHVlYmVyIEhha2VuICIraG5yKworICAgICAgIiBtaXQgIit0ZXh0KyIuIikpOworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBCUygKKyAgICAgIFRQLT5OYW1lKFdFUikrIiBzY2hyZWlidCBldHdhcyBhbnMgU2NobHVlc3NlbGJyZXR0LiIpLCAoe1RQfSkpOworICAgIGhha2VuW2hucixIT09LX0xBQkVMXSA9IHRleHQ7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qKioqKiBISUxGU0ZVTktUSU9ORU4gKioqKiovCisKKy8vIEJlc2NocmVpYnVuZyBlaW5lcyBIYWtlbnMgZXJ6ZXVnZW4uIFdlbm4gPGtleW51bT4gYW5nZWdlYmVuIHdpcmQsIAorLy8gd2lyZCBudXIgZGVyIGdlc3VjaHRlIEhha2VuIGFuZ2V6ZWlndCwgZWdhbCBvYiBsZWVyIG9kZXIgbmljaHQuIAorLy8gQW5zb25zdGVuIHdlcmRlbiBkaWUgYmVsZWd0ZW4gSGFrZW4gYW5nZXplaWd0LCBhdXNzZXIgd2VubiAKKy8vIDxob29rbGlzdF9sb25nPiBnZXNldHp0IGlzdC4gRGFubiB3ZXJkZW4gYWxsZSBIYWtlbiBhdWZnZWxpc3RldC4KK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgS2V5RGVzY3JpcHRpb24oaW50IGtleW51bSkgeworICBzdHJpbmcgZGVzYz0iIjsKKyAgbWFwcGluZyBrZXlsaXN0PShbOjJdKTsKKworICAvLyBMaXN0ZSBkZXJIYWtlbiBhdWYgZGVuL2RpZSBnZXN1Y2h0ZW4gZWluc2NocmFlbmtlbi4KKyAgLy8gTnVyIGVpbiBIYWtlbiBzb2xsIGFuZ2VzY2hhdXQgd2VyZGVuLiBEaWVzIGhhdCBpbW1lciBQcmlvcml0YWV0LAorICAvLyBkLmguIGF1Y2ggYmVpIDxzbGlzdGUgYWxsZT4gd2lyZCBudXIgZWluIEhha2VuIGdlbGlzdGV0LgorICBpZiAoIGtleW51bSApIHsKKyAgICBtX2FkZChrZXlsaXN0LCBrZXludW0sIG1fZW50cnkoaGFrZW4sIGtleW51bSkuLi4pOworICB9CisgIC8vIFdlbm4gPHNsaXN0ZSBhbGxlPiBnZXNldHp0IGlzdCwgYWxsZSBhdXNnZWJlbi4KKyAgZWxzZSBpZiAoIGhvb2tsaXN0X2xvbmcgKSB7CisgICAga2V5bGlzdCA9IGhha2VuOworICB9CisgIC8vIEFuc29uc3RlciBudXIgZGllIGJlbGVndGVuLgorICBlbHNlIHsKKyAgICBrZXlsaXN0ID0gZmlsdGVyKGhha2VuLCAKKyAgICAgIGZ1bmN0aW9uIGludCAoaW50IG51bSwgPHN0cmluZ3xvYmplY3Q+KiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdHAodmFsdWVzWzBdKTsKKyAgICAgIH0pOworICB9CisKKyAgLy8gVWViZXIgZGFzIE1hcHBpbmcgbWl0IGRlbiBzZWxla3RpZXJ0ZW4gSGFrZW4gbGF1ZmVuIHVuZCBBdXNnYWJlbgorICAvLyBlcnpldWdlbi4KKyAgZm9yZWFjaChpbnQgbnVtIDogMS4uMTYpIHsKKyAgICAvLyBIaWVyIHdpcmQgZGVyIGFrdHVlbGxlIFdlcnQgdWViZXJzcHJ1bmdlbiwgd2VubiBlciBuaWNodCBlbnRoYWx0ZW4gCisgICAgLy8gaXN0LCBkYSBkaWUgWnV3ZWlzdW5nIGluIDxrZXk+IHVuZCA8a2V5ZGVzYz4gYXVjaCBkYW5uIGVpbmUgMCBlcmdlYmVuCisgICAgLy8gd3VlcmRlLCB1bmQgc29taXQgS2V5cyBtaXQgbGVlcmVuIFZhbHVlcyBuaWNodCB2b24gbmljaHQgZXhpc3RpZXJlbmRlbgorICAgIC8vIEtleXMgenUgdW50ZXJzY2hlaWRlbiB3YWVyZW4uCisgICAgaWYgKCBtZW1iZXIobV9pbmRpY2VzKGtleWxpc3QpLCBudW0pID09IC0xICkKKyAgICAgIGNvbnRpbnVlOworICAgIHN0cmluZyBrZXlkZXNjID0ga2V5bGlzdFtudW0sIEhPT0tfTEFCRUxdOworICAgIG9iamVjdCBrZXkgPSBrZXlsaXN0W251bSwgSE9PS19PQl07CisgICAgZGVzYyArPSAiSGFrZW4gIiArIG51bSArIChzdHJpbmdwKGtleWRlc2MpPyIgWyIra2V5ZGVzYysiXTogIiA6ICI6ICIpOworICAgIGRlc2MgKz0gKG9iamVjdHAoa2V5KSA/IGtleS0+c2hvcnQoKSA6ICJsZWVyXG4iKTsKKyAgfQorICByZXR1cm4gZGVzYzsKK30KKworLy8gUnVlY2tnYWJld2VydDogMSwgd2VubiBlcyBzaWNoIHVtIGVpbiBTY2hsdWVzc2Vsb2JqZWt0IGhhbmRlbHQsIHNvbnN0IDAuCisvLyBTY2hsdWVzc2VsIHdlcmRlbiBhbmhhbmQgZGVyIElEICJzY2hsdWVzc2VsIiBlcmthbm50IG9kZXIgZGFyYW4sIGRhc3MKKy8vIFF1ZXJ5RG9vcktleSgpIGVpbmVuIFdlcnQgenVydWVja2dpYnQsIGQuaC4gZGFzcyBkaWVzZXMgT2JqZWt0IGVpbmUKKy8vIFN0YW5kYXJkLURvb3JtYXN0ZXItVHVlciBvZWZmbmV0LgorcHJpdmF0ZSBpbnQgSXNWYWxpZEtleShvYmplY3Qgb2IpIHsKKyAgcmV0dXJuIChvYmplY3RwKG9iKSAmJiAob2ItPmlkKCJzY2hsdWVzc2VsIikgfHwgb2ItPlF1ZXJ5RG9vcktleSgpIT0wKSk7Cit9CisKKy8vIEdpYnQgZGllIE51bW1lciBkZXMgbmFlY2hzdGVuIGZyZWllbiBIYWtlbnMgenVydWVjayBvZGVyIDAsIHdlbm4KKy8vIGtlaW5lciBmcmVpIGlzdC4gRGEgTWFwcGluZ3MgbmljaHQgc29ydGllcnQgc2luZCwgbXVzcyB2b24gMS0xNiBudW1lcmlzY2gKKy8vIGl0ZXJpZXJ0IHdlcmRlbiwgZGFtaXQgaW1tZXIgZGVyIGVyc3RlIGZyZWllIEhha2VuIGdlZnVuZGVuIHdpcmQgdW5kIG5pY2h0IAorLy8gaXJnZW5kZWluZXIuCisvLyBSdWVja2dhYmV3ZXJ0OiBIYWtlbm51bW1lciB2b24gMS0xNiBvZGVyIDAsIHdlbm4ga2VpbiBIYWtlbiBmcmVpIGlzdC4KK3ByaXZhdGUgaW50IEdldE5leHRGcmVlU2xvdCgpIHsKKyAgaW50IHNsb3Q7CisgIGZvcmVhY2goaW50IGkgOiAxLi4xNikgeworICAgIGlmICggIW9iamVjdHAoaGFrZW5baSxIT09LX09CXSkgKSB7CisgICAgICBzbG90ID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc2xvdDsKK30KKworLy8gR2lidCB6dSBlaW5lciBTY2hpbGQtQmVzY2hyaWZ0dW5nIGRpZSB6dWdlaG9lcmlnZSBIYWtlbnBvc2l0aW9uIGF1cy4KKy8vIEVzIHdpcmQgZGllIGtsZWluZ2VzY2hyaWViZW5lIFZhcmlhbnRlIGdlc3VjaHQsIHNvIGRhc3MgU3BpZWxlciB6d2FyCisvLyBHcm9zc3NjaHJlaWJ1bmcgaW4gZGVuIEJlc2NocmlmdHVuZ2VuIHZlcndlbmRlbiBrb2VubmVuLCBkaWVzZSBhYmVyCisvLyBuaWNodCBiZXJ1ZWNrc2ljaHRpZ3Qgd2lyZC4gQW5zb25zdGVuIGtvZW5udGUgZXMgenUgU2Nod2llcmlna2VpdGVuIG1pdAorLy8gRG9wcGx1bmdlbiB3aWUgIlZlc3JheSIgdW5kICJ2ZXNyYXkiIGtvbW1lbi4KKy8vIFJ1ZWNrZ2FiZXdlcnQ6IEhha2VubnVtbWVyIHZvbiAxLTE2IG9kZXIgMCwgd2VubiBkZXIgVGV4dCBuaWNodCBnZWZ1bmRlbgorLy8gd3VyZGUuCitwcml2YXRlIG9iamVjdCBHZXRLZXlGb3JMYWJlbChzdHJpbmcgbGFiZWwpIHsKKyAgaWYgKCBsYWJlbCApIAorICAgIGxhYmVsID0gbG93ZXJfY2FzZShsYWJlbCk7CisgIGZvcmVhY2goaW50IGk6IDEuLjE2KSB7CisgICAgaWYgKCBoYWtlbltpLCBIT09LX0xBQkVMXSAmJiBsYWJlbCAmJgorICAgICAgICAgbG93ZXJfY2FzZShoYWtlbltpLEhPT0tfTEFCRUxdKSA9PSBsYWJlbCApCisgICAgICByZXR1cm4gaGFrZW5baSxIT09LX09CXTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gR2lidCB6dSBkZW0gdWViZXJnZWJlbmVuIE9iamVrdCBkaWUgTnVtbWVyIGRlcyBIYWtlbnMgenVydWVjaywgYW4gZGVtCisvLyBlcyBoYWVuZ3QuCitwcml2YXRlIGludCBHZXRIb29rTnVtYmVyRm9yS2V5KG9iamVjdCBvYikgeworICBmb3JlYWNoKGludCBudW0sIG9iamVjdCBrZXkgOiBoYWtlbikgeworICAgIGlmICgga2V5ID09IG9iICkKKyAgICAgIHJldHVybiBudW07CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIEJlcmVpbmlndCBEYXRlbnN0cnVrdHVyIGluIDxoYWtlbj4gdW5kIGRhcyBJbnZlbnRhciBkZXMgQnJldHRlcywgaW5kZW0KKy8vIGEpIGdlcHJ1ZWZ0IHdpcmQsIG9iIGFsbGUgaW4gPGhha2VuPiBlaW5nZXRyYWdlbmVuIE9iamVrdGUgc2ljaCBhdWNoIGltIAorLy8gICAgQnJldHQgYmVmaW5kZW4gdW5kCisvLyBiKSBnZXBydWVmdCB3aXJkLCBvYiBhbGxlIGltIEludmVudGFyIGJlZmluZGxpY2hlbiBPYmpla3RlIGF1Y2gga29ycmVrdCBpbiAKKy8vICAgIDxoYWtlbj4gZWluZ2V0cmFnZW4gc2luZC4KKy8vIFVlYmVyemFlaGxpZ2UgT2JqZWt0ZSB3ZXJkZW4gcmF1c2dld29yZmVuLgorcHJpdmF0ZSB2b2lkIENvbnNvbGlkYXRlSW52ZW50b3J5KCkgeworICBmb3JlYWNoKGludCBpLCBvYmplY3Qgb2IgOiBoYWtlbikgeworICAgIC8vIE9iamVrdCBleGlzdGllcnQsIGlzdCBhYmVyIG5pY2h0IGltIFNjaGx1ZXNzZWxicmV0dD8gRGFubiBhdXN0cmFnZW4uCisgICAgaWYgKG9iamVjdHAob2IpICYmIGVudmlyb25tZW50KG9iKSAhPSBNRSkgeworICAgICAgbV9kZWxldGUoaGFrZW4sIGkpOworICAgICAgLy8gV2lyZCBhdWNoIHZvbSByZXNldCgpIGF1cyBnZXJ1ZmVuLCBkYW5uIGlzdCBUUCA9PSAwLgorICAgICAgaWYgKCBvYmplY3RwKFRQKSApCisgICAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiSG9wcGxhISAiK29iLT5OYW1lKFdFUiwxKSsiIHNjaGVpbnQgdm9tICIKKyAgICAgICAgICAiU2NobHVlc3NlbGJyZXR0IHZlcnNjaHd1bmRlbiB6dSBzZWluISIpKTsKKyAgICB9CisgIH0KKyAgb2JqZWN0ICpyZXN0ZXJhbXBlID0gYWxsX2ludmVudG9yeShNRSkgLSBtX3ZhbHVlcyhoYWtlbiwgSE9PS19PQik7CisgIGlmIChzaXplb2YocmVzdGVyYW1wZSkpIHsKKyAgICByZXN0ZXJhbXBlLT5tb3ZlKGVudmlyb25tZW50KCksTV9QVVQpOworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBCUygiUGxvZXR6bGljaCBmYWVsbHQgZXR3YXMgdm9tICIKKyAgICAgICJTY2hsdWVzc2VsYnJldHQgenUgQm9kZW4sIGRhcyBEdSB6dXZvciBnYXIgbmljaHQgZ2VzZWhlbiBoYXR0ZXN0LiIpKTsKKyAgfQorfQorCitzdHJpbmcgc2hvcnQoKSB7CisgIHN0cmluZyBzaD1RdWVyeVByb3AoUF9TSE9SVCk7CisKKyAgLy8gVW5zaWNodGJhcj8gRGFubiBnaWJ0cyBuaWNodHMgenUgc2VoZW4gLi4uCisgIGlmICggUXVlcnlQcm9wKFBfSU5WSVMpIHx8ICFzaCApCisgICAgcmV0dXJuIDA7CisgIGlmICggUXVlcnlQcm9wKCJ2ZXJzdGVja3QiKSA9PSAxICkgCisgICAgc2ggPSAiIjsKKyAgZWxzZSAKKyAgICBzaCArPSAiLiI7CisKKyAgcmV0dXJuIHByb2Nlc3Nfc3RyaW5nKHNoKSsiXG4iOworfQorCisvLyBJbSBSZXNldCB2b3JzaWNodHNoYWxiZXIgYXVjaCBtYWwgYXVmcmFldW1lbi4KK3ZvaWQgcmVzZXQoKSB7CisgIENvbnNvbGlkYXRlSW52ZW50b3J5KCk7CisgIHJldHVybiA6OnJlc2V0KCk7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKSB7CisgIC8vIEtlaW4gU2NobHVlc3NlbD8gSGF0IGluIGRpZXNlbSBDb250YWluZXIgbml4IHZlcmxvcmVuIQorICBpZiggIUlzVmFsaWRLZXkob2IgKSkgeworICAgIHJldHVybiAxOworICB9CisgIENvbnNvbGlkYXRlSW52ZW50b3J5KCk7CisgIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOworfQorCisvLyBXZW5uIGVpbiBTY2hsdWVzc2VsIHNpY2ggYXVmbG9lc3QsIG11c3MgZGllIExpc3RlIGFiZ2VnbGljaGVuIHdlcmRlbi4KK3ZvaWQgTm90aWZ5UmVtb3ZlKG9iamVjdCBvYikgeworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoTUUpLCBCUygiSG9wcGxhISAiK29iLT5OYW1lKFdFUiwxKSsiIGhhdCBzaWNoICIKKyAgICAiZ2VyYWRlIGluIFdvaGxnZWZhbGxlbiBhdWZnZWxvZXN0LiIpKTsKKyAgLy8gRGFzIE9iamVrdCA8b2I+IHplcnN0b2VydCBzaWNoIGVyc3QgbmFjaCBkZW0gQXVmcnVmIGRpZXNlciBGdW5rdGlvbiwKKyAgLy8gZGFoZXIgcGVyIGNhbGxfb3V0KCkgYXVmcmFldW1lbi4KKyAgY2FsbF9vdXQoIydDb25zb2xpZGF0ZUludmVudG9yeSwgMSk7Cit9CisKKy8vIFplc3N0cmEsIDEuNy4wNywgZnVlcnMgSG9lcnJvaHIKKy8vIERhcmYgaWNoIGRhIEFyYXRob3JuIGVpbnRyYWdlbj8gOy0pCitzdHJpbmcgR2V0T3duZXIoKSB7CisgIHJldHVybiAic2VsZXZlbiI7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFlbmtlcl9ndXRzY2hlaW4uYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFlbmtlcl9ndXRzY2hlaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzg5MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYWVua2VyX2d1dHNjaGVpbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFNjaHJhZW5nZXItR3V0c2NoZWluCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAwNS4wNS4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisjaW5jbHVkZSA8YW5zaS5oPgoraW5oZXJpdCAic3RkL3RoaW5nIjsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBHdXRzY2hlaW4iKTsKKyAgU2V0UHJvcChQX0xPTkcsICJAQGxvbmd0ZXh0QEAiKTsKKyAgQWRkSWQoKHsiZ3V0c2NoZWluIn0pKTsKKyAgU2V0UHJvcChQX05BTUUsICJHdXRzY2hlaW4iKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUpOyAgICAgICAgICAgIC8vIEdld2ljaHQgNWcKKyAgU2V0UHJvcChQX1ZBTFVFLCAwKTsgICAgICAgICAgICAgLy8gS2VpbiBtYXRlcmllbGxlciBXZXJ0LiBJc3QgZWggbmljaHQgdmVya2F1ZmJhci4KKyAgU2V0UHJvcChQX05PQlVZLCAxKTsgICAgICAgICAgICAgLy8gV2lyZCBpbSBMYWRlbiB6ZXJzdG9lcnQsIGZhbGxzIGVyIHZlcmthdWZ0IHdpcmQuCisgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfUEFQRVJ9KSApOworICBTZXRQcm9wKFBfSU5GTywgIkRpZXNlciBHdXRzY2hlaW4gaXN0IG51ciBmdWVyIGVpbmVuIFNlaGVyIG1pdCBFaWdlbmhlaW0gdm9uIEludGVyZXNzZSFcbiIpOworICBTZXRQcm9wKFBfQVVUT0xPQURPQkosIDEpOworfQorCitzdHJpbmcgbG9uZ3RleHQoKQoreworICBzdHJpbmcgc3RyLGF1c3N0ZWxsZXIsaW5oYWJlcix0ZXh0OworICBpbnQgd2VydDsKKyAgYXVzc3RlbGxlcj0iU2VsZXZlbiI7CisgIGluaGFiZXI9IkZpbGxpIjsKKyAgd2VydD01MDAwOworICB0ZXh0PSIiOworICBzdHI9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIKKyAgICAgKyIgIEQgRSBSICAgUyBDIEggUiBBIEUgTiBLIEUgUlxuXG4iCisgICAgICsiICBFIEkgTiBLIEEgVSBGIFMgLSBHIFUgVCBTIEMgSCBFIEkgTiAgICAuXG5cbiIKKyAgICAgKyIgIEF1c2dlc3RlbGx0IHZvbiAiK2F1c3N0ZWxsZXIrIiBmdWVyICIraW5oYWJlcisiLlxuXG4iCisgICAgICsiICBXZXJ0OiAiK3RvX3N0cmluZyh3ZXJ0KSsiIE11ZW56ZW4uXG5cbiIKKyAgICAgK3RleHQKKyAgICAgKyIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsKKyAgcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFua2xhZGVuLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmtsYWRlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWYyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmtsYWRlbi5jCkBAIC0wLDAgKzEsNDM2IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFNDSFJBRU5LRVIKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDA2LjA0LjIwMDYgUF9MT0dfRklMRSAoU2VsZXZlbikKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFN3aWZ0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTE9HX0ZJTEUsInNlbGV2ZW4vc2NocmFlbmtlciIpOyAvLyBTZWxldmVuIDA2LjA0LjIwMDYKKyAgU1AoUF9JTlRfU0hPUlQsICJJbSBTQ0hSQUVOS0VSIik7CisgIFNQKFBfSU5UX0xPTkcsIEJTKAorICAgICAiRHUgc3RlaHN0IGluIGVpbmVtIGdlbXVldGxpY2hlbiBrbGVpbmVuIExhZGVuLiBFaW4gZmxhdXNjaGlnZXIgIgorICAgICsiVGVwcGljaGJvZGVuIGRhZW1wZnQgRGVpbmUgU2Nocml0dGUsIHVuZCBkZXIgR2VydWNoIHZlcnNjaGllZGVuZXIgIgorICAgICsiSG9lbHplciBraXR6ZWx0IGFuZ2VuZWhtIGluIGRlciBOYXNlLiBJcmdlbmR3b2hlciBlcmtsaW5ndCBlaW5lICIKKyAgICArImxlaXNlLCBiZXJ1aGlnZW5kZSBNZWxvZGllLiBBbiBkZW4gV2FlbmRlbiBoYWVuZ2VuIEJpbGRlciB1bmQgIgorICAgICsiWmVpY2hudW5nZW4gdmVyc2NoaWVkZW5zdGVyIEFydCwgc293aWUgZWluZSBncm9zc2UgUHJlaXNsaXN0ZS4gIgorICAgICsiV2VubiBEdSBuaWNodCBkZW4gRWluZHJ1Y2sgaGFldHRlc3QsIGRhc3MgbWFuIGhpZXIgYW4gRGVpbmUgQm9lcnNlICIKKyAgICArIm1vZWNodGUsIGtvZW5udGVzdCBEdSBEaWNoIGhpZXIgcmljaHRpZyB3b2hsIGZ1ZWhsZW4uIiw3OCkpOworCisgIFNQKFBfTElHSFQsIDEpOworICBTUChQX0lORE9PUlMsIDEpOworCisgIEFEKCAoeyJ6ZWl0In0pLCBCUygKKyAgICAgIkRpZSBha3R1ZWxsZSBaZWl0OiAiK2N0aW1lKHRpbWUoKSksNzgpKTsKKyAgQUQoICh7ImF1c2dhbmcifSksIEJTKAorICAgICAiTmFjaCBPc3RlbiBnZWh0J3MgcmF1cy4iLDc4KSk7CisgIEFEKCAoeyJhdXNnYWVuZ2UifSksIEJTKAorICAgICAiU28gc2VociBEdSBhdWNoIHN1Y2hzdCwgbWVociBhbHMgZGVuIGVpbmVuIEF1c2dhbmcgZmluZGVzdCBEdSAiCisgICAgKyJlaW5mYWNoIG5pY2h0LiIsNzgpKTsKKyAgQUQoICh7ImdlbGRib2Vyc2UiLCAiYm9lcnNlIn0pLCBCUygKKyAgICAgIk1hbiByZWRldCBoYWx0IHZvbiBCb2Vyc2UsIGF1Y2ggd2VubiBEdSBrZWluZSBkYWJlaWhhc3QuIEVzIGdlaHQgIgorICAgICsiaGFsdCB1bSBEZWluIEdlbGQhIiw3OCkpOworICBBRCggKHsiZ2VsZCJ9KSwgQlMoCisgICAgICJJcmdlbmR3byB3aXJzdCBEdSBzY2hvbiBLb2hsZSBoYWJlbiEgOikiLDc4KSk7CisgIEFEKCAoeyJrb2hsZSIsICJ6YXN0ZXIiLCAibW9uZXRlbiIsICJwaWVwZW4iLCAibWFldXNlIn0pLCBCUygKKyAgICAgIktvaGxlLCBaYXN0ZXIsIE1vbmV0ZW4sIFBpZXBlbiwgTWFldXNlLi4uIGFsbGVzIGRhc3NlbGJlISA6KSIsNzgpKTsKKyAgQUQoICh7ImJvZGVuIn0pLCBCUygKKyAgICAgIkVpbiBmbGF1c2NoaWdlciwgYWJlciBhdWNoIHNlaHIgc3RyYXBhemllcmZhZWhpZ2VyIFRlcHBpY2ggYmVkZWNrdCAiCisgICAgKyJkZW4gZ2FuemVuIEJvZGVuIGRlcyBMYWRlbnMuIEJpbGxpZyBzaWVodCBlciBuaWNodCBhdXMuIiw3OCkpOworICBBRCggKHsidGVwcGljaCIsICJ0ZXBwaWNoYm9kZW4ifSksIEJTKAorICAgICAiRXMgaGFuZGVsdCBzaWNoIHVtIGVpbmVuIGVjaHRlbiBWb3JiZXJnLVRlcHBpY2guIEVyIHd1cmRlICIKKyAgICArInZvbiBlaW5lbSBGYWNobWFubiB2ZXJsZWd0IHVuZCBzY2hlaW50IGF1cyBlaW5lbSBlaW56aWdlbiBncm9zc2VuICIKKyAgICArIlN0dWVjayB6dSBzZWluLiIsNzgpKTsKKyAgQUQoICh7InN0dWVjayJ9KSwgQlMoCisgICAgICJEZXIgVGVwcGljaCBzY2hlaW50IGF1cyBlaW5lbSBlaW56aWdlbiBncm9zc2VuIFN0dWVjayB6dSBzZWluLiBTbyBndXQgIgorICAgICsia2FubiBkYXMgZWlnZW50bGljaCBudXIgZWluIEZhY2htYW5uLiIsNzgpKTsKKyAgQUQoICh7ImZhY2htYW5uIn0pLCBCUygiRXMgaXN0IGtlaW5lciB6dSBzZWhlbiwgYWJlciBlcyBpc3QgYW56dW5laG1lbiwgZGFzcyAiCisgICAgKyJlcyBzaWNoIHVtIGVpbmVuIHByb2Zlc3Npb25lbGxlbiBUZXBwaWNobGVnZXIgaGFuZGVsdGUuIikpOworICBBRCggKHsidGVwcGljaGxlZ2VyIn0pLCAiV2llIGdlc2FndCwga2VpbmVyIHp1IHNlaGVuLiBEZXIgVGVwcGljaCBsaWVndCBqYSAiCisgICAgKyJzY2hvbiwgdW5kIGRlciB3aXJkIGF1Y2ggbm9jaCBlaW5lIFdlaWxlIGhhbHRlbi5cbiIpOworICBBRCggKHsid2VpbGUifSksICJTY2hvbiBub2NoIGVpbiBwYWFyIEphZWhyY2hlbiFcbiIpOworICBBRCggKHsiamFlaHJjaGVuIn0pLCAiVGVwcGljaGUgZGVyIEZpcm1hIFZvcmJlcmcga29lbm5lbiBsYW5nZSBoYWx0ZW4uXG4iKTsKKyAgQUQoICh7InZvcmJlcmciLCAidm9yYmVyZ3RlcHBpY2giLCAidm9yYmVyZy10ZXBwaWNoIn0pLCBCUygKKyAgICAgIkRpZSBGaXJtYSBWb3JiZXJnIHN0ZWxsdCwgaW0gR2VnZW5zYXR6IHp1ciBGaXJtYSBIaW50ZXJiZXJnLCBzZWhyIGd1dGUgIgorICAgICsiVGVwcGljaGUgaGVyLCB3aWUgamVkZXIgd2Vpc3MuIiw3OCkpOworICBBRCggKHsiZ2VnZW5zYXR6In0pLCAiRGFzIHdlaXNzIHdpcmtsaWNoIEplZGVyIVxuRHUga29lbm50ZXN0IElobiBmcmFnZW4sICIKKyAgICArIndhZXJlIGVyIG5pY2h0IGdlYmFuaXNodC4gOilcbiIpOworICBBRCggKHsiaWhuIn0pLCBCUygiV2VuIElITiA/IE1laW5zdCBEdSBKZWRlcj8gRGVyIGlzdCBkb2NoIGdlYmFuaXNodC4gQXVzIGd1dGVtICIKKyAgICArIkdydW5kLiBXZW5uIGlyZ2VuZHdvIHdhcyB3ZWdrb21tdCwgZGFubiBrb2VubnRlIGRhcyBKZWRlciBnZXdlc2VuIHNlaW4uICIKKyAgICArIkRhcyByZWljaHQgZG9jaCwgdW0gaWhuIHp1IGJhbmlzaGVuLCBvZGVyPyA6KSIpKTsKKyAgQUQoICh7ImhpbnRlcmJlcmciLCAiaGludGVyYmVyZ3RlcHBpY2giLCAiaGludGVyYmVyZy10ZXBwaWNoIn0pLCBCUygKKyAgICAgIkRhcyBoaWVyIGlzdCBlaW4gVGVwcGljaCBkZXIgRmlybWEgVm9yYmVyZy4gTmllbWFuZCBtaXQgR2VzY2htYWNrIHd1ZXJkZSAiCisgICAgKyJkZW4gYmlsbGlnZW4gQWJrbGF0c2NoIGRlciBGaXJtYSBIaW50ZXJiZXJnIGthdWZlbi4iLDc4KSk7CisgIEFEKCAoeyJqZWRlciJ9KSwgQlMoCisgICAgICJEZXIgaXN0IG5pY2h0IGRhLiBTaWVoc3QgRHUgaWhuIGV0d2E/Iiw3OCkpOworICBBRCggKHsiZ3J1bmQiLCAiZ3J1ZW5kZSJ9KSwgQlMoCisgICAgICJHcnVlbmRlIGxhc3NlbiBzaWNoIGltbWVyIGZpbmRlbiwgc2VpIGFsc28gdm9yc2ljaHRpZyEgOikiLDc4KSk7CisgIEFEKCAoeyJnZXNjaG1hY2sifSksIEJTKAorICAgICAiVWViZXIgZGVuIGxhZXNzdCBzaWNoIGJla2FubnRsaWNoIHN0cmVpdGVuLiIsNzgpKTsKKyAgQUQoICh7InRlcHBpY2hlIn0pLCBCUygKKyAgICAgIkR1IHNpZWhzdCBoaWVyIGVpbmVuLiBEZXIgYWJlciBmdWVsbHQgZGVuIGdhbnplbiBSYXVtIGF1cy4iLDc4KSk7CisgIEFEKCAoeyJhYmtsYXRzY2gifSksIEJTKAorICAgICAiVm9yYmVyZy1UZXBwaWNoZSBzaW5kIGhhbHQgZGFzIGVpbnppZyBXYWhyZSEiLDc4KSk7CisgIEFEKCAoeyJsYWRlbiJ9KSwgQlMoCisgICAgICJEZXIgTGFkZW4gaXN0IGJla2FubnQgdW50ZXIgZGVtIE5hbWVuIFwiU0NIUkFFTktFUlwiLiBBYmVyIGRhcyB3ZWlzc3QgIgorICAgICsiRHUgc2ljaGVyLiIsNzgpKTsKKyAgQUQoICh7Im5hbWVuIn0pLCBCUygKKyAgICAgIkRlciBOYW1lbiBkZXMgTGFkZW5zIGlzdCBcIlNDSFJBRU5LRVJcIi4iLDc4KSk7CisgIEFEKCAoeyJzY2hyYWVua2VyIn0pLCBCUygKKyAgICAgIkphLCBzY2hhdSBEaWNoIG51ciB1bSEiLDc4KSk7CisgIEFEKCAoeyJtZWxvZGllIn0pLCBCUygKKyAgICAgIkxhdXNjaGUgaWhyIGJlc3Nlci4iLDc4KSk7CisgIEFEKCAoeyJnZXJ1Y2gifSksIEJTKAorICAgICAiU2VoZW4ga2FubnN0IER1IGRlbiBuaWNodC4gVmllbGxlaWNodCBzb2xsdGVzdCBEdSBEZWluZSBOYXNlIGJlbnV0emVuPyIsNzgpKTsKKyAgQUQoICh7InNjaHJpdHRlIn0pLCBCUygKKyAgICAgIkR1IGdlaHN0IHRlc3R3ZWlzZSBlaW4gcGFhciBTY2hyaXR0ZSwgZGVyIFRlcHBpY2ggZGFlbXBmdCBzaWUgdGF0c2FlY2hsaWNoICIKKyAgICArInNvIGd1dCwgZGFzcyBEdSBuaWNodCBkYXMgZ2VyaW5nc3RlIGhvZXJlbiBrYW5uc3QuIiw3OCkpOworICBBRCggKHsic2Nocml0dCJ9KSwgQlMoCisgICAgICJNYWNoIGRhcyBkb2NoIGlyZ2VuZHdvLCB3byBlcyBrZWluZXIgc2llaHQhIiw3OCkpOworICBBRCggKHsibmFzZSJ9KSwgQlMoCisgICAgICJEdSBmYXNzdCBEaXIgYW4gZGllIE5hc2UuIEVpbiBHbHVlY2ssIHNpZSBpc3Qgbm9jaCBkYSEiLDc4KSk7CisgIEFEKCAoeyJnbHVlY2sifSksIEJTKAorICAgICAiT2huZSBOYXNlIGtvZW5udGVzdCBEdSBoaWVyIGdhciBuaWNodHMgcmllY2hlbiwgc3RlbGwgRGlyIGRhcyBudXIgIgorICAgICsibWFsIHZvciEiLDc4KSk7CisgIEFEKCAoeyJyYXVtIiwgIm9ydCJ9KSwgQlMoCisgICAgICJEdSBzdGVoc3QgaW4gZWluZW0gbm9ibGVuIExhZGVuLiBNYWNoIGVpbmZhY2ggXCJzY2hhdVwiLiIsNzgpKTsKKyAgQUQoICh7ImZpcm1hIn0pLCBCUygKKyAgICAgIkR1IHN0ZWhzdCBoaWVyIGluIGVpbmVtIExhZGVuLiBOYXR1ZXJsaWNoIGlzdCBkYXMgZWluZSBGaXJtYSwgdW5kIGRlciAiCisgICAgKyJMYWRlbmluaGFiZXIgaXN0IGViZW5zbyBuYXR1ZXJsaWNoIGRlciBGaXJtZW5iZXNpdHplci4gSGF0dGVzdCBEdSBkZW5uICIKKyAgICArImV0d2FzIGFuZGVyZXMgZXJ3YXJ0ZXQ/Iiw3OCkpOworICBBRCggKHsiZWluZHJ1Y2sifSksIEJTKAorICAgICAiRXMgaXN0IGVpbiBMYWRlbi4gRXIgc2llaHQgbm9iZWwgYXVzLCBQcmVpc2Ugd2llIGJlaSBBTERJIHdpcmQncyBoaWVyIGFsc28gIgorICAgICsid29obCBuaWNodCBnZWJlbi4gVW5kIGF1c3NlcmRlbSBpc3QgZGVyIGVyc3RlIEVpbmRydWNrIG1laXN0IGRlciByaWNodGlnZS4iLDc4KSk7CisgIEFEKCAoeyJhbGRpIn0pLCBCUygKKyAgICAgIk5FSU4sIER1IGJpc3QgaGllciBOSUNIVCBiZWkgQUxESSAhISEiLDc4KSk7CisgIEFEKCAoeyJwcmVpcyIsICJwcmVpc2UiLCAibGlzdGUiLCAicHJlaXNsaXN0ZSJ9KSwgQlMoCisgICAgICJBbiBkZXIgV2FuZCBoYWVuZ3QgZWluZSBncm9zc2UgUHJlaXNsaXN0ZS4gVmllbGxlaWNodCBzb2xsdGVzdCBEdSBzaWUgIgorICAgICsibGVzZW4/Iiw3OCkpOworICBBRCggKHsiaW5oYWJlciIsICJsYWRlbmluaGFiZXIiLCAiYmVzaXR6ZXIiLCAiZmlybWVuYmVzaXR6ZXIiLCAidmVya2FldWZlciJ9KSwgQlMoCisgICAgICJJc3QgZGVyIGRlbm4gZ2VyYWRlIG5pY2h0IGRhPyBEYXMgaXN0IHNlaHIgdmVyd3VuZGVybGljaCwgZWNodCBlaHJsaWNoLiIsNzgpKTsKKyAgQUQoICh7ImVsZiIsICJlbGZlbiIsICJwZXJzb24ifSksIEJTKAorICAgICAiU2NoYXUgRGlyIGhhbHQgZGFzIFBvcnRyYWl0IGFuISIsNzgpKTsKKyAgQUQoICh7ImRhcnN0ZWxsdW5nIiwgImRhcnN0ZWxsdW5nZW4ifSksIEJTKAorICAgICAiRGllIEJpbGRlciB6ZWlnZW4gTW9lYmVsc3R1ZWNrZSwgaGF1cHRzYWVjaGxpY2ggU2NocmFlbmtlLiIsNzgpKTsKKyAgQUQoICh7InJlaWhlIn0pLCBCUygKKyAgICAgIkJlaSBkZW4gbWVpc3RlbiBCaWxkZXJuIGhhbmRlbHQgZXMgc2ljaCB1bSBEYXJzdGVsbHVuZyB2b24gTW9lYmVsc3R1ZWNrZW4uICIKKyAgICArIk51ciBlaW4gZWluemlnZXMgUG9ydHJhaXQgaXN0IGRhYmVpLCBkYXMgZWluZSBQZXJzb24gemVpZ3QuIiw3OCkpOworICBBRCggKHsiYXJ0In0pLCBCUygKKyAgICAgIkJlaSBkZW4gbWVpc3RlbiBCaWxkZXJuIGhhbmRlbHQgZXMgc2ljaCB1bSBEYXJzdGVsbHVuZ2VuIHZvbiBNb2ViZWxzdHVlY2tlbiwgIgorICAgICsienVtZWlzdCB2b24gU2NocmFlbmtlbi4gRWluIFBvcnRyYWl0IGZhZWxsdCBEaXIgYWxsZXJkaW5ncyBhdWYsIGRhcyBuaWNodCBpbiAiCisgICAgKyJkaWUgUmVpaGUgZGVyIGFuZGVyZW4gQmlsZGVyIHBhc3N0LiIsNzgpKTsKKyAgQUQoICh7ImJpbGRlciJ9KSwgQlMoCisgICAgICJFcyBnaWJ0IG1laHJlcmUgRGFyc3RlbGx1bmdlbiB2b24gdmVyc2NoaWVkZW5lbiBNb2ViZWxzdHVlY2tlbi4gWnVtZWlzdCAiCisgICAgKyJoYW5kZWx0IGVzIHNpY2ggZGFiZWkgdW0gU2NocmFlbmtlIHZlcnNjaGllZGVuZXIgQmF1d2Vpc2UuIEF1c3NlcmRlbSBpc3QgIgorICAgICsiZGEgbm9jaCBlaW4gUG9ydHJhaXQuIiw3OCkpOworICBBRCggKHsiYmF1YXJ0IiwgImJhdXdlaXNlIiwgIm1vZWJlbHN0dWVjayIsICJtb2ViZWxzdHVlY2tlIiwgImFydGVuIn0pLCBCUygKKyAgICAgIkVzIGdpYnQgV2FmZmVuc2NocmFlbmtlLCBLbGVpZGVyc2NocmFlbmtlLCBLdWVobHNjaHJhZW5rZSAoSkEhKSwgS29tbW9kZW4sICIKKyAgICArInNvbnN0aWdlIFNjaHJhZW5rZSAoRHUga2FubnN0IGlocmVuIFp3ZWNrIG5pY2h0IG1hbCBlcmFobmVuKSB1bmQgZWluaWdlICIKKyAgICArIlRydWhlbiwgZGllIHp3YXIga2VpbmUgU2NocmFlbmtlIGltIGVpZ2VudGxpY2hlbiBTaW5uZSBzaW5kLCBhYmVyIFpldWcgIgorICAgICsiYnJpbmd0IG1hbiBkYXJpbiBtaXQgU2ljaGVyaGVpdCBhdWNoIHVudGVyLiBTb2dhciBlaW5lIFZpdHJpbmUgc2llaHN0ICIKKyAgICArIkR1LiIsNzgpKTsKKyAgQUQoICh7Inp3ZWNrIn0pLCBCUygKKyAgICAgIlN0YXVyYXVtIGZ1ZXIgaXJnZW5kd2VsY2hlcyBaZXVncy4gRGFzIG11c3MgZXMgc2Vpbi4gV2FzIGZ1ZXIgZWluZW4gIgorICAgICsiWndlY2sga29lbm50ZSBlcyBzb25zdCBub2NoIGdlYmVuPyIsNzgpKTsKKyAgQUQoICh7InZpdHJpbmUifSksIEJTKCJEaWUgVml0cmluZSBpc3QgbGVlciwgYWJlciBkYXMgYWVuZGVydCBzaWNoIHNpY2hlciwgIgorICAgICsic29iYWxkIER1IGVpbmUgZ2VrYXVmdCBoYXN0LiIsNzgpKTsKKyAgQUQoICh7ImtsZWlkZXJzY2hyYW5rIiwgImtsZWlkZXJzY2hyYWVua2UifSksIEJTKAorICAgICAiU2ljaGVyIGVpZ25ldCBzaWNoIHNvbGNoIGVpbiBTY2hyYW5rIHNlaHIgZ3V0LCB1bSBkYXJpbiBSdWVzdHVuZ2VuICIKKyAgICArImF1Znp1YmV3YWhyZW4uIiw3OCkpOworICBBRCggKHsid2FmZmVuc2NocmFuayIsICJ3YWZmZW5zY2hyYWVua2UifSksIEJTKAorICAgICAiSW4gZWluZW0gV2FmZmVuc2NocmFuayBrYW5uc3QgRHUgZWluZSBNZW5nZSB2ZXJzY2hpZWRlbmVyIFdhZmZlbiAiCisgICAgKyJ1bnRlcmJyaW5nZW4sIHVuZCBkZXIgVm9ydGVpbCBkYWJlaSBpc3QsIGRhc3Mgc2llIGRhbm4gYXVjaCBzYXViZXIgIgorICAgICsic29ydGllcnQgaW0gU2NocmFuayBoYWVuZ2VuLiIsNzgpKTsKKyAgQUQoICh7ImtvbW1vZGVuIn0pLCBCUygKKyAgICAgIkRpZSBrYW5uIG1hbiBuaWNodCBudXIgaW4gZWluZW4gRmx1ciBzdGVsbGVuLCBzb25kZXJuIGF1Y2ggaW4gamVkZW4gIgorICAgICsiYW5kZXJlbiBSYXVtISIsNzgpKTsKKyAgQUQoICh7ImZsdXIifSksIEJTKAorICAgICAiRGllIG1laXN0ZW4gSGFldXNlciBoYWJlbiBlaW5lbi4iLDc4KSk7CisgIEFEKCAoeyJoYWV1c2VyIn0pLCBCUygKKyAgICAgIkhJRVIgPz8/Iiw3OCkpOworICBBRCggKHsibWVuZ2UifSksIEJTKAorICAgICAiTWVociBhbHMgRHUgYnJhdWNoc3QsIGVzIHNlaSBkZW5uIER1IGJpc3QgU2FtbWxlci4iLDc4KSk7CisgIEFEKCAoeyJ6ZXVncyIsICJkaW5nZSJ9KSwgQlMoCisgICAgICJEaW5nZSBoYWx0LiIsNzgpKTsKKyAgQUQoICh7IndhZmZlbiJ9KSwgQlMoCisgICAgICJEdSBrYW5uc3Qgc2llIGluIGVpbmVtIFdhZmZlbnNjaHJhbmsgdW50ZXJicmluZ2VuLCB3ZW5uIER1IGVpbmVuICIKKyAgICArImJlc2l0enQuIFdlbm4gbmljaHQga2FubnN0IER1IGphIGVpbmVuIGthdWZlbi4iLDc4KSk7CisgIEFEKCAoeyJ3YWZmZSJ9KSwgQlMoCisgICAgICJXZWxjaGUgV2FmZmUgbWVpbnN0IER1PyIsNzgpKTsKKyAgQUQoICh7InJ1ZXN0dW5nZW4ifSksIEJTKAorICAgICAiRHUga2FubnN0IHNpZSBpbiBlaW5lbSBLbGVpZGVyc2NocmFuayB1bnRlcmJyaW5nZW4sIHdlbm4gRHUgZWluZW4gIgorICAgICsiYmVzaXR6dC4gV2VubiBuaWNodCBrb2VubnRlc3QgRHUgRGlyIGVpbmVuIHp1bGVnZW4uIiw3OCkpOworICBBRCggKHsicnVlc3R1bmcifSksIEJTKAorICAgICAiVm9uIHdlbGNoZXIgUnVlc3R1bmcgcmVkZXN0IER1PyIsNzgpKTsKKyAgQUQoICh7InZvcnRlaWwifSksIEJTKAorICAgICAiSmVkZXIgaXN0IGRvY2ggYXVmIHNlaW5lbiBwZXJzb2VubGljaGVuIFZvcnRlaWwgYmVkYWNodC4iLDc4KSk7CisgIEFEKCAoeyJrdWVobHNjaHJhbmsiLCAia3VlaGxzY2hyYWVua2UifSksIEJTKAorICAgICAiSW4gc28gZWluZW0gS3VlaGxzY2hyYW5rIGthbm4gbWFuIGVpZ2VudGxpY2ggYWxsZXMgcmVpbnN0ZWNrZW4sIGFiZXIgIgorICAgICsibmF0dWVybGljaCBiaWV0ZXQgZXIgc2ljaCBiZXNvbmRlcnMgZnVlciBHZXRyYWVua2UgdW5kIFNwZWlzZW4gYWxsZXIgIgorICAgICsiQXJ0IGFuLiBXaWUgei5CLiBTY2huZWxsaGFlcnRlciwgQnJvZXRjaGVuIHVzdy4iLDc4KSk7CisgIEFEKCAoeyJnZXRyYWVua2UiLCAic3BlaXNlbiJ9KSwgQlMoCisgICAgICJEYXMgaGllciBpc3Qga2VpbmUgS25laXBlLiBTb3dhcyBnaWJ0J3MgaGllciBuaWNodCEiLDc4KSk7CisgIEFEKCAoeyJrbmVpcGUifSksIEJTKAorICAgICAiRGFzIGhpZXIgaXN0IEtFSU5FIEtuZWlwZSAhISEiLDc4KSk7CisgIEFEKCAoeyJ0cnVoZSIsICJ0cnVoZW4ifSksIEJTKAorICAgICAiRXMgZ2lidCBncm9zc2UgdW5kIGtsZWluZSwgYXVzIHZlcnNjaGllZGVuZW0gTWF0ZXJpYWwuIiw3OCkpOworICBBRCggKHsibWF0ZXJpYWwifSksIEJTKAorICAgICAiVG90YWwgdmVyc2NoaWVkZW4sIHdpcmtsaWNoLiIsNzgpKTsKKyAgQUQoICh7InNjaG5lbGxoYWVydGVyIiwgImJyb2V0Y2hlbiJ9KSwgQlMoCisgICAgICJCZXNvcmcgRGlyIHdlbGNoZSwgYmV2b3IgRHUgc2llIHVudGVyc3VjaGVuIHdpbGxzdCEiLDc4KSk7CisgIEFEKCAoeyJzYW1tbGVyIn0pLCBCUygKKyAgICAgIkJpc3QgRHUgZWluZXI/Iiw3OCkpOworICBBRCggKHsic2ljaGVyaGVpdCJ9KSwgQlMoCisgICAgICJKbywgaW4gc28gZWluZSBUcnVoZSBwYXNzdCB2aWVsIFpldWcgcmVpbi4iLDc4KSk7CisgIEFEKCAoeyJ6ZXVnIn0pLCBCUygKKyAgICAgIkFsbGVzLCB3YXMgRHUgc28gbWl0IERpciBydW1zY2hsZXBwc3QuIERhcyBtZWlzdGUgZGF2b24gYnJhdWNoc3QgIgorICAgICsiRHUgc293aWVzbyBuaWUuIiw3OCkpOworICBBRCggKHsiYmlsZCJ9KSwgQlMoCisgICAgICJFcyBnaWJ0IG1laHJlcmUgRGFyc3RlbGx1bmdlbiB2b24gdmVyc2NoaWVkZW5lbiBNb2ViZWxzdHVlY2tlbiB1bmQgZWluICIKKyAgICArIlBvcnRyYWl0LiBXZWxjaGVzIEJpbGQgbWVpbnN0IER1PyIsNzgpKTsKKyAgQUQoICh7InBvcnRyYWl0In0pLCBCUygKKyAgICAgIkVzIHplaWd0IGVpbmVuIEVsZiBtaXQgc3RyYWhsZW5kIGJsYXVlbiBBdWdlbiB1bmQgZGVuIHR5cGlzY2ggc3BpdHplbiAiCisgICAgKyJFbGZlbm9ocmVuLCBkaWUgZnJlY2ggYXVzIGVpbmVyIGJlZWluZHJ1Y2tlbmRlbiwgc2lsYmVyZ3JhdWVuIExvZXdlbm1hZWhuZSAiCisgICAgKyJoZXJ2b3JzY2hhdWVuLiBEZXIgU3BpdHpodXQsIGRlciBpaG0gYXVmIGRlbSBLb3BmIHNpdHp0LCBsYWVzc3QgZGFyYXVmICIKKyAgICArInNjaGxpZXNzZW4sIGRhc3MgZXMgc2ljaCB1bSBlaW5lbiBaYXViZXJlciBoYW5kZWx0LiBVbnRlbiBpbiBkZXIgcmVjaHRlbiAiCisgICAgKyJCaWxkZWNrZSBpc3QgZWluZSBXaWRtdW5nIGFuZ2VicmFjaHQuIiw3OCkpOworICBBRCggKHsic2lubiIsICJzaW5uZSJ9KSwgQlMoCisgICAgICJTY2hyYWVua2UgdW5kIFRydWhlbiBzZWhlbiBzY2hvbiBldHdhcyB2ZXNjaGllZGVuIGF1cy4iLDc4KSk7CisgIEFEKCAoeyJzd2lmdCJ9KSwgQlMoCisgICAgICJTaWVoc3QgRHUgaWhuIGhpZXIgZXR3YSBnZXJhZGU/Iiw3OCkpOworICBBRCggKHsiYmlsZGVja2UifSksIEJTKAorICAgICAiVW50ZW4gaW4gZGVyIHJlY2h0ZW4gQmlsZGVja2UgaXN0IGVpbmUgV2lkbXVuZyBhbmdlYnJhY2h0LiIsNzgpKTsKKyAgQUQoICh7ImF1Z2VuIn0pLCBCUygKKyAgICAgIkRlciBFbGYgYXVmIGRlbSBQb3J0cmFpdCBoYXQgc3RyYWhsZW5kIGJsYXVlIEF1Z2VuLiIsNzgpKTsKKyAgQUQoICh7IndpZG11bmcifSksIEJTKAorICAgICAiU2llaHQgYXVzIGFscyBvYiBtYW4gZGllIHNvZ2FyIGxlc2VuIGthbm4hIiw3OCkpOworICBBRCggKHsibWFlaG5lIiwgImxvZXdlbm1hZWhuZSJ9KSwgQlMoCisgICAgICJEZXIgRWxmIGF1ZiBkZW0gQmlsZCBoYXQgZWluZSBzaWxiZXJncmF1ZSBMb2V3ZW5tYWVobmUuIiw3OCkpOworICBBRCggKHsiemF1YmVyZXIiLCAiemF1YmVyaHV0IiwgInphdWJlcmVyaHV0IiwgInNwaXR6aHV0In0pLCBCUygKKyAgICAgIkRlciBaYXViZXJodXQgbWFjaHQgZGVuIEVsZmVuIGF1ZiBkZW0gUG9ydHJhaXQgZXJzdCB6dSBlaW5lbSB3YXNjaGVjaHRlbiAiCisgICAgKyJaYXViZXJlci4iLDc4KSk7CisgIEFEKCAoeyJvaHJlbiIsICJlbGZlbm9ocmVuIn0pLCBCUygKKyAgICAgIkRpZSBPaHJlbiBkZXMgRWxmZW4gYXVmIGRlbSBQb3J0cmFpdCBzaW5kIHNvIHNwaXR6LCB3aWUgbWFuIGRhcyB2b24gIgorICAgICsiZWluZW0gRWxmZW4gZXJ3YXJ0ZXQuIiw3OCkpOworICBBUkQoICh7IndpZG11bmcifSksCisgICAgICJEYW5rIGFuIEdlb3JkaSBmdWVyIGRpZXNlIGdyb3NzYXJ0aWdlIEdlc2NoYWVmdHNpZGVlLlxuIgorICAgICsiTW9lZ2VuIERpciBEZWluZSBaYXViZXIgZ2VsaW5nZW4gdW5kIGRpZSBTcGVsbHB1bmt0ZSBuaWVtYWxzIGF1c2dlaGVuLlxuIgorICAgICsiKERhcnVudGVyIGhhdCBqZW1hbmQgdW50ZXJzY2hyaWViZW4sIGFiZXIgZGFzIEdla3Jha2VsIGthbm5zdCBEdSBuaWNodCAiCisgICAgKyJpZGVudGlmaXppZXJlbilcbiIpOworICBBRCggKHsidW50ZXJzY2hyaWZ0In0pLCBCUygKKyAgICAgIk1laW5zdCBEdSBkYXMgR2VrcmFrZWw/Iiw3OCkpOworICBBRCggKHsicm90ZmFlcmJ1bmciLCAiZmFyYmUifSksIEJTKAorICAgICAiRGFzIEhvbHogaGF0IGVpbmUgbGVpY2h0IHJvZXRsaWNoZSBGYXJiZS4iLDc4KSk7CisgIEFEKCAoeyJydWhlIn0pLCBCUygKKyAgICAgIkFhYWFoaGhoaC4gUnVoZSB0dXQgZ3V0LiBVbmQgZGFuayBkZXIgbGVpc2VuIE1lbG9kaWUgZW50c3Bhbm5zdCBEdSAiCisgICAgKyJEaWNoIGFsbG1hZWhsaWNoLiIsNzgpKTsKKyAgQUQoICh7ImNoYW9zZGFlbW9uIn0pLCBCUygKKyAgICAgIktlaW5lciBkYS4gV2VkZXIgU3dpZnQgbm9jaCBlaW4gYW5kZXJlci4gR2x1ZWNrIGZ1ZXIgRGljaCEiLDc4KSk7CisgIEFEKCAoeyJzYWNoZW4ifSksIEJTKAorICAgICAiV2FzIGF1Y2ggaW1tZXIuIiw3OCkpOworICBBRCggKHsia2xhdWUifSksIEJTKAorICAgICAiV2FocnNjaGVpbmxpY2gga2FubiBTd2lmdCBkYW1pdCBhbmRlcmUgU2FjaGVuIGJlc3NlciBlcmxlZGlnZW4gYWxzICIKKyAgICArInNjaHJlaWJlbi4gU2NobGllc3NsaWNoIGlzdCBlciBlaW4gQ2hhb3NkYWVtb24uIiw3OCkpOworICBBRCggKHsiZ2VrcmFrZWwifSksIEJTKAorICAgICAiRHUgbmltbXN0IERpciBaZWl0IHVuZCBzY2hhdXN0IGRpZSBVbnRlcnNjaHJpZnQgZG9jaCBub2NobWFsIGluIGFsbGVyICIKKyAgICArIlJ1aGUgYW4uIEVuZGxpY2gga29tbXQgRGlyIGRpZSBFcmxldWNodHVuZy4gRGFzIHNvbGwgXCJTd2lmdFwiIGhlaXNzZW4uICIKKyAgICArIk1hbm4sIGhhdCBkZXIgbmUgS2xhdWUhIChOYWphLCBiZWkgZWluZW0gQ2hhb3NkYWVtb25lbiB3dW5kZXJ0IGRhcyAiCisgICAgKyJlaWdlbnRsaWNoIG5pY2h0KSIsNzgpKTsKKyAgQUQoICh7ImVybGV1Y2h0dW5nIn0pLCBCUygKKyAgICAgIlNpZSBmYW5kIGluIERlaW5lbSBLb3BmIHN0YXR0LiBEZW4gbXVlc3N0ZXQgRHUgc2Nob24gb2VmZm5lbiwgd2VubiBEdSAiCisgICAgKyJkaWUgRXJsZXVjaHR1bmcgcGh5c2lzY2ggdW50ZXJzdWNoZW4gbW9lY2h0ZXN0LiBVbmQgZGFzIGthbm4gc2ljaCAiCisgICAgKyJuZWdhdGl2IGF1ZiBEZWluZSBHZXN1bmRoZWl0IGF1c3dpcmtlbi4gTGFzcyBlcyBsaWViZXIhIiw3OCkpOworICBBRCggKHsiZ2VzdW5kaGVpdCJ9KSwgQlMoCisgICAgICJNaXQgS29wZiBiaXN0IER1IGdlc3VuZC4gRGFzIGlzdCBnZXdpc3MuIiw3OCkpOworICBBRCggKHsid2FuZCIsICJ3YWVuZGUifSksIEJTKAorICAgICAiRGllIFdhZW5kZSBiZXN0ZWhlbiBhdXMgZWluZW0gZmVpbmVuLCBleG90aXNjaGVuIEhvbHogbWl0IGxlaWNodGVyICIKKyAgICArIlJvdGZhZXJidW5nLiBTaWVodCBzZWhyIGVkZWwgYXVzLiBNZWhyZXJlIEJpbGRlciB3dXJkZW4gYW4gZGVuIFdhZW5kZW4gIgorICAgICsiYXVmZ2VoYWVuZ3QgdW5kIHZlcnRlaWxlbiBzaWNoIGdsZWljaG1hZXNzaWcgdWViZXIgZGVuIFJhdW0uIiw3OCkpOworICBBRCggKHsia29wZiJ9KSwgQlMoCisgICAgICJFaW4gR2x1ZWNrLCBlciBpc3Qgbm9jaCBkcmFuLiBHZW5hdXNvIHdpZSBiZWkgZGVtIEVsZmVuIGF1ZiBkZW0gIgorICAgICsiUG9ydHJhaXQhIiw3OCkpOworICBBRCggKHsic2NocmFuayIsICJzY2hyYWVua2UifSksIEJTKAorICAgICAiRXMgZ2lidCB2ZXJzY2hpZWRlbmUgQXJ0ZW4gdm9uIFNjaHJhZW5rZW4uIiw3OCkpOworICBBRCggKHsiemVpY2hudW5nIn0pLCBCUygKKyAgICAgIkVzIGdpYnQgbWVocmVyZSBkYXZvbi4iLDc4KSk7CisgIEFEKCAoeyJ6ZWljaG51bmdlbiJ9KSwgQlMoCisgICAgICJTaWUgemVpZ2VuIC0gdGVpbHdlaXNlIHNraXp6ZW5oYWZ0IC0gZGVuIEF1ZmJhdSB2ZXJzY2hpZWRlbmVyICIKKyAgICArIk1vZWJlbHN0dWVja2UgLSB2b3J6dWdzd2Vpc2UgU2NocmFlbmtlLiIsNzgpKTsKKyAgQUQoICh7ImF1ZmJhdSIsICJ6dXNhbW1lbnNldHp1bmcifSksIEJTKAorICAgICAiTWl0IGRlbSBBdWZiYXUgaXN0IGRpZSBadXNhbW1lbnNldHp1bmcgZ2VtZWludCAtIHVuZCB1bWdla2VocnQuIiw3OCkpOworICBBRCggKHsiaG9seiIsICJob2VsemVyIn0pLCBCUygKKyAgICAgIlNjaG9uIGhpZXIgaW0gUmF1bSB3dXJkZSBtaXQgdmVyc2NoaWVkZW5zdGVuIEhvZWx6ZXJuIGdlYXJiZWl0ZXQsICIKKyAgICArImlociBlZGxlciBEdWZ0IHZlcm1pc2NodCBzaWNoIHVuZCBiaWV0ZXQgZWluZW4gZXJoZWJlbmRlbiBHZXJ1Y2guICIKKyAgICArIkxlaWRlciBzaW5kIGRpZSBtZWlzdGVuIEhvbHphcnRlbiBzbyBleG90aXNjaCwgZGFzcyBEdSBiZWltIGJlc3RlbiAiCisgICAgKyJXaWxsZW4gbmljaHQgc2FnZW4ga2FubnN0LCB1bSB3YXMgZnVlciBlaW5lbiBCYXVtIGVzIHNpY2ggZGEgbWFsICIKKyAgICArImdlaGFuZGVsdCBoYXQuIiw3OCkpOworICBBRCggKHsiaG9semFydCIsICJob2x6YXJ0ZW4ifSksIEJTKAorICAgICAiU2VociBleG90aXNjaGUgSG9semFydGVuLiBEdSBiaXN0IGtlaW4gRXhwZXJ0ZSBmdWVyIHNvd2FzLCB1bmQgIgorICAgICsidmVybXV0bGljaCBoYXN0IER1IGF1Y2gga2VpbmUgTHVzdCwgZWluZXIgenUgd2VyZGVuLiIsNzgpKTsKKyAgQUQoICh7ImV4cGVydGUifSksIEJTKAorICAgICAiS2VpbmVyIGRhLiIsNzgpKTsKKyAgQUQoICh7Imx1c3QifSksIEJTKAorICAgICAiV2VubiBqZW1hbmQgc2VpbmUgTHVzdCB1bnRlcnN1Y2h0L3VlYmVycHJ1ZWZ0LCBiZWt1bmRldCBlciBkYW1pdCAiCisgICAgKyJlaWdlbnRsaWNoIHNjaG9uIGluIFdpcmtsaWNoa2VpdCBzZWluZSBVbmx1c3QuIiw3OCkpOworICBBRCggKHsidW5sdXN0In0pLCBCUygKKyAgICAgIlRqYSwgVW5sdXN0IGtlbm56ZWljaG5ldCBkZW4gRmF1bHBlbHouIiw3OCkpOworICBBRCggKHsiZmF1bHBlbHoifSksIEJTKAorICAgICAiRHUgYmlzdCBnZW1laW50ISIsNzgpKTsKKyAgQUQoICh7IndpcmtsaWNoa2VpdCIsICJyZWFsaXRhZXQifSksIEJTKAorICAgICAiRGllIFdpcmtsaWNoa2VpdCBpc3QgZGllIFJlYWxpdGFldCAtIHVuZCBhbmRlcnNydW0uIE1laXN0ZW5zICIKKyAgICArImplZGVuZmFsbHMuIiw3OCkpOworICBBRCggKHsibWVpc3RlbnMifSksIEJTKAorICAgICAiSGllciBzY2hvbi4iLDc4KSk7CisgIEFEKCAoeyJoaWVyIn0pLCBCUygKKyAgICAgIkhpZXIgaGFsdCEiLDc4KSk7CisgIEFEKCAoeyJiYXVtIiwgImJhZXVtZSJ9KSwgQlMoCisgICAgICJIaWVyIGdpYnQgZXMga2VpbmUgQmFldW1lLiBEaWUgd3VyZGVuIGJlcmVpdHMgYWxsZSB2ZXJhcmJlaXRldC4iLDc4KSk7CisgIEFEKCAoeyJkdWZ0In0pLCBCUygKKyAgICAgIlJpZWNoZSBoYWx0IG1hbCEiLDc4KSk7CisgIEFEKCAoeyJ3aWxsZSIsICJ3aWxsZW4ifSksIEJTKAorICAgICAiRGVpbiBXaWxsZSBpc3Qgc3RhcmsuLi4iLDc4KSk7CisgIEFEKCAoeyJkZWNrZSJ9KSwgQlMoCisgICAgICJNYWVjaHRpZ2UgQmFsa2VuIGJpbGRlbiBkaWUgRGVja2UuIEVzIGtvZW5udGUgc2ljaCB1bSBFaWNoZSBoYW5kZWxuLCBhYmVyICIKKyAgICArImdlbmF1c29ndXQga29lbm50ZSBlcyBpcmdlbmRlaW5lIGFlaG5saWNoZSwgZXhvdGlzY2hlIEhvbHphcnQgc2Vpbi4gIgorICAgICsiRWluIGhlcnJsaWNoZXIgS3JvbmxldWNodGVyIGhhZW5ndCB2b24gZGVyIE1pdHRlIGhlcmFiLiIsNzgpKTsKKyAgQUQoICh7ImVpY2hlIiwgImVpY2hlbmJhbGtlbiJ9KSwgQlMoCisgICAgICJFcyBpc3QgbmljaHQgc2ljaGVyLCBkYXNzIGVzIHNpY2ggdW0gRWljaGVuYmFsa2VuIGhhbmRlbHQsIGFiZXIgQmFsa2VuICIKKyAgICArInNpbmQncyBhdWYgamVkZW4gRmFsbC4iLDc4KSk7CisgIEFEKCAoeyJmYWxsIn0pLCBCUygKKyAgICAgIkVjaHQgZWhybGljaC4iLDc4KSk7CisgIEFEKCAoeyJiYWxrZW4ifSksIEJTKAorICAgICAiU2llIGJpbGRlbiBkaWUgRGVja2UuIEVpbiBoZXJybGljaCBhbnp1c2VoZW5kZXIgS3JvbmxldWNodGVyIGhhZW5ndCAiCisgICAgKyJkYXJhbiBoZXJhYi4iLDc4KSk7CisgIEFEKCAoeyJrcm9ubGV1Y2h0ZXIifSksIEJTKAorICAgICAiRXIgaGFlbmd0IHZvbiBkZXIgRGVja2UgaGVyYWIgdW5kIG11c3MgZWluIFZlcm1vZWdlbiB3ZXJ0IHNlaW4uIFJlaW5lcyAiCisgICAgKyJCZXJna3Jpc3RhbGwgbWl0IGVpbmVyIFVuemFobCB2b24gS2VyemVuLiBXYXMgZGFzIGZ1ZXIgZWluIEF1ZndhbmQgc2VpbiAiCisgICAgKyJtdXNzLCBkaWUgaW1tZXIgYW0gQnJlbm5lbiB6dSBoYWx0ZW4uIiw3OCkpOworICBBRCggKHsidmVybW9lZ2VuIn0pLCBCUygKKyAgICAgIk1laHIgYWxzIER1IHRyYWdlbiBrYW5uc3QuIiw3OCkpOworICBBRCggKHsiYmVyZ2tyaXN0YWxsIn0pLCBCUygKKyAgICAgIk51ciBCZXJna3Jpc3RhbGwgaGF0IGRpZXNlbiBHbGFuei4iLDc4KSk7CisgIEFEKCAoeyJicmVubmVuIn0pLCBCUygKKyAgICAgIkRpZSBLZXJ6ZW4gZmxhY2tlcm4gbXVudGVyIHZvciBzaWNoIGhpbi4iLDc4KSk7CisgIEFEKCAoeyJ1bnphaGwifSksIEJTKAorICAgICAiMSwgMiwgLi4udmllbGUhIiw3OCkpOworICBBRCggKHsiZ2xhbnoifSksIEJTKAorICAgICAiSGVycmxpY2ghIiw3OCkpOworICBBRCggKHsibWl0dGUifSksIEJTKAorICAgICAiVm9uIGRlciBNaXR0ZSBkZXIgRGVja2UgaGFlbmd0IGVpbiBLcm9ubGV1Y2h0ZXIgaGVyYWIuIiw3OCkpOworICBBRCggKHsia2VyemVuIn0pLCBCUygKKyAgICAgIkRpciBmYWVsbHQgYXVmLCBkYXNzIGRpZSBLZXJ6ZW4gc2ljaCBnYXIgbmljaHQgdmVyYnJhdWNoZW4uIEVzIG11c3MgIgorICAgICsic2ljaCB1bSBtYWdpc2NoZSBLZXJ6ZW4gaGFuZGVsbi4iLDc4KSk7CisgIEFEKCAoeyJhdWZ3YW5kIn0pLCBCUygKKyAgICAgIkVudHNldHp0IGRlbmtzdCBEdSAuIG8gTyAoRGFzIHNjaGxhZWd0IHNpY2ggYmVzdGltbXQgYXVmIGRlbiBQcmVpcyBuaWVkZXIuKSIsNzgpKTsKKyAgQUQoICh7ImVja2VuIn0pLCBCUygKKyAgICAgIkluIGRlbiBFY2tlbiBlbnRkZWNrc3QgRHUga2xlaW5lLCBlZGxlIExhdXRzcHJlY2hlciwgYXVzIGRlbmVuIGRpZSAiCisgICAgKyJNZWxvZGllIHp1IGtvbW1lbiBzY2hlaW50LiIsNzgpKTsKKyAgQUQoICh7ImxhdXRzcHJlY2hlciJ9KSwgQlMoCisgICAgICJEdSB3dXNzdGVzdCBnYXIgbmljaHQsIGRhc3Mgc293YXMgaW0gTW9yZ2VuR3JhdWVuIHNjaG9uIGVyZnVuZGVuIHd1cmRlLiIsNzgpKTsKKyAgQUQoICh7Im1vcmdlbmdyYXVlbiJ9KSwgQlMoCisgICAgICJUdXN0IER1IGRhcyBuaWNodCBzY2hvbiBkaWUgZ2FuemUgWmVpdD8iLDc4KSk7CisKKyAgQWRkU21lbGxzKFNFTlNFX0RFRkFVTFQsICJFcyByaWVjaHQgaGllciBhbmdlbmVobSBuYWNoIHZlcnNjaGllZGVuZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIkhvZWx6ZXJuLlxuIik7CisgIEFkZFNtZWxscygoeyJob2VsemVyIiwgImhvbHoiLCAiaG9semFydGVuIn0pLCBCUygiRHUga2FubnN0IG5pY2h0IHNhZ2VuLCAiCisgICAgKyJ1bSB3YXMgZnVlciBIb2x6YXJ0ZW4gZXMgc2ljaCBoYW5kZWx0LCBhYmVyIGRlciBHZXJ1Y2ggbGFlc3N0IGF1ZiB2aWVsZSAiCisgICAgKyJ2ZXJzY2hpZWRlbmUgc2NobGllc3Nlbi4gRWluZSBUcmVubnVuZyBkZXMgR2VydWNocyBpc3QgRGlyIG5pY2h0IG1vZWdsaWNoLiIpICk7CisgIEFkZFNtZWxscygoeyJnZXJ1Y2giLCAiZ2VydWVjaGUifSksIEJTKCJFcyByaWVjaHQgbmFjaCB2ZXJzY2hpZWRlbmVuICIKKyAgICArIkhvbHphcnRlbi4iKSApOworCisgIEFkZFNvdW5kcyhTRU5TRV9ERUZBVUxULCAiR2FueiBsZWlzZSBob2Vyc3QgRHUgZWluZSBhbmdlbmVobWUsIGJlcnVoaWdlbmRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyJNZWxvZGllLlxuIik7CisgIEFkZFNvdW5kcygoeyJtZWxvZGllIn0pLCAiU2llIHNjaGVpbnQgdm9uIGFsbGVuIEVja2VuIGRlcyBMYWRlbnMgenUga29tbWVuLlxuIik7CisKKyAgQWRkSXRlbSggTEFERU4oInZlcmthZXVmZXIiKSwgUkVGUkVTSF9ERVNUUlVDVCk7CisKKyAgQWRkQ21kKCh7Im9lZmZuZSJ9KSwgImtvcGZfb2VmZm5lbiIpOworICBBZGRDbWQoKHsibGllcyIsICJsZXMiLCAibGVzZSJ9KSwgInByZWlzbGlzdGVfbGVzZW4iKTsKKyAgQWRkQ21kKCh7ImlkZWUifSksICJpZGVlX2xvZ2dlbiIpOworICBBZGRDbWQoKHsidHJlbm4iLCAidHJlbm5lIn0pLCAiZ2VydWVjaGVfdHJlbm5lbiIpOworICBBZGRDbWQoKHsid2VyZCIsICJ3ZXJkZSJ9KSwgImV4cGVydGVfd2VyZGVuIik7CisgIEFkZENtZCgoeyJ6YWVobCIsICJ6YWVobGUifSksICJrZXJ6ZW5femFlaGxlbiIpOworCisgIEFkZFNwZWNpYWxFeGl0KCJvc3RlbiIsICJyYXVzZ2VoZW4iKTsKK30KKworaW50IGtlcnplbl96YWVobGVuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IHphZWhsZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHN0ciE9ImtlcnplbiIpIHJldHVybiAwOworICB3cml0ZSgiMS4uMi4udmllbGUuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCByYXVzZ2VoZW4oc3RyaW5nIGRpcikKK3sKKyAgcmV0dXJuIFRQLT5tb3ZlKFJBVU1fVk9SX0xBREVOLCBNX0dPLCAwLAorICAgICJ2ZXJsYWVzc3QgZGVuIExhZGVuIiwgImtvbW10IGF1cyBkZW0gTGFkZW4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgR2V0RXhpdHMoIG9iamVjdCB2aWV3ZXIgKQoreworICByZXR1cm4gIkRlciBBdXNnYW5nIGJlZmluZGV0IHNpY2ggaW0gT3N0ZW4uXG4iOworfQorCitpbnQga29wZl9vZWZmbmVuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IG9lZmZuZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHN0ciE9ImtvcGYiICYmIHN0ciE9Im1laW5lbiBrb3BmIiAmJiBzdHIhPSJkZWluZW4ga29wZiIpCisgICAgcmV0dXJuIDA7CisgIHdyaXRlKCBCUygiTmV1Z2llcmlnLCB3aWUgRHUgYmlzdCwgZ3JlaWZzdCBEdSBEaXIgYW4gZGVuIEtvcGYuIERhIGZhZWxsdCBEaXIgIgorICAgICsiZWluLCBkYXNzIGRhcyBvZWZmbmVuIERlaW5lcyBLb3BmZXMgZXZ0bC4gZWluZSBDb3B5cmlnaHQtVmVybGV0enVuZyAiCisgICAgKyJkYXJzdGVsbGVuIGtvZW5udGUsIER1IGhlaXNzdCBqYSBzY2hsaWVzc2xpY2ggbmljaHQgSGFubmliYWwuIEFsc28gbGFlc3N0ICIKKyAgICArIkR1IGVzIGRhbm4gZG9jaCBibGVpYmVuLiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBwcmVpc2xpc3RlX2xlc2VuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IGxlc2VuP1xuIik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihzdHIhPSJwcmVpc2xpc3RlIiAmJiBzdHIhPSJsaXN0ZSIpCisgICAgcmV0dXJuIDA7CisgIFRQLT5Nb3JlKCByZWFkX2ZpbGUoTEFERU4oInByZWlzbGlzdGUudHh0IikpICk7CisgIHJldHVybiAxOworfQorCitpbnQgaWRlZV9sb2dnZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHR4dDsKKyAgc3RyPVRQLT5fdW5wYXJzZWRfYXJncygpOworICB0eHQ9QlMoc3RyLCA3OCwgQ0FQKGdldGV1aWQoVFApKSsiLi4uLi4uLi4uLi4uLiJbMC4uMTJdLCBCU19JTkRFTlRfT05DRSk7CisgIHdyaXRlX2ZpbGUoIExBREVOKElERUVOX0xPRyksIHR4dCsiXG4iKTsKKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgRGVpbmUgSWRlZSFcbiIpOworICByZXR1cm4gMTsKK30KKworaW50IGdlcnVlY2hlX3RyZW5uZW4oc3RyaW5nIHN0cikKK3sKKyAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgdHJlbm5lbj9cbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYoc3RyIT0iZ2VydWNoIiAmJiBzdHIhPSJnZXJ1ZWNoZSIpCisgICAgcmV0dXJuIDA7CisgIHdyaXRlKCJEdSB2ZXJzdWNoc3QgZXMsIGFiZXIgRHUgc2NoYWZmc3QgZXMgZWluZmFjaCBuaWNodC5cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IGV4cGVydGVfd2VyZGVuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IHdlcmRlbj9cbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYoc3RyIT0iZXhwZXJ0ZSIgJiYgc3RyIT0iZmFjaG1hbm4iKQorICAgIHJldHVybiAwOworICB3cml0ZSgiVGphLCBzbyBlaW5mYWNoIGdlaHQgZGFzIG5pY2h0LCBhYmVyIGRhcyBoYWV0dGVzdCBEdSBEaXIgZGVua2VuIGtvZW5uZW4uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmtsYWRlbi5oIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbGFkZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM3NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zY2hyYW5rbGFkZW4uaApAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSAibW9lYmVsLmgiCisKKyNkZWZpbmUgU0NIUkFOS01BU1RFUjIgIi9wbGF5ZXJzL3N3aWZ0L3dvcmtyb29tIgorCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisKKyNkZWZpbmUgQlMgICBicmVha19zdHJpbmcKKyNkZWZpbmUgRU5WKHgpICBlbnZpcm9ubWVudCh4KQorI2RlZmluZSBFVE8gZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkKKyNkZWZpbmUgRVRQIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpCisjZGVmaW5lIFRQICAgdGhpc19wbGF5ZXIoKQorI2RlZmluZSBUTyAgIHRoaXNfb2JqZWN0KCkKKworI2RlZmluZSBTUCBTZXRQcm9wCisjZGVmaW5lIFFQIFF1ZXJ5UHJvcAorI2RlZmluZSBBRCBBZGREZXRhaWwKKyNkZWZpbmUgQVJEIEFkZFJlYWREZXRhaWwKKworI2RlZmluZSBTVUlEIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKQorCisvLyNkZWZpbmUgQ0FQKHgpIGNhcGl0YWxpemUoeCkKKyNkZWZpbmUgTE9XRVIoeCkgbG93ZXJfY2FzZSh4KQorCisjZGVmaW5lIENMT05FTUUoeCkgY2xvbmVfb2JqZWN0KHgpLT5tb3ZlKE1FKQorI2RlZmluZSBDTE9ORU9CKHgpIGNsb25lX29iamVjdCh4KQorI2RlZmluZSBDTE9ORSh4LHkpIGNsb25lX29iamVjdCh4KS0+bW92ZSh5KQorI2RlZmluZSBJU1RfWkFITCh4KSAoc3RyaW5nKXRvX2ludCh4KT09eAorCisjZGVmaW5lIFJJR0hUKHgseSkgKHk+c2l6ZW9mKHgpP3g6ZXh0cmFjdCh4LHNpemVvZih4KS15LHNpemVvZih4KS0xKSkKKyNkZWZpbmUgTEVGVCh4LHkpICh5PnNpemVvZih4KT94OmV4dHJhY3QoeCwwLHktMSkpCmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmttYXN0ZXIuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvc2NocmFua21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDJkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmttYXN0ZXIuYwpAQCAtMCwwICsxLDIzMyBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgU2NocmFua21hc3RlcgorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMTkuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgd3VyemVsCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBDaGFuZ2Vsb2c6CisgICAqIDIxLjA2LjIwMDcsIFplc3N0cmEKKyAgICAgICAgICAgY2FsbF9vdXQgb2huZSBWZXJ6b2VnZXJ1bmcgYmVpbSBVcGRhdGVuIGR1cmNoIGVpbmVzIG1pdCAycyBWZXJ6b2VnZXJ1bmcgZXJzZXR6dC4KKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKworbWFwcGluZyBzY2hyYWVua2U7CitzdHJpbmcgKmNudHM7CitpbnQgdXBkYXRlX2xhZXVmdDsKK2ludCByZXNldF9sYWV1ZnQ7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIAoreworICA6OmNyZWF0ZSgpOworICBTUChQX0lOVF9TSE9SVCwgIklyZ2VuZHdvIHVuZCBOaXJnZW5kcyIpOworICBTUChQX0lOVF9MT05HLAorICAgICAiRGllcyBpc3QgZGVyIE1hc3Rlci1SYXVtIGZ1ZXIgZGVuIFNDSFJBRU5LRVIuXG4iCisgICAgKyJIaWVyIG1lcmt0IHNpY2ggQXVndXN0IGRpZSBBbnphaGwgZGVyIHZlcmthdWZ0ZW4gQ29udGFpbmVyLlxuIgorICAgICsiRGF2b24gc2luZCBtb21lbnRhbiBAQEFOWkFITEBAIHJlZ2lzdHJpZXJ0ZSBpbSBVbWxhdWYhXG4iCisgICAgKyJGb2xnZW5kZSBCZWZlaGxlIHNpbmQgdmVyZnVlZ2JhcjpcbiIKKyAgICArIiAgc2NocmFua2xpc3RlLi4uLi4uLi4uTGlzdGV0IHJlZ2lzdHJpZXJ0ZSwgaW0gU3BpZWwgYmVmaW5kbGljaGUgQ29udGFpbmVyLlxuIgorICAgICsiICBzY2hyYW5rdXBkYXRlLi4uLi4uLi5GdWVocnQgZWluIFVwZGF0ZSBhbGxlciByZWdpc3RyaWVydGVuIENvbnRhaW5lciBkdXJjaC5cbiIpOworCisgIFNQKFBfTElHSFQsIDEpOworICBTUChQX0lORE9PUlMsIDEpOworICBpZiggU0NIUkFOS01BU1RFUjItPlF1ZXJ5UHJvcCgic2NocmFlbmtlIikgKSAgLy8gRGVyIFNpY2hlcnVuZ3NyYXVtIGhhdCBEYXRlbj8KKyAgICBzY2hyYWVua2U9U0NIUkFOS01BU1RFUjItPlF1ZXJ5UHJvcCgic2NocmFlbmtlIik7ICAvLyBEYXRlbiBob2xlbi4uLgorICBlbHNlCisgICAgc2NocmFlbmtlPShbXSk7CisgIFNldFByb3AoInNjaHJhZW5rZSIsIHNjaHJhZW5rZSApOworCisgIHVwZGF0ZV9sYWV1ZnQ9MDsKKworICAvLyB1bm5vZXRpZywgU0NIUkFOS01BU1RFUjIgaXN0IGpldHp0IHNjaG9uIGdlbGFkZW4sIHMuby4KKyAgLy9sb2FkX29iamVjdChTQ0hSQU5LTUFTVEVSMik7CisgIHNldF9uZXh0X3Jlc2V0KDM2MDApOyAvLyBSZXNldCAxIHggcHJvIFN0ZC4KKworICBBZGRDbWQoKHsic2NocmFua2xpc3RlIn0pLCAiU2NocmFua2xpc3RlIik7CisgIEFkZENtZCgoeyJzY2hyYW5rdXBkYXRlIn0pLCAiU2NocmFua1VwZGF0ZSIpOworfQorCitwdWJsaWMgaW50IGNsZWFuX3VwKGludCByZWYpIHtyZXR1cm4gMDt9ICAgLy8gdmVyaGluZGVydCBBdXNzd2FwcGVuIGRlcyBSYXVtZXMKKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIEdldEV4aXRzKCBvYmplY3Qgdmlld2VyICkgCit7CisgIHJldHVybiAiIjsKK30KKworc3RyaW5nIEFOWkFITCgpCit7CisgIHJldHVybiB0b19zdHJpbmcoIHNpemVvZihzY2hyYWVua2UpICk7Cit9CisKKworLy8gY250ID0gT2JqZWN0IGRlcyBDb250YWluZXJzCisvLyB2ZXIgPSBWZXJzaW9uIGRlcyBDb250YWluZXJzIChWRVJTSU9OX1NURCtWRVJTSU9OX09CSiB2b24gc3RkLmNvbnQuICsgb2JqZWt0Li4uKQorLy8gc2VoZXI9RGVyIEJlc2l0emVyL0thZXVmZXIKKy8vIHN0YW5kb3J0PVJhdW0gaW4gZGVtIGRlciBDb250YWluZXIgc3RlaHQKK3ZvaWQgUmVnaXN0ZXJDbnQobWl4ZWQgY250LCBtaXhlZCB2ZXIsIG1peGVkIHNlaGVyLCBtaXhlZCBzdGFuZG9ydCkKK3sKKyAgaWYgKG9iamVjdHAoc3RhbmRvcnQpKSBzdGFuZG9ydD1vYmplY3RfbmFtZShzdGFuZG9ydCk7CisgIGlmKCAhb2JqZWN0cChjbnQpIHx8ICFzdHJpbmdwKHZlcikgfHwgIXN0cmluZ3Aoc2VoZXIpIHx8ICFzdHJpbmdwKHN0YW5kb3J0KSApCisgIHsKKyAgICBsb2dfZmlsZSgic3dpZnQvc2NocmFlbmtlci9idWdzLmxvZyIsICJzY2hyYW5rbWFzdGVyIChSZWdpc3RlckNudCkgKiIKKyAgICAgICt0b19zdHJpbmcoY250KSsiKiIrdG9fc3RyaW5nKHZlcikrIioiK3RvX3N0cmluZyhzZWhlcikrIioiCisgICAgICArdG9fc3RyaW5nKHN0YW5kb3J0KSsiKlxuIik7CisgICAgcmV0dXJuOworICB9CisgIG1fZGVsZXRlKHNjaHJhZW5rZSxvYmplY3RfbmFtZShjbnQpKTsKKyAgc2NocmFlbmtlKz0oW29iamVjdF9uYW1lKGNudCk6IHZlcjsgc2VoZXI7IHRvX3N0cmluZyhzdGFuZG9ydCldKTsKKyAgU2V0UHJvcCgic2NocmFlbmtlIiwgc2NocmFlbmtlICk7CisgIFNDSFJBTktNQVNURVIyLT5TZXRQcm9wKCJzY2hyYWVua2UiLCBzY2hyYWVua2UgKTsKK30KKwordm9pZCBSZW1vdmVDbnQobWl4ZWQgY250LCBtaXhlZCBzZWhlcikKK3sKKyAgaWYoICFvYmplY3RwKGNudCkgfHwgIXN0cmluZ3Aoc2VoZXIpICkKKyAgeworICAgIGxvZ19maWxlKCJzd2lmdC9zY2hyYWVua2VyL2J1Z3MubG9nIiwgInNjaHJhbmttYXN0ZXIgKFJlbW92ZUNudCkgKiIKKyAgICAgICt0b19zdHJpbmcoY250KSsiKiIrdG9fc3RyaW5nKHNlaGVyKSsiKlxuIik7CisgICAgcmV0dXJuOworICB9CisgIHNjaHJhZW5rZS09KFtvYmplY3RfbmFtZShjbnQpXSk7CisgIFNldFByb3AoInNjaHJhZW5rZSIsIHNjaHJhZW5rZSApOworICBTQ0hSQU5LTUFTVEVSMi0+U2V0UHJvcCgic2NocmFlbmtlIiwgc2NocmFlbmtlICk7Cit9CisKK3N0cmluZyBmbihzdHJpbmcgd2FzKQoreworICBzdHJpbmcgc3RyLCpzdHJzOworICBzdHJzPW9sZF9leHBsb2RlKCB3YXMsICIvIiApOworICBzdHI9c3Ryc1tzaXplb2Yoc3RycyktMV07CisgIHN0cnM9b2xkX2V4cGxvZGUoIHN0ciwgIiMiICk7CisgIHN0cj1zdHJzWzBdOworICByZXR1cm4gc3RyOworfQorCitpbnQgU2NocmFua2xpc3RlKCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyBzdHIsICpzdHJzOworICBvYmplY3QgY250OworICBpZih1cGRhdGVfbGFldWZ0ICYmICFyZXNldF9sYWV1ZnQpIC8vIE5pY2h0IHdhZWhyZW5kIGVpbmVzIFVwZGF0ZXMgZGVyIFNjaHJhZW5rZSEKKyAgeworICAgIHdyaXRlKCJVcGRhdGUgd2lyZCBkdXJjaGdlZnVlaHJ0LiBCaXR0ZSBiaXMgenVtIEVuZGUgd2FydGVuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3RyPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICBzdHJzPW1faW5kaWNlcyhzY2hyYWVua2UpOworICBmb3IoaT0wO2k8c2l6ZW9mKHN0cnMpO2krKykKKyAgeworICAgIGlmKCBjbnQ9ZmluZF9vYmplY3Qoc3Ryc1tpXSkgKQorICAgIHsKKyAgICAgIHN0cis9KGZuKG9iamVjdF9uYW1lKGNudCkpKyIuLi4uLi4uLi4uLi4uLi4uLi4uLiIpWzAuLjIwXSsiICI7CisgICAgICBzdHIrPXNjaHJhZW5rZVtzdHJzW2ldLCAwXSsiICI7CisgICAgICBzdHIrPShzY2hyYWVua2Vbc3Ryc1tpXSwgMV0rIi4uLi4uLi4uLi4uLi4uLi4uLi4uIilbMC4uMjBdKyIgIjsKKyAgICAgIHN0cis9Zm4oc2NocmFlbmtlW3N0cnNbaV0sIDJdKSsiXG4iOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RyKz0iTmljaHQgYXVmZmluZGJhcmVuIENvbnRhaW5lciBhdXMgTGlzdGUgZ2Vsb2VzY2h0IVxuIjsKKyAgICAgIHNjaHJhZW5rZS09KFtzdHJzW2ldXSk7CisgICAgICBTZXRQcm9wKCJzY2hyYWVua2UiLCBzY2hyYWVua2UgKTsKKyAgICAgIFNDSFJBTktNQVNURVIyLT5TZXRQcm9wKCJzY2hyYWVua2UiLCBzY2hyYWVua2UgKTsKKyAgICB9CisgIH0KKyAgc3RyKz0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgaWYoIFRQICYmIHByZXNlbnQoVFApICkgLy93dXJ6ZWwgMTkuMDMuMDEgCisgICAgVFAtPk1vcmUoc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVXBkYXRlX25hZWNoc3Rlcl9TY2hyYW5rKCkKK3sKKyAgaW50IGk7CisgIG9iamVjdCBjbnQsIGNudF9uZXUsICppbnY7CisgIGlmKCBzaXplb2YoY250cykgKSAgICAvLyBFcyBnaWJ0IG5vY2ggU2NocmFlbmtlIHp1bSBhYmFyYmVpdGVuLi4uCisgIHsKKyAgICBjbnQ9ZmluZF9vYmplY3QoY250c1swXSk7IC8vIFNjaHJhbmsgYXVzd2FlaGxlbiArIE9iamVrdCBzdWNoZW4KKyAgICBpZihjbnQpCisgICAgeworICAgICAgLy8gQXV0b2xvYWRlcnRydWhlIGlzdCBldHdhcyBzcGV6aWVsbGVyIHp1IHVwZGF0ZW4uLi4gRGFoZXIgYWx0ZXJuYXRpdmVyCisgICAgICAvLyBNZWNoYW5pc211czogVXBkYXRlTWUoKSBpbSBNb2ViZWxzdHVlY2sgYXVmcnVmZW4uIFdlbm4gZGllIEZ1bmt0aW9uCisgICAgICAvLyBldHdhcyAhPSAwIGxpZWZlcnQsIHdpcmQgYW5nZW5vbW1lbiwgZGFzcyBkaWVzZSBGdW5rdGlvbiBkYXMgVXBkYXRlCisgICAgICAvLyBnZW1hY2h0IGhhdCBvZGVyIHNpY2ggaW4gS3VlcnplIGRhcnVtIGt1ZW1tZXJ0LiBTb25zdCB3aXJkIGRhcyBhbHRlCisgICAgICAvLyBVcGRhdGUgZ2VtYWNodC4KKyAgICAgIC8vIERhcyBuZXVlIE1vZWJlbG9iamVrdCBpc3QgZGFmdWVyIHZlcmFudHdvcnRsaWNoLCBzaWNoIGJlaW0KKyAgICAgIC8vIFNjaHJhbmttYXN0ZXIgenUgKGRlLSlyZWdpc3RyaWVyZW4hCisgICAgICBvYmplY3Qgb2xkZW52PWVudmlyb25tZW50KGNudCk7CisgICAgICBpZiAoY250LT5VcGRhdGVNZSgpKQorICAgICAgeworICAgICAgICAgIHRlbGxfcm9vbShUTywgIi4uLlVwZGF0ZSAiK0NBUChmbihjbnRzWzBdKSkKKyAgICAgICAgICAgICAgKyIgaW4gIiArIG9iamVjdF9uYW1lKG9sZGVudikgKyAiXG4iICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgdGVsbF9yb29tKFRPLCBDQVAoZm4oY250c1swXSkpCisgICAgICAgICAgICAgICsiIGluICIgKyBvYmplY3RfbmFtZShvbGRlbnYpIAorICAgICAgICAgICAgICArICIgaGF0IGtlaW4gVXBkYXRlTWUoKSFcbiIgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRlbGxfcm9vbShUTywgIk5pY2h0IGF1ZmZpbmRiYXJlbiBDb250YWluZXIgYXVzIExpc3RlIGdlbG9lc2NodCFcbiIpOworICAgICAgc2NocmFlbmtlLT0oW2NudHNbMF1dKTsKKyAgICB9CisgICAgY250cy09KHtjbnRzWzBdfSk7ICAgLy8gU2NocmFuayBhdXMgTGlzdGUgbmVobWVuCisgICAgY2FsbF9vdXQoIlVwZGF0ZV9uYWVjaHN0ZXJfU2NocmFuayIsIDIpOyAgLy8gTnVyIDEgU2NocmFuay1VcGRhdGUgcHJvIGhlYXJ0X2JlYXQhCisgIH0KKyAgZWxzZSAgLy8gQWxsZSBTY2hyYWVua2UgYWJnZWFyYmVpdGV0OgorICB7CisgICAgdGVsbF9yb29tKFRPLCAiKioqIFVwZGF0ZSBhYmdlc2NobG9zc2VuLlxuIik7CisgICAgU2V0UHJvcCgic2NocmFlbmtlIiwgc2NocmFlbmtlICk7CisgICAgU0NIUkFOS01BU1RFUjItPlNldFByb3AoInNjaHJhZW5rZSIsIHNjaHJhZW5rZSApOworICAgIHVwZGF0ZV9sYWV1ZnQ9MDsKKyAgfQorfQorCitpbnQgU2NocmFua1VwZGF0ZSgpCit7CisgIGlmKHVwZGF0ZV9sYWV1ZnQpICAgLy8gTmljaHQgd2FlaHJlbmQgZWluZXMgVXBkYXRlcyBkZXIgU2NocmFlbmtlIQorICB7CisgICAgd3JpdGUoIlVwZGF0ZSB3aXJkIGR1cmNoZ2VmdWVocnQuIEJpdHRlIGJpcyB6dW0gRW5kZSB3YXJ0ZW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB1cGRhdGVfbGFldWZ0PTE7ICAgIC8vIEFiIHNvZm9ydCBsYWV1ZnQgVXBkYXRlIQorICBjbnRzPW1faW5kaWNlcyhzY2hyYWVua2UpOworICB0ZWxsX3Jvb20oVE8sICIqKiogVXBkYXRlIHdpcmQgZ2VzdGFydGV0Li4uXG4iKTsKKyAgVXBkYXRlX25hZWNoc3Rlcl9TY2hyYW5rKCk7CisgIHJldHVybiAxOworfQorCisKK3ZvaWQgcmVzZXQoKQoreworICByZXNldF9sYWV1ZnQ9MTsKKyAgc2V0X25leHRfcmVzZXQoMzYwMCk7IC8vIFJlc2V0IDEgeCBwcm8gU3RkLgorICA6OnJlc2V0KCk7CisgIC8vIFdpcmZ0IFNjaHJhZW5rZSBhdXMgZGVyIExpc3RlLCBkaWUgYXVzIHdlbGNoZW0gR3J1bmQgYXVjaCBpbW1lciBuaWNodCBtZWhyIGV4aXN0aWVyZW4KKyAgU2NocmFua2xpc3RlKCk7CisgIGlmKCAhKHNjaHJhZW5rZT09UXVlcnlQcm9wKCJzY2hyYWVua2UiKT09U0NIUkFOS01BU1RFUjItPlF1ZXJ5UHJvcCgic2NocmFlbmtlIikpICkKKyAgICBsb2dfZmlsZSgic3dpZnQvc2NocmFlbmtlci9yZXNldC5sb2ciLCAic2NocmFua21hc3RlciAocmVzZXQpICIKKyAgICAgICtzaXplb2Yoc2NocmFlbmtlKSsiICIKKyAgICAgICtzaXplb2YoUXVlcnlQcm9wKCJzY2hyYWVua2UiKSkrIiAiCisgICAgICArc2l6ZW9mKFNDSFJBTktNQVNURVIyLT5RdWVyeVByb3AoInNjaHJhZW5rZSIpKSsiXG4iKTsKKyAgaWYoIHByZXNlbnQoIkludGVyYWN0aXZlIikgKQorICAgIHRlbGxfcm9vbShUTywgIioqKiBSRVNFVCAqKipcbiIpOworICByZXNldF9sYWV1ZnQ9MDsKK30KKworLyoKKy8vIFZlcmFsdGV0ZSBGdW5rdGlvbmVuLCB1bSBGZWhsZXIgYWJ6dWZhbmdlbi4gS2FubiBuYWNoIGRlbSBuYWVjaHN0ZW4gUmVib290CisvLyBnZWxvZXNjaHQgd2VyZGVuICEhIQordm9pZCBBZGRDbnQobWl4ZWQgY250LCBtaXhlZCB2ZXIsIG1peGVkIHNlaGVyLCBtaXhlZCBzdGFuZG9ydCkKK3sKKyAgbG9nX2ZpbGUoInN3aWZ0L3NjaHJhZW5rZXIvdmVybG9yZW4ubG9nIiwgdG9fc3RyaW5nKGNudCkrIlxuIik7Cit9Cit2b2lkIEVkaXRDbnQobWl4ZWQgY250LCBtaXhlZCB2ZXIsIG1peGVkIHNlaGVyLCBtaXhlZCBzdGFuZG9ydCkKK3sKKyAgbG9nX2ZpbGUoInN3aWZ0L3NjaHJhZW5rZXIvdmVybG9yZW4ubG9nIiwgdG9fc3RyaW5nKGNudCkrIlxuIik7Cit9CisqLwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zcGluZC5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zcGluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzNiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NwaW5kLmMKQEAgLTAsMCArMSwyMDggQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFNwaW5kCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAxNy4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCisjaW5jbHVkZSAiYW5zaS5oIgoraW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIzIgorCitzdHJpbmcgc3RyYWxsOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgc3dpZnRfc3RkX2NvbnRhaW5lcjo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTcGluZCIpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJEaWVzZXIgU3RhaGxzY2hyYW5rIGlzdCB2b3IgYWxsZW0gZnVlciBzcGFydGFuaXNjaGUgUmFldW1lIGdlZGFjaHQuIEViZW5zbyAiCisgICAgKyJ3aWUgc2VpbiBHZWdlbnN0dWVjaywgZGVyIEtsZWlkZXJzY2hyYW5rLCB2ZXJmdWVndCBlciB1ZWJlciBlaW5lIE1lbmdlICIKKyAgICArIlJlZ2FsZSwgaW4gZGVuZW4gZXIgcmllc2lnZSBBdXNydWVzdHVuZ3NtZW5nZW4gYXVmbmVobWVuIGthbm4uIikKKyAgICArIkBAY250X3N0YXR1c0BAIik7CisgIEFkZElkKCh7InNwaW5kIiwgInNjaHJhbmsiLCAic3RhaGxzY2hyYW5rIn0pKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwgVkVSU0lPTl9PQkopOworICBTZXRQcm9wKFBfTkFNRSwgIlNwaW5kIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTAwKTsgICAgIC8vIE1laHIgc29sbHRlIG5pY2h0IHNlaW4sIGx0LiBUaWFtYWsuCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX01JU0NfTUVUQUwsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKyAgU2V0UHJvcCgib2JqX2NtZCIsICJzbGlzdGUgW09iamVrdC1JZF0gW0tsZWlkdW5ncy0vUnVlc3R1bmdzdHlwXVxuIgorICAgICAgICAgICAgICAgICAgICArIiAgS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXBlbjogSGVsbWUsIFVtaGFlbmdlLCBSdWVzdHVuZ2VuLCBIb3NlbiwgU2NodWhlLFxuIgorICAgICAgICAgICAgICAgICAgICArIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZHNjaHVoZSwgR3VlcnRlbCwgQW11bGV0dGUsIFJpbmdlLCBLb2VjaGVyLFxuIgorICAgICAgICAgICAgICAgICAgICArIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoaWxkZSwgU29uc3RpZ2VzXG4iKTsKKyAgQUQoKHsicmVnYWwiLCAicmVnYWxlIn0pLCBCUygiRHVyY2ggZGllIFJlZ2FsZSBrb21tdCBldHdhcyBPcmRudW5nIGluIGRpZSAiCisgICAgKyJ2aWVsZW4gU2FjaGVuLCBkaWUgbWFuIGluIGRlbiBTY2hyYW5rIHN0ZWNrZW4ga2Fubi4gRHUga2FubnN0IERpciB6LkIuICIKKyAgICArImVpbmUgTGlzdGUgYmVzdGltbXRlciBLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cGVuIGRlcyBTY2hyYW5raW5oYWx0ZXMgIgorICAgICsibWl0IGRlbSBCZWZlaGwgXCJzbGlzdGVcIiBhbnNjaGF1ZW4uIChEYXMgZ2VodCBuYXR1ZXJsaWNoIG51ciBiZWkgIgorICAgICsib2ZmZW5lbSBTY2hyYW5rISIpKTsKKworICBBZGRDbWQoKHsic2xpc3RlIn0pLCAiYXVmbGlzdHVuZyIpOworfQorCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikKK3sKKyAgLy8gTnVyIFJ1ZXN0dW5nL0tsZWlkdW5nIGhhdCBpbiBkaWVzZW0gQ29udGFpbmVyIHdhcyB2ZXJsb3JlbiEKKyAgaWYgKChvYi0+SXNDbG90aGluZygpIHx8IG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSkpCisgICAgICAmJiAhb2ItPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSApCisgIHsKKyAgICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKKyAgfQorCisgIHdyaXRlKCBCUygiSW4gIituYW1lKFdFTiwxKSsiIGthbm5zdCBEdSBudXIgUnVlc3R1bmdzLS9LbGVpZHVuZ3NzdHVlY2tlIGxlZ2VuISIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhdWZsaXN0dW5nMihzdHJpbmcgd2FzLCBzdHJpbmcgbmZfc3RyMSwgc3RyaW5nIG5mX3N0cjIsIGludCBhbGxlcykKK3sKKyAgc3RyaW5nIG9ic2hvcnQsIHN1Y2hlLCAqc3RyczsKKyAgb2JqZWN0ICpvYnM7CisgIGludCBpOworICBtYXBwaW5nIHN1Y2hvYnM7CisgIHN3aXRjaCh3YXMpCisgIHsKKyAgICBjYXNlICJoZWxtZSIgICAgICA6IHN1Y2hlPUFUX0hFTE1FVDsgYnJlYWs7CisgICAgY2FzZSAidW1oYWVuZ2UiICAgOiBzdWNoZT1BVF9DTE9BSzsgYnJlYWs7CisgICAgY2FzZSAicnVlc3R1bmdlbiIgOiBzdWNoZT1BVF9BUk1PVVI7IGJyZWFrOworICAgIGNhc2UgImhvc2VuIiAgICAgIDogc3VjaGU9QVRfVFJPVVNFUlM7IGJyZWFrOworICAgIGNhc2UgInNjaHVoZSIgICAgIDogc3VjaGU9QVRfQk9PVDsgYnJlYWs7CisgICAgY2FzZSAiaGFuZHNjaHVoZSIgOiBzdWNoZT1BVF9HTE9WRTsgYnJlYWs7CisgICAgY2FzZSAiZ3VlcnRlbCIgICAgOiBzdWNoZT1BVF9CRUxUOyBicmVhazsKKyAgICBjYXNlICJhbXVsZXR0ZSIgICA6IHN1Y2hlPUFUX0FNVUxFVDsgYnJlYWs7CisgICAgY2FzZSAicmluZ2UiICAgICAgOiBzdWNoZT1BVF9SSU5HOyBicmVhazsKKyAgICBjYXNlICJrb2VjaGVyIiAgICA6IHN1Y2hlPUFUX1FVSVZFUjsgYnJlYWs7CisgICAgY2FzZSAic2NoaWxkZSIgICAgOiBzdWNoZT1BVF9TSElFTEQ7IGJyZWFrOworICAgIGNhc2UgInNvbnN0aWdlcyIgIDogc3VjaGU9QVRfTUlTQzsgYnJlYWs7CisgICAgZGVmYXVsdCAgICAgICAgICAgOiB3cml0ZSgiRmVobGVyOiBVbmd1ZWx0aWdlciBLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIkZvbGdlbmRlIFR5cGVuIGdpYnQgZXM6XG4iK25mX3N0cjErbmZfc3RyMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgYnJlYWs7CisgIH0KKyAgb2JzPWFsbF9pbnZlbnRvcnkoKTsKKyAgc3VjaG9icz0oW10pOworICBmb3IoaT0wO2k8c2l6ZW9mKG9icyk7aSsrKQorICB7CisgICAgb2JzaG9ydD1vYnNbaV0tPlF1ZXJ5UHJvcChQX1NIT1JUKTsKKyAgICBpZihvYnNob3J0PT0iTmljaHRzIGJlc29uZGVyZXMiKSAvLyBrZWluZSBQX1NIT1JUID8KKyAgICAgIG9ic2hvcnQ9b2JzW2ldLT5OYW1lKFdFUik7ICAgICAvLyAgIEhvZmZlbiB3aXIgbWFsIGRhc3MgZGFzIE9iai4gbmVuIE5hbWVuIGhhdC4KKyAgICBpZihvYnNbaV0tPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKT09c3VjaGUpICAgIC8vIEdlc3VjaHRlciBBcm1vdXJUeXBlIGdlZnVuZGVuLi4uCisgICAgeworICAgICAgaWYoc3VjaG9ic1tvYnNob3J0XSkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUF9TSE9SVCBkZXMgT2JqLiBzY2hvbiBpbSBtYXBwaW5nPworICAgICAgeworICAgICAgICBpZiggb2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpICkKKyAgICAgICAgICBzdWNob2JzW29ic2hvcnRdKz1vYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCk7IC8vICAgRGFubiBkZW4gWmFlaGxlciB1bSBBbW91bnQgaG9jaCEKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN1Y2hvYnNbb2JzaG9ydF0rPTE7ICAgICAgICAgICAgICAgICAgICAgLy8gICBEYW5uIGRlbiBaYWVobGVyIHVtIDEgaG9jaCEKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYoIG9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKSApCisgICAgICAgICAgc3VjaG9icys9KFtvYnNob3J0OiBvYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN1Y2hvYnMrPShbb2JzaG9ydDogMV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBzdHJzPW1faW5kaWNlcyhzdWNob2JzKTsKKyAgaWYoc2l6ZW9mKHN0cnMpKQorICB7CisgICAgaWYoIWFsbGVzKQorICAgIHsKKyAgICAgIHN0cmFsbCs9TmFtZShXRVIsMSkrIiBlbnRoYWVsdCBmb2xnZW5kZSAiK0NBUCh3YXMpKyI6XG4iOworICAgICAgc3RyYWxsKz0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgIH0KKyAgICBlbHNlCisgICAgICBzdHJhbGwrPUFOU0lfQk9MRCsiPT09ICIrQ0FQKHdhcykrIjpcbiIrQU5TSV9OT1JNQUw7CisgICAgZm9yKGk9MDtpPHNpemVvZihzdHJzKTtpKyspCisgICAgeworICAgICAgaWYoc3VjaG9ic1tzdHJzW2ldXSA+IDEpCisgICAgICAgIHN0cmFsbCs9c3Ryc1tpXSsiLiAoIitzdWNob2JzW3N0cnNbaV1dKyIpXG4iOworICAgICAgZWxzZQorICAgICAgICBzdHJhbGwrPXN0cnNbaV0rIi5cbiI7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBpZighYWxsZXMpCisgICAgICBzdHJhbGwrPU5hbWUoV0VSLDEpKyIgZW50aGFlbHQga2VpbmUgIitDQVAod2FzKSsiIVxuIjsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhdWZsaXN0dW5nKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqc3Rycywgb2JfaWQsIHdhcywgbmZfc3RyMSxuZl9zdHIyOworICBzdHJhbGw9IiI7CisgIG5mX3N0cjE9IiAgIChIZWxtZSwgVW1oYWVuZ2UsIFJ1ZXN0dW5nZW4sIEhvc2VuLCBTY2h1aGUsIEhhbmRzY2h1aGUsXG4iCisgICAgICAgICArIiAgICBHdWVydGVsLCBBbXVsZXR0ZSwgUmluZ2UsIEtvZWNoZXIsIFNjaGlsZGUsIFNvbnN0aWdlcylcbiI7CisgIG5mX3N0cjI9IlN5bnRheDogc2xpc3RlIFtPYmpla3QtSWRdIFtLbGVpZHVuZ3MtL1J1ZXN0dW5nc3R5cHxcImFsbGVzXCJdXG4iCisgICAgICAgICArIkJzcC46ICAgc2xpc3RlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiICIrImhlbG1lXG4iCisgICAgICAgICArIiAgICAgICAgc2xpc3RlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiIGFsbGVzXG4iOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIyKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQoc3RyKT09VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgIHsKKyAgICB3cml0ZSgiRmVobGVyOiBFcyBmZWhsdCBlaW4gS2xlaWR1bmdzLS9SdWVzdHVuZ3N0eXAuIEZvbGdlbmRlIFR5cGVuIGdpYnQgZXM6XG4iCisgICAgICAgICArbmZfc3RyMStuZl9zdHIyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdHJzPW9sZF9leHBsb2RlKHN0ciwgIiAiKTsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIKKyAgICAgICAgICAgICArbmZfc3RyMik7CisgIGlmKCBzaXplb2Yoc3RycykgPCAyICkgcmV0dXJuIDA7ICAgLy8gTnVyIDEgUGFyLiB1bmQgZGVyIGlzdCBuaWNodCBkaWUgT2JqZWt0LUlkCisgIGlmKCBzaXplb2Yoc3RycykgPT0gMiApICAgLy8gQW56YWhsIFBhci4gPSAyCisgIHsKKyAgICBvYl9pZD1zdHJzWzBdOworICAgIHdhcz1zdHJzWzFdOworICAgIGlmKCBJU1RfWkFITCh3YXMpICkgICAgIC8vIE9iamVrdC1JZCB6LkIuIG1pdCAic2NocmFuayAyIiBhbmdlc3Byb2NoZW4/CisgICAgICBpZihwcmVzZW50KG9iX2lkKyIgIit3YXMpPT1UTykgICAvLyBGYWxscyBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IHVuZCBrZWluIDMuIFBhciEKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIkZlaGxlcjogRXMgZmVobHQgZWluIEtsZWlkdW5ncy0vUnVlc3R1bmdzdHlwLiBGb2xnZW5kZSBUeXBlbiBnaWJ0IGVzOlxuIgorICAgICAgICAgICAgICArbmZfc3RyMStuZl9zdHIyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICB9CisgIGVsc2UgaWYoIHNpemVvZihzdHJzKSA9PSAzICkKKyAgeworICAgIG9iX2lkPXN0cnNbMF0rIiAiK3N0cnNbMV07CisgICAgd2FzPXN0cnNbMl07CisgIH0KKyAgZWxzZSAgICAgICAgLy8gQW56YWhsIGVyZm9yZGVybGljaGVyIFBhcmFtZXRlciB1ZWJlcnNjaHJpdHRlbiEKKyAgICByZXR1cm4gMDsKKyAgaWYocHJlc2VudChvYl9pZCkhPVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBhdWNoIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgICAgcmV0dXJuIDA7CisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpIT1DTlRfU1RBVFVTX09QRU4pCisgIHsKKyAgICB3cml0ZSgiRGF6dSBtdWVzc3RlICIrbmFtZShXRVIsMSkrIiBnZW9lZmZuZXQgc2Vpbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisvLy0tLSBIaWVyIGlzdCBQYXJhbWV0ZXJwcnVlZnVuZyB6dSBFbmRlLgorICB3YXM9TE9XRVIod2FzKTsKKyAgaWYod2FzIT0iYWxsZXMiKQorICAgIGF1Zmxpc3R1bmcyKHdhcywgbmZfc3RyMSwgbmZfc3RyMiwgMCk7CisgIGVsc2UKKyAgeworICAgIGF1Zmxpc3R1bmcyKCJoZWxtZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJ1bWhhZW5nZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJydWVzdHVuZ2VuIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImhvc2VuIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInNjaHVoZSIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJoYW5kc2NodWhlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImd1ZXJ0ZWwiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigiYW11bGV0dGUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigicmluZ2UiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigia29lY2hlciIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzY2hpbGRlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInNvbnN0aWdlcyIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICB9CisgIFRQLT5Nb3JlKHN0cmFsbCk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zd2lmdF9zdGRfY29udGFpbmVyLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3N3aWZ0X3N0ZF9jb250YWluZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY0OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC9zd2lmdF9zdGRfY29udGFpbmVyLmMKQEAgLTAsMCArMSw2MTEgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgU3RhbmRhcmRfQ29udGFpbmVyCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAyMS4wMy4yMDAxCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTd2lmdAorLy8gRGllc2VzIEZpbGUgd2lyZCBhbnN0ZWxsZSB2b24gL3N0ZC9jb250YWluZXIgaW5oZXJpdGVkLCBzbyBkYXNzIGRlbSBPYmpla3QKKy8vIGVyd2VpdGVydGUgTW9lZ2xpY2hrZWl0ZW4genVyIFZlcmZ1ZWd1bmcgc3RlaGVuLgorLy8KKy8vIDA3LjEyLjIwMDUgKFNlbGV2ZW4pOiBLdXJ6YmVzY2hyZWlidW5nIGF1c2JsZW5kYmFyIGdlbWFjaHQKKy8vIDMwLjA2LjIwMDcgKFplc3N0cmEpOiBjcmVhdGUgZGVyIEJQIHdpcmQgbmljaHQgbWVociBhYmdlYnJvY2hlbi4gQXVmIGRpZQorLy8gICBBcnQgd2lyZCBlcyBkZW0gTnV0emVyIGRpZXNlcyBTdGFuZGFyZG9iamVrdCB1ZWJlcmxhc3Nlbiwgb2IgZXIgZGllIEJQCisvLyAgIGluaXRpYWxpc2llcmVuIHdpbGwgb2RlciBuaWNodC4KKy8vIDAxLjA3LjIwMDcgKFplc3N0cmEpOiBVcGRhdGUgZGVyIE1vZWJlbCBydWZ0IGVyc3RtYWwgVXBkYXRlTWUoKSBpbiBkZW4KKy8vICAgTW9lYmVsbiBhdWYuIFdlbm4gZGFzICE9IDAgbGllZmVydCwgaXN0IFVwZGF0ZU1lKCkgZnVlciBkYXMgVXBkYXRlCisvLyAgIHp1c3RhZW5kaWcgdW5kIG11c3MgZGFzIG1hY2hlbi4KKy8vICAgQXVzc2VyZGVtIGtsZWluZSBBZW5kZXJ1bmcgaW0gUmVnaXN0cmllcmVuIChuaW1tdCBhdWNoIE9iZWt0ZSBhbHMKKy8vICAgU3RhbmRvcnQpCisvLyAgIFdlaXRlcmhpbiBNb2ViZWwgdW1nZXpvZ2VuIG5hY2ggL3Avc2VoZXIvbW9lYmVsLyB1bmQgaW4gZGllc2VtIEZpbGUKKy8vICAgR2V0T3duZXIoKSBkZWZpbmllcnQsIHdlbGNoZXMgIlN3aWZ0IiB6dXJ1ZWNrZ2lidC4gV2VyIGhpZXJ2b24gZXJidCwKKy8vICAgc29sbHRlIGRhbWl0IGFsc28gc2VpbiBlaWdlbmVzIEdldE93bmVyKCkgZGVmaW5pZXJlbi4KKy8vICAgZ2xvYi4gVmFyaWFibGVuIGF1ZiAnbm9zYXZlJyBnZWFlbmRlcnQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBGdWVyIFRlc3R6d2Vja2UgaXN0IGVzIG1vZWdsaWNoLCBkZW0gZW50c3ByZWNoZW5kZW4gT2JqZWt0IGRpZSBQcm9wZXJ0eQorLy8gInRlc3QiIGF1ZiAxIHp1IHNldHplbiwgZGFtaXQgaXN0IGRhbm4gc28gemllbWxpY2ggYWxsZXMgZXJsYXVidC4KKy8vIE1hbiBzb2xsdGUgZGllIFByb3BlcnR5IGFiZXIgdW5iZWRpbmd0IHdpZWRlciBlbnRmZXJuZW4sIHNvbnN0IGlzdCBlcyB6LkIuCisvLyBtb2VnbGljaCwgZWluZW4gU2NocmFuayB2b24gU2VoZXJoYXVzIEEgbmFjaCBTZWhlcmhhdXMgQiBvZGVyIHNvZ2FyIGhpbmF1cworLy8genUgdmVyc2NoaWViZW4gISEhCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSA8Y29udGFpbmVyLmg+Citpbmhlcml0ICIvc3RkL2NvbnRhaW5lciI7CisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKworI2RlZmluZSBWRVJTSU9OX1NURCAiOSIKKworbm9zYXZlIGludCBoYXVzZXJsYXVibmlzOworbm9zYXZlIHN0cmluZyB6d2VpdGllZXJsYXVibmlzOworbm9zYXZlIHN0cmluZyAqZXJsYXVibmlzOworCitpbnQgZXJsYXVidCgpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvL2lmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gU3RhbmRhcmRfQ29udGFpbmVyIHZvbiBTd2lmdCIpOworICBTZXRQcm9wKFBfQ05UX1NUQVRVUyxDTlRfU1RBVFVTX0NMT1NFRCk7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwgMCk7CisgIFNldFByb3AoUF9MT0dfRklMRSwic2VsZXZlbi9zY2hyYWVua2VyIik7IC8vIFNlbGV2ZW4gMDYuMDQuMjAwNgorICBTZXRQcm9wKCJjbnRfaGF1c2ZyZXVuZGUiLCAoe30pICk7CisgIFNldFByb3AoImNudF9lcmxhdWJuaXMiLCAoe30pICk7CisgIFNldFByb3AoImNudF96d2VpdGllZXJsYXVibmlzIiwgIiIgKTsKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fc3RkIiwgVkVSU0lPTl9TVEQpOworCisgIGhhdXNlcmxhdWJuaXM9MDsKKyAgendlaXRpZWVybGF1Ym5pcz0iIjsKKyAgZXJsYXVibmlzPSh7fSk7CisKKyAgc2V0X25leHRfcmVzZXQoMzYwMCk7IC8vIDEgeCBwcm8gU3RkLiBSZXNldCEKKworICBBZGRDbWQoKHsib2VmZm5lIn0pLCAib2VmZm5lbiIpOworICBBZGRDbWQoKHsic2NobGllc3MiLCAic2NobGllc3NlIn0pLCAic2NobGllc3NlbiIpOworICBBZGRDbWQoKHsic2VybGF1YmUifSksICJlcmxhdWJuaXMiKTsKKyAgQWRkQ21kKCh7InNrb21tYW5kb3MifSksICJza29tbWFuZG9zIik7CisgIEFkZENtZCgoeyJ2ZXJzY2hpZWIiLCAidmVyc2NoaWViZSJ9KSwgInZlcnNjaGllYmVuIik7CisgIEFkZENtZCgoeyJ6ZXJ0cnVlbW1lciIsICJ6ZXJ0cnVlbW1lcmUifSksICJ6ZXJ0cnVlbW1lcm4iKTsKKyAgLy9TZWxldmVuIDA3LjEyLjIwMDU6CisgIEFkZENtZCgoeyJzdmVyc3RlY2tlIiwic3ZlcnN0ZWNrIn0pLCJ2ZXJzdGVja2VuIik7CisgIEFkZENtZCgoeyJzaG9sZSIsInNob2wifSksInplaWdlbiIpOworfQorCisvLyBaZXNzdHJhLCAxLjcuMDcsIGZ1ZXJzIEhvZXJyb2hyCitzdHJpbmcgR2V0T3duZXIoKSB7cmV0dXJuICJzd2lmdCI7fQorCitzdGF0aWMgc3RyaW5nIFF1ZXJ5SGF1c2Jlc2l0emVyKCkKK3sKKyAgcmV0dXJuIENBUCh0b19zdHJpbmcoRVRPLT5RdWVyeU93bmVyKCkpKTsgICAgLy8gei5CLjogU3dpZnQKK30KKworCisKK3N0YXRpYyBzdHJpbmcgUXVlcnlUUCgpCit7CisgIHJldHVybiBDQVAoZ2V0ZXVpZChUUCkpOyAgLy8gei5CLjogU3dpZnQKK30KKworaW50IG9lZmZuZW4oc3RyaW5nIHN0cikKK3sKKyAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgb2VmZm5lbj9cbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpIT1UTykgIC8vIFVlYmVycHJ1ZWZlLCBvYiBhdWNoIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgICAgICByZXR1cm4gMDsKKyAgaWYoUXVlcnlQcm9wKFBfQ05UX1NUQVRVUyk9PUNOVF9TVEFUVVNfT1BFTikKKyAgeworICAgIHdyaXRlKE5hbWUoV0VSLDEpKyIgaXN0IGRvY2ggc2Nob24gZ2VvZWZmbmV0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoICFlcmxhdWJ0KCkgKQorICB7CisgICAgd3JpdGUoIkVpbiBtYWdpc2NoZXMgS3JhZnRmZWxkIHZlcmhpbmRlcnQgZGFzIE9lZmZuZW4gIituYW1lKFdFU1NFTiwxKSsiIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIkR1IG9lZmZuZXN0ICIrbmFtZShXRU4pKyIuXG4iKTsKKyAgc2F5KFRQLT5OYW1lKFdFUikrIiBvZWZmbmV0ICIrbmFtZShXRU4pKyIuXG4iLCAoe1RQfSkgKTsKKyAgU2V0UHJvcChQX0NOVF9TVEFUVVMsQ05UX1NUQVRVU19PUEVOKTsKKyAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzY2hsaWVzc2VuKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1IHNjaGxpZXNzZW4/XG4iKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQoc3RyKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKyAgaWYoUXVlcnlQcm9wKFBfQ05UX1NUQVRVUyk9PUNOVF9TVEFUVVNfQ0xPU0VEKQorICB7CisgICAgd3JpdGUoTmFtZShXRVIsMSkrIiBpc3QgZG9jaCBzY2hvbiBnZXNjaGxvc3NlbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCAhZXJsYXVidCgpICkKKyAgeworICAgIHdyaXRlKCJFaW4gbWFnaXNjaGVzIEtyYWZ0ZmVsZCB2ZXJoaW5kZXJ0IGRhcyBTY2hsaWVzc2VuICIrbmFtZShXRVNTRU4sMSkrIiFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJEdSBzY2hsaWVzc3QgIituYW1lKFdFTikrIi5cbiIpOworICBzYXkoVFAtPk5hbWUoV0VSKSsiIHNjaGxpZXNzdCAiK25hbWUoV0VOKSsiLlxuIiwgKHtUUH0pICk7CisgIFNldFByb3AoUF9DTlRfU1RBVFVTLENOVF9TVEFUVVNfQ0xPU0VEKTsKKyAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyBjbnRfc3RhdHVzKCkKK3sKKyAgcmV0dXJuIE5hbWUoV0VSLDEpKyIgaXN0ICIKKyAgICArKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpPyJnZXNjaGxvc3NlbiI6Imdlb2VmZm5ldCIpKyIuXG4iOworfQorCitpbnQgZXJsYXVidCgpCit7CisgIGlmKCBRdWVyeVByb3AoInRlc3QiKSApIHJldHVybiAxOyAgICAgICAvLyBadSBUZXN0endlY2tlbiEKKyAgaWYoIFF1ZXJ5SGF1c2Jlc2l0emVyKCk9PSIwIiApICAgICAgICAgIC8vIFNjaHJhbmsgc3RlaHQgbmljaHQgaW4gZWluZW0gU2VoZXJoYXVzIQorICB7CisgICAgdGVsbF9yb29tKEVUTywgTmFtZShXRVIsMSkrIiBzb2xsdGUgbmljaHQgYXVzc2VyaGFsYiBlaW5lcyBTZWhlcmhhdXNlcyBzdGVoZW4uXG4iCisgICAgICArIkJpdHRlIE1haWwgYW4gIitWRVJBTlRXT1JUTElDSEVSX01BR0lFUisiIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYoIFF1ZXJ5VFAoKSA9PSBRdWVyeUhhdXNiZXNpdHplcigpICkgIC8vIERlciBCZXNpdHplciBkZXMgSGF1c2VzIHNlbGJzdAorICAgIHJldHVybiAxOworICBpZihoYXVzZXJsYXVibmlzKQorICB7CisgICAgaWYoIG1lbWJlcihTSFZFUldBTFRFUi0+SGF1c1Byb3AoTE9XRVIoUXVlcnlIYXVzYmVzaXR6ZXIoKSksIDIpLAorICAgICAgICBRdWVyeVRQKCkpICE9IC0xICkgICAgICAgICAgICAgICAgLy8gSGF1c2ZyZXVuZGUKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmKHp3ZWl0aWVlcmxhdWJuaXMhPSIiKSAgICAgICAgICAgICAgICAvLyBad2VpdGllcworICB7CisgICAgaWYoIFRQLT5RdWVyeVByb3AoUF9TRUNPTkQpID09IHp3ZWl0aWVlcmxhdWJuaXMgKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoIHNpemVvZihlcmxhdWJuaXMpICkKKyAgeworICAgIGlmKCBtZW1iZXIoZXJsYXVibmlzLCBRdWVyeVRQKCkpICE9IC0xICkgLy8gU29uc3RpZ2UgUGVyc29uZW4gZGllIGJlcmVjaHRpZ3Qgc2luZAorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY250X29wZW4oKQoreworICBTZXRQcm9wKFBfQ05UX1NUQVRVUyxDTlRfU1RBVFVTX09QRU4pOworICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDEpOworfQorCitpbnQgZXJsYXVibmlzX2xpc3RlKCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqc3RycyxzdHI7CisgIGlmKCBRdWVyeUhhdXNiZXNpdHplcigpICE9IFF1ZXJ5VFAoKSAmJiAhUXVlcnlQcm9wKCJ0ZXN0IikgKQorICB7CisgICAgd3JpdGUoIEJTKCJOdXIgIitRdWVyeUhhdXNiZXNpdHplcigpKyIgZGFyZiBCZXJlY2h0aWd1bmdlbiAiCisgICAgICArbmFtZShXRVNTRU4sMSkrIiBhYmZyYWdlbiEiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgaWYoaGF1c2VybGF1Ym5pcykKKyAgeworICAgIHN0cnM9U0hWRVJXQUxURVItPkhhdXNQcm9wKExPV0VSKFF1ZXJ5SGF1c2Jlc2l0emVyKCkpLCAyKTsKKyAgICB3cml0ZShCUygiRm9sZ2VuZGUgRnJldW5kZSBEZWluZXMgSGF1c2VzIGR1ZXJmZW4gIituYW1lKFdFTiwxKQorICAgICAgKyIgb2VmZm5lbi9zY2hsaWVzc2VuOiIpKTsKKyAgICBzdHI9IiI7CisgICAgaWYoc2l6ZW9mKHN0cnMpKQorICAgIHsKKyAgICAgIGZvcihpPTA7aTxzaXplb2Yoc3Rycyk7aSsrKQorICAgICAgeworICAgICAgICBzdHIrPXN0cnNbaV07CisgICAgICAgIGlmKGk8c2l6ZW9mKHN0cnMpLTEpCisgICAgICAgICAgc3RyKz0iLCAiOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzdHI9IkR1IGhhc3Qga2VpbmVyIFBlcnNvbiBadWdyaWZmIGF1ZiBEZWluIEhhdXMgZ2V3YWVocnQuLi5cbiI7CisgICAgd3JpdGUoQlMoc3RyKSk7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlKEJTKCJEaWUgRnJldW5kZSBEZWluZXMgSGF1c2VzIGR1ZXJmZW4gIituYW1lKFdFTiwxKQorICAgICAgKyIgbmljaHQgb2VmZm5lbi9zY2hsaWVzc2VuLiIpKTsKKyAgd3JpdGUoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgaWYoendlaXRpZWVybGF1Ym5pcyE9IiIpCisgIHsKKyAgaWYoIHp3ZWl0aWVlcmxhdWJuaXM9PWdldGV1aWQoVFApICkKKyAgICB3cml0ZShCUyggIkFsbGUgRGVpbmUgWndlaXRpZXMgZHVlcmZlbiAiK25hbWUoV0VOLDEpKyIgb2VmZm5lbi9zY2hsaWVzc2VuLiIpKTsKKyAgZWxzZQorICAgIHdyaXRlKEJTKCAiQWxsZSBad2VpdGllcyB2b24gIitDQVAoendlaXRpZWVybGF1Ym5pcykrIiBkdWVyZmVuICIrbmFtZShXRU4sMSkKKyAgICAgICsiIG9lZmZuZW4vc2NobGllc3Nlbi4iKSk7CisgIHdyaXRlKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIH0KKyAgc3Rycz1RdWVyeVByb3AoImNudF9lcmxhdWJuaXMiKTsKKyAgaWYoc2l6ZW9mKHN0cnMpKQorICB7CisgICAgd3JpdGUoQlMoIkZvbGdlbmRlIHNvbnN0aWdlIFBlcnNvbmVuIGR1ZXJmZW4gIituYW1lKFdFTiwxKQorICAgICAgKyIgb2VmZm5lbi9zY2hsaWVzc2VuOiIpKTsKKyAgICBzdHI9IiI7CisgICAgZm9yKGk9MDtpPHNpemVvZihzdHJzKTtpKyspCisgICAgeworICAgICAgc3RyKz1zdHJzW2ldOworICAgICAgaWYoaTxzaXplb2Yoc3RycyktMSkKKyAgICAgICAgc3RyKz0iLCAiOworICAgIH0KKyAgICB3cml0ZShCUyhzdHIpKTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoQlMoIkVzIGdpYnQga2VpbmUgc29uc3RpZ2VuIFBlcnNvbmVuLCBkaWUgIituYW1lKFdFTiwxKQorICAgICAgKyIgb2VmZm5lbi9zY2hsaWVzc2VuIGR1ZXJmZW4uIikpOworICB3cml0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IGVybGF1Ym5pcyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnN0cnMsd2VuLG5mX3N0cjsKKyAgbmZfc3RyPSJTeW50YXg6IHNlcmxhdWJlIFtPYmpla3QtSWRdIFtTcGllbGVybmFtZXxcImhhdXNmcmV1bmRlXCJ8XCJ6d2VpdGllc1wiXVxuIgorICAgICAgICArIkJzcC46ICAgc2VybGF1YmUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgaGF1c2ZyZXVuZGVcbiIKKyAgICAgICAgKyIgICAgICAgIHNlcmxhdWJlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiIHp3ZWl0aWVzXG4iCisgICAgICAgICsiICAgICAgICBzZXJsYXViZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiBnZW9yZGlcbiIKKyAgICAgICAgKyIgICAgICAgIHNlcmxhdWJlICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiICAgICAgKExpc3RldCBTcGllbGVyIG1pdCBFcmxhdWJuaXMpXG4iOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpPT1UTykgICAgIC8vIEZhbGxzIFBhcj09T2JqLiB1bmQga2VpbiAyLi8zLiBQYXIuCisgIHsKKyAgICBlcmxhdWJuaXNfbGlzdGUoKTsgICAgICAgICAgIC8vICAgTGlzdGUgZGVyIEVybGF1YnRlbiBhdXNnZWJlbiEKKyAgICByZXR1cm4gMTsKKyAgfQorICBub3RpZnlfZmFpbCgiRmVobGVyOiBEdSBtdXNzdCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbmdlYmVuIVxuIituZl9zdHIpOworICBzdHJzPW9sZF9leHBsb2RlKHN0ciwgIiAiKTsKKyAgaWYoIHNpemVvZihzdHJzKSA8IDIgKSAgICAgICAgICAgLy8gRmFsbHMgbnVyIDEgUGFyLgorICAgIHJldHVybiAwOyAgICAgICAgICAgICAvLyBBbnphaGwgZXJmb3JkZXJsaWNoZXIgUGFyYW1ldGVyIHVudGVyc2Nocml0dGVuIQorICBlbHNlIGlmKCBzaXplb2Yoc3RycykgPT0gMiApCisgIHsKKyAgICBzdHI9c3Ryc1swXTsKKyAgICB3ZW49c3Ryc1sxXTsKKyAgICBpZiggSVNUX1pBSEwod2VuKSApCisgICAgICBpZihwcmVzZW50KHN0cisiICIrd2VuKT09VE8pICAgLy8gRmFsbHMgMiBQYXIuIHVuZCBkaWVzIGRhcyBPYmouIGlzdCBvaG5lIDMuIFBhci4KKyAgICAgIHsKKyAgICAgICAgZXJsYXVibmlzX2xpc3RlKCk7ICAgICAgICAgICAvLyAgIExpc3RlIGRlciBFcmxhdWJ0ZW4gYXVzZ2ViZW4hCisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKCBzaXplb2Yoc3RycykgPT0gMyApCisgIHsKKyAgICBzdHI9c3Ryc1swXSsiICIrc3Ryc1sxXTsKKyAgICB3ZW49c3Ryc1syXTsKKyAgfQorICBlbHNlICAgICAgICAvLyBBbnphaGwgZXJmb3JkZXJsaWNoZXIgUGFyYW1ldGVyIHVlYmVyc2Nocml0dGVuIQorICAgIHJldHVybiAwOworICBpZihwcmVzZW50KHN0cikhPVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBhdWNoIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgICAgcmV0dXJuIDA7CisgIGlmKCAhZXJsYXVidCgpICYmICFRdWVyeVByb3AoInRlc3QiKSApCisgIHsKKyAgICB3cml0ZSggQlMoIk51ciAiK1F1ZXJ5SGF1c2Jlc2l0emVyKCkrIiBkYXJmIEJlcmVjaHRpZ3VuZ2VuICIKKyAgICAgICtuYW1lKFdFU1NFTiwxKSsiIGFlbmRlcm4hIikpOworICAgIHJldHVybiAxOworICB9CisgIGlmKHdlbj09ImhhdXNmcmV1bmRlIikKKyAgeworICAgIGlmKGhhdXNlcmxhdWJuaXMpCisgICAgeworICAgICAgaGF1c2VybGF1Ym5pcz0wOworICAgICAgU2V0UHJvcCgiY250X2hhdXNmcmV1bmRlIiwgKHt9KSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGF1c2VybGF1Ym5pcz0xOworICAgICAgU2V0UHJvcCgiY250X2hhdXNmcmV1bmRlIiwgU0hWRVJXQUxURVItPkhhdXNQcm9wKExPV0VSKFF1ZXJ5SGF1c2Jlc2l0emVyKCkpLCAyKSApOworICAgIH0KKyAgICB3cml0ZSggQlMoIkRpZSBGcmV1bmRlIERlaW5lcyBTZWhlcmhhdXNlcyBkdWVyZmVuICIrbmFtZShXRU4sMSkrIiBqZXR6dCAiCisgICAgICArKCFoYXVzZXJsYXVibmlzPyJuaWNodCBtZWhyICI6IiIpKyJvZWZmbmVuL3NjaGxpZXNzZW4uIikpOworICAgIHJldHVybiAxOworICB9CisgIGlmKHdlbj09Inp3ZWl0aWVzIikKKyAgeworICAgIGlmKHp3ZWl0aWVlcmxhdWJuaXMhPSIiKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFp3ZWl0aWVzIGVybGF1YnQ/CisgICAgICB6d2VpdGllZXJsYXVibmlzPSIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkYW5uIHZlcmJpZXRlbiEKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnNvbnN0ZW46CisgICAgeworICAgICAgaWYoIFRQLT5RdWVyeVByb3AoUF9TRUNPTkQpICkgICAgICAgICAgICAgICAgIC8vIFNlbGJzdCBlaW4gWndlaXRpZT8KKyAgICAgICAgendlaXRpZWVybGF1Ym5pcz1MT1dFUihUUC0+UXVlcnlQcm9wKFBfU0VDT05EKSk7IC8vIERpZSBad2VpdGllcyB2b20gRXJzdGllIGVybGF1YmVuIQorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbnN0OgorICAgICAgICB6d2VpdGllZXJsYXVibmlzPWdldGV1aWQoVFApOyAgICAgICAgICAgICAgIC8vICAgRWlnZW5lIEVyc3RpZXMgZXJsYXViZW4hCisgICAgfQorICAgIFNldFByb3AoImNudF96d2VpdGllZXJsYXVibmlzIiwgendlaXRpZWVybGF1Ym5pcyApOworICAgIGlmKHp3ZWl0aWVlcmxhdWJuaXMhPSIiKQorICAgICAgd3JpdGUoIEJTKENBUCh6d2VpdGllZXJsYXVibmlzKSsiJ3MgWndlaXRpZXMgZHVlcmZlbiAiK25hbWUoV0VOLDEpKyIgamV0enQgIgorICAgICAgICArKHp3ZWl0aWVlcmxhdWJuaXM9PSIiPyJuaWNodCBtZWhyICI6IiIpKyJvZWZmbmVuL3NjaGxpZXNzZW4uIikpOworICAgIHJldHVybiAxOworICB9CisgIHdlbj1DQVAod2VuKTsKKyAgaWYoIGZpbGVfc2l6ZSgiLy9zYXZlLy8iK0xPV0VSKHdlblswLi4wXSkrIi8vIitMT1dFUih3ZW4pKyIubyIpICE9IC0xICkgLy8gU3BpZWxlciBnaWJ0IGVzIGF1Y2ghCisgIHsKKyAgICBpZiggbWVtYmVyKGVybGF1Ym5pcywgd2VuKSAhPSAtMSApICAvLyBTcGllbGVyIGhhdCBFcmxhdWJuaXMgLT4gdmVyYmlldGVuIQorICAgIHsKKyAgICAgIGVybGF1Ym5pcy09KHt3ZW59KTsKKyAgICAgIHdyaXRlKCBCUyggd2VuKyIgZGFyZiAiK25hbWUoV0VOLDEpKyIgamV0enQgbmljaHQgbWVociBvZWZmbmVuL3NjaGxpZXNzZW4uIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZXJsYXVibmlzKz0oe3dlbn0pOworICAgICAgd3JpdGUoIEJTKCB3ZW4rIiBkYXJmICIrbmFtZShXRU4sMSkrIiBqZXR6dCBvZWZmbmVuL3NjaGxpZXNzZW4uIikpOworICAgIH0KKyAgICBTZXRQcm9wKCJjbnRfZXJsYXVibmlzIiwgZXJsYXVibmlzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoIkVzIGdpYnQga2VpbmVuIFNwaWVsZXIgbmFtZW5zICIrd2VuKyIhXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgaW50IHNrb21tYW5kb3Moc3RyaW5nIHN0cikKK3sKKyAgbm90aWZ5X2ZhaWwoICJGZWhsZXI6IERpZXNlciBCZWZlaGwgYmVub2V0aWd0IGVpbmUgZ3VlbHRpZ2UgT2JqZWt0LUlkIGFscyBQYXJhbWV0ZXIuXG4iCisgICAgKyJCZWlzcGllbDogc2tvbW1hbmRvcyAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIlxuIik7CisgIGlmKCFzdHIpIHJldHVybiAwOworICBpZihwcmVzZW50KHN0cikhPVRPICkgLy8gQmluIGljaCBnZW1laW50PworICAgIHJldHVybiAwOworICB3cml0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICB3cml0ZSgiQWt0dWVsbGUgVmVyc2lvbjogIitRdWVyeVByb3AoImNudF92ZXJzaW9uX3N0ZCIpK1F1ZXJ5UHJvcCgiY250X3ZlcnNpb25fb2JqIikrIlxuIik7CisgIHdyaXRlKCBCUyhOYW1lKFdFUiwxKSsiIGthbm4gbnVyIGluIGRpZXNlbSBTZWhlcmhhdXMgdmVyd2VuZGV0IHdlcmRlbiwgIgorICAgICsiZGEgIitRdWVyeVByb25vdW4oV0VSKSsiIHNwZXppZWxsIGRhZnVlciBnZWthdWZ0IHd1cmRlLiAiK0NBUChRdWVyeVByb25vdW4oV0VSKSkKKyAgICArIiB2ZXJmdWVndCB1ZWJlciBmb2xnZW5kZSBLb21tYW5kb3M6IikKKyAgICArIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgKyJvZWZmbmUgW09iamVrdC1JZF1cbiIKKyAgICArIiAgb2VmZm5ldCAiK25hbWUoV0VOLDEpKyJcblxuIgorICAgICsic2NobGllc3NlIFtPYmpla3QtSWRdXG4iCisgICAgKyIgIHNjaGxpZXNzdCAiK25hbWUoV0VOLDEpKyJcblxuIgorICAgICsic2VybGF1YmUgW09iamVrdC1JZF0gW1NwaWVsZXJuYW1lfFwiaGF1c2ZyZXVuZGVcInxcInp3ZWl0aWVzXCJdXG4iCisgICAgKyIgIEVybGF1YnQgUGVyc29uZW4sICIrbmFtZShXRU4sMSkrIiBtaXR6dWJlbnV0emVuLlxuIgorICAgICsiICBzZXJsYXViZSArIE9iamVrdC1JZCAob2huZSBTcGllbGVybmFtZS9oYXVzZnJldW5kZSlcbiIKKyAgICArIiAgbGlzdGV0IGFsbGUgUGVyc29uZW4gbWl0IFp1Z3JpZmYgYXVmICIrbmFtZShXRU4sMSkrIlxuXG4iCisgICAgKyJ2ZXJzY2hpZWJlIFtPYmpla3QtSWRdIG5hY2ggW0F1c2dhbmddXG4iCisgICAgKyIgIERhbWl0IGthbm5zdCBEdSAiK25hbWUoV0VOLDEpKyIgaW5uZXJoYWxiIERlaW5lcyBTZWhlcmhhdXNlcyB2ZXJzY2hpZWJlbi5cblxuIgorICAvL1NlbGV2ZW4gMDcuMTIuMjAwNQorICAgICsic3ZlcnN0ZWNrZSBbT2JqZWt0LUlkXVxuIgorICAgICsiICBEYW1pdCBtYWNoc3QgRHUgIituYW1lKFdFTiwxKSsiIHVuc2ljaHRiYXIuXG4iCisgICAgKyJzaG9sZSBbT2JqZWt0LUlkXSBoZXJ2b3JcbiIKKyAgICArIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB3aWVkZXIgc2ljaHRiYXIuXG4iCisgIC8vIEJpcyBoaWVyCisgICAgKyJ6ZXJ0cnVlbW1lciBbT2JqZWt0LUlkXVxuIgorICAgICsiICBEYW1pdCB6ZXJzdG9lcnN0IER1ICIrbmFtZShXRU4sMSkrIi5cblxuIik7CisKKworICBpZiggUXVlcnlQcm9wKCJvYmpfY21kIikgKQorICAgIHdyaXRlKCBRdWVyeVByb3AoIm9ial9jbWQiKSsiXG4iICk7CisKKyAgd3JpdGUoIltPYmpla3QtSWRdIG11c3MgZWluZSBndWVsdGlnZSBJZCBzZWluLCBpbiBkaWVzZW0gRmFsbCB6LkIuICIKKyAgICAgICtRdWVyeVByb3AoUF9JRFMpWzFdKyJcbiIpOworICB3cml0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCB2ZXJzY2hpZWJlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2FzLCB3b2hpbiwgemllbHJhdW0sbmZfc3RyOworICBuZl9zdHI9IlN5bnRheDogdmVyc2NoaWViZSBbT2JqZWt0LUlkXSBuYWNoIFtSaWNodHVuZ11cbiIKKyAgICAgICAgKyJCc3AuOiAgIHZlcnNjaGllYmUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgbmFjaCBvc3RlblxuIjsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogT2huZSBQYXJhbWV0ZXIga2xhcHB0IGRhcyBuaWNodC5cbiIrbmZfc3RyKTsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHNzY2FuZihzdHIsIiVzIG5hY2ggJXMiLCB3YXMsIHdvaGluKSAhPSAyKQorICAgIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBEdSBtdXNzdCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbmdlYmVuIVxuIituZl9zdHIpOworICBpZihwcmVzZW50KHdhcykhPVRPKSAgIC8vIFVlYmVycHJ1ZWZlLCBvYiBhdWNoIGRpZXNlcyBPYmpla3QgZ2VtZWludCBpc3QhCisgICAgcmV0dXJuIDA7CisgIGlmKCBRdWVyeUhhdXNiZXNpdHplcigpICE9IFF1ZXJ5VFAoKSAmJiAhUXVlcnlQcm9wKCJ0ZXN0IikgKQorICB7CisgICAgd3JpdGUoIEJTKCJOdXIgIitRdWVyeUhhdXNiZXNpdHplcigpKyIgZGFyZiAiK25hbWUoV0VOLDEpKyIgdmVyc2NoaWViZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCBtZW1iZXIobV9pbmRpY2VzKEVUTy0+UXVlcnlQcm9wKFBfRVhJVFMpKSwgd29oaW4pICE9IC0xICkgLy8gQXVzZ2FuZyB2b3JoYW5kZW4/CisgIHsKKyAgICB6aWVscmF1bT1FVE8tPlF1ZXJ5UHJvcChQX0VYSVRTKVt3b2hpbl07CisgICAgaWYoIHN0cnN0cih6aWVscmF1bSwgTE9XRVIoUXVlcnlIYXVzYmVzaXR6ZXIoKSkrInJhdW0iLCAwKSAhPSAtMSAgfHwKKyAgICAgICAgUXVlcnlQcm9wKCJ0ZXN0IikgKSAgLy8gR2xlaWNoZXMgU2VoZXJoYXVzPyBPZGVyIFRlc3Q/CisgICAgeworICAgICAgVE8tPm1vdmUoemllbHJhdW0sIE1fUFVUKTsKKyAgICAgIHdyaXRlKCJEdSB2ZXJzY2hpZWJzdCAiK25hbWUoV0VOLDEpKyIgbmFjaCAiK0NBUCh3b2hpbikrIi5cbiIpOworICAgICAgVFAtPm1vdmUoemllbHJhdW0sIE1fR08sICJuYWNoICIrQ0FQKHdvaGluKSwgInNjaGllYnQgIituYW1lKFdFTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NoaWVidCAiK25hbWUoV0VOKSsiIGhlcmVpbiIpOworICAgICAgaWYoIHByZXNlbnQoIkludGVyYWN0aXZlIiwgU0NIUkFOS01BU1RFUikgKQorICAgICAgICB0ZWxsX3Jvb20oU0NIUkFOS01BU1RFUiwgVFAtPk5hbWUoV0VSKSsiIHZlcnNjaGllYnQgIituYW1lKFdFTikrIiBuYWNoICIKKyAgICAgICAgICArdG9fc3RyaW5nKEVUTykrIi5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgICB3cml0ZSggQlMoIkR1IGthbm5zdCAiK25hbWUoV0VOLDEpKyIgbmljaHQgaW4gZWluZW4gUmF1bSBhdXNzZXJoYWxiICIKKyAgICAgICAgKyJEZWluZXMgSGF1c2VzIHNjaGllYmVuISIpKTsKKyAgfQorICBlbHNlCisgICAgd3JpdGUoIEJTKCJFcyBnaWJ0IGtlaW5lbiBBdXNnYW5nIG5hbWVucyBcIiIrd29oaW4rIlwiLCB3b2hpbiBEdSAiCisgICAgICArbmFtZShXRU4sMSkrIiB2ZXJzY2hpZWJlbiBrb2VubnRlc3QuIiw3OCwiRmVobGVyOiAiLCBCU19JTkRFTlRfT05DRSkpOworICByZXR1cm4gMTsKK30KKworaW50IHplcnRydWVtbWVybihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmZfc3RyOworICBuZl9zdHI9IlN5bnRheDogemVydHJ1ZW1tZXIgW09iamVrdC1JZF1cbiIKKyAgICAgICAgKyJCc3AuOiAgIHplcnRydWVtbWVyICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXG4iOworICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIrbmZfc3RyKTsKKyAgaWYocHJlc2VudChzdHIpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKKyAgeworICAgIHdyaXRlKCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgIituYW1lKFdFTiwxKSsiIHplcnRydWVtbWVybiEiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIEJTKCJEdSB6ZXJ0cnVlbW1lcnN0ICIrbmFtZShXRU4pKyIgbWl0IHd1Y2h0aWdlbiBTY2hsYWVnZW4sIGJpcyAiCisgICAgKyJuaWNodCBtYWwgbWVociBLcnVlbWVsIHZvbiAiK1F1ZXJ5UHJvbm91bihXRU0pKyIgdWVicmlnIHNpbmQuIikpOworICB0ZWxsX3Jvb20oRVRPLCBCUyggVFAtPk5hbWUoV0VSKSsiIHplcnRydWVtbWVydCAiK25hbWUoV0VOKSsiLiIpLCAoe1RQfSkgKTsKKyAgY2FsbF9vdGhlcihTQ0hSQU5LTUFTVEVSLCI/Pz8iLDApOworICBpZiggcHJlc2VudCgiSW50ZXJhY3RpdmUiLCBTQ0hSQU5LTUFTVEVSKSApCisgICAgdGVsbF9yb29tKFNDSFJBTktNQVNURVIsIFRQLT5OYW1lKFdFUikrIiB6ZXJ0cnVlbW1lcnQgIituYW1lKFdFTikrIi5cbiIpOworICBTQ0hSQU5LTUFTVEVSLT5SZW1vdmVDbnQoVE8sIGdldGV1aWQoVFApICk7CisgIHJlbW92ZSgxKTsKKyAgaWYoVE8pIGRlc3RydWN0KFRPKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBwcm9wczJ2YXJzKCkgIC8vIEZ1ZXIgZGllIFVwZGF0ZS1GdW5rdGlvbiBkZXMgU2NocmFua21hc3RlcnMKK3sKKyAgendlaXRpZWVybGF1Ym5pcz1RdWVyeVByb3AoImNudF96d2VpdGllZXJsYXVibmlzIil8fCIiOworICBlcmxhdWJuaXM9UXVlcnlQcm9wKCJjbnRfZXJsYXVibmlzIil8fCh7fSk7CisgIGlmKCBzaXplb2YoUXVlcnlQcm9wKCJjbnRfaGF1c2ZyZXVuZGUiKSkgKQorICAgIGhhdXNlcmxhdWJuaXM9MTsKKyAgZWxzZQorICAgIGhhdXNlcmxhdWJuaXM9MDsKKyAgaWYoIFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpID09IENOVF9TVEFUVVNfT1BFTikKKyAgICBTZXRQcm9wKFBfVFJBTlNQQVJFTlQsIDEpOworICBlbHNlCisgICAgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBzZXRfbmV4dF9yZXNldCgzNjAwKTsgLy8gMSB4IHBybyBTdGQuIFJlc2V0IQorICA6OnJlc2V0KCk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgLy8gQmVpbSBTY2hyYW5rbWFzdGVyIGFibWVsZGVuLCBkYW5uIHplcnN0b2VyZW4uCisgIHN0cmluZyB1aWQ9IiI7CisgIGlmIChvYmplY3RwKGVudmlyb25tZW50KCkpKQorICB7CisgICAgdWlkPWVudmlyb25tZW50KCktPlF1ZXJ5T3duZXIoKTsgICAgICAgICAgICAgICAgCisgIH0KKyAgU0NIUkFOS01BU1RFUi0+UmVtb3ZlQ250KFRPLCB1aWQgKTsKKyAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cit9CisKK3B1YmxpYyBpbnQgVXBkYXRlTWUoKQoreworICBpZiAoIW9iamVjdHAoZW52aXJvbm1lbnQoKSkpCisgICAgcmV0dXJuIDA7CisgIG9iamVjdCBjbnRfbmV1PWNsb25lX29iamVjdChsb2FkX25hbWUoTUUpKTsgIC8vIE5ldWVuIFNjaHJhbmsgY2xvbmVuCisgIGNudF9uZXUtPm1vdmUoIGVudmlyb25tZW50KCksIE1fTk9DSEVDSyApOyAgLy8gSW4gc2VsYmVuIFJhdW0gd2llIGFsdGVuIHNjaGllYmVuLi4uCisgIGNudF9uZXUtPlNldFByb3AoImNudF9zdGF0dXMiLCBRdWVyeVByb3AoImNudF9zdGF0dXMiKSApOworICBjbnRfbmV1LT5TZXRQcm9wKCJjbnRfaGF1c2ZyZXVuZGUiLCBRdWVyeVByb3AoImNudF9oYXVzZnJldW5kZSIpICk7CisgIGNudF9uZXUtPlNldFByb3AoImNudF9lcmxhdWJuaXMiLCBRdWVyeVByb3AoImNudF9lcmxhdWJuaXMiKSApOworICBjbnRfbmV1LT5TZXRQcm9wKCJjbnRfendlaXRpZWVybGF1Ym5pcyIsIFF1ZXJ5UHJvcCgiY250X3p3ZWl0aWVlcmxhdWJuaXMiKSApOworICBjbnRfbmV1LT5wcm9wczJ2YXJzKCk7ICAvLyBTY2hyYW5rIGxpZXN0IGdlc2V0enRlIFByb3BzIGF1cyBpbiBlaWdlbmUgVmFycworICAvLyBJbnZlbnRhciBiZXdlZ2VuCisgIGZvcmVhY2gob2JqZWN0IGludjogYWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIGlmKCBpbnYtPklzVW5pdCgpICkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaXRzCisgICAgICBpbnYtPm1vdmUoY250X25ldSwgTV9OT0NIRUNLfE1fTU9WRV9BTEwpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbGUgT2JqZWt0ZQorICAgICAgaW52LT5tb3ZlKGNudF9uZXUsIE1fTk9DSEVDSyk7CisgIH0KKyAgcmVtb3ZlKDEpOworICByZXR1cm4gMTsKK30KKworLy8gRWluZ2ViYXV0IDA3LjEyLjIwMDUgdm9uIFNlbGV2ZW4KKy8vIERpZSBLdXJ6YmVzY2hyZWlidW5nIGludmlzIG1hY2hlbjoKK3N0YXRpYyBpbnQgdmVyc3RlY2tlbiAoc3RyaW5nIHN0cikKK3sKKyAgIHN0cmluZyBuZl9zdHI7CisgICBuZl9zdHI9IlN5bnRheDogc3ZlcnN0ZWNrZSBbT2JqZWt0LUlkXVxuIgorICAgICAgICAgKyJCc3AuOiAgIHN2ZXJzdGVja2UgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcbiI7CisgICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIpOworICAgaWYoIXN0ciB8fCBzaXplb2Yoc3RyKSA9PSAwIHx8ICFzdHJpbmdwKHN0cikpIHJldHVybiAwOworCisgICBub3RpZnlfZmFpbCgiRmVobGVyOiBEdSBtdXNzdCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbmdlYmVuIVxuIituZl9zdHIpOworICAgaWYocHJlc2VudChzdHIpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworCisgIGlmKCBRdWVyeUhhdXNiZXNpdHplcigpICE9IFF1ZXJ5VFAoKSAmJiAhUXVlcnlQcm9wKCJ0ZXN0IikgKQorICB7CisgICAgd3JpdGUoIEJTKCJOdXIgIitRdWVyeUhhdXNiZXNpdHplcigpKyIgZGFyZiAiK25hbWUoV0VOLDEpKyIgdmVyc3RlY2tlbiEiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIkR1IGhhc3QgIituYW1lKFdFTiwxKSsiIGRvY2ggc2Nob24gdmVyc3RlY2t0IVxuIik7CisgIGlmKFF1ZXJ5UHJvcCgidmVyc3RlY2t0IikgPT0gMSkgcmV0dXJuIDA7CisgIHdyaXRlKCJEdSB2ZXJzdGVja3N0ICIrbmFtZShXRU4sMSkrIi5cbiIpOworICBTZXRQcm9wKCJ2ZXJzdGVja3QiLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgemVpZ2VuIChzdHJpbmcgc3RyKQoreworICAgc3RyaW5nIG5mX3N0cjsKKyAgIG5mX3N0cj0iU3ludGF4OiBzaG9sZSBbT2JqZWt0LUlkXSBoZXJ2b3JcbiIKKyAgICAgICAgICsiQnNwLjogICBzaG9sZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiBoZXJ2b3JcbiI7CisgICBub3RpZnlfZmFpbCgiRmVobGVyOiBPaG5lIFBhcmFtZXRlciBrbGFwcHQgZGFzIG5pY2h0LlxuIituZl9zdHIpOworICAgaWYoIXN0ciB8fCBzaXplb2Yoc3RyKSA9PSAwIHx8ICFzdHJpbmdwKHN0cikpIHJldHVybiAwOworICAgaWYoc3Ryc3RyKHN0ciwiaGVydm9yIikgIT0gLTEpCisgICAgc3NjYW5mKHN0ciwiJXMgaGVydm9yIixzdHIpOworICAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIrbmZfc3RyKTsKKyAgIGlmKHByZXNlbnQoc3RyKSE9VE8pICAgLy8gVWViZXJwcnVlZmUsIG9iIGF1Y2ggZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgICByZXR1cm4gMDsKKworICAgaWYoIFF1ZXJ5SGF1c2Jlc2l0emVyKCkgIT0gUXVlcnlUUCgpICYmICFRdWVyeVByb3AoInRlc3QiKSApCisgICB7CisgICAgIHdyaXRlKCBCUygiTnVyICIrUXVlcnlIYXVzYmVzaXR6ZXIoKSsiIGRhcmYgIituYW1lKFdFTiwxKSsKKyAgICAgICAgICAgICAgICIgd2llZGVyIGhlcnZvcmhvbGVuISIpKTsKKyAgICAgcmV0dXJuIDE7CisgICB9CisgICBub3RpZnlfZmFpbChOYW1lKFdFUiwxKSsiIGlzdCBkb2NoIGdhciBuaWNodCB2ZXJzdGVja3QhXG4iKTsKKyAgIGlmKFF1ZXJ5UHJvcCgidmVyc3RlY2t0IikgPT0gMCkgcmV0dXJuIDA7CisgICB3cml0ZSgiRHUgaG9sc3QgIituYW1lKFdFTiwxKSsiIGF1cyBkZW0gVmVyc3RlY2suXG4iKTsKKyAgIFNldFByb3AoInZlcnN0ZWNrdCIsIDApOworICAgcmV0dXJuIDE7Cit9CisKKworbWl4ZWQgc2hvcnQoKQoreworICBzdHJpbmcgc2g7CisKKyAgLy8gVW5zaWNodGJhcj8gRGFubiBnaWJ0cyBuaWNodHMgenUgc2VoZW4gLi4uCisgIGlmIChRdWVyeVByb3AoUF9JTlZJUyl8fCEoc2g9UXVlcnlQcm9wKFBfU0hPUlQpKSkKKyAgcmV0dXJuIDA7CisKKyAgaWYoUXVlcnlQcm9wKFBfQ05UX1NUQVRVUyk9PUNOVF9TVEFUVVNfT1BFTikKKyAge3NoICs9ICIgKGdlb2VmZm5ldCkiO30KKworICBpZihRdWVyeVByb3AoInZlcnN0ZWNrdCIpID09IDEpIHtzaCA9ICIiO30KKyAgZWxzZSBzaCArPSAiLiI7CisKKyAgcmV0dXJuIHByb2Nlc3Nfc3RyaW5nKHNoKSsiXG4iOworfQorCisvLyBoaWVyIG5pY2h0IGdlbnV0enQsIHp1bSBVZWJlcnNjaHJlaWJlbiBnZWRhY2h0LgorcHJvdGVjdGVkIHZvaWQgU2V0QmVzaXR6ZXIoc3RyaW5nIHVpZCwgc3RyaW5nIHV1aWQpIHsgfQorCisvLyBuYWNoIGRlbSBtb3ZlIHNjaGF1ZW4sIG9iIG1hbiBpbiBlaW5lbSBTZWhlcmhhdXMgaXN0LiBXZW5uIGphLCB3aXJkIGRpZQorLy8gRnVua3Rpb24gU2V0QmVzaXR6ZXIoKSBnZXJ1ZmVuIHVuZCBpaHIgVUlEIHVuZCBVVUlEIGRlcyBFaWdlbnR1ZW1lcnMKKy8vIHVlYmVyZ2ViZW4uIFNvbGx0ZW4gVUlEIHVuZC9vZGVyIFVVSUQgbmljaHQgYmVzdGltbWJhciBzZWluLCB3aXJkIGRpZQorLy8gRnVua3Rpb24gbmljaHQgZ2VydWZlbi4KK3Byb3RlY3RlZCB2b2lkIE5vdGlmeU1vdmUob2JqZWN0IGRlc3QsIG9iamVjdCBvbGRlbnYsIGludCBtZXRob2QpCit7CisKKyAgOjpOb3RpZnlNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKKworICBpZiAoZGVzdAorICAgICAgJiYgc3Ryc3RyKG9iamVjdF9uYW1lKGRlc3QpLCIvZC9zZWhlci9oYWV1c2VyLyIpID09IDApCisgIHsKKyAgICAvLyAodmVybXV0bGljaCkgaW4gZWluZW0gU2VoZXJoYXVzCisgICAgc3RyaW5nIHVpZCA9IGRlc3QtPlF1ZXJ5T3duZXIoKTsKKyAgICAvLyBlcnN0bWFsIGJlaW0gU2NocmFua21hc3RlciBhbm1lbGRlbi4KKyAgICBTQ0hSQU5LTUFTVEVSLT5SZWdpc3RlckNudChUTywgUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9zdGQiKQorICAgICAgICArIjoiK1F1ZXJ5UHJvcCgiY250X3ZlcnNpb25fb2JqIiksIHVpZCwgZGVzdCk7CisgICAgLy8gVVVJRCByYXVzZmluZGVuCisgICAgbWl4ZWQgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8odWlkKTsKKyAgICBpZiAoIHBvaW50ZXJwKHJldCkgJiYgc2l6ZW9mKHJldCkgPj0gNSApCisgICAgeworICAgICAgLy8gVXNlcm5hbWUgKyAiXyIgKyBDcmVhdGlvbkRhdGUKKyAgICAgIFNldEJlc2l0emVyKHVpZCwgcmV0WzBdICsgIl8iICsgcmV0WzVdKTsKKyAgICB9CisgICAgLy8gZWxzZTogVXNlciB1bmJla2FubnQ/IC0+IGplZGVuZmFsbHMga2VpbmUgaW5pdGlhbGlzaWVydW5nIG1vZWdsaWNoLgorICB9Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvdHJlc29yLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3RyZXNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWQ2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3RyZXNvci5jCkBAIC0wLDAgKzEsNzggQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFRyZXNvcgorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMTcuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgoraW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIzIgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgc3dpZnRfc3RkX2NvbnRhaW5lcjo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBUcmVzb3IiKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICAiRWluIHNlaHIgc3RhYmlsZXIgdW5kIGZldWVyc2ljaGVyZXIgVHJlc29yLCBhbiBkZW0gc2ljaCBzaWNoZXIgc2Nob24gc28gIgorICAgICsibWFuY2hlciBFaW5icmVjaGVyIGVpbmUgQWJmdWhyIGdlaG9sdCBoYXQuIERhcyBtYWdpc2NoZSBGZWxkLCBkYXMgZGVuICIKKyAgICArIlRyZXNvciB1bWdpYnQsIHZlcmhpbmRlcnQgd29obCBhdWNoIEF0dGFja2VuIG1hZ2lzY2hlciBBcnQuIFNvIHd1Y2h0aWcgIgorICAgICsidW5kIHdpY2h0aWcsIHdpZSBkaWVzZXIgS2xvdHogYXVzc2llaHQsIHZlcm11dGVzdCBEdSB3b2hsIHp1IFJlY2h0LCAiCisgICAgKyJkYXNzIHNpY2ggdW5zYWdiYXJlIFJlaWNodHVlbWVyIGluIHNlaW5lbSBJbm5lcmVuIHZlcmJlcmdlbiBtdWVzc2VuLiIpCisgICAgKyJAQGNudF9zdGF0dXNAQCIpOworICBBZGRJZCgoeyJ0cmVzb3IifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiVHJlc29yIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTAwKTsgICAgIC8vIE1laHIgc29sbHRlIG5pY2h0IHNlaW4sIGx0LiBUaWFtYWsuCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX1NURUVMLCBNQVRfTUlTQ19NQUdJQ30pICk7CisgIFNldFByb3AoUF9JTkZPLCAiVmVyc3VjaHMgbWFsIG1pdDogXCJza29tbWFuZG9zICIrUXVlcnlQcm9wKFBfSURTKVsxXSsiXCIgIVxuIik7CisKKyAgQUQoKHsiZmVsZCJ9KSwgQlMoIkVpbiBzdGFya2VzIG1hZ2lzY2hlcyBGZWxkIHVtZ2lidCAiK25hbWUoV0VOLDEpKyIuIikpOworICBBRCgoeyJrbG90eiJ9KSwgQlMoTmFtZShXRVIsMSkrIiBpc3Qgd2FocmxpY2ggZWluIEtsb3R6LCBhdXNnZXNwcm9jaGVuIHd1Y2h0aWcuIikpOworfQorCit2YXJhcmdzIGludCBQcmV2ZW50SW5zZXJ0KG9iamVjdCBvYikKK3sKKyAgLy8gWnVlcnN0IG1hbDogRGluZ2UsIGRlcmVuIFdlcnQgPj0gNTAwMCBNdWVuemVuIGlzdCwgZHVlcmZlbiByZWluLCBzb2xhbmdlCisgIC8vIGVzIGtlaW5lIFJ1ZXN0dW5nZW4gb2RlciBXYWZmZW4gc2luZCEKKyAgaWYoIG9iLT5RdWVyeVByb3AoUF9WQUxVRSkgPj0gNTAwMCAmJiAhb2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKSAmJgorICAgICAhb2ItPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSApCisgICAgICAgIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOworICBpZiggb2ItPmlkKCJcbmdlbGQiKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZWxkPworICAgICAgb2ItPlF1ZXJ5TWF0ZXJpYWxHcm91cChNQVRHUk9VUF9QUkVDSU9VU19NRVRBTCkgfHwgICAgICAvLyBFZGVsbWV0YWxsPworICAgICAgb2ItPlF1ZXJ5TWF0ZXJpYWxHcm91cChNQVRHUk9VUF9KRVdFTCkgfHwgICAgICAgICAgICAgICAvLyBFZGVsc3RlaW4/CisgICAgICBvYi0+UXVlcnlNYXRlcmlhbChNQVRfQ1JZU1RBTCkgfHwgICAgICAgICAgICAgICAgICAgICAgIC8vIEtyaXN0YWxsPworICAgICAgb2ItPlF1ZXJ5TWF0ZXJpYWwoTUFUX0lWT1JZKSApICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGZlbmJlaW4/CisgIHsKKyAgICBpZighb2ItPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSApICAgIC8vIEF1ZiBrZWluZW4gRmFsbCBXYWZmZW4hCisgICAgeworICAgICAgaWYoIG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSApICkgLy8gRmFsbHMgUnVlc3R1bmdzdGVpbC4uLgorICAgICAgeworICAgICAgICBpZiggb2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKT09QVRfUklORyB8fAorICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX0FSTU9VUl9UWVBFKT09QVRfQU1VTEVUIHx8CisgICAgICAgICAgICBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpPT1BVF9NSVNDICkKKyAgICAgICAgICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlKEJTKCJOdXIgd2VydHZvbGxlIFJpbmdlIHVuZCBBbXVsZXR0ZSBrYW5uc3QgRHUgaW4gIituYW1lKFdFTiwxKQorICAgICAgICAgICAgKyIgc3RlY2tlbiwgZXZ0bC4gbm9jaCBhbmRlcmUgd2VydHZvbGxlIFNhY2hlbiwgYWJlciBhdWYga2VpbmVuICIKKyAgICAgICAgICAgICsiRmFsbCBSdWVzdHVuZ2VuIG9kZXIgV2FmZmVuISIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdyaXRlKCJXYWZmZW4ga2FubnN0IER1IG5pY2h0IGluICIrbmFtZShXRU4sMSkrIiB0dW4hXG4iKTsKKyAgfQorICB3cml0ZSggQlMoIkluICIrbmFtZShXRU4sMSkrIiBrYW5uc3QgRHUgbnVyIEdlbGQgdW5kIEVkZWxzdGVpbmUgbGVnZW4sIGV2dGwuIGF1Y2ggIgorICAgICAgICAgICArIndlcnR2b2xsZSBPYmpla3RlLCB6LkIuIGF1cyBFZGVsbWV0YWxsZW4sIEtyaXN0YWxsIG9kZXIgRWxmZW5iZWluISIpKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ZlcmthZXVmZXIuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvdmVya2FldWZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDNhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3ZlcmthZXVmZXIuYwpAQCAtMCwwICsxLDMxMSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmFtZSBkZXMgT2JqZWN0czogICAgVmVya2FldWZlciAoQXVndXN0IHZvbSBTQ0hSQUVOS0VSKQorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMjQuMDguMjAwNgorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU2VsZXZlbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8YmFuay5oPgorCisjaW5jbHVkZSAic2NocmFua2xhZGVuLmgiCitpbmhlcml0ICIvc3RkL25wYyI7CisKKy8vIFdlbm4gaW0gTGFkZW4gYnp3LiBpbSBFbnZpcm9ubWVudCB2b24gQXVndXN0IGRpZSBQcm9wICJ0ZXN0IiBhdWYgMSBnZXNldHp0CisvLyB3aXJkLCBrb3N0ZXQgZGVyIEthdWYgbmljaHRzLiBKZWRlciBkZXIgZWluIFNlaGVyaGF1cyBiZXNpdHp0LCBrYW5uIGthdWZlbi4KKworLy8gRnVlciBQcm9wIGltIFNwaWVsZXIgPSBpbmRpdmlkdWVsbGVyZSBCZWdydWVzc3VuZworI2RlZmluZSBMQVNUVklTSVQgInNjaHJhbmtsYWRlbl9sYXN0dmlzaXQiCisvLyAxMCUgUmFiYXR0IGZ1ZXIgTGV1dGUsIGRpZSBpbnRlbnNpdiB0ZXN0ZXRlbiwgSWRlZW4gZnVlciBkZW4gTGFkZW4gYmVpc3RldWVydGVuLAorLy8gb2RlciBoYWxmZW4sIGdyb2Vzc2VyZSBCdWdzIHp1IGJlaGViZW4hCisjZGVmaW5lIFJBQkFUVCAoeyJnZW9yZGkiLCJmb29iYXIiLCJibG9vZCIsImx1cmNoaSIsICJlbGRhcm9uIn0pCisKKy8vIGthdWZlLi4uIGFuZGVyZSBpbSByYXVtIHNvbGx0ZW4gdm9yIGRlciBhbnR3b3J0IHNlaGVuIHdlciBhdWd1c3QgbmFjaCB3YXMgZnJhZ3QKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYoIWNsb25lcChUTykpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xPR19GSUxFLCJzZWxldmVuL3NjaHJhZW5rZXIiKTsgLy8gU2VsZXZlbiAwNi4wNC4yMDA2CisgIFNQKFBfU0hPUlQsICJBdWd1c3QiKTsKKyAgU1AoUF9MT05HLCBCUygKKyAgICAgIkRhcyBpc3QgQXVndXN0LCBlaW4ga2xlaW5lciBad2VyZyB1bmQgc2VpbmVzIFplaWNoZW5zIFNlaGVyLUJlcmF0ZXIuICIKKyAgICArIkVyIHZlcnNvcmd0IFNlaGVyIG1pdCBFaWdlbmhlaW0gbWl0IGRlbSBNb2JpbGlhciwgZGFzIG1hbiBicmF1Y2h0LCAiCisgICAgKyJ3aWxsIG1hbiBzZWluIEhhdXMgdWViZXJzaWNodGxpY2ggaGFsdGVuIHVuZCBldHdhcyBPcmRudW5nIGluIGRpZSAiCisgICAgKyJTYW1tbHVuZ2VuIGJyaW5nZW4sIGRpZSBzaWNoIGluIHNvIGVpbmVtIFNlaGVyaGF1cyB6d2FuZ3NsYWV1ZmlnICIKKyAgICArImFuaGFldWZlbi4gSW0gR2VnZW5zYXR6IHp1IGRlbiBtZWlzdGVuIFp3ZXJnZW4gc2llaHQgQXVndXN0IG5pY2h0IG51ciAiCisgICAgKyJhdXMgd2llIGZyaXNjaCBnZWR1c2NodCwgZXIgc3RlY2t0IGF1Y2ggaW4gZWluZW0gZmVpbmVuIEFuenVnLiBTbyAiCisgICAgKyJlaW5lbiBnZXBmbGVndGVuIEJhcnQgd2llIGRlbiB2b24gQXVndXN0IGhhc3QgRHUgdm9yaGVyIG5vY2ggbmllICIKKyAgICArImdlc2VoZW4uIFVuZCBkYW5uIGR1ZnRldCBlciBhdWNoIG5vY2ggbmFjaCBpcmdlbmRlaW5lbSBleG90aXNjaGVuICIKKyAgICArIldhZXNzZXJjaGVuLiBXYWVyZSBuaWNodCBkZXIgZ2llcmlnZSBCbGljayBpbiBzZWluZW4gQXVnZW4sIGtvZW5udGVzdCAiCisgICAgKyJEdSB3aXJrbGljaCB6d2VpZmVsbiwgZGFzcyBlcyBzaWNoIGhpZXIgd2lya2xpY2ggdW0gZWluZW4gWndlcmcgIgorICAgICsiaGFuZGVsdC4iLDc4LDAsMSkpOworICBTUChQX05BTUUsICJBdWd1c3QiKTsKKyAgU1AoUF9HRU5ERVIsIE1BTEUpOworICBTUChQX0FSVElDTEUsIDApOworICBTUChQX1JBQ0UsICJad2VyZyIpOworICAvLyBBcmF0aG9ybiwgMjAxNS1Pa3QtMTMsIFplaWxlIHZvciBQX1hQIGdlem9nZW4sIGRhbWl0IGF1Y2ggc2ljaGVyIGtlaW4KKyAgLy8gRUsgYW5nZXplaWd0IHdpcmQuCisgIGNyZWF0ZV9kZWZhdWx0X25wYygyMCk7CisgIFNQKFBfWFAsIDApOworICBBZGRJZCgoeyJhdWd1c3QiLCAiaW5oYWJlciIsICJsYWRlbmluaGFiZXIiLCAiYmVzaXR6ZXIiLAorICAgICAgICAgICJmaXJtZW5iZXNpdHplciIsICJ2ZXJrYWV1ZmVyIiwgInp3ZXJnIiwgInNlaGVyLWJlcmF0ZXIifSkpOworCisgIFNQKFBfU0laRSwgMTMwKTsKKyAgU1AoUF9OT19BVFRBQ0ssIEJTKCJEaWUgYmVydWhpZ2VuZGUgTWVsb2RpZSBzY2hlaW50IG5pY2h0IG51ciB6dW0gIgorICAgICsiVmVyZ251ZWdlbiBkZXIgS3VuZGVuIHp1IGVya2xpbmdlbi4gRHUgYnJpbmdzdCBlcyBlaW5mYWNoICIKKyAgICArIm5pY2h0IGZlcnRpZywgRGVpbmUgSGFuZCBnZWdlbiBBdWd1c3QgenUgZXJoZWJlbiEiKSk7CisKKyAgQUQoKHsiYW56dWcifSksIEJTKE5hbWUoV0VSKSsiIHN0ZWNrdCBpbiBlaW5lbSBmZWluZW4gcm90YnJhdW5lbiBBbnp1ZywgIgorICAgICsiaW4gZGVtIHZlcm11dGxpY2ggYXVjaCBlaW4gQmV0dGxlciBrb2VuaWdsaWNoIGF1ZiBEaWNoIHdpcmtlbiB3dWVyZGUuICIKKyAgICArIk9mZmVuc2ljaHRsaWNoIGlzdCBlciBuaWNodCBkZXIgQWVybXN0ZW4gZWluZXIuIikpOworICBBRCgoeyJiZXR0bGVyIn0pLCBCUygiV2llIGVpbiBCZXR0bGVyIHdpcmt0IEF1Z3VzdCBuaWNodCBhdWYgRGljaC4iKSk7CisgIEFEKCh7IndhZXNzZXJjaGVuIn0pLCBCUygiRXMgcmllY2h0IGtvZXN0bGljaC4gU2NobnVwcGVyIGRvY2ggbWFsISIpKTsKKyAgQUQoKHsiYmFydCJ9KSwgQlMoIkRlciB2ZXJtdXRsaWNoIHdlaXNzZSBCYXJ0IHd1cmRlIHZvbiBLdWVuc3RsZXJoYW5kICIKKyAgICArInJvZXRsaWNoIGVpbmdlZmFlcmJ0IHVuZCBwYXNzdCBmYXJibGljaCB2b3J6dWVnbGljaCB6dW0gQW56dWcuIikpOworICBBRCgoeyJrdWVuc3RsZXJoYW5kIn0pLCBCUygiQmVzdGltbXQgaGF0IEF1Z3VzdCBkYXMgbmljaHQgc2VsYnN0IGdlbWFjaHQuIikpOworICBBRCgoeyJtb2JpbGlhciJ9KSwgQlMoIkRhcyB2ZXJrYXVmdCBlciBoaWVyLiIpKTsKKyAgQUQoKHsiYXVnZW4ifSksIEJTKCJPYndvaGwgIitOYW1lKFdFUikrIiBwZXJmZWt0ZSBNYW5pZXJlbiBhbiBkZW4gVGFnICIKKyAgICArImxlZ3QsIHNlaW5lIEF1Z2VuIHZlcnJhdGVuIGlobi4gRGllIERvbGxhcnplaWNoZW4gaW4gc2VpbmVtIEJsaWNrICIKKyAgICArInNpbmQgbmljaHQgenUgdWViZXJzZWhlbi4iKSk7CisgIEFEKCh7ImRvbGxhcnplaWNoZW4ifSksIEJTKCJFaW5lIFJlZGVuc2FydC4gS2VpbmUgQWhudW5nIHdhcyBkYXMgc2VpbiBzb2xsLiIpKTsKKyAgQUQoKHsicmVkZW5zYXJ0In0pLCBCUygiSXJnZW5kIGVpbiBTcHJ1Y2gsIGRlbiBEdSBpcmdlbmR3byBhdWZnZXNjaG5hcHB0IGhhc3QuIikpOworICBBRCgoeyJzcHJ1Y2gifSksIEJTKCJJbSBTcHJ1ZWNoZWtsb3BmZW4gYmlzdCBEdSBndXQsIG9kZXI/IikpOworICBBRCgoeyJzcHJ1ZWNoZWtsb3BmZW4ifSksIEJTKCJPSywgaWNoIGdlYiBhdWYuIDopIikpOworICBBRCgoeyJtYW5pZXJlbiJ9KSwgIlVuZCBkYXMgYmVpIGVpbmVtIFp3ZXJnISEhXG4iKTsKKworICBBZGRJbmZvKCh7ImxhZGVuIiwgInNjaHJhZW5rZXIifSksICJEZXIgU2NocmFlbmtlciBpc3QgbWVpbiBMYWRlbiwgIgorICAgICsidW5kIGljaCBkZW5rZSBlcyBpc3QgZWluIGd1dGVyIExhZGVuLiBEYXMgR2VzY2hhZWZ0IGxhZXVmdCwgc2VpdCAiCisgICAgKyJqZWRlciBPcmRudW5nIGluIHNlaW5lbSBTZWhlcmhhdXMgaGFiZW4gbW9lY2h0ZS4gVW5kIFNlaGVyaGFldXNlciAiCisgICAgKyJnaWJ0IGVzIGphIG1laHIgYWxzIGdlbnVnISA6KSIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJoYWV1c2VyIiwgInNlaGVyaGFldXNlciJ9KSwgIkJlaSBtaXIga29lbm5lbiBTZWhlciAiCisgICAgKyJNb2JpbGlhciBmdWVyIGlociBTZWhlcmhhdXMga2F1ZmVuLiBVbnNlcmUgUXVhbGl0YWV0IGlzdCB3ZWl0aGluICIKKyAgICArImJlcnVlaG10LiBBdXNzZXJkZW0gc2luZCB3aXIgZGllIGVpbnppZ2VuIGF1ZiBkZW0gTWFya3QuIiwgImdyaW5zdDogIik7CisgIEFkZEluZm8oKHsibWVsb2RpZSJ9KSwgImxhdXNjaHQgdmVydHJhZXVtdC5cbiIpOworICBBZGRJbmZvKCh7ImdlbGQifSksICJTaWUgaGFiZW4gZG9jaCB3ZWxjaGVzP1xuIiwgImZyYWd0IGJlc29yZ3Q6ICIpOworICAvLyBTZWxldmVuIDAxLjA0LjIwMDY6IGZyYWdlIG5hY2ggKHNjaGx1ZXNzZWwpYnJldHQgZWluZ2VmdWVndAorICBBZGRJbmZvKCh7Im1vYmlsaWFyIiwgInNjaHJhbmsiLCAic2NocmFlbmtlIiwgInRydWhlIiwgInRydWhlbiIsICJrb21tb2RlIiwKKyAgICAgImt1ZWhsc2NocmFuayIsICJ3YWZmZW5zY2hyYW5rIiwgIndhZmZlbnRydWhlIiwgInNwaW5kIiwgImtsZWlkZXJzY2hyYW5rIiwiYnJldHQiLCJzY2hsdWVzc2VsYnJldHQiLAorICAgICAibXVlbGxjb250YWluZXIiLCAiemF1YmVya2lzdGUiLCAidHJlc29yIiwgImhvbHp0cnVoZSIsInZpdHJpbmUiLCJwdWx0IiwibGVzZXB1bHQifSksCisgICAgICJMZXNlbiBTaWUgZG9jaCBiaXR0ZSBkaWUgUHJlaXNsaXN0ZSBhbiBkZXIgV2FuZC4iLCAic2FndDogIik7CisgIEFkZEluZm8oKHsibGllZmVybiIsICJsaWVmZXJ1bmcifSksICJXaXIgbGllZmVybiBzb2ZvcnQuIiwgInNhZ3Q6ICIpOworICBBZGRJbmZvKCh7ImJhcnQifSksICJFcyBpc3QgZWluIHNjaG9lbmVyIEJhcnQsIG5pY2h0PyA6KSIsICJmcmFndDogIik7CisgIEFkZEluZm8oKHsiYXVnZW4ifSksICJXYXMgaGFiZW4gU2llIGFuIGRlbmVuIGF1c3p1c2V0emVuPyIsICJmcmFndDogIik7CisgIEFkZEluZm8oKHsiZHVzY2hlIn0pLCAiSmVkZW4gTW9yZ2VuLiBEYXMgaXN0IGxlaWRlciBQZmxpY2h0LiBVbmQgMzY0IG1hbCAiCisgICAgKyJ6dSBvZnQgOigiLCAic2FndDogIik7CisgIEFkZEluZm8oKHsicGZsaWNodCIsICJwZmxpY2h0ZW4ifSksICJBbHMgTGFkZW5pbmhhYmVyIGhhdCBtYW4gZGVyZW4gIgorICAgICsidmllbGUhIiwgInNhZ3Q6ICIpOworICBBZGRJbmZvKCh7ImFuenVnIn0pLCAiRWluIGVjaHRlciBBcm1nYW5pISIsICJ2ZXJrdWVuZGV0IHN0b2x6OiAiKTsKKyAgQWRkSW5mbygoeyJhcm1nYW5pIn0pLCAiRHUga2VubnN0IEFybWdhbmkgbmljaHQ/IiwgImZyYWd0IG5hc2VydWVtcGZlbmQ6ICIpOworICBBZGRJbmZvKCh7Imdlb3JkaSJ9KSwgIlZvbiBpaG0gc3RhbW10IGRpZSB1cnNwcnVlbmdsaWNoZSBHZXNjaGFlZnRzaWRlZSAiCisgICAgKyJmdWVyIGRlbiBTQ0hSQUVOS0VSLiBEYWZ1ZXIgYmVrb21tdCBlciBiZWkgdW5zIGF1Y2ggUmFiYXR0ISIsICJlcnphZWhsdDogIik7CisgIEFkZEluZm8oKHsiYXVndXN0In0pLCAiV29sbGVuIFNpZSBzaWNoIHVlYmVyIG1pY2ggbHVzdGlnIG1hY2hlbj8iLCAiZnJhZ3QgZHJvaGVuZDogIik7CisgIEFkZEluZm8oKHsicmFiYXR0In0pLCAiTnVyIFN0YW1ta3VuZGVuLCBkaWUgdW5zIHNjaG9uIGJyYXVjaGJhcmUgSWRlZW4gIgorICAgICsiZ2VsaWVmZXJ0IGhhYmVuLCBvZGVyIGRpZSB1bnMgYmVpbSBBdWZiYXUgZGVzIEdlc2NoYWVmdHMgZ2Vob2xmZW4gaGFiZW4sICIKKyAgICArImdld2FlaHJlbiB3aXIgUmFiYXR0LiIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJpZGVlbiJ9KSwgIkVzIG11ZXNzZW4gYnJhdWNoYmFyZSBJZGVlbiBzZWluLiIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJzdGFtbWt1bmRlIiwgInN0YW1ta3VuZGVuIn0pLCAiRWluaWdlIGtvbW1lbiBvZWZ0ZXIgdm9yYmVpLiIsICJzYWd0OiAiKTsKKyAgQWRkSW5mbygoeyJhdWZiYXUifSksICJFcyBrb21tdCBtaXIgbm9jaCBzbyB2b3IsIGFscyB3YWVycyBnZXN0ZXJuIGdld2VzZW4uIiwgInNhZ3Q6ICIpOworICBBZGRJbmZvKCh7Imt1bmRlIiwgImt1bmRlbiJ9KSwgIkljaCBob2ZmZSBtYWwsIGRhc3MgU0lFIGRlciBLdW5kZSBzaW5kIT8iLCAic2FndDogIik7CisKKyAgQWRkQ21kKCh7ImthdWYiLCAia2F1ZmUiLCAiYmVzdGVsbCIsICJiZXN0ZWxsZSJ9KSwgImNvbnRhaW5lcl9rYXVmZW4iKTsKKyAgQWRkQ21kKCh7InNjaG51cHBlciIsICJzY2hudXBwZXJlIn0pLCAic2NobnVwcGVybiIpOworfQorCitpbnQgc2NobnVwcGVybigpCit7CisgIHdyaXRlKEJTKCJFaW4gYmV0b2VyZW5kZXIgRHVmdCB1bWdpYnQgQXVndXN0LCB1bmQgdmVyZGVja3QgamVnbGljaGVuIEdlcnVjaCwgIgorICAgICsiZGVuIER1IHZvbiBzb25zdGlnZW4gWndlcmdlbiBnZXdvaG50IGJpc3QuIikpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cmluZyBhbnJlZGUoKQoreworICBzd2l0Y2goIFRQLT5RdWVyeVByb3AoUF9HRU5ERVIpICkKKyAgeworICAgIGNhc2UgTUFMRSAgIDogcmV0dXJuICJtZWluIEhlcnIiOyBicmVhazsKKyAgICBjYXNlIEZFTUFMRSA6IHJldHVybiAibWVpbmUgRGFtZSI7IGJyZWFrOworICB9CisgIHJldHVybiAibWVpbiBILi4uIEQuLi4gV2FzYXVjaGltbWVyIjsKK30KKwordm9pZCBiZWdydWVzc3VuZyhvYmplY3QgcGwsIHN0cmluZyB0eHQpCit7CisgIGlmKCBvYmplY3RwKHBsKSAmJiBwcmVzZW50KHBsKSApCisgICAgdGVsbF9yb29tKEVUTywgIlxuIit0eHQpOworfQorCit2b2lkIGluaXQoKQoreworICA6OmluaXQoKTsKKyAgaWYgKCFpbnRlcmFjdGl2ZShUUCkgfHwgVFAtPlF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICAgIHJldHVybiAwOyAvLyBLZWluZSBNZWxkdW5nZW4gd2VubiBpbnZpcyBvZGVyIGtlaW4gU3BpZWxlciEKKyAgaWYoVFAtPlF1ZXJ5UHJvcChMQVNUVklTSVQpIDwgdGltZSgpLTM2MDApICAvLyBsYWVuZ2VyIGFscyAxIFN0ZC4gbmljaHQgZGEgZ2V3ZXNlbgorICB7CisgICAgaWYoIG1lbWJlcihSQUJBVFQsIGdldGV1aWQoVFApKSAhPSAtMSApCisgICAgICBjYWxsX291dCgiYmVncnVlc3N1bmciLCAwLCBUUCwgQlMoIkhlcnpsaWNoc3QgV2lsbGtvbW1lbiBpbiBtZWluZW0gIgorICAgICAgICArImJlc2NoZWlkZW5lbiBMYWRlbiwgIitUUC0+bmFtZShXRVIpKyIuIEVzIGlzdCBqZWRlc21hbCBlaW5lIEZyZXVkZSwgIgorICAgICAgICArIlNpZSB6dSBzZWhlbiEiLDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgICAgZWxzZQorICAgICAgY2FsbF9vdXQoImJlZ3J1ZXNzdW5nIiwgMCwgVFAsIEJTKCJXaWxsa29tbWVuIGluIG1laW5lbSBiZXNjaGVpZGVuZW4gTGFkZW4sICIKKyAgICAgICAgK2FucmVkZSgpKyIuIiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICB9CisgIGVsc2UgIC8vIHNjaG9ubWFsIGlubmVyaGFsYiAxIFN0ZC4gZGEgZ2V3ZXNlbj8KKyAgeworICAgIGlmKCBtZW1iZXIoUkFCQVRULCBnZXRldWlkKFRQKSkgIT0gLTEgKQorICAgICAgY2FsbF9vdXQoImJlZ3J1ZXNzdW5nIiwgMCwgVFAsIEJTKCJIYWxsbywgIitUUC0+bmFtZShXRVIpKyIuICIKKyAgICAgICAgKyJTaWUga29ubnRlbiBlcyBqYSBuaWNodCBsYW5nZSBvaG5lIG1pY2ggYXVzaGFsdGVuLCBhYmVyIFN0YW1ta3VuZGVuICIKKyAgICAgICAgKyJzaW5kIG1pciBkaWUgbGllYnN0ZW4gS3VuZGVuLiBXb21pdCBrYW5uIGljaCBJaG5lbiBkaWVzbWFsICIKKyAgICAgICAgKyJkaWVuZW4/Iiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgIGVsc2UKKyAgICAgIGNhbGxfb3V0KCJiZWdydWVzc3VuZyIsIDAsIFRQLCBCUygiR3V0ZW4gVGFnLCAiK2FucmVkZSgpKyIuICIKKyAgICAgICAgKyJJY2ggZnJldWUgbWljaCwgZGFzcyBTaWUgbWVpbmVuIExhZGVuIHNvIGJhbGQgd2llZGVyIGJlc3VjaGVuIGtvbW1lbiEgIgorICAgICAgICArIldvbWl0IGthbm4gaWNoIElobmVuIGRpZXNtYWwgZGllbmVuPyIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgfQorCisgIFRQLT5TZXRQcm9wKExBU1RWSVNJVCwgdGltZSgpICk7Cit9CisKK2ludCBjb250YWluZXJfa2F1ZmVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBjbnRfZmlsZTsKKyAgaW50IHByZWlzOworICBvYmplY3QgemllbHJhdW0sY250LG9iOworICB0ZWxsX3Jvb20oRVRPLCBUUC0+TmFtZShXRVIpKyIgd2VuZGV0IHNpY2ggd2VnZW4gZWluZXMgS2F1ZnMgYW4gIgorICAgICtOYW1lKFdFTikrIi5cbiIsICh7VFB9KSApOworICBpZiggKHF1ZXJ5X3dpel9sZXZlbChUUCkgPj0gU0VFUl9MVkwgJiYgcXVlcnlfd2l6X2xldmVsKFRQKSA8IExFQVJORVJfTFZMKSB8fAorICAgICAgRVRPLT5RdWVyeVByb3AoInRlc3QiKSApIC8vIFRQIGlzdCBTZWhlciwgb2RlciBUZXN0bW9kdXMuCisgIHsKKyAgICBjYXRjaChjYWxsX290aGVyKCIvZC9zZWhlci9oYWV1c2VyLyIrZ2V0ZXVpZChUUCkrInJhdW0wIiwgIj8/PyIsIDApKTsKKyAgICBpZiggIXppZWxyYXVtPWZpbmRfb2JqZWN0KCIvZC9zZWhlci9oYWV1c2VyLyIrZ2V0ZXVpZChUUCkrInJhdW0wIikgKQorICAgIHsKKyAgICAgIHRlbGxfcm9vbShFVE8sIEJTKCJUdXQgbWlyIGxlaWQsICIrYW5yZWRlKCkrIi4gVm9yYXVzc2V0enVuZyBmdWVyIGVpbmUgIgorICAgICAgICArIkxpZWZlcnVuZyB1bnNlcmVyIEFydGlrZWwgaXN0IGVpbiBiZWdlaGJhcmVzICIKKyAgICAgICAgKyJTZWhlcmhhdXMuIiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIG5vdGlmeV9mYWlsKCBCUygiVHV0IG1pciBsZWlkLCAiK2FucmVkZSgpKyIuIFNvIGVpbmVuIEFydGlrZWwgZnVlaHJlbiB3aXIgbmljaHQuICIKKyAgICAgICsiQml0dGUgbGVzZW4gU2llIGRpZSBQcmVpc2xpc3RlIGFuIGRlciBXYW5kLiBEb3J0IGtvZW5uZW4gU2llIHNpY2ggZ2VuYXUgIgorICAgICAgKyJkYXJ1ZWJlciBpbmZvcm1pZXJlbiwgdWViZXIgd2VsY2hlIEFydGlrZWwgd2lyIHp1ciBaZWl0ICIKKyAgICAgICsidmVyZnVlZ2VuLiIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICBpZighc3RyKSByZXR1cm4gMDsKKyAgICBzd2l0Y2goc3RyKQorICAgIHsKKyAgICAgIGNhc2UgIjEiIDoKKyAgICAgIGNhc2UgImtvbW1vZGUiIDogICAgICAgY250X2ZpbGU9ImtvbW1vZGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz0zNzk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIjIiIDoKKyAgICAgIGNhc2UgImtsZWlkZXJzY2hyYW5rIjogY250X2ZpbGU9ImtsZWlkZXJzY2hyYW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9NTg5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIzIiA6CisgICAgICBjYXNlICJzcGluZCIgOiAgICAgICAgIGNudF9maWxlPSJzcGluZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTUyOTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiNCIgOgorICAgICAgY2FzZSAia3VlaGxzY2hyYW5rIiA6ICBjbnRfZmlsZT0ia3VlaGxzY2hyYW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9MzQ5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICI1IiA6CisgICAgICBjYXNlICJ3YWZmZW5zY2hyYW5rIiA6IGNudF9maWxlPSJ3YWZmZW5zY2hyYW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9NTg5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICI2IiA6CisgICAgICBjYXNlICJ3YWZmZW50cnVoZSIgOiAgIGNudF9maWxlPSJ3YWZmZW50cnVoZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTUzOTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiNyIgOgorICAgICAgY2FzZSAidHJlc29yIiA6ICAgICAgICBjbnRfZmlsZT0idHJlc29yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlaXM9NDQ5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICI4IiA6CisgICAgICBjYXNlICJ6YXViZXJraXN0ZSIgOiAgIGNudF9maWxlPSJ6YXViZXJraXN0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTc5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiOSIgOgorICAgICAgY2FzZSAibXVlbGxjb250YWluZXIiOiBjbnRfZmlsZT0ibXVlbGxjb250YWluZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz05OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgLy8gU2VsZXZlbiAwMS4wNC4yMDA2CisgICAgICBjYXNlICIxMCIgOgorICAgICAgY2FzZSAic2NobHVlc3NlbGJyZXR0IjogY250X2ZpbGU9InNjaGx1ZXNzZWxicmV0dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWlzPTQ5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIxMSIgOgorICAgICAgY2FzZSAiZHVzY2hrYWJpbmUiOiBjbnRfZmlsZT0id2FzY2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz0zNDk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIjEyIjoKKyAgICAgIGNhc2UgImhvbHp0cnVoZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudF9maWxlPSJhdXRvbG9hZGVydHJ1aGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz03NDk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIxMyI6CisgICAgICBjYXNlICJ2aXRyaW5lIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250X2ZpbGU9InZpdHJpbmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz00OTk5OTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIxNCI6CisgICAgICBjYXNlICJsZXNlcHVsdCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250X2ZpbGU9Imxlc2VwdWx0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVpcz02MDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIHJldHVybiAwOyBicmVhazsKKyAgICB9CisgICAgaWYoIG1lbWJlcihSQUJBVFQsIGdldGV1aWQoVFApKSAhPSAtMSApICAvLyAxMCUgUmFiYXR0IGZ1ZXIgYmVzdGltbXRlIExldXRlLAorICAgICAgcHJlaXM9cHJlaXMvMTAwKjkwOyAgICAgICAgICAgICAgICAgICAgLy8gZGllIElkZWVuIGZ1ZXIgZGVuIExhZGVuIGJlaXN0ZXVlcnRlbi4KKyAgICBpZiggIUVUTy0+UXVlcnlQcm9wKCJ0ZXN0IikgKQorICAgIHsKKyAgICAgIGlmKCAhVFAtPlF1ZXJ5TW9uZXkoKSApCisgICAgICB7CisgICAgICAgIHRlbGxfcm9vbShFVE8sIEJTKCJPaG5lIEdlbGQgYmVrb21tZW4gU2llIGJlaSB1bnMgbmljaHRzLCAiK2FucmVkZSgpCisgICAgICAgICAgKyIuIFdpciBzaW5kIGtlaW4gV29obGZhaHJ0c2luc3RpdHV0ISIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiggVFAtPlF1ZXJ5TW9uZXkoKSA8IHByZWlzICkKKyAgICAgIHsKKyAgICAgICAgdGVsbF9yb29tKEVUTywgQlMoIENBUChhbnJlZGUoKSkrIiwgU2llIGhhYmVuIHp1d2VuaWcgR2VsZCBkYWJlaS4gIgorICAgICAgICAgICsiRGVyIFByZWlzIGZ1ZXIgZGllc2VzIE9iamVrdCBpc3QgIitwcmVpcworICAgICAgICAgICsiIE11ZW56ZW4uIiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIFRQLT5BZGRNb25leSgtcHJlaXMpOyAgICAgIC8vIFNwaWVsZXIgR2VsZCBhYnppZWhlbgorICAgICAgWkVOVFJBTEJBTkstPlBheUluKHByZWlzKTsgLy8gR2VsZCBhdWYgZGllIEJhbmsuCisgICAgfQorICAgIGNudD1jbG9uZV9vYmplY3QoIExBREVOKGNudF9maWxlKSApOworICAgIGNudC0+bW92ZSh6aWVscmF1bSwgTV9QVVR8TV9TSUxFTlQpOworICAgIHRlbGxfcm9vbShFVE8sIFRQLT5OYW1lKFdFUikrIiBrYXVmdCAiK2NudC0+bmFtZShXRU4pKyIuXG4iLCAoe1RQfSkgKTsKKyAgICB0ZWxsX3Jvb20oRVRPLCBCUygiRXMgaXN0IGVpbiBWZXJnbnVlZ2VuLCBtaXQgSWhuZW4gR2VzY2hhZWZ0ZSB6dSBtYWNoZW4sICIKKyAgICAgICthbnJlZGUoKSsiISBXZW5uIFNpZSBpbiBJaHIgSGF1cyB6dXJ1ZWNra2VocmVuLCB3ZXJkZW4gU2llIGRpZSBXYXJlIGJlcmVpdHMgIgorICAgICAgKyJ2b3JmaW5kZW4sIHNvIHNjaG5lbGwgYXJiZWl0ZW4gd2lyLiIsNzgsIE5hbWUoV0VSKSsiIHNhZ3Q6ICIpKTsKKyAgICB0ZWxsX3Jvb20oemllbHJhdW0sIEJTKCJNaXQgS25hbGwgdW5kIFNjaHdlZmVsZHVmdCBlcnNjaGVpbnQgZWluIGtsZWluZXMsICIKKyAgICAgICsidmVyaHV0emVsdGVzIE1hZW5uY2hlbi4gRXMgdHJhZWd0IGVpbmVuIGdydWVuZW4gQW56dWcgdW5kIGVpbmUgZ3J1ZW5lICIKKyAgICAgICsiS2FwcGUsIGF1ZiBkZXIgaW4gZ2VsYmVtIFNjaHJpZnR6dWcgXCJTQ0hSQUVOS0VSXCIgc3RlaHQuIERhcyBNYWVubmNoZW4gIgorICAgICAgKyJzdGVsbHQgIitjbnQtPm5hbWUoV0VOKSsiIGFiIHVuZCB2ZXJzY2h3aW5kZXQgYXVmIGRlbSBnbGVpY2hlbiBXZWdlLCB3aWUgIgorICAgICAgKyJlcyBoZXJlaW5nZWtvbW1lbiBpc3QuIikpOworICAgIGlmKCBwcmVzZW50KCJJbnRlcmFjdGl2ZSIsIFNDSFJBTktNQVNURVIpICkKKyAgICAgIHRlbGxfcm9vbShTQ0hSQU5LTUFTVEVSLCBUUC0+TmFtZShXRVIpKyIga2F1ZnQgIituYW1lKFdFTikrIi5cbiIpOworICAgIFNDSFJBTktNQVNURVItPlJlZ2lzdGVyQ250KGNudCwgY250LT5RdWVyeVByb3AoImNudF92ZXJzaW9uX3N0ZCIpCisgICAgICArY250LT5RdWVyeVByb3AoImNudF92ZXJzaW9uX29iaiIpLCBnZXRldWlkKFRQKSwKKyAgICAgICAiL2Qvc2VoZXIvaGFldXNlci8iK2dldGV1aWQoVFApKyJyYXVtMCIpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYocXVlcnlfd2l6X2xldmVsKFRQKSA+PSBMRUFSTkVSX0xWTCApICAvLyBUUCBpc3QgTWFnaWVyLgorICB7CisgICAgdGVsbF9yb29tKEVUTywgQlMoIlR1dCBtaXIgbGVpZCwgIithbnJlZGUoKSsiLiBBbiBNYWdpZXIgbGllZmVybiB3aXIgbmljaHRzLiAiCisgICAgICArIkRhcyBpc3QgZWluIFByaW56aXAgZGVzIEhhdXNlcywgdW5kIFByaW56aXBpZW4gc2luZCBkYXp1IGRhLCBkYXNzICIKKyAgICAgICsic2llIGVpbmdlaGFsdGVuIHdlcmRlbi4gIiw3OCwgTmFtZShXRVIpKyIgc2FndDogIikpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgIC8vIFRQIGlzdCBTcGllbGVyLCBrZWluIFNlaGVyIG9kZXIgTWFnaWVyLgorICB7CisgICAgdGVsbF9yb29tKEVUTywgQlMoIlR1dCBtaXIgbGVpZCwgIithbnJlZGUoKSsiLiBXaXIgbGllZmVybiBudXIgYW4gU2VoZXIuICIKKyAgICAgICsiQWJlciBkYSBpY2ggU2llIGFscyBzdHJlYnNhbWUgdW5kIGVyZm9sZ3JlaWNoZSBQZXJzb24gYW5zZWhlLCAiCisgICAgICArImJpbiBpY2ggc2ljaGVyLCBkYXNzIHdpciB1bnMgYmFsZCB3aWVkZXJzZWhlbiEiLDc4LCBOYW1lKFdFUikrIiBzYWd0OiAiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvdml0cmluZS5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC92aXRyaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1YmI5NgotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvdml0cmluZS5jCkBAIC0wLDAgKzEsMzM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitWaXRyaW5lIGZ1ZXIgZGllIFBva2FsZQorQXV0b3I6IE1pcmlsCitsZXR6dGUgQWVuZGVydW5nOgorMDUuMDkuMjAxMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlICIvZC9lYmVuZS9taXJpbC9mcmF0ZXJuaXRhcy9mcmF0ZXJuaXRhcy5oIgorI2luY2x1ZGUgIi9kL2ViZW5lL21pcmlsL2ZyYXRlcm5pdGFzL3Ryb3BoeS5oIgorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL21vZWJlbC5oIgorI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oIgorCitpbmhlcml0IExBREVOKCJzd2lmdF9zdGRfY29udGFpbmVyIik7CisKK3N0cmluZyBiZXNpdHplcjsKK2ludCBzdGF1YjsKK3N0cmluZyAqdHJvcGh5bmFtZW47CisKK3N0YXRpYyBzdHJpbmcgbXlfbG9uZygpOworc3RhdGljIHN0cmluZyBzdGF1Yl9kZXNjcigpOwordm9pZCBHZXRUcm9waHlEZXRhaWxzKCk7CitzdHJpbmcgKkdldEFsbFRyb3BoeU5hbWVzKCk7Cit2b2lkIE5ldWVEZXRhaWxzKCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKXsKKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisgIHNldF9uZXh0X3Jlc2V0KDg2NDAwKTsKKyAgOjpjcmVhdGUoKTsKKyAgYmVzaXR6ZXI9IiI7CisgIHN0YXViPTA7CisgIFNldFByb3AoUF9OQU1FLCJWaXRyaW5lIik7CisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBWaXRyaW5lIik7CisgIFNldChQX0xPTkcsIydteV9sb25nLEZfUVVFUllfTUVUSE9EKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRQcm9wKFBfTUFURVJJQUwsKFtNQVRfR0xBU1M6NTAsTUFUX0VCT05ZOjUwXSkpOworICBTZXRQcm9wKFBfVkFMVUUsMTAwMDApOworICBTZXRQcm9wKFBfV0VJR0hULDUwMDAwMCk7CisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywwKTsKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsMCk7CisgIFNldFByb3AoSF9GVVJOSVRVUkUsMSk7CisgIFNldFByb3AoUF9OT0dFVCwiRGllIFZpdHJpbmUgaXN0IHZpZWwgenUgc2Nod2VyLlxuIik7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsMik7CisgIEdldFRyb3BoeURldGFpbHMoKTsKKyAgQWRkSWQoKHsiXG5taXJpbF9wb2thbF92aXRyaW5lIiwidml0cmluZSJ9KSk7CisKKyAgTmV1ZURldGFpbHMoKTsKKworICBBZGRDbWQoKHsic2FldWJlcmUiLCJzYWV1YmVyIiwicmVpbmlnZSIsInJlaW5pZyIsIm1hY2giLCJtYWNoZSJ9KSwKKyAgICAgICAgICAgInNhZXViZXJfY21kIik7CisKKyAgQWRkQ21kKCh7InN0ZWxsZSIsInN0ZWxsIn0pLCJzdGVsbF9jbWQiKTsKKyAgUmVtb3ZlQ21kKCh7InNlcmxhdWJlIn0pKTsKKworfQorCit2b2lkIHJlc2V0KCl7CisgICsrc3RhdWI7CisgIHNldF9uZXh0X3Jlc2V0KDg2NDAwKTsKKyAgOjpyZXNldCgpOworICByZXR1cm47Cit9CisKK3ZvaWQgU2V0QmVzaXR6ZXIoc3RyaW5nIHVpZCxzdHJpbmcgdXVpZCl7CisgIGJlc2l0emVyPXV1aWQ7CisgIEdldFRyb3BoeURldGFpbHMoKTsKKyAgcmV0dXJuOworfQorCitzdHJpbmcgUXVlcnlCZXNpdHplcigpeworICByZXR1cm4gYmVzaXR6ZXI7Cit9CisKK3ZvaWQgTmV1ZURldGFpbHMoKXsKKyAgQWRkRGV0YWlsKCh7ImhvbHoiLCJlYmVuaG9seiJ9KSxCUygiRGllIFZpdHJpbmUgYmVzdGVodCB0ZWlsd2Vpc2UgIgorICAgICJhdXMgRWJlbmhvbHouIFR1ZXJlbiwgRGVja2VsIHVuZCBFaW5sZWdlYm9lZGVuIHNpbmQgYXVzIEdsYXMuIikpOworICBBZGREZXRhaWwoKHsidHVlcmVuIiwidHVlciIsImdsYXN0dWVyZW4iLCJnbGFzdHVlciIsImRlY2tlbCJ9KSxCUygKKyAgICAgICAgICAgICJEdXJjaCBkYXMgR2xhcyBrYW5uc3QgRHUgaW5zIElubmVyZSBkZXIgVml0cmluZSBndWNrZW4uIikpOworICBBZGREZXRhaWwoKHsiaW5uZXJlcyIsImdlZ2Vuc3RhZW5kZSIsImdlZ2Vuc3RhbmQifSksCisgICAgICAgICAgICBCUygiRG9ydCBrYW5uIG1hbiBQb2thbGUgaGluZWluc3RlbGxlbiwgYWJlciBuaWNodCB3aWVkZXIgIgorICAgICAgICAgICAgImhlcmF1c25laG1lbi4iKSk7CisgIEFkZERldGFpbCgoeyJnbGFzIiwic2NoZWliZSIsInNjaGVpYmVuIn0pLAorICAgICBCUygiR2xhcyBpc3QgcHJha3Rpc2NoLCBzb2xhbmdlIGVzIHNhdWJlciBpc3Q6ICIKKyAgICAgICAgIk1hbiBrYW5uIGRhZHVyY2ggaW5zIElubmVyZSBzY2hhdWVuLiIpKTsKKyAgQWRkRGV0YWlsKCh7InJlaWhlIiwicGxhdHoiLCJlaW5sZWdlYm9lZGVuIiwiZWlubGVnZWJvZGVuIiwiYm9lZGVuIiwKKyAgICAgICAgICAgICAgImJvZGVuIn0pLAorICAgICAgICAgICBCUygiRGllIHZpZWxlbiBCb2VkZW4gYmlldGVuIFBsYXR6IGZ1ZXIgdmllbGUgUG9rYWxlISIpKTsKKyAgcmV0dXJuOworfQorCisKK3N0YXRpYyBzdHJpbmcgbXlfbG9uZygpeworICBpZihzdGF1YjwyMSkKKyAgcmV0dXJuIEJTKAorICAiRGllIHNjaGxpY2h0ZSBWaXRyaW5lIGF1cyBkdW5rbGVtIEhvbHogZWlnbmV0IHNpY2ggaGVydm9ycmFnZW5kLCB1bSAiCisgICJ3ZXJ0dm9sbGUgR2VnZW5zdGFlbmRlIGRhcmluIGF1c3p1c3RlbGxlbi4gSGludGVyIGRlbiBiZWlkZW4gR2xhc3R1ZXJlbiAiCisgICJzaWVoc3QgRHUgZWluZSBSZWloZSB2b24gRWlubGVnZWJvZWRlbiwgZGllIGViZW5mYWxscyBhdXMgR2xhcyBiZXN0ZWhlbi4gIisKKyAgc3RhdWJfZGVzY3IoKSk7CisgIGVsc2UgcmV0dXJuIEJTKHN0YXViX2Rlc2NyKCkpOworfQorCisKK3N0YXRpYyBzdHJpbmcgc3RhdWJfZGVzY3IoKXsKKyAgc3RyaW5nIHRleHQ7CisgIHRleHQ9IiI7CisgIHN3aXRjaChzdGF1Yil7CisgICAgY2FzZSAwLi4xOgorICAgICAgdGV4dD0KKyAgICAgICAgIkRpZSBWaXRyaW5lIGlzdCBoZXJ2b3JyYWdlbmQgZ2VwZmxlZ3QuIER1IHNpZWhzdCBrZWluZXJsZWkgU3RhdWIgIisKKyAgICAgICAgImRhcmluLCB1bmQgZGllIFNjaGVpYmVuIHNpbmQgdm9lbGxpZyBrbGFyLlxuIjsKKyAgICAgICAgQWRkRGV0YWlsKCh7InN0YXViIn0pLEJTKCJLZWluZXIgenUgc2VoZW4uIikpOworICAgIGJyZWFrOworICAgIGNhc2UgMi4uNDoKKyAgICAgIHRleHQ9CisgICAgICAgICJEaWUgVml0cmluZSBpc3QgZ3V0IGdlcGZsZWd0LiBFcyBsaWVndCBrYXVtIFN0YXViIGRhcmluLCB1bmQgZGllICIrCisgICAgICAgICJUdWVyZW4gc2luZCBrbGFyLlxuIjsKKyAgICAgICAgQWRkRGV0YWlsKCh7InN0YXViIn0pLEJTKCJNYW4gc2llaHQgbnVyIHdlbmlnIGRhdm9uLiIpKTsKKyAgICBicmVhazsKKyAgICBjYXNlIDUuLjc6CisgICAgICB0ZXh0PQorICAgICAgICAiRGllIFZpdHJpbmUgaXN0IGluIGVpbmVtIG9yZGVudGxpY2hlbiBadXN0YW5kLCBhbGxlcmRpbmdzIHNhbW1lbHQgIisKKyAgICAgICAgInNpY2ggc28gbGFuZ3NhbSBTdGF1YiBhdWYgZGVuIEVpbmxlZ2Vib2VkZW4uXG4iOworICAgICAgICBBZGREZXRhaWwoKHsic3RhdWIifSksQlMoIlNvIGxhbmdzYW0ga29lbm50ZSBtYW4gZGllICIKKyAgICAgICAgIlZpdHJpbmUgc2FldWJlcm4hIikpOworICAgICAgICBBZGREZXRhaWwoKHsienVzdGFuZCJ9KSxCUygiTm9jaCBpc3QgZXIgb3JkZW50bGljaC4iKSk7CisgICAgYnJlYWs7CisgICAgY2FzZSA4Li4xMDoKKyAgICAgIHRleHQ9CisgICAgICAgICJEaWUgVml0cmluZSB3aXJrdCBzY2hvbiBldHdhcyBzdGF1YmlnLiBNYW4gZXJrZW5udCBhdWNoLCBkYXNzICIrCisgICAgICAgICJkZXIgZWluIG9kZXIgYW5kZXJlIEZpbmdlcmFiZHJ1Y2sgZGllIFR1ZXJlbiB6aWVydC4iOworICAgICAgICBBZGREZXRhaWwoKHsic3RhdWIiLCJmaW5nZXJhYmRydWNrIiwidHVlcmVuIiwiZ2xhc3R1ZXJlbiIsCisgICAgICAgICJkZWNrZWwiLCJnbGFzdHVlciIsInR1ZXIiLCJ6dXN0YW5kIn0pLAorICAgICAgICBCUygiRXMgbG9obnQgc2ljaCBqZXR6dCBzY2hvbiwgZGllIFZpdHJpbmUgenUgc2FldWJlcm4uIikpOworICAgIGJyZWFrOworICAgIGNhc2UgMTEuLjE1OgorICAgICAgdGV4dD0KKyAgICAgICAgIkR1IGhhc3QgZGVuIEVpbmRydWNrLCBkYXNzIGRpZSBWaXRyaW5lIGxhbmdzYW0gZWlubWFsIGdlc2FldWJlcnQgIisKKyAgICAgICAgIndlcmRlbiBrb2VubnRlLiBEaWUgRWlubGVnZWJvZWRlbiBzaW5kIHN0YXViaWcgdW5kIHphaGxyZWljaGUgIisKKyAgICAgICAgIkZpbmdlcmFiZHJ1ZWNrZSBzaW5kIGF1ZiBkZW4gR2xhc3R1ZXJlbiB6dSBzZWhlbi4iOworICAgIGJyZWFrOworICAgIGNhc2UgMTYuLjIwOgorICAgICAgdGV4dD0KKyAgICAgICAgIkRpZSBWaXRyaW5lIG1hY2h0IGVpbmVuIHJlY2h0IHVuZ2VwZmxlZ3RlbiBFaW5kcnVjay4gSW5uZW4gaXN0ICIrCisgICAgICAgICJzaWUgc2Nob24gc2VociB2ZXJzdGF1YnQgdW5kIGF1Y2ggZGllIFR1ZXJlbiBzaW5kIHNjaG9uIHJlY2h0ICIrCisgICAgICAgICJkcmVja2lnIGdld29yZGVuLiI7CisgICAgICAgIEFkZERldGFpbCgoeyJzdGF1YiJ9KSxCUygiTnVuIHdpcmQgZXMgYWJlciB3aXJrbGljaCBaZWl0LCBkaWUgIgorICAgICAgICAiVml0cmluZSB6dSBzYWV1YmVybi4gU29uc3Qgc2llaHQgbWFuIGJhbGQgbmljaHRzIG1laHIgZGFyaW4uIikpOworICAgIGJyZWFrOworICAgIGNhc2UgMjEuLjI1OgorICAgICAgdGV4dD0KKyAgICAgICAgIkRpZSBWaXRyaW5lIGlzdCB0b3RhbCB6dWdlc3RhdWJ0LiBVZWJlciBkZW4gR2xhc3R1ZXJlbiBzaW5kICIrCisgICAgICAgICJlcnN0ZSBTcGlubndlYmVuIHp1IGVya2VubmVuIHVuZCBkaWUgU2NoZWliZW4gc2luZCBzY2hvbiBmYXN0ICIrCisgICAgICAgICJibGluZCB2b24gYWxsIGRlbiBGaW5nZXJhYmRydWVja2VuIHVuYXVmbWVya3NhbWVyIEdhZXN0ZS4iOworICAgICAgICAgUmVtb3ZlRGV0YWlsKG1faW5kaWNlcyhRdWVyeVByb3AoUF9ERVRBSUxTKSkpOworICAgICAgICAgQWRkRGV0YWlsKCh7InNwaW5ud2ViZW4iLCJkcmVjayIsInZpdHJpbmUiLCJnbGFzdHVlcmVuIiwiZ2xhc3R1ZXIiLAorICAgICAgICAgInR1ZXJlbiIsInR1ZXIiLCJzY2hlaWJlIiwic2NoZWliZW4iLCJkZWNrZWwifSksCisgICAgICAgICAiVW50ZXIgZGVtIGdhbnplbiBEcmVjayBpc3QgbGVpZGVyIG5pY2h0cyBtZWhyIHp1IGVya2VubmVuLlxuIik7CisgICAgICAgICBBZGREZXRhaWwoKHsiZ2Flc3RlIiwiZ2FzdCIsImZpbmdlcmFiZHJ1Y2siLCJmaW5nZXJhYmRydWVja2UifSksCisgICAgICAgICAiRGllIEdhZXN0ZSBzaW5kIHNpY2hlciBzY2h1bGQgYW4gZGVtIERyZWNrLlxuIik7CisgICAgYnJlYWs7CisgICAgY2FzZSAyNi4uMzA6CisgICAgICB0ZXh0PQorICAgICAgICAiRHUga2FubnN0IGRpZSBWaXRyaW5lIHVudGVyIGRlciBkaWNrZW4gU3RhdWJzY2hpY2h0IGthdW0gbm9jaCAiKworICAgICAgICAiZXJrZW5uZW4gdW5kIGRpZSBHbGFzdHVlcmVuIHNpbmQgYmxpbmQgZ2V3b3JkZW4uIjsKKyAgICAgICAgIEFkZERldGFpbCgoeyJzdGF1YnNjaGljaHQiLCJzY2hpY2h0In0pLAorICAgICAgICAgQlMoIkRpZSBpc3QgdmVyZGFtbXQgZGljayB1bmQgdW5kdXJjaHNpY2h0aWcuIikpOworICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0ZXh0PQorICAgICAgICAiRGFzcyBzaWNoIHVudGVyIGRpZXNlciBBbnNhbW1sdW5nIHZvbiBTcGlubndlYmVuIHVuZCBTdGF1YiBub2NoICIrCisgICAgICAgICJlaW5lIFZpdHJpbmUgbWl0IEdsYXN0dWVyZW4gdmVyYmVyZ2VuIHNvbGwsIGthbm5zdCBEdSBrYXVtIGdsYXViZW4uICIrCisgICAgICAgICJKZWRlbmZhbGxzIGthbm4gbWFuIGR1cmNoIGRpZSB2b2VsbGlnIGJsaW5kZW4gU2NoZWliZW4gbmljaHRzICIrCisgICAgICAgICJtZWhyIGVya2VubmVuLiI7CisgICAgICBBZGREZXRhaWwoKHsiZHJlY2siLCJzcGlubndlYmVuIiwic3RhdWIiLCJhbnNhbW1sdW5nIn0pLCJQZnVpIERlaWJlbCFcbiIpOworICB9CisgIHJldHVybiB0ZXh0OworfQorCitzdGF0aWMgaW50IHNhZXViZXJfY21kKHN0cmluZyBzdHIpeworICBzdHJpbmcgdGV4dDsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHN0cnN0cihzdHIsInZpdHJpbmUiKTwwKSByZXR1cm4gMDsKKyAgc3dpdGNoKHN0YXViKXsKKyAgICBjYXNlIDA6CisgICAgICB3cml0ZSgiRGFzIGlzdCBub2NoIG5pY2h0IG5vZXRpZyFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgICAgY2FzZSAxLi4yMDoKKyAgICAgIHRleHQ9IkR1IHJlaW5pZ3N0IGRpZSBWaXRyaW5lIGdydWVuZGxpY2guIERhcyB3dXJkZSBhdWNoIGxhbmdzYW0gIgorICAgICAgIlplaXQhIjsKKyAgICAgIGlmKGdldHV1aWQoVFApIT1iZXNpdHplcikKKyAgICAgICAgdGV4dCs9IkR1IGZyYWdzdCBEaWNoLCB3aWVzbyBEdSBmcmVtZGUgTW9lYmVsIHJlaW5pZ3N0LiI7CisKKyAgICAgIHdyaXRlKEJTKHRleHQpKTsKKyAgICAgIHNheShCUyhUUE4rIiByZWluaWd0IGRpZSBWaXRyaW5lIGdydWVuZGxpY2guIERhcyB3dXJkZSBhdWNoIGxhbmdzYW0gIgorICAgICAgIlplaXQhXG4iKSxUUCk7CisgICAgICBzdGF1Yj0wOyAvL0hpZXIgZGFyZiBub2NoIGplbWFuZCBoZWxmZW4hCisgICAgYnJlYWs7CisgICAgY2FzZSAyMS4uMzA6CisgICAgICB0ZXh0PSJEdSBiZWdpbm5zdCBkaWUgVml0cmluZSB6dSByZWluaWdlbi4gIjsKKyAgICAgIGlmKGdldHV1aWQoVFApIT1iZXNpdHplcil7CisgICAgICAgIHRleHQrPSJOYWNoIGVpbmlnZXIgWmVpdCBmcmFnc3QgRHUgRGljaCwgb2IgRHUgZWlnZW50bGljaCBzcGlubnN0LCAiKworICAgICAgICAiZGVubiBkYXMgaXN0IHVlYmVyaGF1cHQgbmljaHQgRGVpbmUgVml0cmluZS4gRHUgbGFlc3N0IHZvbiBkZW0gIisKKyAgICAgICAgIlZvcmhhYmVuIHdpZWRlciBhYi4iOworICAgICAgICBzYXkoQlMoVFBOKyIgZmFlbmd0IGt1cnogYW4sIGRpZSBWaXRyaW5lIHp1IHJlaW5pZ2VuLCBsYWVzc3QgZXMgYWJlciAiCisgICAgICAgICJzY2huZWxsIHdpZWRlciBzZWluLiIpLFRQKTsKKyAgICAgIH0KKyAgICAgIGVsc2V7CisgICAgICAgIHRleHQrPSJEYXMgZGF1ZXJ0IGVpbmUgZ2FuemUgV2VpbGUsIGFiZXIgZGFubiBzdHJhaGx0IGRpZSBWaXRyaW5lICIKKyAgICAgICAgIndpZWRlci4iOworICAgICAgICBzYXkoQlMoVFBOKyIgYmVnaW5udCBkaWUgVml0cmluZSB6dSByZWluaWdlbi4gRGFzIGRhdWVydCBlaW5lIGdhbnplICIKKyAgICAgICAgIldlaWxlLCBhYmVyIGRhbm4gc3RyYWhsdCBzaWUgd2llZGVyLiIpLFRQKTsKKyAgICAgICAgc3RhdWI9MDsKKyAgICAgIH0KKyAgICAgIHdyaXRlKEJTKHRleHQpKTsKKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYoZ2V0dXVpZChUUCkhPWJlc2l0emVyKQorICAgICAgICB3cml0ZSgiRGFzIGRyZWNraWdlIFRlaWwgZmFzc3QgRHUgbmljaHQgYW4hXG4iKTsKKyAgICAgIGVsc2V7CisgICAgICAgIHdyaXRlKEJTKAorICAgICAgICAgICJEdSBzY2hydWJic3QgdW5kIHNjaHJ1YmJzdCB1bmQgZXMgc2NoZWludCBrZWluIEVuZGUgenUgbmVobWVuLiAiCisgICAgICAgICAgIkFscyBEdSBzY2hvbiBsYW5nc2FtIGF1ZmdlYmVuIHdpbGxzdCwgaXN0IHNvIGxhbmdzYW0gZWluIGtsZWluZXIgIgorICAgICAgICAgICJFcmZvbGcgenUgc2VoZW4uIER1IG5pbW1zdCBEaXIgdm9yLCBkaWUgVml0cmluZSBpbiBadWt1bmZ0ICIKKyAgICAgICAgICAiaGFldWZpZ2VyIHp1IHJlaW5pZ2VuISIpKTsKKyAgICAgICAgc2F5KEJTKAorICAgICAgICAgIFRQTisiIHNjaHJ1YmJ0IHN0dW5kZW5sYW5nIGFuIGRlciBWaXRyaW5lIHJ1bSwgYmlzIHNpZSBlbmRsaWNoICIKKyAgICAgICAgICAid2llZGVyIHJpY2h0aWcgc2F1YmVyIGlzdC4iKSxUUCk7CisgICAgICAgIHN0YXViPTA7CisgICAgICB9CisgIH0KKyAgaWYoc3RhdWI9PTApeworICAgIFJlbW92ZURldGFpbChtX2luZGljZXMoUXVlcnlQcm9wKFBfREVUQUlMUykpKTsKKyAgICBHZXRUcm9waHlEZXRhaWxzKCk7CisgICAgTmV1ZURldGFpbHMoKTsKKyAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgR2V0VHJvcGh5RGV0YWlscygpeworICBzdHJpbmcgKnRyb3BoeWxpc3RlLCpzaG9ydHM7CisgIG1hcHBpbmcgdHJvcGh5ZGV0YWlsczsKKworICBzaG9ydHM9KHt9KTsKKworICB0cm9waHlsaXN0ZT1NSVJJTF9UUk9QSFlNQVNURVItPkdldFBsYWNlZFRyb3BoaWVzKGJlc2l0emVyKTsKKworICBmb3JlYWNoKCBzdHJpbmcgdHIgOiB0cm9waHlsaXN0ZSApCisgICAgc2hvcnRzKz0oeyBNSVJJTF9UUk9QSFlNQVNURVItPkdldFRyb3BoeVNob3J0KHRyKSB9KTsKKworICBzaG9ydHMgPSBzb3J0X2FycmF5KHNob3J0cywgIyc+KTsKKyAgaWYoIXNpemVvZihzaG9ydHMpKQorICAgIEFkZERldGFpbCgoeyJwb2thbGUiLCJwb2thbCIsImluIHZpdHJpbmUifSksCisgICAgICAgICAgICAgICAgIkJpc2xhbmcgaXN0IGRpZSBWaXRyaW5lIG5vY2ggbGVlci5cbiIpOworICBlbHNlCisgIEFkZERldGFpbCgoeyJwb2thbGUiLCJwb2thbCIsImluIHZpdHJpbmUifSksCisgICAgIkR1IHNpZWhzdCBmb2xnZW5kZSBQb2thbGUgaW4gZGVyIFZpdHJpbmU6XG4iCisgICAgK2ltcGxvZGUoc2hvcnRzLCIuXG4iKSsiLlxuIik7CisKKyAgZm9yZWFjaCggc3RyaW5nIHRyIDogdHJvcGh5bGlzdGUgKQorICB7CisgICAgQWRkRGV0YWlsKCBNSVJJTF9UUk9QSFlNQVNURVItPkdldFRyb3BoeUlkcyh0ciksCisgICAgICAgICAgICAgICBCUyhNSVJJTF9UUk9QSFlNQVNURVItPkdldFRyb3BoeUxvbmcodHIpKSk7CisKKyAgICB0cm9waHlkZXRhaWxzID0gTUlSSUxfVFJPUEhZTUFTVEVSLT5HZXRUcm9waHlEZXRhaWxzKHRyKTsKKyAgICBpZiAoICFzaXplb2YodHJvcGh5ZGV0YWlscykgKQorICAgICAgY29udGludWU7CisgICAgZm9yZWFjaCAoIG1peGVkIGRldCwgc3RyaW5nIGRldF9kZXNjIDogdHJvcGh5ZGV0YWlscyApCisgICAgICBBZGREZXRhaWwoIGRldCwgQlMoZGV0X2Rlc2MpICk7CisgIH0KKyAgcmV0dXJuOworfQorCitzdHJpbmcgKkdldEFsbFRyb3BoeU5hbWVzKCl7CisgIGludCBpLGFuemFobDsKKyAgc3RyaW5nICp0cm9waHluYW1lbjsKKworICB0cm9waHluYW1lbj0oe30pOworCisgIGZvcmVhY2goc3RyaW5nIGJsYTpNSVJJTF9UUk9QSFlNQVNURVItPkdldFRyb3BoeUxpc3RlKCkpCisgICAgdHJvcGh5bmFtZW4rPU1JUklMX1RST1BIWU1BU1RFUi0+R2V0VHJvcGh5SWRzKGJsYSk7CisKKyAgcmV0dXJuIHRyb3BoeW5hbWVuOworfQorCitzdGF0aWMgaW50IHN0ZWxsX2NtZChzdHJpbmcgc3RyKXsKKyAgc3RyaW5nIHdhcyxpZGVudGlmaWVyOworICBpbnQgcmVzdWx0YXQ7CisgIG9iamVjdCBvYjsKKyAgaWYoIXN0cikgcmV0dXJuIDA7CisgIGlmKHN0cnN0cihzdHIsInZpdHJpbmUiKTwwKSByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkRhcyBpc3QgbmljaHQgRGVpbmUgVml0cmluZSFcbiIpOworICBpZihnZXR1dWlkKFRQKSE9YmVzaXR6ZXIpCisgICAgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEaWUgU3ludGF4IGlzdDogc3RlbGxlIDxnZWdlbnN0YW5kPiBpbiB2aXRyaW5lIVxuIik7CisgIGlmKHNzY2FuZihzdHIsIiVzIGluIHZpdHJpbmUiLHdhcykhPTEpCisgICAgcmV0dXJuIDA7CisKKyAgbm90aWZ5X2ZhaWwoIkRpZSBWaXRyaW5lIHNvbGx0ZSBzY2hvbiBvZmZlbiBzZWluLlxuIik7CisgIGlmKFF1ZXJ5UHJvcChQX0NOVF9TVEFUVVMpIT1DTlRfU1RBVFVTX09QRU4gJiYgIUlTX0xFQVJORVIoVFApKQorICAgIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRHUgc29sbHRlc3QgZGllIFZpdHJpbmUgdm9yaGVyIGVyc3RtYWwgc2FldWJlcm4hXG4iKTsKKyAgaWYoc3RhdWI+MjApCisgICAgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEYXMga2FubnN0IER1IGxlaWRlciBuaWNodCBpbiBkaWUgVml0cmluZSBzdGVsbGVuIVxuIik7CisgIGlmKG1lbWJlcihHZXRBbGxUcm9waHlOYW1lcygpLGxvd2VyX2Nhc2Uod2FzKSk8MAorICAgICAmJiBsb3dlcl9jYXNlKHdhcykhPSJwb2thbCIpCisgICAgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEYXMgaGFzdCBEdSBuaWNodCFcbiIpOworICBpZighb2I9cHJlc2VudCh3YXMsVFApKQorICAgIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBsZWlkZXIgbmljaHQgaW4gZGllIFZpdHJpbmUgc3RlbGxlbiFcbiIpOworICBpZighb2ItPmlkKCJcbm1pcmlsX3Bva2FsIikpCisgICAgcmV0dXJuIDA7CisKKyAgaWRlbnRpZmllcj1vYi0+UXVlcnlJZGVudGlmaWVyKCk7CisgIHJlc3VsdGF0PU1JUklMX1RST1BIWU1BU1RFUi0+UGxhY2VUcm9waHkoZ2V0dXVpZChUUCksaWRlbnRpZmllcik7CisKKyAgbm90aWZ5X2ZhaWwoIkhpZXIgc3RpbW10IGV0d2FzIG5pY2h0LCBzYWcgYml0dGUgZWluZW0gRXJ6bWFnaWVyIEJlc2NoZWlkISAiCisgICJSZXN1bHRhdD0iK3Jlc3VsdGF0KyJcbiIpOworICBpZihyZXN1bHRhdCE9MSkKKyAgICByZXR1cm4gMDsKKyAgd3JpdGUoQlMoIkR1IHN0ZWxsc3QgZGVuIFBva2FsIGluIGRpZSBWaXRyaW5lIHVuZCBiZXd1bmRlcnN0IGlobiBub2NoIGVpbiAiCisgICJ3ZW5pZy5cbiIpKTsKKyAgc2F5KFRQTisiIHN0ZWxsdCBlaW5lbiBQb2thbCBpbiBkaWUgVml0cmluZS5cbiIsVFApOworICBHZXRUcm9waHlEZXRhaWxzKCk7CisgIG9iLT5yZW1vdmUoKTsKKyAgaWYob2IpCisgICAgZGVzdHJ1Y3Qob2IpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YWZmZW5zY2hyYW5rLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3dhZmZlbnNjaHJhbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YWZmZW5zY2hyYW5rLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFdhZmZlbnNjaHJhbmsKKy8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDIyLjAzLjIwMDEKKy8vIE1hZ2llcjogICAgICAgICAgICAgIFN3aWZ0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBDaGFuZ2Vsb2cKKyAgICogMjEuMDUuMjAwNywgWmVzc3RyYQorICAgICBLYW1wZnN0YWViZSBhdWYgSGlud2VpcyB2b24gdGFzc3JhbSBlcmdhZW56dC4KKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KK2luaGVyaXQgTEFERU4oInN3aWZ0X3N0ZF9jb250YWluZXIiKTsKKworI2RlZmluZSBWRVJTSU9OX09CSiAiNiIKKworc3RyaW5nIHN0cmFsbDsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAoVE8pKSByZXR1cm47CisgIHN3aWZ0X3N0ZF9jb250YWluZXI6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gV2FmZmVuc2NocmFuayIpOworICBTZXRQcm9wKFBfTE9ORywgQlMoCisgICAgICJNaXQgZGVuIFdhZmZlbiwgZGllIGluIGRpZXNlbiBtYXNzaXZlbiBIb2x6c2NocmFuayBwYXNzZW4sIGtvZW5udGVzdCAiCisgICAgKyJEdSBlaW4gZ2FuemVzIFNvZWxkbmVyaGVlciBhdXNydWVzdGVuLiBGdWVyIGplZGUgV2FmZmVuZ2F0dHVuZyBnaWJ0ICIKKyAgICArImVzIGVpbmVuIGVpZ2VuZW4gUGxhdHosIGRhbWl0IG1hbiBhdWNoIGFsbGVzIGdsZWljaCBmaW5kZXQsIHNvbGx0ZSAiCisgICAgKyJtYW4gZXMgYnJhdWNoZW4uIikrIkBAY250X3N0YXR1c0BAIik7CisgIEFkZElkKCh7IndhZmZlbnNjaHJhbmsiLCAiaG9senNjaHJhbmsiLCAic2NocmFuayJ9KSk7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIFZFUlNJT05fT0JKKTsKKyAgU2V0UHJvcChQX05BTUUsICJXYWZmZW5zY2hyYW5rIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDUgS2cKKyAgU2V0UHJvcChQX01BWF9XRUlHSFQsIDEwMDAwMDApOyAgLy8gRXMgcGFzc2VuIGZ1ZXIgMTAwMCBrZyBTYWNoZW4gcmVpbi4KKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTAwKTsgICAgIC8vIE1laHIgc29sbHRlIG5pY2h0IHNlaW4sIGx0LiBUaWFtYWsuCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIEtlaW4gbWF0ZXJpZWxsZXIgV2VydC4gSXN0IGVoIG5pY2h0IHZlcmthdWZiYXIuCisgIFNldFByb3AoUF9OT0JVWSwgMSk7ICAgICAgICAgICAgIC8vIFdpcmQgaW0gTGFkZW4gemVyc3RvZXJ0LCBmYWxscyBlciB2ZXJrYXVmdCB3aXJkLgorICBTZXRQcm9wKFBfTk9HRVQsICJEYXMgZ2VodCBuaWNodC4gIitOYW1lKFdFUiwxKSsiIGhhZnRldCB3aWUgbWFnaXNjaCBhbSBCb2Rlbi5cbiIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsICh7TUFUX01JU0NfV09PRCwgTUFUX01JU0NfTUFHSUN9KSApOworICBTZXRQcm9wKFBfSU5GTywgIlZlcnN1Y2hzIG1hbCBtaXQ6IFwic2tvbW1hbmRvcyAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIlwiICFcbiIpOworICBTZXRQcm9wKCJvYmpfY21kIiwgInNsaXN0ZSBbT2JqZWt0LUlkXSBbV2FmZmVudHlwfFwiYWxsZXNcIl1cbiIKKyAgICArIiAgV2FmZmVudHlwZW46IFNjaHdlcnRlciwgU3BlZXJlLCBBZXh0ZSwgS2V1bGVuLCBLYW1wZnN0YWViZSwgTWVzc2VyLCBQZWl0c2NoZW4sXG4iCisgICAgKyIgICAgICAgICAgICAgICBGZXJud2FmZmVuLCBNdW5pdGlvbiwgU29uc3RpZ2VzLCBVbnp1b3JkYmFyXG4iKTsKKworICBBRCgoeyJwbGF0eiJ9KSwgQlMoIkRlciBTY2hyYW5rIGJpZXRldCBQbGF0eiBmdWVyIGplZGUgZXJkZW5rbGljaGUgIgorICAgICsiV2FmZmVuZ2F0dHVuZy4iKSk7CisKKyAgQWRkQ21kKCh7InNsaXN0ZSJ9KSwgImF1Zmxpc3R1bmciKTsKK30KKwordmFyYXJncyBpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpCit7CisgIC8vIEtlaW5lIFdhZmZlPyBIYXQgaW4gZGllc2VtIENvbnRhaW5lciBuaXggdmVybG9yZW4hCisgIGlmKCAhb2ItPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSAmJiAhb2ItPlF1ZXJ5UHJvcChQX1dDKSAmJgorICAgICAgIW9iLT5pZCgiXG5CdW1lcmFuZyIpICYmICFvYi0+aXNfY2xhc3NfbWVtYmVyKENMX0FNTVVOSVRJT04pICYmCisgICAgICAhb2ItPmlkKCJcbmdvcnNlaWxwZmVpbCIpICkKKyAgeworICAgIHdyaXRlKCBCUygiSW4gIituYW1lKFdFTiwxKSsiIGthbm5zdCBEdSBudXIgV2FmZmVuICsgTXVuaXRpb24gbGVnZW4hIikpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gOjpQcmV2ZW50SW5zZXJ0KG9iKTsKK30KKworaW50IGF1Zmxpc3R1bmcyKHN0cmluZyB3YXMsIHN0cmluZyBuZl9zdHIxLCBzdHJpbmcgbmZfc3RyMiwgaW50IGFsbGVzKQoreworICBzdHJpbmcgb2JzaG9ydCwgc3VjaGUsICpzdHJzOworICBvYmplY3QgKm9iczsKKyAgaW50IGk7CisgIG1hcHBpbmcgc3VjaG9iczsKKyAgc3dpdGNoKHdhcykKKyAgeworICAgIGNhc2UgIm11bml0aW9uIiAgIDogc3VjaGU9V1RfQU1NVTsgYnJlYWs7CisgICAgY2FzZSAiYWV4dGUiICAgICAgOiBzdWNoZT1XVF9BWEU7IGJyZWFrOworICAgIGNhc2UgImtldWxlbiIgICAgIDogc3VjaGU9V1RfQ0xVQjsgYnJlYWs7CisgICAgY2FzZSAibWVzc2VyIiAgICAgOiBzdWNoZT1XVF9LTklGRTsgYnJlYWs7CisgICAgY2FzZSAiZmVybndhZmZlbiIgOiBzdWNoZT1XVF9SQU5HRURfV0VBUE9OOyBicmVhazsKKyAgICBjYXNlICJzcGVlcmUiICAgICA6IHN1Y2hlPVdUX1NQRUFSOyBicmVhazsKKyAgICBjYXNlICJzY2h3ZXJ0ZXIiICA6IHN1Y2hlPVdUX1NXT1JEOyBicmVhazsKKyAgICBjYXNlICJwZWl0c2NoZW4iICA6IHN1Y2hlPVdUX1dISVA7IGJyZWFrOworICAgIGNhc2UgInNvbnN0aWdlcyIgIDogc3VjaGU9V1RfTUlTQzsgYnJlYWs7CisgICAgY2FzZSAia2FtcGZzdGFlYmUiOiBzdWNoZT1XVF9TVEFGRjsgYnJlYWs7CisgICAgY2FzZSAidW56dW9yZGJhciIgOiBzdWNoZT0idW56dW9yZGJhciI7IGJyZWFrOworICAgIGRlZmF1bHQgICAgICAgICAgIDogd3JpdGUoIkZlaGxlcjogVW5ndWVsdGlnZXIgV2FmZmVudHlwLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiRm9sZ2VuZGUgVHlwZW4gZ2lidCBlczpcbiIrbmZfc3RyMStuZl9zdHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyBicmVhazsKKyAgfQorICBvYnM9YWxsX2ludmVudG9yeSgpOworICBzdWNob2JzPShbXSk7CisgIGZvcihpPTA7aTxzaXplb2Yob2JzKTtpKyspCisgIHsKKyAgICBvYnNob3J0PXRvX3N0cmluZyhvYnNbaV0tPlF1ZXJ5UHJvcChQX1NIT1JUKSk7CisgICAgaWYob2JzaG9ydD09IkVpbiBCdW1lcmFuZ0BAZmxpZWd0QEAiKQorICAgICAgb2JzaG9ydD0iRWluIEJ1bWVyYW5nIjsKKyAgICBlbHNlIGlmKG9ic2hvcnQ9PSJOaWNodHMgYmVzb25kZXJlcyIgfHwgb2JzaG9ydD09IjAiKSAvLyBrZWluZSBQX1NIT1JUID8KKyAgICAgIG9ic2hvcnQ9b2JzW2ldLT5OYW1lKFdFUik7ICAgICAvLyAgIEhvZmZlbiB3aXIgbWFsIGRhc3MgZGFzIE9iai4gbmVuIE5hbWVuIGhhdC4KKyAgICBpZihvYnNbaV0tPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKT09c3VjaGUgfHwgIC8vIEdlc3VjaHRlciBXZWFwb25UeXBlIGdlZnVuZGVuLi4uCisgICAgICAgKCFvYnNbaV0tPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSAmJiBzdWNoZT09InVuenVvcmRiYXIiKSApCisgICAgeworICAgICAgaWYoc3VjaG9ic1tvYnNob3J0XSkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUF9TSE9SVCBkZXMgT2JqLiBzY2hvbiBpbSBtYXBwaW5nPworICAgICAgeworICAgICAgICBpZiggb2JzW2ldLT5RdWVyeVByb3AoUF9BTU9VTlQpICkKKyAgICAgICAgICBzdWNob2JzW29ic2hvcnRdKz1vYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCk7IC8vICAgRGFubiBkZW4gWmFlaGxlciB1bSBBbW91bnQgaG9jaCEKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN1Y2hvYnNbb2JzaG9ydF0rPTE7ICAgICAgICAgICAgICAgICAgICAgLy8gICBEYW5uIGRlbiBaYWVobGVyIHVtIDEgaG9jaCEKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYoIG9ic1tpXS0+UXVlcnlQcm9wKFBfQU1PVU5UKSApCisgICAgICAgICAgc3VjaG9icys9KFtvYnNob3J0OiBvYnNbaV0tPlF1ZXJ5UHJvcChQX0FNT1VOVCldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN1Y2hvYnMrPShbb2JzaG9ydDogMV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBzdHJzPW1faW5kaWNlcyhzdWNob2JzKTsKKyAgaWYoc2l6ZW9mKHN0cnMpKQorICB7CisgICAgaWYoIWFsbGVzKQorICAgIHsKKyAgICAgIGlmKHN1Y2hlPT0idW56dW9yZGJhciIpCisgICAgICAgIHN0cmFsbCs9TmFtZShXRVIsMSkrIiBlbnRoYWVsdCBmb2xnZW5kZSBuaWNodCB6dW9yZGJhcmUgV2FmZmVuOlxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyYWxsKz1OYW1lKFdFUiwxKSsiIGVudGhhZWx0IGZvbGdlbmRlICIrQ0FQKHdhcykrIjpcbiI7CisgICAgICBzdHJhbGwrPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZihzdWNoZT09InVuenVvcmRiYXIiKQorICAgICAgICBzdHJhbGwrPUFOU0lfQk9MRCsiPT09IE5pY2h0IHp1b3JkYmFyZSBXYWZmZW46XG4iK0FOU0lfTk9STUFMOworICAgICAgZWxzZQorICAgICAgICBzdHJhbGwrPUFOU0lfQk9MRCsiPT09ICIrQ0FQKHdhcykrIjpcbiIrQU5TSV9OT1JNQUw7CisgICAgfQorICAgIGZvcihpPTA7aTxzaXplb2Yoc3Rycyk7aSsrKQorICAgIHsKKyAgICAgIGlmKHN1Y2hvYnNbc3Ryc1tpXV0gPiAxKQorICAgICAgICBzdHJhbGwrPXN0cnNbaV0rIi4gKCIrc3VjaG9ic1tzdHJzW2ldXSsiKVxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyYWxsKz1zdHJzW2ldKyIuXG4iOworICAgIH0KKyAgfQorICBlbHNlCisgICAgaWYoIWFsbGVzKQorICAgICAgc3RyYWxsKz1OYW1lKFdFUiwxKSsiIGVudGhhZWx0IGtlaW5lICIrQ0FQKHdhcykrIiFcbiI7CisgIHJldHVybiAxOworfQorCitpbnQgYXVmbGlzdHVuZyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnN0cnMsIG9iX2lkLCB3YXMsIG5mX3N0cjEsbmZfc3RyMjsKKyAgc3RyYWxsPSIiOworICBuZl9zdHIxPSIgICAoU2Nod2VydGVyLCBTcGVlcmUsIEFleHRlLCBLZXVsZW4sIEthbXBmc3RhZWJlLCBNZXNzZXIsIFBlaXRzY2hlbixcbiIKKyAgICAgICAgICsiICAgIEZlcm53YWZmZW4sIE11bml0aW9uLCBTb25zdGlnZXMsIFVuenVvcmRiYXIpXG4iOworICBuZl9zdHIyPSJTeW50YXg6IHNsaXN0ZSBbT2JqZWt0LUlkXSBbV2FmZmVudHlwXVxuIgorICAgICAgICAgKyJCc3AuOiAgIHNsaXN0ZSAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rIiAiKyJzY2h3ZXJ0ZXJcbiIKKyAgICAgICAgICsiICAgICAgICBzbGlzdGUgIitRdWVyeVByb3AoUF9JRFMpWzFdKyIgYWxsZXNcbiI7CisgIG5vdGlmeV9mYWlsKCJGZWhsZXI6IE9obmUgUGFyYW1ldGVyIGtsYXBwdCBkYXMgbmljaHQuXG4iK25mX3N0cjIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpPT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgZGllc2VzIE9iamVrdCBnZW1laW50IGlzdCEKKyAgeworICAgIHdyaXRlKCJGZWhsZXI6IEVzIGZlaGx0IGVpbiBXYWZmZW50eXAuIEZvbGdlbmRlIFR5cGVuIGdpYnQgZXM6XG4iCisgICAgICAgICArbmZfc3RyMStuZl9zdHIyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdHJzPW9sZF9leHBsb2RlKHN0ciwgIiAiKTsKKyAgbm90aWZ5X2ZhaWwoIkZlaGxlcjogRHUgbXVzc3QgZWluZSBndWVsdGlnZSBPYmpla3QtSWQgYW5nZWJlbiFcbiIKKyAgICAgICAgICAgICArbmZfc3RyMik7CisgIGlmKCBzaXplb2Yoc3RycykgPCAyICkgcmV0dXJuIDA7ICAgLy8gTnVyIDEgUGFyLiB1bmQgZGVyIGlzdCBuaWNodCBkaWUgT2JqZWt0LUlkCisgIGlmKCBzaXplb2Yoc3RycykgPT0gMiApICAgLy8gQW56YWhsIFBhci4gPSAyCisgIHsKKyAgICBvYl9pZD1zdHJzWzBdOworICAgIHdhcz1zdHJzWzFdOworICAgIGlmKCBJU1RfWkFITCh3YXMpICkgICAgIC8vIE9iamVrdC1JZCB6LkIuIG1pdCAic2NocmFuayAyIiBhbmdlc3Byb2NoZW4/CisgICAgICBpZihwcmVzZW50KG9iX2lkKyIgIit3YXMpPT1UTykgICAvLyBGYWxscyBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IHVuZCBrZWluIDMuIFBhciEKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIkZlaGxlcjogRXMgZmVobHQgZWluIFdhZmZlbnR5cC4gRm9sZ2VuZGUgVHlwZW4gZ2lidCBlczpcbiIKKyAgICAgICAgICAgICAgK25mX3N0cjErbmZfc3RyMik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKCBzaXplb2Yoc3RycykgPT0gMyApCisgIHsKKyAgICBvYl9pZD1zdHJzWzBdKyIgIitzdHJzWzFdOworICAgIHdhcz1zdHJzWzJdOworICB9CisgIGVsc2UgICAgICAgIC8vIEFuemFobCBlcmZvcmRlcmxpY2hlciBQYXJhbWV0ZXIgdWViZXJzY2hyaXR0ZW4hCisgICAgcmV0dXJuIDA7CisgIGlmKHByZXNlbnQob2JfaWQpIT1UTykgICAvLyBVZWJlcnBydWVmZSwgb2IgYXVjaCBkaWVzZXMgT2JqZWt0IGdlbWVpbnQgaXN0IQorICAgIHJldHVybiAwOworICBpZihRdWVyeVByb3AoUF9DTlRfU1RBVFVTKSE9Q05UX1NUQVRVU19PUEVOKQorICB7CisgICAgd3JpdGUoIkRhenUgbXVlc3N0ZSAiK25hbWUoV0VSLDEpKyIgZ2VvZWZmbmV0IHNlaW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorLy8tLS0gSGllciBpc3QgUGFyYW1ldGVycHJ1ZWZ1bmcgenUgRW5kZS4KKyAgd2FzPUxPV0VSKHdhcyk7CisgIGlmKHdhcyE9ImFsbGVzIikKKyAgICBhdWZsaXN0dW5nMih3YXMsIG5mX3N0cjEsIG5mX3N0cjIsIDApOworICBlbHNlCisgIHsKKyAgICBhdWZsaXN0dW5nMigiYWV4dGUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigia2V1bGVuIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoImthbXBmc3RhZWJlIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoIm1lc3NlciIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJzcGVlcmUiLCBuZl9zdHIxLCBuZl9zdHIyLCAxKTsKKyAgICBhdWZsaXN0dW5nMigic2Nod2VydGVyIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInBlaXRzY2hlbiIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJmZXJud2FmZmVuIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoIm11bml0aW9uIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgICAgYXVmbGlzdHVuZzIoInNvbnN0aWdlcyIsIG5mX3N0cjEsIG5mX3N0cjIsIDEpOworICAgIGF1Zmxpc3R1bmcyKCJ1bnp1b3JkYmFyIiwgbmZfc3RyMSwgbmZfc3RyMiwgMSk7CisgIH0KKyAgVFAtPk1vcmUoc3RyYWxsKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3dhZmZlbnRydWhlLmMgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3dhZmZlbnRydWhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4YWFhNwotLS0gL2Rldi9udWxsCisrKyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvd2FmZmVudHJ1aGUuYwpAQCAtMCwwICsxLDQzIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOYW1lIGRlcyBPYmplY3RzOiAgICBXYWZmZW50cnVoZQorLy8gTGV0enRlIEFlbmRlcnVuZzogICAgMjIuMDMuMjAwMQorLy8gTWFnaWVyOiAgICAgICAgICAgICAgU3dpZnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIENoYW5nZWxvZworICAgKiAyMS4wNS4yMDA3LCBaZXNzdHJhCisgICAgIERhIFdhZmZlbnNjaHJhbmsgdW5kIFdhZmZlbnRydWhlIHNpY2ggcHJha3Rpc2NoIG5pY2h0IHVudGVyc2NoZWlkZW4sIGJpcworICAgICBhdWYgMTAgWmVpbGVuIGltIENyZWF0ZSwgZXJidCBudW4gZGllIFdhZmZlbnRydWhlIGRlbiBXYWZmZW5zY2hyYW5rIHVuZAorICAgICB1ZWJlcnNjaHJlaWJ0IGVpbmZhY2ggZGllIHBhc3NlbmRlbiBQcm9wcy4KKyovCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKy8vaW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworaW5oZXJpdCBMQURFTigid2FmZmVuc2NocmFuayIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICI3IgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKFRPKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIFdhZmZlbnRydWhlIik7CisgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkRpZXNlIFN0YWhsdHJ1aGUgaXN0IHNwZXppZWxsIHp1ciBBdWZuYWhtZSB2b24gZ3Jvc3NlbiBXYWZmZW5tZW5nZW4gIgorICAgICAiZ2VmZXJ0aWd0LiBWZXJzY2hpZWRlbmUgRmFlY2hlciBmdWVyIGRpZSBlaW56ZWxuZW4gV2FmZmVudHlwZW4gZXJsZWljaHRlcm4gIgorICAgICAiZGllIFN1Y2hlIG5hY2ggRGVpbmVtIGJldm9yenVndGVuIFdhZmZlbnR5cC4iKSsiQEBjbnRfc3RhdHVzQEAiKTsKKyAgUmVtb3ZlSWQoKHsid2FmZmVuc2NocmFuayIsICJob2x6c2NocmFuayIsICJzY2hyYW5rIn0pKTsKKyAgQWRkSWQoKHsid2FmZmVudHJ1aGUiLCAic3RhaGx0cnVoZSIsICJ0cnVoZSJ9KSk7CisgIFNldFByb3AoImNudF92ZXJzaW9uX29iaiIsIFZFUlNJT05fT0JKKTsKKyAgU2V0UHJvcChQX05BTUUsICJXYWZmZW50cnVoZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCBGRU1BTEUpOyAgCisgIFNldFByb3AoUF9NQVRFUklBTCwgKHtNQVRfTUlTQ19NRVRBTCwgTUFUX01JU0NfTUFHSUN9KSApOworICBTZXRQcm9wKFBfSU5GTywgIlZlcnN1Y2hzIG1hbCBtaXQ6IFwic2tvbW1hbmRvcyAiK1F1ZXJ5UHJvcChQX0lEUylbMV0rCisgICAgIlwiICFcbiIpOworICBBRCgoeyJmYWVjaGVyIn0pLCBCUygiRnVlciBqZWRlbiBXYWZmZW50eXAgZ2lidCBlcyBlaW4gZWlnZW5lcyBGYWNoLCBzbyBkYXNzICIKKyAgICAiRHUgZWluZSBiZXNzZXJlIFVlYmVyc2ljaHQgaGFzdC4iKSk7CisgIEFEKCh7InBsYXR6In0pLCBCUygiRGllIFdhZmZlbnRydWhlIGJpZXRldCBQbGF0eiBmdWVyIGplZGUgZXJkZW5rbGljaGUgIgorCSJXYWZmZW5nYXR0dW5nLiIpKTsKK30KKwpkaWZmIC0tZ2l0IGEvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YXNjaC5jIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC93YXNjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODkzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3dhc2NoLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFdhc2Nob2JqZWt0CisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAwMS4wNC4yMDA1CisvLyBNYWdpZXI6ICAgICAgICAgICAgICBTZWxldmVuCisvLyBEaWVzZXMgRmlsZSBnaWJ0IGRlbSBTcGllbGVyIGRpZSBNb2VnbGljaGtlaXQsIGVpbmUgV2FzY2hnZWxlZ2VuaGVpdCBpbgorLy8gc2VpbmVtIFNlaGVyaGF1cyBhdWZ6dXN0ZWxsZW4uIERhcyBiZWltIEtvbW1hbmRvIHdhc2NoKGUpLCBkdXNjaChlKSBsYWVzc3QKKy8vIHNpY2ggZGllIE1lZHVuZyB1ZWJlcnNjaHJlaWJlbiAoVGVzdCBwZXIgcmF1bS0+UXVlcnlQcm9wKCJoX2NvbW1hbmRzIikpCisvLyAwMS4wNy4yMDA3IChaZXNzdHJhKTogR2V0T3duZXIoKSBkZWZpbmllcnQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MKKworI2luY2x1ZGUgInNjaHJhbmtsYWRlbi5oIgoraW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCitzdHJpbmcgKndjbWQ7CitzdHJpbmcgKm9iamVrdGUgPQorICAoKHsiXG5zdGlua29iaiIsIlxuemVzc3RyYV9hc2NoZSIsInNlbGV2ZVxuc2NoZWlzc2UiLCJcbnBvcGMiLAorICAgICAiXG5zc3Bib2xsZW4iLCJzZWxldmVcbnN0aW5rb2JqIiwiXG5xMnBfZ2VzdGFuayIsImJlclx0cmFtX3Nrb3QiLAorICAgICAiYmFtYmlcbnNjaG11dHppZ2VoYWVuZGUifSkpOworLyogV3VyemVsKEtsby9JbWJpc3MpLCBaZXNzdHJhKFZ1bGthbi9JbGx1bWluYXRvcyksIFNlbGV2ZW4oS2xvL05lYmVsZWxmZW4pLAorICogU2VsZXZlbihQb3Bjb3JuL05lYmVsZWxmZW4pLCBCb2luZyhTY2hsZWltc2NobWVpc3NlcixTU1ApLCBTVEFOREFSVAorICovCisKK3N0YXRpYyB2b2lkIHdhc2NoX2Z1bigpOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworCisgIHdjbWQgPSAoKHsid2FzY2hlIiwid2FzY2giLCJkdXNjaGUiLCJkdXNjaCJ9KSk7CisgIEFkZElkKCh7ImR1c2Noa2FiaW5lIiwia2FiaW5lIiwiZHVzY2hlIiwid2FzY2hnZWxlZ2VuaGVpdCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJEdXNjaGthYmluZSIpOworICAKKyAgU2V0UHJvcCgiY250X3ZlcnNpb25fb2JqIiwxKTsKKworICBTZXRQcm9wKCJvYmpfY21kIiwKKyAgIndhc2NoKGUpLCBkdXNjaChlKVxuIisKKyAgIiAgIERhbWl0IGxhZXNzdCBzaWNoIGRhcyBTdGlua2VuIGF1cyBkZW0gSW1iaXNza2xvIGJlc2VpdGlnZW4uXG4iKworICAiICAgV2VubiBrZWluIEJlZmVobCAnd2FzY2goZSknIGltIFJhdW0gYmVzY2hyaWViZW4gaXN0LCBlcmZvbGd0IGVpbmVcbiIrCisgICIgICBTdGFuZGFydG1lbGR1bmcsIHNlbGJpZ2VzIGdpbHQgZnVlciAnZHVzY2goZSknLlxuIisKKyAgInNzZXR6KGUpIHdhc2NoYmVmZWhsXG4iKworICAiICAgRGFtaXQga2FubiBtYW4gZGllIEJlZmVobHNsaXN0ZSBlcndlaXRlcm4sIGRpZSBkYXMgV2FzY2hlbiBcbiIrCisgICIgICBhdXNsb2VzZW5cbiIrCisgICJzbG9lc2NoKGUpIHdhc2NoYmVmZWhsXG4iKworICAiICAgRGFtaXQga2FubiBtYW4gZWluZW4gQmVmZWhsIGF1cyBkZXIgTGlzdGUgbG9lc2NoZW5cbiIrCisgICJ3YXNjaGJlZmVobHNsaXRlLCB3YmwiKworICAiICAgWmVpZ3QgZWluZSBMaXN0ZSBkZXIgQmVmZWhsZSBhbiwgZGllIGRhcyBXYXNjaGVuIGF1c2xvZXNlbi5cbiIpOworCisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBEdXNjaGthYmluZSIpOworICBTZXRQcm9wKFBfTE9ORyxCUygiRGllIER1c2Noa2FiaW5lIGhhdCBlaW5lbiBSYWhtZW4gYXVzIGhlbGxlbSBIb2x6LiAiCisgICAiRGF6d2lzY2hlbiB3dXJkZW4gbWF0dGUgU2NoZWliZW4gZWluZ2VsYXNzZW4sIGRhbWl0IG1hbiBuaWVtYW5kZW4gYmVpbSAiCisgICAiRHVzY2hlbiBiZW9iYWNodGVuIGthbm4uIikpOworICBBZGREZXRhaWwoInJhaG1lbiIsIkRlciBSYWhtZW4gaXN0IGF1cyBoZWxsZW0gSG9sei5cbiIpOworICBBZGREZXRhaWwoKHsic2NoZWliZW4iLCJzY2hlaWJlIn0pLCJEaWUgU2NoZWliZW4gZGVyIER1c2Noa2FiaW5lIHNpbmQgIisKKyAgICJtYXR0IHVuZCBhYnNvbHV0IHVuZHVyY2hzaWNodGlnIVxuIik7CisgIEFkZERldGFpbCgoeyJkdXNjaGVuIiwiYmVpbSBkdXNjaGVuIn0pLAorICAgIk1hbiBrYW5uIG5pZW1hbmRlbiBiZWltIER1c2NoZW4gYmVvYmFjaHRlbi5cbiIpOworCisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDUwMDApOyAgICAgICAgIC8vIEdld2ljaHQgNSBLZworICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMCk7ICAgICAgICAvLyBTb2xsIG51ciBuIHBzZXVkby1Db250YWluZXIKKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULCAxMDApOyAgLy8gRGFmdWVyIG1hY2h0IGVyIGF1Y2ggbml4IGxlaWNodGVyIDopCisgIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMCk7ICAgICAgIC8vIEtlaW4gQ29udGFpbmVyIDopCisgIFNldFByb3AoUF9WQUxVRSwgMCk7ICAgICAgICAgICAgIC8vIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBGYWxzIGRvY2g6IHplcnN0b2VyZW4hCisgIFNldFByb3AoUF9OT0dFVCwKKyAgICAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9NSVNDX1dPT0QsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKworICBBZGRDbWQod2NtZCwiY21kX3dhc2NoZW4iKTsKKyAgUmVtb3ZlQ21kKCh7Im9lZmZuZSIsIm9lZmZuIiwic2NobGllc3NlIiwic2NobGllc3MifSkpOworICBBZGRDbWQoKHsic3NldHplIiwic3NldHoifSksImNtZF9zZXR6ZW4iKTsKKyAgQWRkQ21kKCh7InNsb2VzY2hlIiwic2xvZXNjaGUifSksImNtZF9sb2VzY2hlbiIpOworICBBZGRDbWQoKHsid2JsIiwid2FzY2hiZWZlaGxzbGlzdGUifSksImxpc3RlIik7Cit9CisKKy8vIFplc3N0cmEsIDEuNy4wNywgZnVlcnMgSG9lcnJvaHIKK3N0cmluZyBHZXRPd25lcigpIHtyZXR1cm4gInNlbGV2ZW4iO30KKwordmFyYXJncyBpbnQgUHJldmVudEluc2VydChvYmplY3Qgb2IpIHtyZXR1cm4gMTt9IC8vRGFzIGlzdCBrZWluIENvbnRhaW5lciA6KQorCitzdGF0aWMgdm9pZCB3YXNjaF9mdW4oKQoreworICBpbnQgaTsKKyAgb2JqZWN0IG9iOworICBpID0gc2l6ZW9mKG9iamVrdGUpOworICBpLS07CisgIHdoaWxlKGkgPiAtMSkKKyAgeworCisgICAgaWYoIVRQKSByZXR1cm47CisgICAgb2IgPSBwcmVzZW50KG9iamVrdGVbaV0sVFApOworICAgIHdoaWxlKG9iKQorICAgIHsKKyAgICAgIGlmKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorCSAgeworCSAgICB0ZWxsX29iamVjdChUUCxCUygiRHUgc2NoZWluc3QgamVtYW5kZW4gaW4gRGVpbmVtIEludiB6dSBoYWJlbiFcbiIKKwkgICAgICJEYXMgc29sbHRlIHNpY2ggdmllbGxlaWNodCBlaW4gTWFnaWVyIGFuc2NoYXVlbi4iKSk7CisJICAgIGktLTsKKwkgICAgcmV0dXJuOworICAgICAgfQorICAgICAgb2ItPnJlbW92ZSgxKTsKKyAgICAgIGlmKHByZXNlbnQob2JqZWt0ZVtpXSxUUCkpOworICAgICAgIG9iID0gcHJlc2VudChvYmpla3RlW2ldLFRQKTsKKyAgICB9CisgICAgaS0tOworCisgIH0KK30KKworaW50IGNtZF93YXNjaGVuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB2ZXJiOworICB2ZXJiID0gcXVlcnlfdmVyYigpOworICBpZighZW52aXJvbm1lbnQoKSkgcmV0dXJuIDA7CisgIGlmKCAhZXJsYXVidCgpICkKKyAgeworICAgICAgd3JpdGUoIkR1IHNvbGx0ZXN0IGRlbiBCZXNpdHplciB2aWVsbGVpY2h0IHVtIEVybGF1Ym5pcyBiaXR0ZW4uXG4iKTsKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmKG1lbWJlcihlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoImhfY29tbWFuZHMiKSx2ZXJiKSA9PSAwKQorICB7CisgICAgd3JpdGUoCisgICAgICJEdSBzcHJpbmdzdCBzY2huZWxsIHVudGVyIGRpZSBEdXNjaGUgdW5kIHdhZXNjaHN0IERpY2ggZ3J1ZW5kbGljaC5cbiIpOworICAgIHNheSh0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBzcHJpbmd0IHNjaG5lbGwgdW50ZXIgZGllIER1c2NoZS5cbiIpOworICAgIHdhc2NoX2Z1bigpOworICAgIHJldHVybiAxOworICB9CisgIHdhc2NoX2Z1bigpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGNtZF9zZXR6ZW4oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGJlZjsKKyAgbm90aWZ5X2ZhaWwoIk1vZWNodGVzdCBEdSBlaW5lbiBXYXNjaGJlZmVobCBzZXR6ZW4/XG4iKworICAgICJTeW50YXg6IHNzZXR6KGUpIHdhc2NoYmVmZWhsIFtiZWZlaGxdXG4iKTsKKyAgaWYoIXN0ciB8fCAhc3RyaW5ncChzdHIpIHx8IHNpemVvZihzdHIpID09IDApIHJldHVybiAwOworICBzc2NhbmYoc3RyLCJ3YXNjaGJlZmVobCAlcyIsYmVmKTsKKyAgaWYoIWJlZikgcmV0dXJuIDA7CisgIGlmKGJlZltzaXplb2YoYmVmKSAuLiBzaXplb2YoYmVmKS0xXSA9PSAiZSIpCisgICBiZWYgPSBiZWZbc2l6ZW9mKGJlZikgLi4gc2l6ZW9mKGJlZiktMl07CisgIG5vdGlmeV9mYWlsKCJEZXIgQmVmZWhsIHN0ZWh0IHNjaG9uIGF1ZiBkZXIgTGlzdGUuXG4iKTsKKyAgaWYobWVtYmVyKHdjbWQsYmVmKSAhPSAtMSkgcmV0dXJuIDA7CisgIHdjbWQgKz0gKCh7YmVmLGJlZisiZSJ9KSk7CisgIEFkZENtZCh3Y21kLCJjbWRfd2FzY2hlbiIpOworICB3cml0ZShCUygiRHUgaGFzdCBkaWUgQmVmZWhsZSAiK2JlZisiIHVuZCAiK2JlZisiZSBhbiBkaWUgTGlzdGUgIgorICAgImFuZ2VmdWVndC4iKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNtZF9sb2VzY2hlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgYmVmOworICBub3RpZnlfZmFpbCgiTW9lY2h0ZXN0IER1IGVpbmVuIFdhc2NoYmVmZWhsIGxvZXNjaGVuP1xuIisKKyAgICAiU3ludGF4OiBzbG9lc2NoKGUpIHdhc2NoYmVmZWhsIFtiZWZlaGxdXG4iKTsKKyAgaWYoIXN0ciB8fCAhc3RyaW5ncChzdHIpIHx8IHNpemVvZihzdHIpID09IDApIHJldHVybiAwOworICBzc2NhbmYoc3RyLCJ3YXNjaGJlZmVobCAlcyIsYmVmKTsKKyAgaWYoIWJlZikgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJEZXIgQmVmZWhsIHN0ZWh0IGdhciBuaWNodCBhdWYgZGVyIExpc3RlLlxuIik7CisgIGlmKG1lbWJlcih3Y21kLGJlZikgPT0gLTEpIHJldHVybiAwOworICB3Y21kIC09ICgoe2JlZn0pKTsKKyAgUmVtb3ZlQ21kKGJlZik7CisgIHdyaXRlKEJTKCJEdSBoYXN0IGRpZSBCZWZlaGxlICIrYmVmKyIgdW5kICIrYmVmKyJlIHZvbiBkZXIgTGlzdGUgIgorICAgImVudGZlcm50LiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbGlzdGUoc3RyaW5nIHN0cikKK3sKKyAgd3JpdGUoIkR1IGhhc3QgZm9sZ2VuZGUgQmVmZWhsZSBhdWYgZGVyIFdhc2NobGlzdGUgc3RlaGVuOlxuIisKKyAgIGJyZWFrX3N0cmluZyhpbXBsb2RlKHdjbWQsIiwgIiksNzgsMykpOworICByZXR1cm4gMTsKK30KKworCisKKy8vIG9lZmZuZW4gdW5kIHNjaGxpZXNzZW4gYXVzYmF1ZW4uCit2YXJhcmdzIGludCBza29tbWFuZG9zKHN0cmluZyBzdHIpCit7CisgIG5vdGlmeV9mYWlsKCAiRmVobGVyOiBEaWVzZXIgQmVmZWhsIGJlbm9ldGlndCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbHMgUGFyYW1ldGVyLlxuIgorICAgICsiQmVpc3BpZWw6IHNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcbiIpOworICBpZighc3RyKSByZXR1cm4gMDsKKyAgaWYocHJlc2VudChzdHIpIT1UTyApIC8vIEJpbiBpY2ggZ2VtZWludD8KKyAgICByZXR1cm4gMDsKKyAgd3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgd3JpdGUoIkFrdHVlbGxlIFZlcnNpb246ICIrUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9zdGQiKStRdWVyeVByb3AoImNudF92ZXJzaW9uX29iaiIpKyJcbiIpOworICB3cml0ZSggQlMoTmFtZShXRVIsMSkrIiBrYW5uIG51ciBpbiBkaWVzZW0gU2VoZXJoYXVzIHZlcndlbmRldCB3ZXJkZW4sICIKKyAgICArImRhICIrUXVlcnlQcm9ub3VuKFdFUikrIiBzcGV6aWVsbCBkYWZ1ZXIgZ2VrYXVmdCB3dXJkZS4gIitDQVAoUXVlcnlQcm9ub3VuKFdFUikpCisgICAgKyIgdmVyZnVlZ3QgdWViZXIgZm9sZ2VuZGUgS29tbWFuZG9zOiIpCisgICAgKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICsic2VybGF1YmUgW09iamVrdC1JZF0gW1NwaWVsZXJuYW1lfFwiaGF1c2ZyZXVuZGVcInxcInp3ZWl0aWVzXCJdXG4iCisgICAgKyIgIEVybGF1YnQgUGVyc29uZW4sICIrbmFtZShXRU4sMSkrIiBtaXR6dWJlbnV0emVuLlxuIgorICAgICsiICBzZXJsYXViZSArIE9iamVrdC1JZCAob2huZSBTcGllbGVybmFtZS9oYXVzZnJldW5kZSlcbiIKKyAgICArIiAgbGlzdGV0IGFsbGUgUGVyc29uZW4gbWl0IFp1Z3JpZmYgYXVmICIrbmFtZShXRU4sMSkrIlxuXG4iCisgICAgKyJ2ZXJzY2hpZWJlIFtPYmpla3QtSWRdIG5hY2ggW0F1c2dhbmddXG4iCisgICAgKyIgIERhbWl0IGthbm5zdCBEdSAiK25hbWUoV0VOLDEpKyIgaW5uZXJoYWxiIERlaW5lcyBTZWhlcmhhdXNlcyB2ZXJzY2hpZWJlbi5cblxuIgorICAvL1NlbGV2ZW4gMDcuMTIuMjAwNQorICAgICsic3ZlcnN0ZWNrZSBbT2JqZWt0LUlkXVxuIgorICAgICsiICBEYW1pdCBtYWNoc3QgRHUgIituYW1lKFdFTiwxKSsiIHVuc2ljaHRiYXIuXG4iCisgICAgKyJzaG9sZSBbT2JqZWt0LUlkXSBoZXJ2b3JcbiIKKyAgICArIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB3aWVkZXIgc2ljaHRiYXIuXG4iCisgIC8vIEJpcyBoaWVyCisgICAgKyJ6ZXJ0cnVlbW1lciBbT2JqZWt0LUlkXVxuIgorICAgICsiICBEYW1pdCB6ZXJzdG9lcnN0IER1ICIrbmFtZShXRU4sMSkrIi5cblxuIik7CisKKworICBpZiggUXVlcnlQcm9wKCJvYmpfY21kIikgKQorICAgIHdyaXRlKCBRdWVyeVByb3AoIm9ial9jbWQiKSsiXG4iICk7CisKKyAgd3JpdGUoIltPYmpla3QtSWRdIG11c3MgZWluZSBndWVsdGlnZSBJZCBzZWluLCBpbiBkaWVzZW0gRmFsbCB6LkIuICIKKyAgICAgICtRdWVyeVByb3AoUF9JRFMpWzFdKyJcbiIpOworICB3cml0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvemF1YmVya2lzdGUuYyBiL2Qvc2VoZXIvaGFldXNlci9tb2ViZWwvemF1YmVya2lzdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y2Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL21vZWJlbC96YXViZXJraXN0ZS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWUgZGVzIE9iamVjdHM6ICAgIFphdWJlcmtpc3RlCisvLyBMZXR6dGUgQWVuZGVydW5nOiAgICAxMC4wNS4yMDAyCisvLyBNYWdpZXI6ICAgICAgICAgICAgICBWYW5pb24KKy8vIFdhczogICAgICAgICAgICAgICAgIERpZSBJRCBmdWVyIGRpZSBLb21wb3MgZGVyIFphdWJlcmVyIHVtZ2VzdGVsbHQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICJzY2hyYW5rbGFkZW4uaCIKKworLy8gRnVlciBkaWUgSURzCisjaW5jbHVkZSAiL3AvemF1YmVyZXIvemF1YmVyZXIuaCIKKworaW5oZXJpdCBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOworCisjZGVmaW5lIFZFUlNJT05fT0JKICIzIgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChUTykpIHJldHVybjsKKyAgc3dpZnRfc3RkX2NvbnRhaW5lcjo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgWmF1YmVya2lzdGUiKTsKKyAgU2V0UHJvcChQX0xPTkcsIEJTKAorICAgICAiRWluZSBrbGVpbmUgS2lzdGUgYXVzIEJpcm5iYXVtaG9sei4gRGEgZGllc2VtIHNlbHRlbmVuIEhvbHogc2VsYnN0ICIKKyAgICArIm1hZ2lzY2hlIEZhZWhpZ2tlaXRlbiBuYWNoZ2VzYWd0IHdlcmRlbiwgaXN0IGVzIHdvaGwgZGFzIGlkZWFsZSBNYXRlcmlhbCwgIgorICAgICsidW0gZGllIHRlaWx3ZWlzZSBnZWZhZWhybGljaGVuIEtvbXBvbmVudGVuIGVpbmVzIFphdWJlcmVycyBkYXJpbiAiCisgICAgKyJ1bnRlcnp1YnJpbmdlbi4iKSsiQEBjbnRfc3RhdHVzQEAiKTsKKyAgQWRkSWQoKHsiemF1YmVya2lzdGUiLCAia2lzdGUifSkpOworICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CisgIFNldFByb3AoUF9OQU1FLCAiWmF1YmVya2lzdGUiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNTAwMCk7ICAgICAgICAgLy8gR2V3aWNodCA1IEtnCisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAxMDAwMDAwKTsgIC8vIEVzIHBhc3NlbiBmdWVyIDEwMDAga2cgU2FjaGVuIHJlaW4uCisgIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQorICBTZXRQcm9wKFBfTUFYX09CSkVDVFMsIDEwMCk7ICAgICAvLyBNZWhyIHNvbGx0ZSBuaWNodCBzZWluLCBsdC4gVGlhbWFrLgorICBTZXRQcm9wKFBfVkFMVUUsIDApOyAgICAgICAgICAgICAvLyBLZWluIG1hdGVyaWVsbGVyIFdlcnQuIElzdCBlaCBuaWNodCB2ZXJrYXVmYmFyLgorICBTZXRQcm9wKFBfTk9CVVksIDEpOyAgICAgICAgICAgICAvLyBXaXJkIGltIExhZGVuIHplcnN0b2VydCwgZmFsbHMgZXIgdmVya2F1ZnQgd2lyZC4KKyAgU2V0UHJvcChQX05PR0VULCAiRGFzIGdlaHQgbmljaHQuICIrTmFtZShXRVIsMSkrIiBoYWZ0ZXQgd2llIG1hZ2lzY2ggYW0gQm9kZW4uXG4iKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9QRUFSX1dPT0QsIE1BVF9NSVNDX01BR0lDfSkgKTsKKyAgU2V0UHJvcChQX0lORk8sICJWZXJzdWNocyBtYWwgbWl0OiBcInNrb21tYW5kb3MgIitRdWVyeVByb3AoUF9JRFMpWzFdKyJcIiAhXG4iKTsKKworICBBRCgoeyJob2x6IiwgImJpcm5iYXVtaG9seiJ9KSwgQlMoIkZhc3Qga29lbm50ZXN0IER1IG1laW5lbiwgZGFzcyAiK25hbWUoV0VSLDEpCisgICAgKyIgbGVidCEiKSk7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKQoreworICAvLyBLZWluZSBaYXViZXJrb21wbz8gSGF0IGluIGRpZXNlbSBDb250YWluZXIgbml4IHZlcmxvcmVuIQorICBpZiggIW9iLT5pZChaX0lEX1pVVEFUKSApCisgIHsKKyAgICB3cml0ZSggQlMoIkluICIrbmFtZShXRU4sMSkrIiBrYW5uc3QgRHUgbnVyIFphdWJlcmVyLUtvbXBvbmVudGVuIGxlZ2VuISIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDo6UHJldmVudEluc2VydChvYik7Cit9Cg==