LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNkYmcuYyx2IDEuMTAgMjAwMi8wOC8yMiAxODo1MzoyMiBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCnZvaWQKRmNWYWx1ZVByaW50IChjb25zdCBGY1ZhbHVlIHYpCnsKICAgIHN3aXRjaCAodi50eXBlKSB7CiAgICBjYXNlIEZjVHlwZVZvaWQ6CglwcmludGYgKCIgPHZvaWQ+Iik7CglicmVhazsKICAgIGNhc2UgRmNUeXBlSW50ZWdlcjoKCXByaW50ZiAoIiAlZChpKSIsIHYudS5pKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVEb3VibGU6CglwcmludGYgKCIgJWcoZikiLCB2LnUuZCk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlU3RyaW5nOgoJcHJpbnRmICgiIFwiJXNcIiIsIHYudS5zKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVCb29sOgoJcHJpbnRmICgiICVzIiwgdi51LmIgPyAiRmNUcnVlIiA6ICJGY0ZhbHNlIik7CglicmVhazsKICAgIGNhc2UgRmNUeXBlTWF0cml4OgoJcHJpbnRmICgiICglZiAlZjsgJWYgJWYpIiwgdi51Lm0tPnh4LCB2LnUubS0+eHksIHYudS5tLT55eCwgdi51Lm0tPnl5KTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVDaGFyU2V0OgkvKiBYWFggKi8KCXByaW50ZiAoIiBzZXQiKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVMYW5nU2V0OgoJcHJpbnRmICgiICIpOwoJRmNMYW5nU2V0UHJpbnQgKHYudS5sKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVGVEZhY2U6CglwcmludGYgKCIgZmFjZSIpOwoJYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNWYWx1ZUxpc3RQcmludCAoY29uc3QgRmNWYWx1ZUxpc3QgKmwpCnsKICAgIGZvciAoOyBsOyBsID0gbC0+bmV4dCkKICAgIHsKCUZjVmFsdWVQcmludCAobC0+dmFsdWUpOwoJc3dpdGNoIChsLT5iaW5kaW5nKSB7CgljYXNlIEZjVmFsdWVCaW5kaW5nV2VhazoKCSAgICBwcmludGYgKCIodykiKTsKCSAgICBicmVhazsKCWNhc2UgRmNWYWx1ZUJpbmRpbmdTdHJvbmc6CgkgICAgcHJpbnRmICgiKHMpIik7CgkgICAgYnJlYWs7CgljYXNlIEZjVmFsdWVCaW5kaW5nU2FtZToKCSAgICBwcmludGYgKCIoPSkiKTsKCSAgICBicmVhazsKCX0KICAgIH0KfQoKdm9pZApGY0xhbmdTZXRQcmludCAoY29uc3QgRmNMYW5nU2V0ICpscykKewogICAgRmNTdHJCdWYJYnVmOwogICAgRmNDaGFyOAlpbml0X2J1ZlsxMDI0XTsKICAgIAogICAgRmNTdHJCdWZJbml0ICgmYnVmLCBpbml0X2J1Ziwgc2l6ZW9mIChpbml0X2J1ZikpOwogICAgaWYgKEZjTmFtZVVucGFyc2VMYW5nU2V0ICgmYnVmLCBscykgJiYgRmNTdHJCdWZDaGFyICgmYnVmLCdcMCcpKQoJcHJpbnRmICgiJXMiLCBidWYuYnVmKTsKICAgIGVsc2UKCXByaW50ZiAoImxhbmdzZXQgKGFsbG9jIGVycm9yKSIpOwogICAgRmNTdHJCdWZEZXN0cm95ICgmYnVmKTsKfQoKdm9pZApGY1BhdHRlcm5QcmludCAoY29uc3QgRmNQYXR0ZXJuICpwKQp7CiAgICBpbnQJCSAgICBpOwogICAgRmNQYXR0ZXJuRWx0ICAgKmU7CiAgICAKICAgIGlmICghcCkKICAgIHsKCXByaW50ZiAoIk51bGwgcGF0dGVyblxuIik7CglyZXR1cm47CiAgICB9CiAgICBwcmludGYgKCJQYXR0ZXJuICVkIG9mICVkXG4iLCBwLT5udW0sIHAtPnNpemUpOwogICAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQogICAgewoJZSA9ICZwLT5lbHRzW2ldOwoJcHJpbnRmICgiXHQlczoiLCBlLT5vYmplY3QpOwoJRmNWYWx1ZUxpc3RQcmludCAoZS0+dmFsdWVzKTsKCXByaW50ZiAoIlxuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjT3BQcmludCAoRmNPcCBvcCkKewogICAgc3dpdGNoIChvcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjogcHJpbnRmICgiSW50ZWdlciIpOyBicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiRG91YmxlIik7IGJyZWFrOwogICAgY2FzZSBGY09wU3RyaW5nOiBwcmludGYgKCJTdHJpbmciKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6IHByaW50ZiAoIk1hdHJpeCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIkJvb2wiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDaGFyU2V0OiBwcmludGYgKCJDaGFyU2V0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wRmllbGQ6IHByaW50ZiAoIkZpZWxkIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6IHByaW50ZiAoIkNvbnN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduOiBwcmludGYgKCJBc3NpZ24iKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOiBwcmludGYgKCJBc3NpZ25SZXBsYWNlIik7IGJyZWFrOwogICAgY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDogcHJpbnRmICgiUHJlcGVuZEZpcnN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wQXBwZW5kOiBwcmludGYgKCJBcHBlbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OiBwcmludGYgKCJBcHBlbmRMYXN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wUXVlc3Q6IHByaW50ZiAoIlF1ZXN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wT3I6IHByaW50ZiAoIk9yIik7IGJyZWFrOwogICAgY2FzZSBGY09wQW5kOiBwcmludGYgKCJBbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BFcXVhbDogcHJpbnRmICgiRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3RFcXVhbDogcHJpbnRmICgiTm90RXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BMZXNzOiBwcmludGYgKCJMZXNzIik7IGJyZWFrOwogICAgY2FzZSBGY09wTGVzc0VxdWFsOiBwcmludGYgKCJMZXNzRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNb3JlOiBwcmludGYgKCJNb3JlIik7IGJyZWFrOwogICAgY2FzZSBGY09wTW9yZUVxdWFsOiBwcmludGYgKCJNb3JlRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDb250YWluczogcHJpbnRmICgiQ29udGFpbnMiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3RDb250YWluczogcHJpbnRmICgiTm90Q29udGFpbnMiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BQbHVzOiBwcmludGYgKCJQbHVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wTWludXM6IHByaW50ZiAoIk1pbnVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wVGltZXM6IHByaW50ZiAoIlRpbWVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wRGl2aWRlOiBwcmludGYgKCJEaXZpZGUiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3Q6IHByaW50ZiAoIk5vdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcE5pbDogcHJpbnRmICgiTmlsIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29tbWE6IHByaW50ZiAoIkNvbW1hIik7IGJyZWFrOwogICAgY2FzZSBGY09wRmxvb3I6IHByaW50ZiAoIkZsb29yIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2VpbDogcHJpbnRmICgiQ2VpbCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFJvdW5kOiBwcmludGYgKCJSb3VuZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFRydW5jOiBwcmludGYgKCJUcnVuYyIpOyBicmVhazsKICAgIGNhc2UgRmNPcEludmFsaWQ6IHByaW50ZiAoIkludmFsaWQiKTsgYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNFeHByUHJpbnQgKGNvbnN0IEZjRXhwciAqZXhwcikKewogICAgaWYgKCFleHByKSBwcmludGYgKCJub25lIik7CiAgICBlbHNlIHN3aXRjaCAoZXhwci0+b3ApIHsKICAgIGNhc2UgRmNPcEludGVnZXI6IHByaW50ZiAoIiVkIiwgZXhwci0+dS5pdmFsKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BEb3VibGU6IHByaW50ZiAoIiVnIiwgZXhwci0+dS5kdmFsKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BTdHJpbmc6IHByaW50ZiAoIlwiJXNcIiIsIGV4cHItPnUuc3ZhbCk7IGJyZWFrOwogICAgY2FzZSBGY09wTWF0cml4OiBwcmludGYgKCJbJWcgJWcgJWcgJWddIiwKCQkJICAgICAgZXhwci0+dS5tdmFsLT54eCwKCQkJICAgICAgZXhwci0+dS5tdmFsLT54eSwKCQkJICAgICAgZXhwci0+dS5tdmFsLT55eCwKCQkJICAgICAgZXhwci0+dS5tdmFsLT55eSk7IGJyZWFrOwogICAgY2FzZSBGY09wQm9vbDogcHJpbnRmICgiJXMiLCBleHByLT51LmJ2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDaGFyU2V0OiBwcmludGYgKCJjaGFyc2V0XG4iKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOaWw6IHByaW50ZiAoIm5pbFxuIik7IGJyZWFrOwogICAgY2FzZSBGY09wRmllbGQ6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5maWVsZCk7IGJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5jb25zdGFudCk7IGJyZWFrOwogICAgY2FzZSBGY09wUXVlc3Q6CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJcHJpbnRmICgiIHF1ZXN0ICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodC0+dS50cmVlLmxlZnQpOwoJcHJpbnRmICgiIGNvbG9uICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodC0+dS50cmVlLnJpZ2h0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduOgogICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZToKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDoKICAgIGNhc2UgRmNPcFByZXBlbmQ6CiAgICBjYXNlIEZjT3BBcHBlbmQ6CiAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OgogICAgY2FzZSBGY09wT3I6CiAgICBjYXNlIEZjT3BBbmQ6CiAgICBjYXNlIEZjT3BFcXVhbDoKICAgIGNhc2UgRmNPcE5vdEVxdWFsOgogICAgY2FzZSBGY09wTGVzczoKICAgIGNhc2UgRmNPcExlc3NFcXVhbDoKICAgIGNhc2UgRmNPcE1vcmU6CiAgICBjYXNlIEZjT3BNb3JlRXF1YWw6CiAgICBjYXNlIEZjT3BDb250YWluczoKICAgIGNhc2UgRmNPcE5vdENvbnRhaW5zOgogICAgY2FzZSBGY09wUGx1czoKICAgIGNhc2UgRmNPcE1pbnVzOgogICAgY2FzZSBGY09wVGltZXM6CiAgICBjYXNlIEZjT3BEaXZpZGU6CiAgICBjYXNlIEZjT3BDb21tYToKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglwcmludGYgKCIgIik7Cglzd2l0Y2ggKGV4cHItPm9wKSB7CgljYXNlIEZjT3BBc3NpZ246IHByaW50ZiAoIkFzc2lnbiIpOyBicmVhazsKCWNhc2UgRmNPcEFzc2lnblJlcGxhY2U6IHByaW50ZiAoIkFzc2lnblJlcGxhY2UiKTsgYnJlYWs7CgljYXNlIEZjT3BQcmVwZW5kRmlyc3Q6IHByaW50ZiAoIlByZXBlbmRGaXJzdCIpOyBicmVhazsKCWNhc2UgRmNPcFByZXBlbmQ6IHByaW50ZiAoIlByZXBlbmQiKTsgYnJlYWs7CgljYXNlIEZjT3BBcHBlbmQ6IHByaW50ZiAoIkFwcGVuZCIpOyBicmVhazsKCWNhc2UgRmNPcEFwcGVuZExhc3Q6IHByaW50ZiAoIkFwcGVuZExhc3QiKTsgYnJlYWs7CgljYXNlIEZjT3BPcjogcHJpbnRmICgiT3IiKTsgYnJlYWs7CgljYXNlIEZjT3BBbmQ6IHByaW50ZiAoIkFuZCIpOyBicmVhazsKCWNhc2UgRmNPcEVxdWFsOiBwcmludGYgKCJFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcE5vdEVxdWFsOiBwcmludGYgKCJOb3RFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcExlc3M6IHByaW50ZiAoIkxlc3MiKTsgYnJlYWs7CgljYXNlIEZjT3BMZXNzRXF1YWw6IHByaW50ZiAoIkxlc3NFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcE1vcmU6IHByaW50ZiAoIk1vcmUiKTsgYnJlYWs7CgljYXNlIEZjT3BNb3JlRXF1YWw6IHByaW50ZiAoIk1vcmVFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcENvbnRhaW5zOiBwcmludGYgKCJDb250YWlucyIpOyBicmVhazsKCWNhc2UgRmNPcE5vdENvbnRhaW5zOiBwcmludGYgKCJOb3RDb250YWlucyIpOyBicmVhazsKCWNhc2UgRmNPcFBsdXM6IHByaW50ZiAoIlBsdXMiKTsgYnJlYWs7CgljYXNlIEZjT3BNaW51czogcHJpbnRmICgiTWludXMiKTsgYnJlYWs7CgljYXNlIEZjT3BUaW1lczogcHJpbnRmICgiVGltZXMiKTsgYnJlYWs7CgljYXNlIEZjT3BEaXZpZGU6IHByaW50ZiAoIkRpdmlkZSIpOyBicmVhazsKCWNhc2UgRmNPcENvbW1hOiBwcmludGYgKCJDb21tYSIpOyBicmVhazsKCWRlZmF1bHQ6IGJyZWFrOwoJfQoJcHJpbnRmICgiICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodCk7CglicmVhazsKICAgIGNhc2UgRmNPcE5vdDoKCXByaW50ZiAoIk5vdCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglicmVhazsKICAgIGNhc2UgRmNPcEZsb29yOgoJcHJpbnRmICgiRmxvb3IgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BDZWlsOgoJcHJpbnRmICgiQ2VpbCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglicmVhazsKICAgIGNhc2UgRmNPcFJvdW5kOgoJcHJpbnRmICgiUm91bmQgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BUcnVuYzoKCXByaW50ZiAoIlRydW5jICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wSW52YWxpZDogcHJpbnRmICgiSW52YWxpZCIpOyBicmVhazsKICAgIH0KfQoKdm9pZApGY1Rlc3RQcmludCAoY29uc3QgRmNUZXN0ICp0ZXN0KQp7CiAgICBzd2l0Y2ggKHRlc3QtPmtpbmQpIHsKICAgIGNhc2UgRmNNYXRjaFBhdHRlcm46CglwcmludGYgKCJwYXR0ZXJuICIpOwoJYnJlYWs7CiAgICBjYXNlIEZjTWF0Y2hGb250OgoJcHJpbnRmICgiZm9udCAiKTsKCWJyZWFrOwogICAgfQogICAgc3dpdGNoICh0ZXN0LT5xdWFsKSB7CiAgICBjYXNlIEZjUXVhbEFueToKCXByaW50ZiAoImFueSAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxBbGw6CglwcmludGYgKCJhbGwgIik7CglicmVhazsKICAgIGNhc2UgRmNRdWFsRmlyc3Q6CglwcmludGYgKCJmaXJzdCAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxOb3RGaXJzdDoKCXByaW50ZiAoIm5vdF9maXJzdCAiKTsKCWJyZWFrOwogICAgfQogICAgcHJpbnRmICgiJXMgIiwgdGVzdC0+ZmllbGQpOwogICAgRmNPcFByaW50ICh0ZXN0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAodGVzdC0+ZXhwcik7CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRWRpdFByaW50IChjb25zdCBGY0VkaXQgKmVkaXQpCnsKICAgIHByaW50ZiAoIkVkaXQgJXMgIiwgZWRpdC0+ZmllbGQpOwogICAgRmNPcFByaW50IChlZGl0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAoZWRpdC0+ZXhwcik7Cn0KCnZvaWQKRmNTdWJzdFByaW50IChjb25zdCBGY1N1YnN0ICpzdWJzdCkKewogICAgRmNFZGl0CSplOwogICAgRmNUZXN0CSp0OwogICAgCiAgICBwcmludGYgKCJtYXRjaFxuIik7CiAgICBmb3IgKHQgPSBzdWJzdC0+dGVzdDsgdDsgdCA9IHQtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNUZXN0UHJpbnQgKHQpOwogICAgfQogICAgcHJpbnRmICgiZWRpdFxuIik7CiAgICBmb3IgKGUgPSBzdWJzdC0+ZWRpdDsgZTsgZSA9IGUtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNFZGl0UHJpbnQgKGUpOwoJcHJpbnRmICgiO1xuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRm9udFNldFByaW50IChjb25zdCBGY0ZvbnRTZXQgKnMpCnsKICAgIGludAkgICAgaTsKCiAgICBwcmludGYgKCJGb250U2V0ICVkIG9mICVkXG4iLCBzLT5uZm9udCwgcy0+c2ZvbnQpOwogICAgZm9yIChpID0gMDsgaSA8IHMtPm5mb250OyBpKyspCiAgICB7CglwcmludGYgKCJGb250ICVkICIsIGkpOwoJRmNQYXR0ZXJuUHJpbnQgKHMtPmZvbnRzW2ldKTsKICAgIH0KfQoKaW50CkZjRGVidWcgKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgIGluaXRpYWxpemVkOwogICAgc3RhdGljIGludCAgZGVidWc7CgogICAgaWYgKCFpbml0aWFsaXplZCkKICAgIHsKCWNoYXIgICAgKmU7CgoJaW5pdGlhbGl6ZWQgPSAxOwoJZSA9IGdldGVudiAoIkZDX0RFQlVHIik7CglpZiAoZSkKCXsKCSAgICBwcmludGYgKCJGQ19ERUJVRz0lc1xuIiwgZSk7CgkgICAgZGVidWcgPSBhdG9pIChlKTsKCSAgICBpZiAoZGVidWcgPCAwKQoJCWRlYnVnID0gMDsKCX0KICAgIH0KICAgIHJldHVybiBkZWJ1ZzsKfQo=