LyoKICogQmVpc3BpZWxkYXRlaSBmdWVyIGVpbmVuIGVpbmZhY2hlbiBNYXN0ZXIsIGRlciBTcGllbGVyZGF0ZW4gYXVjaAogKiB1ZWJlciByZWJvb3RzLCByZXNldHMgdW5kIHVwZGF0ZXMgaGlud2VnIHNwZWljaGVydCwgdW5kIGdsZWljaHplaXRnCiAqIGRhZnVlciBzb3JndCwgZGFzcyBkaWUgRGF0ZW5tZW5nZW4gbmljaHQgaW1tZXIgZ3JvZXNzZXIgd2VyZGVuLgogKgogKiBCeTogUnVtYXRhQE1vcmdlbkdyYXVlbiAzLzk5CiAqCiAqLwoKLy8gVm9uIGRpZXNlbSBPYmpla3QgZ2lidCBlcyBrZWluZSBDbG9uZXMsIHNvbmRlcm4gbnVyIGRpZSBCbHVlcHJpbnQuCi8vIERhcyBLb25zdHJ1a3QgaWYoIGNsb25lcChNRSkgKSBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsgaXN0IGRhZHVyY2gKLy8gb2Jzb2xldC4KI3ByYWdtYSBub19jbG9uZQoKI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPGRlZmluZXMuaD4KCi8vIE9ydCwgYW4gZGVtIGRpZSBEYXRlbiBnZXNwZWljaGVydCB3ZXJkZW4ga29lbm5lbi4gRGllIEVuZHVuZyAubwovLyB3aXJkIHZvbSBTeXN0ZW0gYW5nZWhhZW5ndC4KI2RlZmluZSBTQVZFRklMRSAiL2RvYy9iZWlzcGllbGUvbWFzdGVyL29wZmVyc3RvY2tsb2ciCgovLyBEaWVzZXMgaXN0IGRlciBLbGllbnQsIGRlciBkaWVzZW4gTWFzdGVyIGJlbnV0enQuIERpZXNlciBXZXJ0IHdpcmQKLy8gaW4gZGllc2VtIFByb2dyYW1tIHp3YXIgbmljaHQgYmVudXR6dCwgc3RlaHQgaGllciBhYmVyLCBkYW1pdCBtYW4KLy8gd2Vpc3MsIHdvZnVlciBkaWVzZXIgTWFzdGVyIGd1dCBpc3QuCiNkZWZpbmUgQ0xJRU5UICIvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9jayIKCi8vIEVzIGJyYXVjaHQga2VpbiBPYmpla3QgaW5oZXJpdGV0IHdlcmRlbiwgZGEgd2lyIGtlaW5lcmxlaSBTcGllbC0KLy8gRnVua3Rpb25pdGFldCBicmF1Y2hlbi4gRGVyIE1hc3RlciBrYW5uIG5pY2h0IGdlbm9tbWVuLCBiZXdlZ3Qgb2RlcgovLyBzb25zdHdpZSBpbm5oZXJsYWIgZGVzIE11ZHMgYmVudXR6dCB3ZXJkZW4uIEluc2Jlc29uZGVyZSBzb2xsZW4KLy8gaW0gc2F2ZWZpbGUgenVtIE1hc3RlciBrZWluZSBQcm9wZXJ0aWVzIG9kZXIgc28gYXVmdGF1Y2hlbi4KLy8gaW5oZXJ0ICIvc3RkL3RoaW5nIjsKCi8vIFVtIGRpZXNlIERhdGVuIGdlaHQgZXMuCi8vIERhcyBNYXBwaW5nIHNwZWljaGVydCB6dSBqZWRlbSBTcGllbGVyLCB3YW5uIGRhcyBsZXR6dGUgTWFsIGR1cmNoIGVpbmVuCi8vIGRlciBLbGllbnRlbiBkYXMgQWxpZ25tZW50IGdlYWVuZGVydCB3dXJkZS4gQWx0ZSBEYXRlbiB3ZXJkZW4gYmVpCi8vIEdlbGVnZW5oZWl0IGdlbG9lc2NodC4KbWFwcGluZyBkYXRhOwoKdm9pZCBwdXJnZSgpOwoKdm9pZCBjcmVhdGUoKSB7CgogIC8vIERhbWl0IFNjaHJlaWJ6dWdyaWZmIGF1ZiBTYXZlZmlsZSBtb2VnbGljaC4KICBzZXRldWlkKGdldHVpZCgpKTsKCiAgaWYoIHJlc3RvcmVfb2JqZWN0KCBTQVZFRklMRSApICkgewogICAgcHVyZ2UoKTsKICB9IGVsc2UgewogICAgZGF0YSA9IChbXSk7CiAgICBzYXZlX29iamVjdCggU0FWRUZJTEUgKTsgLy8gRGFtaXQgU2F2ZWZpbGUgdW5kIERhdGVuIGltbWVyIHN5bmNocm9uIHNpbmQuCiAgfQp9CgovLyBEaWVzZSBGdW5rdGlvbiB0ZXN0ZXQgZWluZW4gZWluemVsbmVuIEVpbnRyYWcsIG9iIGVyIHZlcmFsdGV0IGlzdC4KLy8gKGlzdCBuaWNodCBKYWhyIDIwMzgtZmVzdCA6LSkKaW50IG5vdEV4cGlyZWQoIHN0cmluZyBuYW1lLCBpbnQgZGF0ZSApIHsKICByZXR1cm4gdGltZSgpIC0gZGF0ZSA8IDg2NDAwOwp9CgovLyBEYXMgTWFwcGluZyB1bnRlcnN1Y2hlbiwgb2IgRWludHJhZWdlIHZvcmhhbmRlbiBzaW5kLCBkaWUgbmljaHQKLy8gbWVociBiZW5vZXRpZ3Qgd2VyZGVuLgovLyAoSW4gZGllc2VtIEZhbGwgc2luZCBkYXMgRWludHJhZWdlLCBkaWUgYWVsdGVyIGFscyBlaW5lbiBUYWcgc2luZC4pCi8vIEVzIHJlaWNodCB1bnMsIGRpZXNlIEZ1bmt0aW9uIGVpbm1hbCBwcm8gcmVib290IGF1c3p1ZnVlaHJlbi4gQmVpCi8vIGFuZGVyZW4gQW53ZW5kdW5nZW4ga29lbm50ZSBkYXMgbmF0dWVybGljaCBoYWV1ZmlnZXIgbm9ldGlnIHNlaW4uCnZvaWQgcHVyZ2UoKSB7CiAgZGF0YSA9IGZpbHRlcl9pbmRpY2VzKCBkYXRhLCAjJ25vdEV4cGlyZWQgKTsKICBzYXZlX29iamVjdCggU0FWRUZJTEUgKTsKfQoKLy8gRGllc2UgRnVua3Rpb24gaXN0IGRpZSBlaW5nZXRsaWNoZSBGdW5rdGlvbiwgZGllICJnZW1hc3RlcnQiIHdlcmRlbgovLyBzb2xsLCBhbHNvIGb8ciBtZWhyZXJlIE9wZmVyc3RvZWNrZSBnZW1laW5zYW0gYmVudXR6dCB3aXJkLgovLyBEZXIgT3BmZXJzdG9jayB1ZWJlcmdpYnQgZGFzIFNwaWVsZXJvYmpla3QgdW5kIGRpZSBnZXd1ZW5zY2h0ZQovLyBBbGlnbm1lbnRhZW5kZXJ1bmcsIGFscyBFcmdlYm5pcyB3aXJkIDEgZ2VsaWVmZXJ0LCB3ZW5uIGVpbmUgQWVuZGVydW5nCi8vIHZvcmdlbm9tbWVuIHd1cmRlICgwIHNvbnN0KSB1bmQgZGFzIEFsaWdubWVudCBkZXMgU3BpZWxlcnMgZW50c3ByZWNoZW5kCi8vIGdlc2V0enQuCmludCBhZGRBbGlnbm1lbnQoIG9iamVjdCBwbGF5ZXIsIGludCBhbGlnbiApIHsKICBpbnQgbmV3QWxpZ247CiAgc3RyaW5nIG5hbWU7CgogIC8qCiAgLy8gRmFsbHMgbWFuIHZlcmhpbmRlcm4gd2lsbCwgZGFzcyBudXIgZGVyIEtsaWVudCBhdWYgZGllIERhdGVuIHp1Z3JlaWZ0LAogIC8vIGthbm4gbWFuIGhpZXIgbm9jaCBBYmZyYWdlbiBlaW5iYXVlbiwgdHlwaXNjaGVyd2Vpc2Ugc2llaHQgZGFzIGRhbm4gc28KICAvLyBhdXM6CiAgaWYoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi54eHhdICE9IENMSUVOVCApIHJldHVybiAtMTsKICAvLyBvZGVyCiAgaWYoIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IGdldGV1aWQoKSApIHJldHVybiAtMTsKICAvLyBldGMuIGV0Yy4KICAqLwoKICBuYW1lID0gZ2V0ZXVpZChwbGF5ZXIpOwoKICAvLyBOdXIgZWluZSBBZW5kZXJ1bmcgcHJvIFRhZy4KICAvLyBXaXIgYmVudXR6ZW4gaGllciwgZGFzcyBkYXRhW25hbWVdID09IDAgaXN0LCBmYWxscyBkYXRhIGRlbiBOYW1lbiBuaWNodAogIC8vIGVudGhhZWx0IQogIGlmKCBub3RFeHBpcmVkKCBuYW1lLCBkYXRhW25hbWVdICkgKSByZXR1cm4gMDsKCiAgLy8gRGF0ZW4gc2V0emVuIHVuZCBzcGVpY2hlcm4uCiAgZGF0YVtuYW1lXSA9IHRpbWUoKTsKICBzYXZlX29iamVjdCggU0FWRUZJTEUgKTsKCiAgLy8gTWF4aW1hbGUgQWVuZGVydW5nOiAyMDAKICBpZiggYWxpZ24gPCAtMjAwICkgYWxpZ24gPSAtMjAwOwogIGlmKCBhbGlnbiA+IDIwMCApIGFsaWduID0gMjAwOwoKICBuZXdBbGlnbiA9IHBsYXllci0+UXVlcnlQcm9wKCBQX0FMSUdOICkgKyBhbGlnbjsKCiAgLy8gS2FwcHVuZyBiZWkgKy0xMDAwCiAgaWYoIG5ld0FsaWduIDwgLTEwMDAgKSBuZXdBbGlnbiA9IC0xMDAwOwogIGlmKCBuZXdBbGlnbiA+IDEwMDAgKSBuZXdBbGlnbiA9IDEwMDA7CiAKICBwbGF5ZXItPlNldFByb3AoIFBfQUxJR04sIG5ld0FsaWduICk7CiAgcmV0dXJuIDE7Cn0KCi8vIFNjaGx1c3NiZW1lcmt1bmc6Ci8vCi8vIEdld2l0enRlIFByb2dyYW1taWVyZXIga29lbm50ZW4gZGVuIEtsaWVudCB1bmQgZGVuIE1hc3RlciBpbiBlaW5lcgovLyBEYXRlaSB6dXNhbW1lbiBhYmxlZ2VuLiBEaWUgQmx1ZXByaW50IHdpcmQgYWxzIE1hc3RlciwgZGllIENsb25lcyB3ZXJkZW4KLy8gYWxzIEtsaWVudGVuIGJlbnV0enQuIEljaCBoYWJlIGRhcyBoaWVyIGJld3Vzc3QgYW5kZXJzIGdlbWFjaHQgdW5kIGVtcGZlaGxlCi8vIGRhcyBhdWNoIGFscyBWb3JiaWxkLCB3ZWlsIHNvIGRlciBDb2RlIHdlc2VudGxpY2ggYmVzc2VyIHp1IHZlcnN0ZWhlbiBpc3QuCg==