Ly8gKGMpIDIwMDMgYnkgUGFkcmVpYyAocGFkcmVpY0BtZy5tdWQuZGUpCi8vIAovLyBFcyBrYW5uIGJlc3RpbW10ZSBMYWVkZW4genVtIEhhbmRlbG4gdm9uIEtyYWV1dGVybiBnZWJlbi4KLy8gWnVuYWVjaHN0IGVpbm1hbCBnaWJ0IGVzIGVpbmVuIGluIGRlciBEdW5rZWxlbGZlbmdpbGRlLgovLyBIaWVyIGtvZW5uZW4gS3JhZXV0ZXIgZ2UtIHVuZCB2ZXJrYXVmdCB3ZXJkZW4uCi8vIEdydW5kc2FldHpsaWNoIGthbm4gZXMgYmVsaWViaWcgdmllbGUga3JhZXV0ZXJrdW5kaWdlCi8vIEhhZW5kbGVyIGdlYmVuLCBlaW5lIGt1cnplIEFic3ByYWNoZSB3YWVyZSBqZWRvY2ggdm9uIFZvcnRlaWwuCgovLyBEZXIgTGFkZW4gZXJ3ZWl0ZXJ0IGRpZSByb29tL3Nob3AgRnVua3Rpb25lbi4KLy8gWnVyIFZlcndlbmR1bmcgbXVzcyBkaWVzZXIgbm9jaCBtaXQgZWluZW0gc3RkL3Jvb20ga29tYmluaWVydAovLyB3ZXJkZW4uIERpZXMgZXJsYXVidCBkaWUgVmVyd2VuZHVuZyB2b24gZWlnZW5lbiBTdGFuZGFyZHJhZXVtZW4gb2RlcgovLyBLb21iaW5hdGlvbiBtaXQgS25laXBlbi4KCmluaGVyaXQgIi9zdGQvcm9vbS9zaG9wIjsKCiNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCgojaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KCi8vIEZsYWcsIGRhcyBpbSByZXNldCgpIGRhcyBTcGVpY2hlcm4gYXVzbG9lc3QsIHdlbm4gZXMgZ2VzZXR6dCBpc3QuCnN0YXRpYyAgaW50IG5lZWRfc2F2ZTsgIApzdGF0aWMgIGludCBiYXNpc3ZhbHVlPTQwMDsgLy8gZ2lidCBkZW4gX0R1cmNoc2Nobml0dHN3ZXJ0XyBlaW5lcyBLcmF1dHMgYW4Kc3RhdGljICBpbnQgbWF4dmFsdWU9MTAwMDA7IC8vIGJlc3RpbW10IGRlbiBtYXguIFdlcnQgYWxsZXIgS3JhZXV0ZXIKCi8vIEVudGhhZWx0IGZ1ZXIgamVkZSBQbGFudElEIGVpbmVuIFphZWhsZXIsIGRlciBhbmdpYnQsIHdpZXZpZWwgdm9uIGRlbQovLyBqZXdlaWxpZ2VuIEtyYXV0IHZlcmthdWZ0IHd1cmRlLgovLyBwcml2YXRlIGludCAqY291bnQ9KHt9KTsKCi8vIFN1bW1lIHVlYmVyIGFsbGUgRWludHJhZWdlIGluIGNvdW50Ci8vIHByaXZhdGUgaW50IHN1bTsKCnByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCnsKICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKQogIHsKICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKICAgIHJldHVybjsKICB9CiAgOjpjcmVhdGUoKTsKCiAgU2V0UHJvcChQX0JVWV9PTkxZX1BMQU5UUywxKTsKICAvKgogIHNldGV1aWQoZ2V0dWlkKCkpOyAvLyB3aXJkIHp1bSBzcGVpY2hlcm4gYmVu9nRpZ3QKICBpbnQgc2k9c2l6ZW9mKGNvdW50KTsKICAvLyBmdWVyIGplZGUgUGxhbnRJRCBlaW5lbiBFaW50cmFnIGFubGVnZW4sIGQuaC4gd2VubiBpbiBjb3VudCBub2NoCiAgLy8gbmljaHQgZ2VudWcgdm9yaGFuZGVuIHNpbmQsIHdlcmRlbiBmZWhsZW5kZSBFaW50cmFlZ2UgZXJnYWVuenQuCiAgaWYgKHNpPFBMQU5UQ09VTlQpIAogICAgY291bnQ9Y291bnQrYWxsb2NhdGUoUExBTlRDT1VOVC1zaSk7CiAgKi8KfQoKcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkKewogIHNldF9uZXh0X3Jlc2V0KC0xKTsKfQoKc3RhdGljIHN0cmluZyBzZWxsX29ial9vbmx5X3BsYW50cyhvYmplY3Qgb2IsIGludCBzaG9ydCkKewogICBpZiAoIUlTX1BMQU5UKG9iKSkKICAgICAgcmV0dXJuICJUdXQgbWlyIGxlaWQsIGRhbWl0IGthbm4gaWNoIG5pY2h0cyBhbmZhbmdlbi4iOwogICAvLyBlcyB3ZXJkZW4gbnVyIEtyYWV1dGVyIGFuZ2VrYXVmdCwgZGllIGxlZ2FsIGdlY2xvbnQgd3VyZGVuLAogICAvLyBkLmguIGltIGVudHNwcmVjaGVuZGVuIE1hc3RlciBvcmRlbnRsaWNoIGVpbmdldHJhZ2VuIHd1cmRlbiEKICAgaWYgKG9iLT5RdWVyeVBsYW50SWQoKTw9MCkKICAgICAgcmV0dXJuIG9iLT5OYW1lKFdFUiwgMikrIiBpc3QgaWxsZWdhbCBhdWYgZGllIFdlbHQgZ2Vrb21tZW4uIEljaCBkYXJmICIKICAgICAgICAgICAgK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGxlaWRlciBuaWNodCBhbm5laG1lbi4iOwogICByZXR1cm4gOjpzZWxsX29iaihvYiwgc2hvcnQpOwp9CgpzdGF0aWMgc3RyaW5nIHNlbGxfb2JqKG9iamVjdCBvYiwgaW50IHNob3J0KQp7CiAgIC8vIGVzIHdlcmRlbiBudXIgS3JhZXV0ZXIgYW5nZWthdWZ0LCBkaWUgbGVnYWwgZ2VjbG9udCB3dXJkZW4sCiAgIC8vIGQuaC4gaW0gZW50c3ByZWNoZW5kZW4gTWFzdGVyIG9yZGVudGxpY2ggZWluZ2V0cmFnZW4gd3VyZGVuIQogIGlmIChJU19QTEFOVChvYikgJiYgb2ItPlF1ZXJ5UGxhbnRJZCgpPD0wKQogICAgcmV0dXJuICJIbSwgIitvYi0+TmFtZShXRVIsIDIpKyIgc3RhbW10IGFiZXIgYXVzIGVpbmVyIHNlaHIgZHViaW9zZW4gIgogICAgICAiUXVlbGxlLiBJY2gga2FubiAiK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGxlaWRlciBuaWNodCBhbm5laG1lbi4iOwogIGlmIChRdWVyeVByb3AoUF9CVVlfT05MWV9QTEFOVFMpKQogICAgcmV0dXJuIHNlbGxfb2JqX29ubHlfcGxhbnRzKG9iLCBzaG9ydCk7CiAgcmV0dXJuIDo6c2VsbF9vYmoob2Isc2hvcnQpOwp9CgovKgp2b2lkIHJlc2V0KCkKewogIDo6cmVzZXQoKTsKICAvLyBEYXRlbiBzaW5kIG5pY2h0IHNvb28gd2ljaHRpZywgYWxzIGRhcyBiZWkgamVkZXIgQWVuZGVydW5nCiAgLy8gZ2VzYXZldCB3ZXJkZW4gbXVlc3N0ZS4gRGFoZXIgbnVuIGltIHJlc2V0IHNwZWljaGVybi4KICBpZiAobmVlZF9zYXZlKSB7CiAgICAvLyBiYXNpc3ZhbHVlL1BMQU5UQ09VTlQ6IER1cmNoc2Nobml0dHN3ZXJ0IGVpbmVzIGVpbnplbG5lbiBLcmF1dHMKICAgIC8vIHN1bSArIFBMQU5UQ09VTlQ6IEdlc2FtdHphaGwgdmVya2F1ZnRlciBwbHVzIFphaGwgZXhpc3RpZXJlbmRlcgogICAgLy8gICAgICAgICAgICAgICAgICAgS3JhZXV0ZXIKICAgIC8vIFdlbm4gYWxzbyBkZXIgV2VydCBhbGwgZGllc2VyIEtyYWV1dGVyID4gMTBrIGlzdCwgd2lyZCBqZWRlcgogICAgLy8gRWluemVsemFlaGxlciBhdWYgOTAlIGdlc3R1dHp0LCBkYW1pdCBkaWUgV2VydGUgbmljaHQgaW5zIFVmZXJsb3NlCiAgICAvLyBzdGVpZ2VuLgogICAgaWYgKCgoc3VtK1BMQU5UQ09VTlQpKmJhc2lzdmFsdWUvUExBTlRDT1VOVCk+bWF4dmFsdWUpIHsKICAgICAgaW50IGksIG5ld3N1bTsKICAgICAgZm9yIChpPXNpemVvZihjb3VudCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgY291bnRbaV0gPSBjb3VudFtpXSo5LzEwOwogICAgICAgIG5ld3N1bSs9Y291bnRbaV07CiAgICAgIH0KICAgICAgc3VtPW5ld3N1bTsKICAgIH0KICAgIG5lZWRfc2F2ZT0wOwogIH0KfQoKLy8gQWt0dWFsaXNpZXJ0IGRlbiBEYXRlbmJlc3RhbmQgYmVpbSBLYXVmZW4gb2RlciBWZXJrYXVmZW4gZWluZXMgT2JqZWt0cwp2b2lkIFVwZGF0ZUNvdW50ZXIob2JqZWN0IG9iLCBpbnQgbnVtKQp7CiAgIGludCBpZD1vYi0+UXVlcnlQbGFudElkKCk7CiAgIGlmIChpZD4wICYmIGlzX3BsYW50KG9iKSkgewogICAgICAvLyBLYXVmIG9kZXIgVmVya2F1ZiB2b24gS3JhZXV0ZXJuLCB2ZXJhZW5kZXJ0IGRlbiBXZXJ0IGRlcgogICAgICAvLyBLcmFldXRlcgogICAgICAvLyBaYWVobGVyIGluIGRlciBMaXN0ZSBob2NoemFlaGxlbgogICAgICBjb3VudFtpZF0rPW51bTsKICAgICAgaWYgKGNvdW50W2lkXTwwKSBjb3VudFtpZF09MDsgLy8gZGFyZiBhYmVyIGFuc2ljaCBuaWNoIHBhc3NpZXJlbgogICAgICAvLyBHZXNhbXRzdW1tZSBha3R1YWxpc2llcmVuCiAgICAgIHN1bSs9bnVtOwogICAgICBuZWVkX3NhdmU9MTsKICAgfQogICA6OlVwZGF0ZUNvdW50ZXIob2IsIG51bSk7Cn0KCi8vIERpZSBQcmVpc2UgZGllIGhpZXIgaW0gTGFib3IgZnVlciBLcmFldXRlciBnZXphaGx0IHVuZCB2ZXJsYW5ndAovLyB3ZXJkZW4sIHNpbmQgbmljaHQgZml4IHNvbmRlcm4gaGFlbmdlbiB2b24gQW5nZWJvdCB1bmQgTmFjaGZyYWdlIGFiLgovLyBIaWVyIHdlaXNzIG1hbiB1ZWJlciBkZW4gd2FocmVuIFdlcnQgZGVyIGVpbnplbG5lbiBLcmFldXRlciBiZXNjaGVpZC4Kc3RhdGljIGludCByZWFsVmFsdWUob2JqZWN0IG9iLCBvYmplY3QgcGxheWVyKQp7CiAgIC8vIFByZWlzZSBmdWVyIG5vcm1hbGUgR3VldGVyIGdhbnogbm9ybWFsLi4uCiAgIGlmICghaXNfcGxhbnQob2IpKQogICAgICAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9WQUxVRSk7CgogICAvLyBqZWRlIEtyYWV1dGVya2F0ZWdvcmllIGJla29tbXQgZGVuIGdsZWljaGVuIFdlcnQgenVnZXdpZXNlbi4gICAKICAgLy8gdmFsIGVudHNwcmljaHQgZGVtIGFrdHVlbGxlbiAiRHVyY2hzY2huaXR0c3dlcnQiIGVpbmVzIEtyYXV0ZXMKICAgaW50IHZhbD0oc3VtK1BMQU5UQ09VTlQpKmJhc2lzdmFsdWUvUExBTlRDT1VOVDsKCiAgIC8vIGFiZXIgZGllc2VyIFdlcnQgdmVydGVpbHQgc2ljaCBhdWYgdW50ZXJzY2hpZWRsaWNoIHZpZWxlIEtyYWV1dGVyCiAgIC8vIChBTjogRGllc2VyIEtvbW1lbnRhciBlcnNjaGxpZXNzdCBzaWNoIG1pciBuaWNodC4pCiAgIGludCBpZD1vYi0+UXVlcnlQbGFudElkKCk7CiAgIGlmIChpZDw9MCkgcmV0dXJuIDA7IC8vIGlsbGVnYWwgZ2VjbG9udCAtPiB3ZXJ0bG9zCiAgIC8vIGdnZi4gZGllIFphZWhsZXJsaXN0ZSB1bSBkaWUgZmVobGVuZGVuIEVpbnRyYWVnZSBlcndlaXRlcm4uCiAgIGlmICgoaWQtMSk+c2l6ZW9mKGNvdW50KSkgCiAgICAgY291bnQ9Y291bnQrYWxsb2NhdGUoaWQtMS1zaXplb2YoY291bnQpKTsKICAgCiAgIC8vICJtaXR0bGVyZW4gV2VydCIgZGVzIGFiZ2VmcmFndGVuIEtyYXV0ZXMgZXJyZWNobmVuIChEaXZpc2lvbiBkdXJjaAogICAvLyBkZXNzZW4gdW1nZXNldHp0ZSBBbnphaGwpCiAgIHZhbD12YWwvKGNvdW50W2lkXSsxKTsKICAgCiAgIC8vIFdlcnQgcnVuZGVuIGF1ZiBuYWVjaHN0bmllZHJpZ2VyZW4gZ2xhdHQgZHVyY2ggMTAgdGVpbGJhcmVuIFdlcnQuCiAgIHJldHVybiB2YWwtdmFsJTEwOyAKfQoKLy8gZ2lidCBkZW4gUHJlaXMgenVy/GNrLCBkZXIgenVtIEFua2F1ZiBkZXMgT2JqZWt0ZXMgdmVyd2VuZGV0IHdlcmRlbiBzb2xsCnN0YXRpYyB2YXJhcmdzIGludCBRdWVyeVZhbHVlKG9iamVjdCBvYiwgaW50IHZhbHVlLCBvYmplY3QgcGxheWVyKQp7CiAgIHJldHVybiA6OlF1ZXJ5VmFsdWUob2IsIHJlYWxWYWx1ZShvYiwgcGxheWVyKSwgcGxheWVyKTsKfQoKLy8gZ2lidCBkZW4gUHJlaXMgYW4sIHp1IGRlbSBkYXMgT2JqZWt0IHZlcmthdWZ0IHdlcmRlbiBzb2xsLgpzdGF0aWMgdmFyYXJncyBpbnQgUXVlcnlCdXlWYWx1ZShtaXhlZCBvYiwgb2JqZWN0IHBsYXllcikKewogICBpZiAob2JqZWN0cChvYikpCiAgICAgIHJldHVybiAocmVhbFZhbHVlKG9iLCBwbGF5ZXIpKlF1ZXJ5QnV5RmFjdChwbGF5ZXIpICsgNTApLzEwMDsKICAgLy8gZml4ZWQgT2JqZWt0ZS4uLgogICByZXR1cm4gOjpRdWVyeUJ1eVZhbHVlKG9iLCBwbGF5ZXIpOwp9CiovCg==