Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEsIDIwMTggQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzLCAyMDE1IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTcgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgIlNwbGFzaFR5cGVzLmgiCiNpbmNsdWRlICJTcGxhc2hDbGlwLmgiCiNpbmNsdWRlICJTcGxhc2hQYXR0ZXJuLmgiCgpjbGFzcyBTcGxhc2hCaXRtYXA7CnN0cnVjdCBTcGxhc2hHbHlwaEJpdG1hcDsKY2xhc3MgU3BsYXNoU3RhdGU7CmNsYXNzIFNwbGFzaFNjcmVlbjsKY2xhc3MgU3BsYXNoUGF0aDsKY2xhc3MgU3BsYXNoWFBhdGg7CmNsYXNzIFNwbGFzaEZvbnQ7CnN0cnVjdCBTcGxhc2hQaXBlOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFJldHJpZXZlcyB0aGUgbmV4dCBsaW5lIG9mIHBpeGVscyBpbiBhbiBpbWFnZSBtYXNrLiAgTm9ybWFsbHksCi8vIGZpbGxzIGluICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMKLy8gZXhoYXVzdGVkLCByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIGJvb2wgKCpTcGxhc2hJbWFnZU1hc2tTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIHBpeGVsKTsKCi8vIFJldHJpZXZlcyB0aGUgbmV4dCBsaW5lIG9mIHBpeGVscyBpbiBhbiBpbWFnZS4gIE5vcm1hbGx5LCBmaWxscyBpbgovLyAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzIGV4aGF1c3RlZCwKLy8gcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBib29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCi8vIFVzZSBJQ0NDb2xvclNwYWNlIHRvIHRyYW5zZm9ybSBhIGJpdG1hcAp0eXBlZGVmIHZvaWQgKCpTcGxhc2hJQ0NUcmFuc2Zvcm0pKHZvaWQgKmRhdGEsIFNwbGFzaEJpdG1hcCAqYml0bWFwKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgewojaWZkZWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWZkZWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmZGVmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmREZXZpY2VOCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBib29sIHZlY3RvckFudGlhbGlhc0EsCgkgU3BsYXNoU2NyZWVuUGFyYW1zICpzY3JlZW5QYXJhbXMgPSBudWxscHRyKTsKICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBib29sIHZlY3RvckFudGlhbGlhc0EsCgkgU3BsYXNoU2NyZWVuICpzY3JlZW5BKTsKCiAgflNwbGFzaCgpOwoKICBTcGxhc2goY29uc3QgU3BsYXNoICYpID0gZGVsZXRlOwogIFNwbGFzaCYgb3BlcmF0b3I9KGNvbnN0IFNwbGFzaCAmKSA9IGRlbGV0ZTsKCiAgLy8tLS0tLSBzdGF0ZSByZWFkCgogIFNwbGFzaENvb3JkICpnZXRNYXRyaXgoKTsKICBTcGxhc2hQYXR0ZXJuICpnZXRTdHJva2VQYXR0ZXJuKCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0RmlsbFBhdHRlcm4oKTsKICBTcGxhc2hTY3JlZW4gKmdldFNjcmVlbigpOwogIFNwbGFzaEJsZW5kRnVuYyBnZXRCbGVuZEZ1bmMoKTsKICBTcGxhc2hDb29yZCBnZXRTdHJva2VBbHBoYSgpOwogIFNwbGFzaENvb3JkIGdldEZpbGxBbHBoYSgpOwogIFNwbGFzaENvb3JkIGdldExpbmVXaWR0aCgpOwogIGludCBnZXRMaW5lQ2FwKCk7CiAgaW50IGdldExpbmVKb2luKCk7CiAgU3BsYXNoQ29vcmQgZ2V0TWl0ZXJMaW1pdCgpOwogIFNwbGFzaENvb3JkIGdldEZsYXRuZXNzKCk7CiAgU3BsYXNoQ29vcmQgKmdldExpbmVEYXNoKCk7CiAgaW50IGdldExpbmVEYXNoTGVuZ3RoKCk7CiAgU3BsYXNoQ29vcmQgZ2V0TGluZURhc2hQaGFzZSgpOwogIGJvb2wgZ2V0U3Ryb2tlQWRqdXN0KCk7CiAgU3BsYXNoQ2xpcCAqZ2V0Q2xpcCgpOwogIFNwbGFzaEJpdG1hcCAqZ2V0U29mdE1hc2soKTsKICBib29sIGdldEluTm9uSXNvbGF0ZWRHcm91cCgpOwoKICAvLy0tLS0tIHN0YXRlIHdyaXRlCgogIHZvaWQgc2V0TWF0cml4KFNwbGFzaENvb3JkICptYXRyaXgpOwogIHZvaWQgc2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VDb2xvcik7CiAgdm9pZCBzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsQ29sb3IpOwogIHZvaWQgc2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKTsKICB2b2lkIHNldEJsZW5kRnVuYyhTcGxhc2hCbGVuZEZ1bmMgZnVuYyk7CiAgdm9pZCBzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSk7CiAgdm9pZCBzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0UGF0dGVybkFscGhhKFNwbGFzaENvb3JkIHN0cm9rZUFscGhhLCBTcGxhc2hDb29yZCBmaWxsQWxwaGEpOwogIHZvaWQgY2xlYXJQYXR0ZXJuQWxwaGEoKTsKICB2b2lkIHNldEZpbGxPdmVycHJpbnQoYm9vbCBmb3ApOwogIHZvaWQgc2V0U3Ryb2tlT3ZlcnByaW50KGJvb2wgc29wKTsKICB2b2lkIHNldE92ZXJwcmludE1vZGUoaW50IG9wbSk7CiAgdm9pZCBzZXRMaW5lV2lkdGgoU3BsYXNoQ29vcmQgbGluZVdpZHRoKTsKICB2b2lkIHNldExpbmVDYXAoaW50IGxpbmVDYXApOwogIHZvaWQgc2V0TGluZUpvaW4oaW50IGxpbmVKb2luKTsKICB2b2lkIHNldE1pdGVyTGltaXQoU3BsYXNoQ29vcmQgbWl0ZXJMaW1pdCk7CiAgdm9pZCBzZXRGbGF0bmVzcyhTcGxhc2hDb29yZCBmbGF0bmVzcyk7CiAgLy8gdGhlIDxsaW5lRGFzaD4gYXJyYXkgd2lsbCBiZSBjb3BpZWQKICB2b2lkIHNldExpbmVEYXNoKFNwbGFzaENvb3JkICpsaW5lRGFzaCwgaW50IGxpbmVEYXNoTGVuZ3RoLAoJCSAgIFNwbGFzaENvb3JkIGxpbmVEYXNoUGhhc2UpOwogIHZvaWQgc2V0U3Ryb2tlQWRqdXN0KGJvb2wgc3Ryb2tlQWRqdXN0KTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICB2b2lkIGNsaXBSZXNldFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgU3BsYXNoRXJyb3IgY2xpcFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJCSBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEpOwogIC8vIE5COiB1c2VzIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgU3BsYXNoRXJyb3IgY2xpcFRvUGF0aChTcGxhc2hQYXRoICpwYXRoLCBib29sIGVvKTsKICB2b2lkIHNldFNvZnRNYXNrKFNwbGFzaEJpdG1hcCAqc29mdE1hc2spOwogIHZvaWQgc2V0SW5Ob25Jc29sYXRlZEdyb3VwKFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwQSwKCQkJICAgICBpbnQgYWxwaGEwWEEsIGludCBhbHBoYTBZQSk7CiAgdm9pZCBzZXRUcmFuc2ZlcihHdWNoYXIgKnJlZCwgR3VjaGFyICpncmVlbiwgR3VjaGFyICpibHVlLCBHdWNoYXIgKmdyYXkpOwogIHZvaWQgc2V0T3ZlcnByaW50TWFzayhHdWludCBvdmVycHJpbnRNYXNrLCBib29sIGFkZGl0aXZlKTsKCiAgLy8tLS0tLSBzdGF0ZSBzYXZlL3Jlc3RvcmUKCiAgdm9pZCBzYXZlU3RhdGUoKTsKICBTcGxhc2hFcnJvciByZXN0b3JlU3RhdGUoKTsKCiAgLy8tLS0tLSBkcmF3aW5nIG9wZXJhdGlvbnMKCiAgLy8gRmlsbCB0aGUgYml0bWFwIHdpdGggPGNvbG9yPi4gIFRoaXMgaXMgbm90IHN1YmplY3QgdG8gY2xpcHBpbmcuCiAgdm9pZCBjbGVhcihTcGxhc2hDb2xvclB0ciBjb2xvciwgR3VjaGFyIGFscGhhID0gMHgwMCk7CgogIC8vIFN0cm9rZSBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgc3Ryb2tlIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3Igc3Ryb2tlKFNwbGFzaFBhdGggKnBhdGgpOwoKICAvLyBGaWxsIGEgcGF0aCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbChTcGxhc2hQYXRoICpwYXRoLCBib29sIGVvKTsKCiAgLy8gRmlsbCBhIHBhdGgsIFhPUmluZyB3aXRoIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4KICBTcGxhc2hFcnJvciB4b3JGaWxsKFNwbGFzaFBhdGggKnBhdGgsIGJvb2wgZW8pOwoKICAvLyBEcmF3IGEgY2hhcmFjdGVyLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbENoYXIoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwgaW50IGMsIFNwbGFzaEZvbnQgKmZvbnQpOwoKICAvLyBEcmF3IGEgZ2x5cGgsIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4gIFRoaXMgZnVuY3Rpb24gZG9lcwogIC8vIG5vdCBmcmVlIGFueSBkYXRhLCBpLmUuLCBpdCBpZ25vcmVzIGdseXBoLT5mcmVlRGF0YS4KICB2b2lkIGZpbGxHbHlwaChTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LAoJCQlTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgpOwoKICAvLyBEcmF3cyBhbiBpbWFnZSBtYXNrIHVzaW5nIHRoZSBmaWxsIGNvbG9yLiAgVGhpcyB3aWxsIHJlYWQgPGg+CiAgLy8gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gICIxIgogIC8vIHBpeGVscyB3aWxsIGJlIGRyYXduIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBjb2xvcjsgIjAiIHBpeGVscyBhcmUKICAvLyB0cmFuc3BhcmVudC4gIFRoZSBtYXRyaXg6CiAgLy8gICAgWyBtYXRbMF0gbWF0WzFdIDAgXQogIC8vICAgIFsgbWF0WzJdIG1hdFszXSAwIF0KICAvLyAgICBbIG1hdFs0XSBtYXRbNV0gMSBdCiAgLy8gbWFwcyBhIHVuaXQgc3F1YXJlIHRvIHRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIGZvciB0aGUgaW1hZ2UsIGluCiAgLy8gUG9zdFNjcmlwdCBzdHlsZToKICAvLyAgICBbeCcgeScgMV0gPSBbeCB5IDFdICogbWF0CiAgLy8gTm90ZSB0aGF0IHRoZSBTcGxhc2ggeSBheGlzIHBvaW50cyBkb3dud2FyZCwgYW5kIHRoZSBpbWFnZSBzb3VyY2UKICAvLyBpcyBhc3N1bWVkIHRvIHByb2R1Y2UgcGl4ZWxzIGluIHJhc3RlciBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKICAvLyB0b3AgbGluZS4KICBTcGxhc2hFcnJvciBmaWxsSW1hZ2VNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsCgkJCSAgICBib29sIGdseXBoTW9kZSk7CgogIC8vIERyYXcgYW4gaW1hZ2UuICBUaGlzIHdpbGwgcmVhZCA8aD4gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tCiAgLy8gPHNyYz4sIHN0YXJ0aW5nIHdpdGggdGhlIHRvcCBsaW5lLiAgVGhlc2UgcGl4ZWxzIGFyZSBhc3N1bWVkIHRvCiAgLy8gYmUgaW4gdGhlIHNvdXJjZSBtb2RlLCA8c3JjTW9kZT4uICBJZiA8c3JjQWxwaGE+IGlzIHRydWUsIHRoZQogIC8vIGFscGhhIHZhbHVlcyByZXR1cm5lZCBieSA8c3JjPiBhcmUgdXNlZDsgb3RoZXJ3aXNlIHRoZXkgYXJlCiAgLy8gaWdub3JlZC4gIFRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIG9mIHNvdXJjZSBhbmQgdGFyZ2V0IG1vZGVzCiAgLy8gYXJlIHN1cHBvcnRlZDoKICAvLyAgICBzb3VyY2UgICAgICAgdGFyZ2V0CiAgLy8gICAgLS0tLS0tICAgICAgIC0tLS0tLQogIC8vICAgIE1vbm8xICAgICAgICBNb25vMQogIC8vICAgIE1vbm84ICAgICAgICBNb25vMSAgIC0tIHdpdGggZGl0aGVyaW5nCiAgLy8gICAgTW9ubzggICAgICAgIE1vbm84CiAgLy8gICAgUkdCOCAgICAgICAgIFJHQjgKICAvLyAgICBCR1I4ICAgICAgICAgQkdSOAogIC8vICAgIENNWUs4ICAgICAgICBDTVlLOAogIC8vIFRoZSBtYXRyaXggYmVoYXZlcyBhcyBmb3IgZmlsbEltYWdlTWFzay4KICBTcGxhc2hFcnJvciBkcmF3SW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCBTcGxhc2hJQ0NUcmFuc2Zvcm0gdGYsIHZvaWQgKnNyY0RhdGEsCgkJCVNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBib29sIHNyY0FscGhhLAoJCQlpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsIGJvb2wgaW50ZXJwb2xhdGUsCgkJCWJvb2wgdGlsaW5nUGF0dGVybiA9IGZhbHNlKTsKCiAgLy8gQ29tcG9zaXRlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGlzIFNwbGFzaAogIC8vIG9iamVjdC4KICBTcGxhc2hFcnJvciBjb21wb3NpdGUoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCwKCQkJYm9vbCBub0NsaXAsIGJvb2wgbm9uSXNvbGF0ZWQsCgkJCWJvb2wga25vY2tvdXQgPSBmYWxzZSwgU3BsYXNoQ29vcmQga25vY2tvdXRPcGFjaXR5ID0gMS4wKTsKCiAgLy8gQ29tcG9zaXRlIHRoaXMgU3BsYXNoIG9iamVjdCBvbnRvIGEgYmFja2dyb3VuZCBjb2xvci4gIFRoZQogIC8vIGJhY2tncm91bmQgYWxwaGEgaXMgYXNzdW1lZCB0byBiZSAxLgogIHZvaWQgY29tcG9zaXRlQmFja2dyb3VuZChTcGxhc2hDb2xvclB0ciBjb2xvcik7CgogIC8vIENvcHkgYSByZWN0YW5ndWxhciByZWdpb24gZnJvbSA8c3JjPiBvbnRvIHRoZSBiaXRtYXAgYmVsb25naW5nIHRvCiAgLy8gdGhpcyBTcGxhc2ggb2JqZWN0LiAgVGhlIGRlc3RpbmF0aW9uIGFscGhhIHZhbHVlcyBhcmUgYWxsIHNldCB0bwogIC8vIHplcm8uCiAgU3BsYXNoRXJyb3IgYmxpdFRyYW5zcGFyZW50KFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeFNyYywgaW50IHlTcmMsCgkJCSAgICAgIGludCB4RGVzdCwgaW50IHlEZXN0LCBpbnQgdywgaW50IGgpOwogIHZvaWQgYmxpdEltYWdlKFNwbGFzaEJpdG1hcCAqc3JjLCBib29sIHNyY0FscGhhLCBpbnQgeERlc3QsIGludCB5RGVzdCk7CgogIC8vLS0tLS0gbWlzYwoKICAvLyBDb25zdHJ1Y3QgYSBwYXRoIGZvciBhIHN0cm9rZSwgZ2l2ZW4gdGhlIHBhdGggdG8gYmUgc3Ryb2tlZCBhbmQKICAvLyB0aGUgbGluZSB3aWR0aCA8dz4uICBBbGwgb3RoZXIgc3Ryb2tlIHBhcmFtZXRlcnMgYXJlIHRha2VuIGZyb20KICAvLyB0aGUgY3VycmVudCBzdGF0ZS4gIElmIDxmbGF0dGVuPiBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwKICAvLyBmaXJzdCBmbGF0dGVuIHRoZSBwYXRoIGFuZCBoYW5kbGUgdGhlIGxpbmVkYXNoLgogIFNwbGFzaFBhdGggKm1ha2VTdHJva2VQYXRoKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkIHcsCgkJCSAgICAgYm9vbCBmbGF0dGVuID0gdHJ1ZSk7CgogIC8vIFJldHVybiB0aGUgYXNzb2NpYXRlZCBiaXRtYXAuCiAgU3BsYXNoQml0bWFwICpnZXRCaXRtYXAoKSB7IHJldHVybiBiaXRtYXA7IH0KCiAgLy8gU2V0IHRoZSBtaW5pbXVtIGxpbmUgd2lkdGguCiAgdm9pZCBzZXRNaW5MaW5lV2lkdGgoU3BsYXNoQ29vcmQgdykgeyBtaW5MaW5lV2lkdGggPSB3OyB9CgogIC8vIFNldHRlci9HZXR0ZXIgZm9yIHRoaW4gbGluZSBtb2RlCiAgdm9pZCBzZXRUaGluTGluZU1vZGUoU3BsYXNoVGhpbkxpbmVNb2RlIHRoaW5MaW5lTW9kZUEpIHsgdGhpbkxpbmVNb2RlID0gdGhpbkxpbmVNb2RlQTsgfQogIFNwbGFzaFRoaW5MaW5lTW9kZSBnZXRUaGluTGluZU1vZGUoKSB7IHJldHVybiB0aGluTGluZU1vZGU7IH0KCiAgLy8gR2V0IGEgYm91bmRpbmcgYm94IHdoaWNoIGluY2x1ZGVzIGFsbCBtb2RpZmljYXRpb25zIHNpbmNlIHRoZQogIC8vIGxhc3QgY2FsbCB0byBjbGVhck1vZFJlZ2lvbi4KICB2b2lkIGdldE1vZFJlZ2lvbihpbnQgKnhNaW4sIGludCAqeU1pbiwgaW50ICp4TWF4LCBpbnQgKnlNYXgpCiAgICB7ICp4TWluID0gbW9kWE1pbjsgKnlNaW4gPSBtb2RZTWluOyAqeE1heCA9IG1vZFhNYXg7ICp5TWF4ID0gbW9kWU1heDsgfQoKICAvLyBDbGVhciB0aGUgbW9kaWZpZWQgcmVnaW9uIGJvdW5kaW5nIGJveC4KICB2b2lkIGNsZWFyTW9kUmVnaW9uKCk7CgogIC8vIEdldCBjbGlwcGluZyBzdGF0dXMgZm9yIHRoZSBsYXN0IGRyYXdpbmcgb3BlcmF0aW9uIHN1YmplY3QgdG8KICAvLyBjbGlwcGluZy4KICBTcGxhc2hDbGlwUmVzdWx0IGdldENsaXBSZXMoKSB7IHJldHVybiBvcENsaXBSZXM7IH0KCiAgLy8gVG9nZ2xlIGRlYnVnIG1vZGUgb24gb3Igb2ZmLgogIHZvaWQgc2V0RGVidWdNb2RlKGJvb2wgZGVidWdNb2RlQSkgeyBkZWJ1Z01vZGUgPSBkZWJ1Z01vZGVBOyB9CgojaWYgMSAvL350bXA6IHR1cm4gb2ZmIGFudGktYWxpYXNpbmcgdGVtcG9yYXJpbHkKICB2b2lkIHNldEluU2hhZGluZyhib29sIHNoKSB7IGluU2hhZGluZyA9IHNoOyB9CiAgYm9vbCBnZXRWZWN0b3JBbnRpYWxpYXMoKSB7IHJldHVybiB2ZWN0b3JBbnRpYWxpYXM7IH0KICB2b2lkIHNldFZlY3RvckFudGlhbGlhcyhib29sIHZhYSkgeyB2ZWN0b3JBbnRpYWxpYXMgPSB2YWE7IH0KI2VuZGlmCgogIC8vIERvIHNoYWRlZCBmaWxscyB3aXRoIGR5bmFtaWMgcGF0dGVybnMKICBTcGxhc2hFcnJvciBzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIGJvb2wgaGFzQkJveCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4pOwogIC8vIERyYXcgYSBnb3VyYXVkIHRyaWFuZ2xlIHNoYWRpbmcuCiAgYm9vbCBnb3VyYXVkVHJpYW5nbGVTaGFkZWRGaWxsKFNwbGFzaEdvdXJhdWRDb2xvciAqc2hhZGluZyk7Cgpwcml2YXRlOgoKICB2b2lkIHBpcGVJbml0KFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSwKCQlTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuLCBTcGxhc2hDb2xvclB0ciBjU3JjLAoJCUd1Y2hhciBhSW5wdXQsIGJvb2wgdXNlc1NoYXBlLAoJCWJvb2wgbm9uSXNvbGF0ZWRHcm91cCwKCQlib29sIGtub2Nrb3V0ID0gZmFsc2UsIEd1Y2hhciBrbm9ja291dE9wYWNpdHkgPSAyNTUpOwogIHZvaWQgcGlwZVJ1bihTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vMShTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZVhCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZUJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNpZmRlZiBTUExBU0hfQ01ZSwogIHZvaWQgcGlwZVJ1blNpbXBsZUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZURldmljZU44KFNwbGFzaFBpcGUgKnBpcGUpOwojZW5kaWYKICB2b2lkIHBpcGVSdW5BQU1vbm8xKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBTW9ubzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBWEJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwojaWZkZWYgU1BMQVNIX0NNWUsKICB2b2lkIHBpcGVSdW5BQUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBRGV2aWNlTjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNlbmRpZgogIHZvaWQgcGlwZVNldFhZKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIGRyYXdQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksIGJvb2wgbm9DbGlwKTsKICB2b2lkIGRyYXdBQVBpeGVsSW5pdCgpOwogIHZvaWQgZHJhd0FBUGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KTsKICB2b2lkIGRyYXdTcGFuKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSwgYm9vbCBub0NsaXApOwogIHZvaWQgZHJhd0FBTGluZShTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIGJvb2wgYWRqdXN0TGluZSA9IGZhbHNlLCBHdWNoYXIgbGluZU9wYWNpdHkgPSAwKTsKICB2b2lkIHRyYW5zZm9ybShTcGxhc2hDb29yZCAqbWF0cml4LCBTcGxhc2hDb29yZCB4aSwgU3BsYXNoQ29vcmQgeWksCgkJIFNwbGFzaENvb3JkICp4bywgU3BsYXNoQ29vcmQgKnlvKTsKICB2b2lkIHVwZGF0ZU1vZFgoaW50IHgpOwogIHZvaWQgdXBkYXRlTW9kWShpbnQgeSk7CiAgdm9pZCBzdHJva2VOYXJyb3coU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBzdHJva2VXaWRlKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkIHcpOwogIFNwbGFzaFBhdGggKmZsYXR0ZW5QYXRoKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkICptYXRyaXgsCgkJCSAgU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIHZvaWQgZmxhdHRlbkN1cnZlKFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxLAoJCSAgICBTcGxhc2hDb29yZCB4MiwgU3BsYXNoQ29vcmQgeTIsCgkJICAgIFNwbGFzaENvb3JkIHgzLCBTcGxhc2hDb29yZCB5MywKCQkgICAgU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgZmxhdG5lc3MyLAoJCSAgICBTcGxhc2hQYXRoICpmUGF0aCk7CiAgU3BsYXNoUGF0aCAqbWFrZURhc2hlZFBhdGgoU3BsYXNoUGF0aCAqeFBhdGgpOwogIHZvaWQgZ2V0QkJveEZQKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkICp4TWluQSwgU3BsYXNoQ29vcmQgKnlNaW5BLCBTcGxhc2hDb29yZCAqeE1heEEsIFNwbGFzaENvb3JkICp5TWF4QSk7CiAgU3BsYXNoRXJyb3IgZmlsbFdpdGhQYXR0ZXJuKFNwbGFzaFBhdGggKnBhdGgsIGJvb2wgZW8sCgkJCSAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvb3JkIGFscGhhKTsKICBib29sIHBhdGhBbGxPdXRzaWRlKFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgZmlsbEdseXBoMihpbnQgeDAsIGludCB5MCwgU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoLCBib29sIG5vY2xpcCk7CiAgdm9pZCBhcmJpdHJhcnlUcmFuc2Zvcm1NYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICAgICAgU3BsYXNoQ29vcmQgKm1hdCwgYm9vbCBnbHlwaE1vZGUpOwogIFNwbGFzaEJpdG1hcCAqc2NhbGVNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCQkgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCk7CiAgdm9pZCBzY2FsZU1hc2tZZFhkKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWWRYdShTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1l1WGQoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZdVh1KFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgYmxpdE1hc2soU3BsYXNoQml0bWFwICpzcmMsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCVNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcyk7CiAgU3BsYXNoRXJyb3IgYXJiaXRyYXJ5VHJhbnNmb3JtSW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCBTcGxhc2hJQ0NUcmFuc2Zvcm0gdGYsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkJICAgICAgIGJvb2wgc3JjQWxwaGEsCgkJCSAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hDb29yZCAqbWF0LCBib29sIGludGVycG9sYXRlLCBib29sIHRpbGluZ1BhdHRlcm4gPSBmYWxzZSk7CiAgU3BsYXNoQml0bWFwICpzY2FsZUltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJCSAgIGJvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LCBib29sIGludGVycG9sYXRlLCBib29sIHRpbGluZ1BhdHRlcm4gPSBmYWxzZSk7CiAgdm9pZCBzY2FsZUltYWdlWWRYZChTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgYm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVlkWHUoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIGJvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVhkKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBib29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYdShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgYm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WHVCaWxpbmVhcihTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgYm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgdmVydEZsaXBJbWFnZShTcGxhc2hCaXRtYXAgKmltZywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCSAgICAgaW50IG5Db21wcyk7CiAgdm9pZCBibGl0SW1hZ2UoU3BsYXNoQml0bWFwICpzcmMsIGJvb2wgc3JjQWxwaGEsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCSBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMpOwogIHZvaWQgYmxpdEltYWdlQ2xpcHBlZChTcGxhc2hCaXRtYXAgKnNyYywgYm9vbCBzcmNBbHBoYSwKCQkJaW50IHhTcmMsIGludCB5U3JjLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQkJaW50IHcsIGludCBoKTsKICB2b2lkIGR1bXBQYXRoKFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgZHVtcFhQYXRoKFNwbGFzaFhQYXRoICpwYXRoKTsKCiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBpbnQgcGlwZU5vbklzb0dyb3VwQ29ycmVjdGlvbltdOwoKICBTcGxhc2hCaXRtYXAgKmJpdG1hcDsKICBTcGxhc2hTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQml0bWFwICphYUJ1ZjsKICBpbnQgYWFCdWZZOwogIFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwOwkvLyBmb3Igbm9uLWlzb2xhdGVkIGdyb3VwcywgdGhpcyBpcyB0aGUKCQkJCS8vICAgYml0bWFwIGNvbnRhaW5pbmcgdGhlIGFscGhhMCB2YWx1ZXMKICBpbnQgYWxwaGEwWCwgYWxwaGEwWTsJCS8vIG9mZnNldCB3aXRoaW4gYWxwaGEwQml0bWFwCiAgU3BsYXNoQ29vcmQgYWFHYW1tYVtzcGxhc2hBQVNpemUgKiBzcGxhc2hBQVNpemUgKyAxXTsKICBTcGxhc2hDb29yZCBtaW5MaW5lV2lkdGg7CiAgU3BsYXNoVGhpbkxpbmVNb2RlIHRoaW5MaW5lTW9kZTsKICBpbnQgbW9kWE1pbiwgbW9kWU1pbiwgbW9kWE1heCwgbW9kWU1heDsKICBTcGxhc2hDbGlwUmVzdWx0IG9wQ2xpcFJlczsKICBib29sIHZlY3RvckFudGlhbGlhczsKICBib29sIGluU2hhZGluZzsKICBib29sIGRlYnVnTW9kZTsKfTsKCiNlbmRpZgo=