I2luY2x1ZGUgPGRlZmluZXMuaD4KI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPG1vdmluZy5oPgovLwovLyBCeSBSdW1hdGFATW9yZ2VuR3JhdWVuIDMvOTkKLy8KLy8gQmVpc3BpZWxkYXRlaSBmdWVyIGRpZSBCZW51dHp1bmcgdm9uIE1hc3Rlcm4gdW5kIEtsaWVudGVuLgovLwovLyBJY2ggZ2VoZSBoaWVyIG5pY2h0IGF1ZiBkaWUgIm5vcm1hbGVuIiBGdW5rdGlvbmVuIGVpbi4KCmluaGVyaXQgIi9zdGQvdGhpbmciOwoKI2RlZmluZSBPU19NQVNURVIgIi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrbWFzdGVyIgoKdm9pZCBjcmVhdGUoKQp7CglpZihJU19CTFVFKE1FKSkgcmV0dXJuOwoJOjpjcmVhdGUoKTsKCVNldFByb3AoIFBfTkFNRSwgIk9wZmVyc3RvY2siICk7CglTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOwoJU2V0UHJvcCggUF9WQUxVRSwgMTAwMCArIHJhbmRvbSgyMDAwKSApOwoJQWRkSWQoICh7InN0b2NrIiwiaW5zY2hyaWZ0Iiwib3BmZXJzdG9jayJ9KSApOwoJU2V0UHJvcCggUF9TSE9SVCwgIkluIGVpbmVyIEVja2Ugc3RlaHQgZWluIE9wZmVyc3RvY2siICk7CglTZXRQcm9wKCBQX0xPTkcsCgkJIkRlciBPcGZlcnN0b2NrIGJlc3RlaHQgYXVzIHNvbGlkZW0gSG9sei4gVm9ybmUgYXVmIGRlbSBLYXN0ZW4gaXN0IGVpbmVcbiIKCSsJIkluc2NocmlmdCB6dSBzZWhlbiwgZGllIER1IGxlc2VuIGthbm5zdC5cbiIKCSsJIkBAY29udGVudHNAQCIKCSk7CglTZXRQcm9wKCBQX1JFQURfTVNHLAoJCSI+Pj4+Pj4+Pj4+Pj4gRnVlciBkZW4gQXVmYmF1IGVpbmVzIE9ya3dhaXNlbmhhdXNlcyA8PDw8PDw8PDw8PDxcbiIKCSsJIkluIGRlbiBsZXR6dGVuIEphaHJlbiB3dXJkZW4gaW1tZXIgd2llZGVyIHVuc2NodWxkaWdlIE9ya2tpbmRlclxuIgoJKwkiZHVyY2ggYnJ1dGFsZSBBYmVudGV1cmVyIGlocmVyIEVsdGVybiBiZXJhdWJ0LiBCaXR0ZSB1bnRlci1cbiIKCSsJInN0dWV0emVuIFNpZSBtaXQgZWluZXIga2xlaW5lbiBTcGVuZGUgZGVuIEF1ZmJhdSBlaW5lcyBXYWlzZW4tXG4iCgkrCSJoYXVzZXMgZnVlciBkaWVzZSBiZW1pdGxlaWRlbnN3ZXJ0ZW4gS3JlYXR1cmVuLlxuIgoJKTsKCUFkZERldGFpbCggImhvbHoiLCAiU29saWRlIHVuZCBzbyBndXQgd2llIHVuemVyYnJlY2hsaWNoLlxuIiApOwoJU2V0UHJvcCggUF9OT0dFVCwKCQkiRGVyIE9wZmVyc3RvY2sgaXN0IG5pY2h0IG9obmUgR3J1bmQgYW0gQm9kZW4gZmVzdGdlbmFnZWx0LlxuIiApOwoJQWRkQ21kKCAic3BlbmRlIiwic3BlbmRlIiApOwoJQWRkQ21kKCAoeyJzdGVja2UiLCJzdGVjayJ9KSwgInN0ZWNrZW4iICk7CglBZGRDbWQoICJvZWZmbmUiLCJvZWZmbmUiICk7CglBZGRDbWQoICh7ImJyaWNoIiwiYnJlY2hlIn0pLCJicmVjaGUiICk7Cn0KCmNvbnRlbnRzKCkKewoJc3dpdGNoKFF1ZXJ5UHJvcChQX1ZBTFVFKSkKCXsKCWNhc2UgMDoKCQlyZXR1cm4gIkVyIGlzdCBsZWVyLlxuIjsKCWNhc2UgMToKCQlyZXR1cm4gIkVyIGVudGhhZWx0OlxuRWluZSBNdWVuemUuXG4iOwoJZGVmYXVsdDoKCQlyZXR1cm4gIkVyIGVudGhhZWx0OlxuIitRdWVyeVByb3AoUF9WQUxVRSkrIiBNdWVuemVuLlxuIjsKCX0KfQoKc3RlY2tlbiggc3RyICkKewoJc3RyaW5nIHdhcywgd29yZWluOwoJaWYoICFzdHIgfHwgc3NjYW5mKHN0ciwiJXMgaW4gJXMiLHdhcyx3b3JlaW4pIT0yIHx8ICFpZCh3b3JlaW4pICkgcmV0dXJuIDA7CglyZXR1cm4gc3BlbmRlKCBzdHIgKTsKfQoKc3BlbmRlKCBzdHIgKQp7CglpbnQgYW56LCBuZXdBbDsKCXN0cmluZyBhcmc7CgkKCW5vdGlmeV9mYWlsKCAiV2lldmllbGUgTXVlbnplbiB3aWxsc3QgRHUgZGVubiBzcGVuZGVuP1xuIiApOwoJaWYoICFzdHIgfHwgc3RyPT0iIiApCgkJcmV0dXJuIDA7CglpZiggc3NjYW5mKHN0ciwiJWQgJXMiLGFueixhcmcpPT0gMiApCgkJc3RyID0gYXJnOwoJZWxzZQoJewoJCWlmKCBzdHI9PSJlaW5lIG11ZW56ZSIgfHwgc3RyPT0iZWluIGdvbGRzdHVlY2siICkKCQl7CgkJCWFueiA9IDE7CgkJCXN0ciA9ICJtdWVuemUiOwoJCX0KCQllbHNlCgkJCXJldHVybiAwOwoJfQoJaWYoIGFuejw9MCB8fCAKCQltZW1iZXIoKHsibXVlbnplIiwiZ29sZHN0dWVjayIsIm11ZW56ZW4iLCJnb2xkc3R1ZWNrZSJ9KSwgc3RyKT09LTEKCSkKCQlyZXR1cm4gMDsKCWlmKCBhbno+UEwtPlF1ZXJ5TW9uZXkoKSApCgl7CgkJd3JpdGUoICJTbyB2aWVsIEdlbGQgaGFzdCBEdSBuaWNodC5cbiIgKTsKCQlyZXR1cm4gMTsKCX0KCVBMLT5BZGRNb25leSgtYW56KTsKCVNldFByb3AoUF9WQUxVRSxRdWVyeVByb3AoUF9WQUxVRSkrYW56KTsKCgkvLyBIaWVyIHdpcmQgZGVyIE1hc3RlciBhdWZnZXJ1ZmVuLCBkZXIgZGFzIEFsaWdubWVudCBkZXIgU3BpZWxlcgoJLy8gZGFubiBhZW5kZXJ0LgoJaWYoIE9TX01BU1RFUi0+YWRkQWxpZ25tZW50KCBQTCwgYW56LzMgKSA+IDAgKSB7CgkJLy8gRWlnZW50bGljaCBr9m5udGUgbWFuIGhpZXIgYXVjaCBkaWUgTWVsZHVuZyBhdXNnZWJlbiwgYWJlcgoJCS8vIGRlciBTcGllbGVyIHNvbGwgZGVuIFVudGVyc2NoaWVkIHp3aXNjaGVuIEFsaWdubWVudCBnZWFlbmRlcnQKCQkvLyB1bnQgQWxpZ25tZW50IG5pY2h0IGdlYWVuZGVydCBzZWhlbiBrb2VubmVuLgoJfQoJd3JpdGUoICJEdSBoYXN0IHdhaHJoYWZ0IGRhcyBHZWZ1ZWhsLCBldHdhcyBHdXRlcyBnZXRhbiB6dSBoYWJlbi5cbiIgKTsKCglzYXkoIGNhcGl0YWxpemUoUEwtPm5hbWUoV0VSKSkrIiBzcGVuZGV0ICIrYW56CgkJKyAoKGFuej09MSk/IiBNdWVuemUuXG4iOiIgTXVlbnplbi5cbiIpICk7CglyZXR1cm4gMTsKfQoKb2VmZm5lKCBzdHIgKQp7CglpbnQgbmV3QWw7CgkKCW5vdGlmeV9mYWlsKCAiV0FTIHdpbGxzdCBEdSBvZWZmbmVuP1xuIiApOwoJaWYoICFpZChzdHIpICkKCQlyZXR1cm4gMDsKCU9TX01BU1RFUi0+YWRkQWxpZ25tZW50KCBQTCwgLTMwICk7Cgl3cml0ZSggIkFsbGVpbiBzY2hvbiBkZXIgR2VkYW5rZS4uLi5cbiIgKTsKCXJldHVybiAxOwp9CgpicmVjaGUoIHN0ciApCnsKCXN0cmluZyBhcmc7Cglub3RpZnlfZmFpbCggIldBUyB3aWxsc3QgRHUgYXVmYnJlY2hlbj9cbiIgKTsKCWlmKCAhc3RyICkKCQlyZXR1cm4gMDsKCWlmKCBzc2NhbmYoc3RyLCIlcyBhdWYiLGFyZyk9PTEgKQoJCXN0ciA9IGFyZzsKCWlmKCAhaWQoc3RyKSApCgkJcmV0dXJuIDA7Cgl3cml0ZSggIkRlaW4gbGF1dGVzIEdldG9lc2UgcnVmdCBlaW5lbiBUZXVmZWwgaGVyYmVpLCBkZXIgRGljaCBnbGVpY2hcbiIKCSsJIm1pdCBpbiBkaWUgSG9lbGxlIG5pbW10LlxuIgoJKTsKCXNheSggY2FwaXRhbGl6ZShQTC0+bmFtZShXRVIpKSsiIHZlcnN1Y2h0LCBkZW4gT3BmZXJzdG9jayBhdWZ6dWJyZWNoZW4uXG4iCgkrICJHbGVpY2ggZXJzY2hlaW50IGVpbiBUZXVmZWwsIHVtICIrUEwtPlF1ZXJ5UHJvbm91bihXRU4pCgkrCSIgaW4gZGllIEhvZWxsZSB6dSByZWlzc2VuLlxuIiApOwoJUEwtPm1vdmUoIi9kL3VudGVyd2VsdC9yYWV1bWUvcXVhbGVucmF1bSIsTV9HTywienVyIEhvZWxsZSIsImZhZWhydCIpOwoJT1NfTUFTVEVSLT5hZGRBbGlnbm1lbnQoIFBMLCAtMjAwICk7CglyZXR1cm4gMTsKfQo=