Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDEwLCAyMDEyIEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmFuIFRob21hcyA8dGhvbWFzQGVsb2FkMjQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTIgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGFycnkgUm9iZXJ0cyA8aGFycnkucm9iZXJ0c0BtaWRuaWdodC1sYWJzLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQW50aG9ueSBXZXNsZXkgPGF3ZXNsZXlAc21hcnRuZXR3b3Jrcy5jb20uYXU+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbXBsZW1lbnRhdGlvbgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgIlNwbGFzaEVycm9yQ29kZXMuaCIKI2luY2x1ZGUgIlNwbGFzaEJpdG1hcC5oIgojaW5jbHVkZSAicG9wcGxlci9FcnJvci5oIgojaW5jbHVkZSAiZ29vL0pwZWdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9QTkdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9UaWZmV3JpdGVyLmgiCiNpbmNsdWRlICJnb28vSW1nV3JpdGVyLmgiCiNpbmNsdWRlICJnb28vR29vTGlzdC5oIgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoQml0bWFwCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTcGxhc2hCaXRtYXA6OlNwbGFzaEJpdG1hcChpbnQgd2lkdGhBLCBpbnQgaGVpZ2h0QSwgaW50IHJvd1BhZEEsCgkJCSAgIFNwbGFzaENvbG9yTW9kZSBtb2RlQSwgR0Jvb2wgYWxwaGFBLAoJCQkgICBHQm9vbCB0b3BEb3duLCBHb29MaXN0ICpzZXBhcmF0aW9uTGlzdEEpIHsKICB3aWR0aCA9IHdpZHRoQTsKICBoZWlnaHQgPSBoZWlnaHRBOwogIG1vZGUgPSBtb2RlQTsKICByb3dQYWQgPSByb3dQYWRBOwogIHN3aXRjaCAobW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgaWYgKHdpZHRoID4gMCkgewogICAgICByb3dTaXplID0gKHdpZHRoICsgNykgPj4gMzsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgaWYgKHdpZHRoID4gMCkgewogICAgICByb3dTaXplID0gd2lkdGg7CiAgICB9IGVsc2UgewogICAgICByb3dTaXplID0gLTE7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBpZiAod2lkdGggPiAwICYmIHdpZHRoIDw9IElOVF9NQVggLyAzKSB7CiAgICAgIHJvd1NpemUgPSB3aWR0aCAqIDM7CiAgICB9IGVsc2UgewogICAgICByb3dTaXplID0gLTE7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDQpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogNDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDQpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogNDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZURldmljZU44OgogICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8PSBJTlRfTUFYIC8gNCkgewogICAgICByb3dTaXplID0gd2lkdGggKiAoU1BPVF9OQ09NUFMgKyA0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwojZW5kaWYKICB9CiAgaWYgKHJvd1NpemUgPiAwKSB7CiAgICByb3dTaXplICs9IHJvd1BhZCAtIDE7CiAgICByb3dTaXplIC09IHJvd1NpemUgJSByb3dQYWQ7CiAgfQogIGRhdGEgPSAoU3BsYXNoQ29sb3JQdHIpZ21hbGxvY25fY2hlY2tvdmVyZmxvdyhyb3dTaXplLCBoZWlnaHQpOwogIGlmIChkYXRhICE9IE5VTEwpIHsKICAgIGlmICghdG9wRG93bikgewogICAgICBkYXRhICs9IChoZWlnaHQgLSAxKSAqIHJvd1NpemU7CiAgICAgIHJvd1NpemUgPSAtcm93U2l6ZTsKICAgIH0KICAgIGlmIChhbHBoYUEpIHsKICAgICAgYWxwaGEgPSAoR3VjaGFyICopZ21hbGxvY24od2lkdGgsIGhlaWdodCk7CiAgICB9IGVsc2UgewogICAgICBhbHBoYSA9IE5VTEw7CiAgICB9CiAgfSBlbHNlIHsKICAgIGFscGhhID0gTlVMTDsKICB9CiAgc2VwYXJhdGlvbkxpc3QgPSBuZXcgR29vTGlzdCgpOwogIGlmIChzZXBhcmF0aW9uTGlzdEEgIT0gTlVMTCkKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VwYXJhdGlvbkxpc3RBLT5nZXRMZW5ndGgoKTsgaSsrKQogICAgICBzZXBhcmF0aW9uTGlzdC0+YXBwZW5kKCgoR2Z4U2VwYXJhdGlvbkNvbG9yU3BhY2UgKikgc2VwYXJhdGlvbkxpc3RBLT5nZXQoaSkpLT5jb3B5KCkpOwp9CgpTcGxhc2hCaXRtYXAgKlNwbGFzaEJpdG1hcDo6Y29weShTcGxhc2hCaXRtYXAgKnNyYykgewogIFNwbGFzaEJpdG1hcCAqcmVzdWx0ID0gbmV3IFNwbGFzaEJpdG1hcChzcmMtPmdldFdpZHRoKCksIHNyYy0+Z2V0SGVpZ2h0KCksIHNyYy0+Z2V0Um93UGFkKCksIAogICAgc3JjLT5nZXRNb2RlKCksIHNyYy0+Z2V0QWxwaGFQdHIoKSAhPSBOVUxMLCBzcmMtPmdldFJvd1NpemUoKSA+PSAwLCBzcmMtPmdldFNlcGFyYXRpb25MaXN0KCkpOwogIEd1Y2hhciAqZGF0YVNvdXJjZSA9IHNyYy0+Z2V0RGF0YVB0cigpOwogIEd1Y2hhciAqZGF0YURlc3QgPSByZXN1bHQtPmdldERhdGFQdHIoKTsKICBpbnQgYW1vdW50ID0gc3JjLT5nZXRSb3dTaXplKCk7CiAgaWYgKGFtb3VudCA8IDApIHsKICAgIGRhdGFTb3VyY2UgPSBkYXRhU291cmNlICsgKHNyYy0+Z2V0SGVpZ2h0KCkgLSAxKSAqIGFtb3VudDsKICAgIGRhdGFEZXN0ID0gZGF0YURlc3QgKyAoc3JjLT5nZXRIZWlnaHQoKSAtIDEpICogYW1vdW50OwogICAgYW1vdW50ICo9IC1zcmMtPmdldEhlaWdodCgpOwogIH0gZWxzZSB7CiAgICBhbW91bnQgKj0gc3JjLT5nZXRIZWlnaHQoKTsKICB9CiAgbWVtY3B5KGRhdGFEZXN0LCBkYXRhU291cmNlLCBhbW91bnQpOwogIGlmIChzcmMtPmdldEFscGhhUHRyKCkgIT0gTlVMTCkgewogICAgbWVtY3B5KHJlc3VsdC0+Z2V0QWxwaGFQdHIoKSwgc3JjLT5nZXRBbHBoYVB0cigpLCBzcmMtPmdldFdpZHRoKCkgKiBzcmMtPmdldEhlaWdodCgpKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKU3BsYXNoQml0bWFwOjp+U3BsYXNoQml0bWFwKCkgewogIGlmIChkYXRhKSB7CiAgICBpZiAocm93U2l6ZSA8IDApIHsKICAgICAgZ2ZyZWUoZGF0YSArIChoZWlnaHQgLSAxKSAqIHJvd1NpemUpOwogICAgfSBlbHNlIHsKICAgICAgZ2ZyZWUoZGF0YSk7CiAgICB9CiAgfQogIGdmcmVlKGFscGhhKTsKICBkZWxldGVHb29MaXN0KHNlcGFyYXRpb25MaXN0LCBHZnhTZXBhcmF0aW9uQ29sb3JTcGFjZSk7Cn0KCgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlUE5NRmlsZShjaGFyICpmaWxlTmFtZSkgewogIEZJTEUgKmY7CiAgU3BsYXNoRXJyb3IgZTsKCiAgaWYgKCEoZiA9IGZvcGVuKGZpbGVOYW1lLCAid2IiKSkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJPcGVuRmlsZTsKICB9CgogIGUgPSB0aGlzLT53cml0ZVBOTUZpbGUoZik7CiAgCiAgZmNsb3NlKGYpOwogIHJldHVybiBlOwp9CgoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZVBOTUZpbGUoRklMRSAqZikgewogIFNwbGFzaENvbG9yUHRyIHJvdywgcDsKICBpbnQgeCwgeTsKCiAgc3dpdGNoIChtb2RlKSB7CgogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgZnByaW50ZihmLCAiUDRcbiVkICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDgpIHsKCWZwdXRjKCpwIF4gMHhmZiwgZik7CgkrK3A7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBmcHJpbnRmKGYsICJQNVxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIGZ3cml0ZShyb3csIDEsIHdpZHRoLCBmKTsKICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIGZwcmludGYoZiwgIlA2XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgZndyaXRlKHJvdywgMSwgMyAqIHdpZHRoLCBmKTsKICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICBmcHJpbnRmKGYsICJQNlxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSByb3c7CiAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CglmcHV0YyhzcGxhc2hCR1I4UihwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4RyhwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4QihwKSwgZik7CglwICs9IDQ7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBmcHJpbnRmKGYsICJQNlxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSByb3c7CiAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CglmcHV0YyhzcGxhc2hCR1I4UihwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4RyhwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4QihwKSwgZik7CglwICs9IDM7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogIGNhc2Ugc3BsYXNoTW9kZURldmljZU44OgogICAgLy8gUE5NIGRvZXNuJ3Qgc3VwcG9ydCBDTVlLCiAgICBlcnJvcihlcnJJbnRlcm5hbCwgLTEsICJ1bnN1cHBvcnRlZCBTcGxhc2hCaXRtYXAgbW9kZSIpOwogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICBicmVhazsKI2VuZGlmCiAgfQogIHJldHVybiBzcGxhc2hPazsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUFscGhhUEdNRmlsZShjaGFyICpmaWxlTmFtZSkgewogIEZJTEUgKmY7CgogIGlmICghYWxwaGEpIHsKICAgIHJldHVybiBzcGxhc2hFcnJNb2RlTWlzbWF0Y2g7CiAgfQogIGlmICghKGYgPSBmb3BlbihmaWxlTmFtZSwgIndiIikpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyT3BlbkZpbGU7CiAgfQogIGZwcmludGYoZiwgIlA1XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICBmd3JpdGUoYWxwaGEsIDEsIHdpZHRoICogaGVpZ2h0LCBmKTsKICBmY2xvc2UoZik7CiAgcmV0dXJuIHNwbGFzaE9rOwp9Cgp2b2lkIFNwbGFzaEJpdG1hcDo6Z2V0UGl4ZWwoaW50IHgsIGludCB5LCBTcGxhc2hDb2xvclB0ciBwaXhlbCkgewogIFNwbGFzaENvbG9yUHRyIHA7CgogIGlmICh5IDwgMCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB4ID49IHdpZHRoKSB7CiAgICByZXR1cm47CiAgfQogIHN3aXRjaCAobW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgcCA9ICZkYXRhW3kgKiByb3dTaXplICsgKHggPj4gMyldOwogICAgcGl4ZWxbMF0gPSAocFswXSAmICgweDgwID4+ICh4ICYgNykpKSA/IDB4ZmYgOiAweDAwOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAzICogeF07CiAgICBwaXhlbFswXSA9IHBbMF07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMl07CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDQgKiB4XTsKICAgIHBpeGVsWzBdID0gcFsyXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFswXTsKICAgIHBpeGVsWzNdID0gcFszXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAzICogeF07CiAgICBwaXhlbFswXSA9IHBbMl07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMF07CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyA0ICogeF07CiAgICBwaXhlbFswXSA9IHBbMF07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMl07CiAgICBwaXhlbFszXSA9IHBbM107CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVEZXZpY2VOODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIChTUE9UX05DT01QUyArIDQpICogeF07CiAgICBmb3IgKGludCBjcCA9IDA7IGNwIDwgU1BPVF9OQ09NUFMgKyA0OyBjcCsrKQogICAgICBwaXhlbFtjcF0gPSBwW2NwXTsKICAgIGJyZWFrOwojZW5kaWYKICB9Cn0KCkd1Y2hhciBTcGxhc2hCaXRtYXA6OmdldEFscGhhKGludCB4LCBpbnQgeSkgewogIHJldHVybiBhbHBoYVt5ICogd2lkdGggKyB4XTsKfQoKU3BsYXNoQ29sb3JQdHIgU3BsYXNoQml0bWFwOjp0YWtlRGF0YSgpIHsKICBTcGxhc2hDb2xvclB0ciBkYXRhMjsKCiAgZGF0YTIgPSBkYXRhOwogIGRhdGEgPSBOVUxMOwogIHJldHVybiBkYXRhMjsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgY2hhciAqZmlsZU5hbWUsIGludCBoRFBJLCBpbnQgdkRQSSwgY29uc3QgY2hhciAqY29tcHJlc3Npb25TdHJpbmcpIHsKICBGSUxFICpmOwogIFNwbGFzaEVycm9yIGU7CgogIGlmICghKGYgPSBmb3BlbihmaWxlTmFtZSwgIndiIikpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyT3BlbkZpbGU7CiAgfQoKICBlID0gd3JpdGVJbWdGaWxlKGZvcm1hdCwgZiwgaERQSSwgdkRQSSwgY29tcHJlc3Npb25TdHJpbmcpOwogIAogIGZjbG9zZShmKTsKICByZXR1cm4gZTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgRklMRSAqZiwgaW50IGhEUEksIGludCB2RFBJLCBjb25zdCBjaGFyICpjb21wcmVzc2lvblN0cmluZykgewogIEltZ1dyaXRlciAqd3JpdGVyOwoJU3BsYXNoRXJyb3IgZTsKICAKICBzd2l0Y2ggKGZvcm1hdCkgewogICAgI2lmZGVmIEVOQUJMRV9MSUJQTkcKICAgIGNhc2Ugc3BsYXNoRm9ybWF0UG5nOgoJICB3cml0ZXIgPSBuZXcgUE5HV3JpdGVyKCk7CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCgogICAgI2lmZGVmIEVOQUJMRV9MSUJKUEVHCiAgICAjaWZkZWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoRm9ybWF0SnBlZ0NNWUs6CiAgICAgIHdyaXRlciA9IG5ldyBKcGVnV3JpdGVyKEpDU19DTVlLKTsKICAgICAgYnJlYWs7CiAgICAjZW5kaWYKICAgIGNhc2Ugc3BsYXNoRm9ybWF0SnBlZzoKICAgICAgd3JpdGVyID0gbmV3IEpwZWdXcml0ZXIoKTsKICAgICAgYnJlYWs7CiAgICAjZW5kaWYKCQogICAgI2lmZGVmIEVOQUJMRV9MSUJUSUZGCiAgICBjYXNlIHNwbGFzaEZvcm1hdFRpZmY6CiAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgICAgICB3cml0ZXIgPSBuZXcgVGlmZldyaXRlcihUaWZmV3JpdGVyOjpNT05PQ0hST01FKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICAgICAgd3JpdGVyID0gbmV3IFRpZmZXcml0ZXIoVGlmZldyaXRlcjo6R1JBWSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICAgIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICAgICAgd3JpdGVyID0gbmV3IFRpZmZXcml0ZXIoVGlmZldyaXRlcjo6UkdCKTsKICAgICAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICBjYXNlIHNwbGFzaE1vZGVEZXZpY2VOODoKICAgICAgICB3cml0ZXIgPSBuZXcgVGlmZldyaXRlcihUaWZmV3JpdGVyOjpDTVlLKTsKICAgICAgICBicmVhazsKI2VuZGlmCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaWZmV3JpdGVyOiBNb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsIG1vZGUpOwogICAgICAgIHdyaXRlciA9IG5ldyBUaWZmV3JpdGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHdyaXRlcikgewogICAgICAgICgoVGlmZldyaXRlciAqKXdyaXRlciktPnNldENvbXByZXNzaW9uU3RyaW5nKGNvbXByZXNzaW9uU3RyaW5nKTsKICAgICAgfQogICAgICBicmVhazsKICAgICNlbmRpZgoKICAgIGRlZmF1bHQ6CiAgICAgIC8vIE5vdCB0aGUgZ3JlYXRlc3QgZXJyb3IgbWVzc2FnZSwgYnV0IHVzZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkCiAgICAgIC8vIGhhdmUgYWxyZWFkeSBjaGVja2VkIHdoZXRoZXIgdGhlaXIgZGVzaXJlZCBmb3JtYXQgaXMgY29tcGlsZWQgaW4uCiAgICAgIGVycm9yKGVyckludGVybmFsLCAtMSwgIlN1cHBvcnQgZm9yIHRoaXMgaW1hZ2UgdHlwZSBub3QgY29tcGlsZWQgaW4iKTsKICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgfQoKCWUgPSB3cml0ZUltZ0ZpbGUod3JpdGVyLCBmLCBoRFBJLCB2RFBJKTsKCWRlbGV0ZSB3cml0ZXI7CglyZXR1cm4gZTsKfQoKI2luY2x1ZGUgInBvcHBsZXIvR2Z4U3RhdGVfaGVscGVycy5oIgoKdm9pZCBTcGxhc2hCaXRtYXA6OmdldFJHQkxpbmUoaW50IHlsLCBTcGxhc2hDb2xvclB0ciBsaW5lKSB7CiAgU3BsYXNoQ29sb3IgY29sOwogIGRvdWJsZSBjLCBtLCB5LCBrLCBjMSwgbTEsIHkxLCBrMSwgciwgZywgYjsKCiAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICBnZXRQaXhlbCh4LCB5bCwgY29sKTsKICAgIGMgPSBieXRlVG9EYmwoY29sWzBdKTsKICAgIG0gPSBieXRlVG9EYmwoY29sWzFdKTsKICAgIHkgPSBieXRlVG9EYmwoY29sWzJdKTsKICAgIGsgPSBieXRlVG9EYmwoY29sWzNdKTsKI2lmIFNQTEFTSF9DTVlLCiAgICBpZiAoc2VwYXJhdGlvbkxpc3QtPmdldExlbmd0aCgpID4gMCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcGFyYXRpb25MaXN0LT5nZXRMZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgaWYgKGNvbFtpKzRdID4gMCkgewogICAgICAgICAgR2Z4Q01ZSyBjbXlrOwogICAgICAgICAgR2Z4Q29sb3IgaW5wdXQ7CiAgICAgICAgICBpbnB1dC5jWzBdID0gYnl0ZVRvQ29sKGNvbFtpKzRdKTsKICAgICAgICAgIEdmeFNlcGFyYXRpb25Db2xvclNwYWNlICpzZXBDUyA9IChHZnhTZXBhcmF0aW9uQ29sb3JTcGFjZSAqKXNlcGFyYXRpb25MaXN0LT5nZXQoaSk7CiAgICAgICAgICBzZXBDUy0+Z2V0Q01ZSygmaW5wdXQsICZjbXlrKTsKICAgICAgICAgIGNvbFswXSA9IGNvbFRvQnl0ZShjbXlrLmMpOwogICAgICAgICAgY29sWzFdID0gY29sVG9CeXRlKGNteWsubSk7CiAgICAgICAgICBjb2xbMl0gPSBjb2xUb0J5dGUoY215ay55KTsKICAgICAgICAgIGNvbFszXSA9IGNvbFRvQnl0ZShjbXlrLmspOwogICAgICAgICAgYyArPSBieXRlVG9EYmwoY29sWzBdKTsKICAgICAgICAgIG0gKz0gYnl0ZVRvRGJsKGNvbFsxXSk7CiAgICAgICAgICB5ICs9IGJ5dGVUb0RibChjb2xbMl0pOwogICAgICAgICAgayArPSBieXRlVG9EYmwoY29sWzNdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGMgPiAxKSBjID0gMTsKICAgICAgaWYgKG0gPiAxKSBtID0gMTsKICAgICAgaWYgKHkgPiAxKSB5ID0gMTsKICAgICAgaWYgKGsgPiAxKSBrID0gMTsKICAgIH0KI2VuZGlmCiAgICBjMSA9IDEgLSBjOwogICAgbTEgPSAxIC0gbTsKICAgIHkxID0gMSAtIHk7CiAgICBrMSA9IDEgLSBrOwogICAgY215a1RvUkdCTWF0cml4TXVsdGlwbGljYXRpb24oYywgbSwgeSwgaywgYzEsIG0xLCB5MSwgazEsIHIsIGcsIGIpOwogICAgKmxpbmUrKyA9IGRibFRvQnl0ZShjbGlwMDEocikpOwogICAgKmxpbmUrKyA9IGRibFRvQnl0ZShjbGlwMDEoZykpOwogICAgKmxpbmUrKyA9IGRibFRvQnl0ZShjbGlwMDEoYikpOwogIH0KfQoKdm9pZCBTcGxhc2hCaXRtYXA6OmdldFhCR1JMaW5lKGludCB5bCwgU3BsYXNoQ29sb3JQdHIgbGluZSkgewogIFNwbGFzaENvbG9yIGNvbDsKICBkb3VibGUgYywgbSwgeSwgaywgYzEsIG0xLCB5MSwgazEsIHIsIGcsIGI7CgogIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgZ2V0UGl4ZWwoeCwgeWwsIGNvbCk7CiAgICBjID0gYnl0ZVRvRGJsKGNvbFswXSk7CiAgICBtID0gYnl0ZVRvRGJsKGNvbFsxXSk7CiAgICB5ID0gYnl0ZVRvRGJsKGNvbFsyXSk7CiAgICBrID0gYnl0ZVRvRGJsKGNvbFszXSk7CiNpZiBTUExBU0hfQ01ZSwogICAgaWYgKHNlcGFyYXRpb25MaXN0LT5nZXRMZW5ndGgoKSA+IDApIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXBhcmF0aW9uTGlzdC0+Z2V0TGVuZ3RoKCk7IGkrKykgewogICAgICAgIGlmIChjb2xbaSs0XSA+IDApIHsKICAgICAgICAgIEdmeENNWUsgY215azsKICAgICAgICAgIEdmeENvbG9yIGlucHV0OwogICAgICAgICAgaW5wdXQuY1swXSA9IGJ5dGVUb0NvbChjb2xbaSs0XSk7CiAgICAgICAgICBHZnhTZXBhcmF0aW9uQ29sb3JTcGFjZSAqc2VwQ1MgPSAoR2Z4U2VwYXJhdGlvbkNvbG9yU3BhY2UgKilzZXBhcmF0aW9uTGlzdC0+Z2V0KGkpOwogICAgICAgICAgc2VwQ1MtPmdldENNWUsoJmlucHV0LCAmY215ayk7CiAgICAgICAgICBjb2xbMF0gPSBjb2xUb0J5dGUoY215ay5jKTsKICAgICAgICAgIGNvbFsxXSA9IGNvbFRvQnl0ZShjbXlrLm0pOwogICAgICAgICAgY29sWzJdID0gY29sVG9CeXRlKGNteWsueSk7CiAgICAgICAgICBjb2xbM10gPSBjb2xUb0J5dGUoY215ay5rKTsKICAgICAgICAgIGMgKz0gYnl0ZVRvRGJsKGNvbFswXSk7CiAgICAgICAgICBtICs9IGJ5dGVUb0RibChjb2xbMV0pOwogICAgICAgICAgeSArPSBieXRlVG9EYmwoY29sWzJdKTsKICAgICAgICAgIGsgKz0gYnl0ZVRvRGJsKGNvbFszXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjID4gMSkgYyA9IDE7CiAgICAgIGlmIChtID4gMSkgbSA9IDE7CiAgICAgIGlmICh5ID4gMSkgeSA9IDE7CiAgICAgIGlmIChrID4gMSkgayA9IDE7CiAgICB9CiNlbmRpZgogICAgYzEgPSAxIC0gYzsKICAgIG0xID0gMSAtIG07CiAgICB5MSA9IDEgLSB5OwogICAgazEgPSAxIC0gazsKICAgIGNteWtUb1JHQk1hdHJpeE11bHRpcGxpY2F0aW9uKGMsIG0sIHksIGssIGMxLCBtMSwgeTEsIGsxLCByLCBnLCBiKTsKICAgICpsaW5lKysgPSBkYmxUb0J5dGUoY2xpcDAxKGIpKTsKICAgICpsaW5lKysgPSBkYmxUb0J5dGUoY2xpcDAxKGcpKTsKICAgICpsaW5lKysgPSBkYmxUb0J5dGUoY2xpcDAxKHIpKTsKICAgICpsaW5lKysgPSAyNTU7CiAgfQp9CgpHQm9vbCBTcGxhc2hCaXRtYXA6OmNvbnZlcnRUb1hCR1IoKSB7CiAgaWYgKG1vZGUgPT0gc3BsYXNoTW9kZVhCR1I4KQogICAgcmV0dXJuIGdUcnVlOwogIAogIGludCBuZXdyb3dTaXplID0gd2lkdGggKiA0OwogIFNwbGFzaENvbG9yUHRyIG5ld2RhdGEgPSAoU3BsYXNoQ29sb3JQdHIpZ21hbGxvY25fY2hlY2tvdmVyZmxvdyhuZXdyb3dTaXplLCBoZWlnaHQpOwogIGlmIChuZXdkYXRhICE9IE5VTEwpIHsKICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3ZGF0YSArIHkgKiBuZXdyb3dTaXplOwogICAgICBnZXRYQkdSTGluZSh5LCByb3cpOwogICAgfQogICAgaWYgKHJvd1NpemUgPCAwKSB7CiAgICAgIGdmcmVlKGRhdGEgKyAoaGVpZ2h0IC0gMSkgKiByb3dTaXplKTsKICAgIH0gZWxzZSB7CiAgICAgIGdmcmVlKGRhdGEpOwogICAgfQogICAgZGF0YSA9IG5ld2RhdGE7CiAgICByb3dTaXplID0gbmV3cm93U2l6ZTsKICAgIG1vZGUgPSBzcGxhc2hNb2RlWEJHUjg7CiAgfQogIHJldHVybiBuZXdkYXRhICE9IE5VTEw7Cn0KCiNpZiBTUExBU0hfQ01ZSwp2b2lkIFNwbGFzaEJpdG1hcDo6Z2V0Q01ZS0xpbmUoaW50IHlsLCBTcGxhc2hDb2xvclB0ciBsaW5lKSB7CiAgU3BsYXNoQ29sb3IgY29sOwoKICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgIGdldFBpeGVsKHgsIHlsLCBjb2wpOwogICAgaWYgKHNlcGFyYXRpb25MaXN0LT5nZXRMZW5ndGgoKSA+IDApIHsKICAgICAgZG91YmxlIGMsIG0sIHksIGs7CiAgICAgIGMgPSBieXRlVG9EYmwoY29sWzBdKTsKICAgICAgbSA9IGJ5dGVUb0RibChjb2xbMV0pOwogICAgICB5ID0gYnl0ZVRvRGJsKGNvbFsyXSk7CiAgICAgIGsgPSBieXRlVG9EYmwoY29sWzNdKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXBhcmF0aW9uTGlzdC0+Z2V0TGVuZ3RoKCk7IGkrKykgewogICAgICAgIGlmIChjb2xbaSs0XSA+IDApIHsKICAgICAgICAgIEdmeENNWUsgY215azsKICAgICAgICAgIEdmeENvbG9yIGlucHV0OwogICAgICAgICAgaW5wdXQuY1swXSA9IGJ5dGVUb0NvbChjb2xbaSs0XSk7CiAgICAgICAgICBHZnhTZXBhcmF0aW9uQ29sb3JTcGFjZSAqc2VwQ1MgPSAoR2Z4U2VwYXJhdGlvbkNvbG9yU3BhY2UgKilzZXBhcmF0aW9uTGlzdC0+Z2V0KGkpOwogICAgICAgICAgc2VwQ1MtPmdldENNWUsoJmlucHV0LCAmY215ayk7CiAgICAgICAgICBjb2xbMF0gPSBjb2xUb0J5dGUoY215ay5jKTsKICAgICAgICAgIGNvbFsxXSA9IGNvbFRvQnl0ZShjbXlrLm0pOwogICAgICAgICAgY29sWzJdID0gY29sVG9CeXRlKGNteWsueSk7CiAgICAgICAgICBjb2xbM10gPSBjb2xUb0J5dGUoY215ay5rKTsKICAgICAgICAgIGMgKz0gYnl0ZVRvRGJsKGNvbFswXSk7CiAgICAgICAgICBtICs9IGJ5dGVUb0RibChjb2xbMV0pOwogICAgICAgICAgeSArPSBieXRlVG9EYmwoY29sWzJdKTsKICAgICAgICAgIGsgKz0gYnl0ZVRvRGJsKGNvbFszXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbFswXSA9IGRibFRvQnl0ZShjbGlwMDEoYykpOwogICAgICBjb2xbMV0gPSBkYmxUb0J5dGUoY2xpcDAxKG0pKTsKICAgICAgY29sWzJdID0gZGJsVG9CeXRlKGNsaXAwMSh5KSk7CiAgICAgIGNvbFszXSA9IGRibFRvQnl0ZShjbGlwMDEoaykpOwogICAgfQogICAgKmxpbmUrKyA9IGNvbFswXTsKICAgICpsaW5lKysgPSBjb2xbMV07CiAgICAqbGluZSsrID0gY29sWzJdOwogICAgKmxpbmUrKyA9IGNvbFszXTsKICB9Cn0KI2VuZGlmCgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlSW1nRmlsZShJbWdXcml0ZXIgKndyaXRlciwgRklMRSAqZiwgaW50IGhEUEksIGludCB2RFBJKSB7CiAgaWYgKG1vZGUgIT0gc3BsYXNoTW9kZVJHQjggJiYgbW9kZSAhPSBzcGxhc2hNb2RlTW9ubzggJiYgbW9kZSAhPSBzcGxhc2hNb2RlTW9ubzEgJiYgbW9kZSAhPSBzcGxhc2hNb2RlWEJHUjgKI2lmIFNQTEFTSF9DTVlLCiAgICAgICYmIG1vZGUgIT0gc3BsYXNoTW9kZUNNWUs4ICYmIG1vZGUgIT0gc3BsYXNoTW9kZURldmljZU44CiNlbmRpZgogICAgICkgewogICAgZXJyb3IoZXJySW50ZXJuYWwsIC0xLCAidW5zdXBwb3J0ZWQgU3BsYXNoQml0bWFwIG1vZGUiKTsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCiAgaWYgKCF3cml0ZXItPmluaXQoZiwgd2lkdGgsIGhlaWdodCwgaERQSSwgdkRQSSkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCiAgc3dpdGNoIChtb2RlKSB7CiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICAgIGlmICh3cml0ZXItPnN1cHBvcnRDTVlLKCkpIHsKICAgICAgICBTcGxhc2hDb2xvclB0ciByb3c7CiAgICAgICAgdW5zaWduZWQgY2hhciAqKnJvd19wb2ludGVycyA9IG5ldyB1bnNpZ25lZCBjaGFyKltoZWlnaHRdOwogICAgICAgIHJvdyA9IGRhdGE7CgogICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgIHJvd19wb2ludGVyc1t5XSA9IHJvdzsKICAgICAgICAgIHJvdyArPSByb3dTaXplOwogICAgICAgIH0KICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVQb2ludGVycyhyb3dfcG9pbnRlcnMsIGhlaWdodCkpIHsKICAgICAgICAgIGRlbGV0ZVtdIHJvd19wb2ludGVyczsKICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgIH0KICAgICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3IHVuc2lnbmVkIGNoYXJbMyAqIHdpZHRoXTsKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgICBnZXRSR0JMaW5lKHksIHJvdyk7CiAgICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVSb3coJnJvdykpIHsKICAgICAgICAgICAgZGVsZXRlW10gcm93OwogICAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGVsZXRlW10gcm93OwogICAgICB9CiAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZURldmljZU44OgogICAgICBpZiAod3JpdGVyLT5zdXBwb3J0Q01ZSygpKSB7CiAgICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3IHVuc2lnbmVkIGNoYXJbNCAqIHdpZHRoXTsKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgICBnZXRDTVlLTGluZSh5LCByb3cpOwogICAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgfSBlbHNlIHsKICAgICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAgIGdldFJHQkxpbmUoeSwgcm93KTsKICAgICAgICAgIGlmICghd3JpdGVyLT53cml0ZVJvdygmcm93KSkgewogICAgICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgIH0KICAgIGJyZWFrOwojZW5kaWYKICAgIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICB7CiAgICAgIFNwbGFzaENvbG9yUHRyIHJvdzsKICAgICAgdW5zaWduZWQgY2hhciAqKnJvd19wb2ludGVycyA9IG5ldyB1bnNpZ25lZCBjaGFyKltoZWlnaHRdOwogICAgICByb3cgPSBkYXRhOwoKICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICAgIHJvd19wb2ludGVyc1t5XSA9IHJvdzsKICAgICAgICByb3cgKz0gcm93U2l6ZTsKICAgICAgfQogICAgICBpZiAoIXdyaXRlci0+d3JpdGVQb2ludGVycyhyb3dfcG9pbnRlcnMsIGhlaWdodCkpIHsKICAgICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93X3BvaW50ZXJzOwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgewogICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgLy8gQ29udmVydCBpbnRvIGEgUE5HIHJvdwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgcm93WzMqeF0gPSBkYXRhW3kgKiByb3dTaXplICsgeCAqIDQgKyAyXTsKICAgICAgICAgIHJvd1szKngrMV0gPSBkYXRhW3kgKiByb3dTaXplICsgeCAqIDQgKyAxXTsKICAgICAgICAgIHJvd1szKngrMl0gPSBkYXRhW3kgKiByb3dTaXplICsgeCAqIDRdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93OwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgewogICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgLy8gQ29udmVydCBpbnRvIGEgUE5HIHJvdwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgcm93WzMqeF0gPSBkYXRhW3kgKiByb3dTaXplICsgeF07CiAgICAgICAgICByb3dbMyp4KzFdID0gZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgICAgICAgcm93WzMqeCsyXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgICAgICB9CgogICAgICAgIGlmICghd3JpdGVyLT53cml0ZVJvdygmcm93KSkgewogICAgICAgICAgZGVsZXRlW10gcm93OwogICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRlbGV0ZVtdIHJvdzsKICAgIH0KICAgIGJyZWFrOwogICAgCiAgICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3IHVuc2lnbmVkIGNoYXJbMyAqIHdpZHRoXTsKICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgIC8vIENvbnZlcnQgaW50byBhIFBORyByb3cKICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgIGdldFBpeGVsKHgsIHksICZyb3dbMyp4XSk7CiAgICAgICAgICByb3dbMyp4KzFdID0gcm93WzMqeF07CiAgICAgICAgICByb3dbMyp4KzJdID0gcm93WzMqeF07CiAgICAgICAgfQoKICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVSb3coJnJvdykpIHsKICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGVbXSByb3c7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgZGVmYXVsdDoKICAgIC8vIGNhbid0IGhhcHBlbgogICAgYnJlYWs7CiAgfQogIAogIGlmICghd3JpdGVyLT5jbG9zZSgpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgogIHJldHVybiBzcGxhc2hPazsKfQo=