Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBTUExBU0hfSAojZGVmaW5lIFNQTEFTSF9ICgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW50ZXJmYWNlCiNlbmRpZgoKI2luY2x1ZGUgIlNwbGFzaFR5cGVzLmgiCiNpbmNsdWRlICJTcGxhc2hDbGlwLmgiCiNpbmNsdWRlICJTcGxhc2hQYXR0ZXJuLmgiCgpjbGFzcyBTcGxhc2hCaXRtYXA7CnN0cnVjdCBTcGxhc2hHbHlwaEJpdG1hcDsKY2xhc3MgU3BsYXNoU3RhdGU7CmNsYXNzIFNwbGFzaFNjcmVlbjsKY2xhc3MgU3BsYXNoUGF0aDsKY2xhc3MgU3BsYXNoWFBhdGg7CmNsYXNzIFNwbGFzaEZvbnQ7CnN0cnVjdCBTcGxhc2hQaXBlOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFJldHJpZXZlcyB0aGUgbmV4dCBsaW5lIG9mIHBpeGVscyBpbiBhbiBpbWFnZSBtYXNrLiAgTm9ybWFsbHksCi8vIGZpbGxzIGluICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMKLy8gZXhoYXVzdGVkLCByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIEdCb29sICgqU3BsYXNoSW1hZ2VNYXNrU291cmNlKSh2b2lkICpkYXRhLCBTcGxhc2hDb2xvclB0ciBwaXhlbCk7CgovLyBSZXRyaWV2ZXMgdGhlIG5leHQgbGluZSBvZiBwaXhlbHMgaW4gYW4gaW1hZ2UuICBOb3JtYWxseSwgZmlsbHMgaW4KLy8gKjxsaW5lPiBhbmQgcmV0dXJucyB0cnVlLiAgSWYgdGhlIGltYWdlIHN0cmVhbSBpcyBleGhhdXN0ZWQsCi8vIHJldHVybnMgZmFsc2UuCnR5cGVkZWYgR0Jvb2wgKCpTcGxhc2hJbWFnZVNvdXJjZSkodm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgY29sb3JMaW5lLAoJCQkJICAgR3VjaGFyICphbHBoYUxpbmUpOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVudW0gU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCB7CiNpZiBTUExBU0hfQ01ZSwogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZENNWUssCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAojZW5kaWYKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kUkdCCiNpZiBTUExBU0hfQ01ZSwogICwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kQ01ZSwojZW5kaWYKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoIHsKcHVibGljOgoKICAvLyBDcmVhdGUgYSBuZXcgcmFzdGVyaXplciBvYmplY3QuCiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW5QYXJhbXMgKnNjcmVlblBhcmFtcyA9IE5VTEwpOwogIFNwbGFzaChTcGxhc2hCaXRtYXAgKmJpdG1hcEEsIEdCb29sIHZlY3RvckFudGlhbGlhc0EsCgkgU3BsYXNoU2NyZWVuICpzY3JlZW5BKTsKCiAgflNwbGFzaCgpOwoKICAvLy0tLS0tIHN0YXRlIHJlYWQKCiAgU3BsYXNoQ29vcmQgKmdldE1hdHJpeCgpOwogIFNwbGFzaFBhdHRlcm4gKmdldFN0cm9rZVBhdHRlcm4oKTsKICBTcGxhc2hQYXR0ZXJuICpnZXRGaWxsUGF0dGVybigpOwogIFNwbGFzaFNjcmVlbiAqZ2V0U2NyZWVuKCk7CiAgU3BsYXNoQmxlbmRGdW5jIGdldEJsZW5kRnVuYygpOwogIFNwbGFzaENvb3JkIGdldFN0cm9rZUFscGhhKCk7CiAgU3BsYXNoQ29vcmQgZ2V0RmlsbEFscGhhKCk7CiAgU3BsYXNoQ29vcmQgZ2V0TGluZVdpZHRoKCk7CiAgaW50IGdldExpbmVDYXAoKTsKICBpbnQgZ2V0TGluZUpvaW4oKTsKICBTcGxhc2hDb29yZCBnZXRNaXRlckxpbWl0KCk7CiAgU3BsYXNoQ29vcmQgZ2V0RmxhdG5lc3MoKTsKICBTcGxhc2hDb29yZCAqZ2V0TGluZURhc2goKTsKICBpbnQgZ2V0TGluZURhc2hMZW5ndGgoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lRGFzaFBoYXNlKCk7CiAgU3BsYXNoQ2xpcCAqZ2V0Q2xpcCgpOwogIFNwbGFzaEJpdG1hcCAqZ2V0U29mdE1hc2soKTsKICBHQm9vbCBnZXRJbk5vbklzb2xhdGVkR3JvdXAoKTsKCiAgLy8tLS0tLSBzdGF0ZSB3cml0ZQoKICB2b2lkIHNldE1hdHJpeChTcGxhc2hDb29yZCAqbWF0cml4KTsKICB2b2lkIHNldFN0cm9rZVBhdHRlcm4oU3BsYXNoUGF0dGVybiAqc3Ryb2tlQ29sb3IpOwogIHZvaWQgc2V0RmlsbFBhdHRlcm4oU3BsYXNoUGF0dGVybiAqZmlsbENvbG9yKTsKICB2b2lkIHNldFNjcmVlbihTcGxhc2hTY3JlZW4gKnNjcmVlbik7CiAgdm9pZCBzZXRCbGVuZEZ1bmMoU3BsYXNoQmxlbmRGdW5jIGZ1bmMpOwogIHZvaWQgc2V0U3Ryb2tlQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbEFscGhhKFNwbGFzaENvb3JkIGFscGhhKTsKICB2b2lkIHNldExpbmVXaWR0aChTcGxhc2hDb29yZCBsaW5lV2lkdGgpOwogIHZvaWQgc2V0TGluZUNhcChpbnQgbGluZUNhcCk7CiAgdm9pZCBzZXRMaW5lSm9pbihpbnQgbGluZUpvaW4pOwogIHZvaWQgc2V0TWl0ZXJMaW1pdChTcGxhc2hDb29yZCBtaXRlckxpbWl0KTsKICB2b2lkIHNldEZsYXRuZXNzKFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICAvLyB0aGUgPGxpbmVEYXNoPiBhcnJheSB3aWxsIGJlIGNvcGllZAogIHZvaWQgc2V0TGluZURhc2goU3BsYXNoQ29vcmQgKmxpbmVEYXNoLCBpbnQgbGluZURhc2hMZW5ndGgsCgkJICAgU3BsYXNoQ29vcmQgbGluZURhc2hQaGFzZSk7CiAgdm9pZCBzZXRTdHJva2VBZGp1c3QoR0Jvb2wgc3Ryb2tlQWRqdXN0KTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICB2b2lkIGNsaXBSZXNldFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgU3BsYXNoRXJyb3IgY2xpcFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJCSBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEpOwogIC8vIE5COiB1c2VzIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgU3BsYXNoRXJyb3IgY2xpcFRvUGF0aChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbyk7CiAgdm9pZCBzZXRTb2Z0TWFzayhTcGxhc2hCaXRtYXAgKnNvZnRNYXNrKTsKICB2b2lkIHNldEluTm9uSXNvbGF0ZWRHcm91cChTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcEEsCgkJCSAgICAgaW50IGFscGhhMFhBLCBpbnQgYWxwaGEwWUEpOwoKICAvLy0tLS0tIHN0YXRlIHNhdmUvcmVzdG9yZQoKICB2b2lkIHNhdmVTdGF0ZSgpOwogIFNwbGFzaEVycm9yIHJlc3RvcmVTdGF0ZSgpOwoKICAvLy0tLS0tIGRyYXdpbmcgb3BlcmF0aW9ucwoKICAvLyBGaWxsIHRoZSBiaXRtYXAgd2l0aCA8Y29sb3I+LiAgVGhpcyBpcyBub3Qgc3ViamVjdCB0byBjbGlwcGluZy4KICB2b2lkIGNsZWFyKFNwbGFzaENvbG9yUHRyIGNvbG9yLCBHdWNoYXIgYWxwaGEgPSAweDAwKTsKCiAgLy8gU3Ryb2tlIGEgcGF0aCB1c2luZyB0aGUgY3VycmVudCBzdHJva2UgcGF0dGVybi4KICBTcGxhc2hFcnJvciBzdHJva2UoU3BsYXNoUGF0aCAqcGF0aCk7CgogIC8vIEZpbGwgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4KICBTcGxhc2hFcnJvciBmaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKCiAgLy8gRmlsbCBhIHBhdGgsIFhPUmluZyB3aXRoIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4KICBTcGxhc2hFcnJvciB4b3JGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKCiAgLy8gRHJhdyBhIGNoYXJhY3RlciwgdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGxDaGFyKFNwbGFzaENvb3JkIHgsIFNwbGFzaENvb3JkIHksIGludCBjLCBTcGxhc2hGb250ICpmb250KTsKCiAgLy8gRHJhdyBhIGdseXBoLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uICBUaGlzIGZ1bmN0aW9uIGRvZXMKICAvLyBub3QgZnJlZSBhbnkgZGF0YSwgaS5lLiwgaXQgaWdub3JlcyBnbHlwaC0+ZnJlZURhdGEuCiAgdm9pZCBmaWxsR2x5cGgoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwKCQkJU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoKTsKCiAgLy8gRHJhd3MgYW4gaW1hZ2UgbWFzayB1c2luZyB0aGUgZmlsbCBjb2xvci4gIFRoaXMgd2lsbCByZWFkIDxoPgogIC8vIGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbSA8c3JjPiwgc3RhcnRpbmcgd2l0aCB0aGUgdG9wIGxpbmUuICAiMSIKICAvLyBwaXhlbHMgd2lsbCBiZSBkcmF3biB3aXRoIHRoZSBjdXJyZW50IGZpbGwgY29sb3I7ICIwIiBwaXhlbHMgYXJlCiAgLy8gdHJhbnNwYXJlbnQuICBUaGUgbWF0cml4OgogIC8vICAgIFsgbWF0WzBdIG1hdFsxXSAwIF0KICAvLyAgICBbIG1hdFsyXSBtYXRbM10gMCBdCiAgLy8gICAgWyBtYXRbNF0gbWF0WzVdIDEgXQogIC8vIG1hcHMgYSB1bml0IHNxdWFyZSB0byB0aGUgZGVzaXJlZCBkZXN0aW5hdGlvbiBmb3IgdGhlIGltYWdlLCBpbgogIC8vIFBvc3RTY3JpcHQgc3R5bGU6CiAgLy8gICAgW3gnIHknIDFdID0gW3ggeSAxXSAqIG1hdAogIC8vIE5vdGUgdGhhdCB0aGUgU3BsYXNoIHkgYXhpcyBwb2ludHMgZG93bndhcmQsIGFuZCB0aGUgaW1hZ2Ugc291cmNlCiAgLy8gaXMgYXNzdW1lZCB0byBwcm9kdWNlIHBpeGVscyBpbiByYXN0ZXIgb3JkZXIsIHN0YXJ0aW5nIGZyb20gdGhlCiAgLy8gdG9wIGxpbmUuCiAgU3BsYXNoRXJyb3IgZmlsbEltYWdlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0LAoJCQkgICAgR0Jvb2wgZ2x5cGhNb2RlKTsKCiAgLy8gRHJhdyBhbiBpbWFnZS4gIFRoaXMgd2lsbCByZWFkIDxoPiBsaW5lcyBvZiA8dz4gcGl4ZWxzIGZyb20KICAvLyA8c3JjPiwgc3RhcnRpbmcgd2l0aCB0aGUgdG9wIGxpbmUuICBUaGVzZSBwaXhlbHMgYXJlIGFzc3VtZWQgdG8KICAvLyBiZSBpbiB0aGUgc291cmNlIG1vZGUsIDxzcmNNb2RlPi4gIElmIDxzcmNBbHBoYT4gaXMgdHJ1ZSwgdGhlCiAgLy8gYWxwaGEgdmFsdWVzIHJldHVybmVkIGJ5IDxzcmM+IGFyZSB1c2VkOyBvdGhlcndpc2UgdGhleSBhcmUKICAvLyBpZ25vcmVkLiAgVGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnMgb2Ygc291cmNlIGFuZCB0YXJnZXQgbW9kZXMKICAvLyBhcmUgc3VwcG9ydGVkOgogIC8vICAgIHNvdXJjZSAgICAgICB0YXJnZXQKICAvLyAgICAtLS0tLS0gICAgICAgLS0tLS0tCiAgLy8gICAgTW9ubzEgICAgICAgIE1vbm8xCiAgLy8gICAgTW9ubzggICAgICAgIE1vbm8xICAgLS0gd2l0aCBkaXRoZXJpbmcKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzgKICAvLyAgICBSR0I4ICAgICAgICAgUkdCOAogIC8vICAgIEJHUjggICAgICAgICBCR1I4CiAgLy8gICAgQ01ZSzggICAgICAgIENNWUs4CiAgLy8gVGhlIG1hdHJpeCBiZWhhdmVzIGFzIGZvciBmaWxsSW1hZ2VNYXNrLgogIFNwbGFzaEVycm9yIGRyYXdJbWFnZShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCVNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBHQm9vbCBzcmNBbHBoYSwKCQkJaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0KTsKCiAgLy8gQ29tcG9zaXRlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGlzIFNwbGFzaAogIC8vIG9iamVjdC4KICBTcGxhc2hFcnJvciBjb21wb3NpdGUoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCwKCQkJR0Jvb2wgbm9DbGlwLCBHQm9vbCBub25Jc29sYXRlZCk7CgogIC8vIENvbXBvc2l0ZSB0aGlzIFNwbGFzaCBvYmplY3Qgb250byBhIGJhY2tncm91bmQgY29sb3IuICBUaGUKICAvLyBiYWNrZ3JvdW5kIGFscGhhIGlzIGFzc3VtZWQgdG8gYmUgMS4KICB2b2lkIGNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpOwoKICAvLyBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGUgYml0bWFwIGJlbG9uZ2luZyB0bwogIC8vIHRoaXMgU3BsYXNoIG9iamVjdC4gIFRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZXMgYXJlIGFsbCBzZXQgdG8KICAvLyB6ZXJvLgogIFNwbGFzaEVycm9yIGJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoKTsKCiAgLy8tLS0tLSBtaXNjCgogIC8vIENvbnN0cnVjdCBhIHBhdGggZm9yIGEgc3Ryb2tlLCBnaXZlbiB0aGUgcGF0aCB0byBiZSBzdHJva2VkLCBhbmQKICAvLyB1c2luZyB0aGUgY3VycmVudCBsaW5lIHBhcmFtZXRlcnMuICBJZiA8ZmxhdHRlbj4gaXMgdHJ1ZSwgdGhpcwogIC8vIGZ1bmN0aW9uIHdpbGwgZmlyc3QgZmxhdHRlbiB0aGUgcGF0aCBhbmQgaGFuZGxlIHRoZSBsaW5lZGFzaC4KICBTcGxhc2hQYXRoICptYWtlU3Ryb2tlUGF0aChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBmbGF0dGVuID0gZ1RydWUpOwoKICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYml0bWFwLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CgogIC8vIEdldCBhIGJvdW5kaW5nIGJveCB3aGljaCBpbmNsdWRlcyBhbGwgbW9kaWZpY2F0aW9ucyBzaW5jZSB0aGUKICAvLyBsYXN0IGNhbGwgdG8gY2xlYXJNb2RSZWdpb24uCiAgdm9pZCBnZXRNb2RSZWdpb24oaW50ICp4TWluLCBpbnQgKnlNaW4sIGludCAqeE1heCwgaW50ICp5TWF4KQogICAgeyAqeE1pbiA9IG1vZFhNaW47ICp5TWluID0gbW9kWU1pbjsgKnhNYXggPSBtb2RYTWF4OyAqeU1heCA9IG1vZFlNYXg7IH0KCiAgLy8gQ2xlYXIgdGhlIG1vZGlmaWVkIHJlZ2lvbiBib3VuZGluZyBib3guCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICAvLyBHZXQgY2xpcHBpbmcgc3RhdHVzIGZvciB0aGUgbGFzdCBkcmF3aW5nIG9wZXJhdGlvbiBzdWJqZWN0IHRvCiAgLy8gY2xpcHBpbmcuCiAgU3BsYXNoQ2xpcFJlc3VsdCBnZXRDbGlwUmVzKCkgeyByZXR1cm4gb3BDbGlwUmVzOyB9CgogIC8vIFRvZ2dsZSBkZWJ1ZyBtb2RlIG9uIG9yIG9mZi4KICB2b2lkIHNldERlYnVnTW9kZShHQm9vbCBkZWJ1Z01vZGVBKSB7IGRlYnVnTW9kZSA9IGRlYnVnTW9kZUE7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpIHsgcmV0dXJuIHZlY3RvckFudGlhbGlhczsgfQogIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIHZhYSkgeyB2ZWN0b3JBbnRpYWxpYXMgPSB2YWE7IH0KI2VuZGlmCgogIC8vIERvIHNoYWRlZCBmaWxscyB3aXRoIGR5bmFtaWMgcGF0dGVybnMKICBTcGxhc2hFcnJvciBzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKTsKICAvLyBEcmF3IGEgZ291cmF1ZCB0cmlhbmdsZSBzaGFkaW5nLgogIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoU3BsYXNoR291cmF1ZENvbG9yICpzaGFkaW5nKTsKCnByaXZhdGU6CgogIHZvaWQgcGlwZUluaXQoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LAoJCVNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvbG9yUHRyIGNTcmMsCgkJU3BsYXNoQ29vcmQgYUlucHV0LCBHQm9vbCB1c2VzU2hhcGUsCgkJR0Jvb2wgbm9uSXNvbGF0ZWRHcm91cCk7CiAgdm9pZCBwaXBlUnVuKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVNldFhZKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIGRyYXdQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFQaXhlbEluaXQoKTsKICB2b2lkIGRyYXdBQVBpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBkcmF3U3BhbihTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFMaW5lKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSk7CiAgdm9pZCB0cmFuc2Zvcm0oU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgeGksIFNwbGFzaENvb3JkIHlpLAoJCSBTcGxhc2hDb29yZCAqeG8sIFNwbGFzaENvb3JkICp5byk7CiAgdm9pZCB1cGRhdGVNb2RYKGludCB4KTsKICB2b2lkIHVwZGF0ZU1vZFkoaW50IHkpOwogIHZvaWQgc3Ryb2tlTmFycm93KFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgc3Ryb2tlV2lkZShTcGxhc2hQYXRoICpwYXRoKTsKICBTcGxhc2hQYXRoICpmbGF0dGVuUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqbWF0cml4LAoJCQkgIFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICB2b2lkIGZsYXR0ZW5DdXJ2ZShTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSwKCQkgICAgU3BsYXNoQ29vcmQgeDIsIFNwbGFzaENvb3JkIHkyLAoJCSAgICBTcGxhc2hDb29yZCB4MywgU3BsYXNoQ29vcmQgeTMsCgkJICAgIFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIGZsYXRuZXNzMiwKCQkgICAgU3BsYXNoUGF0aCAqZlBhdGgpOwogIFNwbGFzaFBhdGggKm1ha2VEYXNoZWRQYXRoKFNwbGFzaFBhdGggKnhQYXRoKTsKICBTcGxhc2hFcnJvciBmaWxsV2l0aFBhdHRlcm4oU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8sCgkJCSAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvb3JkIGFscGhhKTsKICB2b2lkIGZpbGxHbHlwaDIoaW50IHgwLCBpbnQgeTAsIFNwbGFzaEdseXBoQml0bWFwICpnbHlwaCwgR0Jvb2wgbm9jbGlwKTsKICB2b2lkIGR1bXBQYXRoKFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgZHVtcFhQYXRoKFNwbGFzaFhQYXRoICpwYXRoKTsKCiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kW107CiAgc3RhdGljIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgcGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBpbnQgcGlwZU5vbklzb0dyb3VwQ29ycmVjdGlvbltdOwoKICBTcGxhc2hCaXRtYXAgKmJpdG1hcDsKICBTcGxhc2hTdGF0ZSAqc3RhdGU7CiAgU3BsYXNoQml0bWFwICphYUJ1ZjsKICBpbnQgYWFCdWZZOwogIFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwOwkvLyBmb3Igbm9uLWlzb2xhdGVkIGdyb3VwcywgdGhpcyBpcyB0aGUKCQkJCS8vICAgYml0bWFwIGNvbnRhaW5pbmcgdGhlIGFscGhhMCB2YWx1ZXMKICBpbnQgYWxwaGEwWCwgYWxwaGEwWTsJCS8vIG9mZnNldCB3aXRoaW4gYWxwaGEwQml0bWFwCiAgU3BsYXNoQ29vcmQgYWFHYW1tYVtzcGxhc2hBQVNpemUgKiBzcGxhc2hBQVNpemUgKyAxXTsKICBpbnQgbW9kWE1pbiwgbW9kWU1pbiwgbW9kWE1heCwgbW9kWU1heDsKICBTcGxhc2hDbGlwUmVzdWx0IG9wQ2xpcFJlczsKICBHQm9vbCB2ZWN0b3JBbnRpYWxpYXM7CiAgR0Jvb2wgZGVidWdNb2RlOwp9OwoKI2VuZGlmCg==