LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmN4bWwuYyx2IDEuMjEgMjAwMi8wOC8yMiAxODo1MzoyMiBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKI2lmbmRlZiBIQVZFX1hNTFBBUlNFX0gKI2RlZmluZSBIQVZFX1hNTFBBUlNFX0ggMAojZW5kaWYKCiNpZiBIQVZFX1hNTFBBUlNFX0gKI2luY2x1ZGUgPHhtbHBhcnNlLmg+CiNlbHNlCiNpbmNsdWRlIDxleHBhdC5oPgojZW5kaWYKCiNpZmRlZiBfV0lOMzIKI2RlZmluZSBTVFJJQ1QKI2luY2x1ZGUgPHdpbmRvd3MuaD4KI3VuZGVmIFNUUklDVAojZW5kaWYKCkZjVGVzdCAqCkZjVGVzdENyZWF0ZSAoRmNNYXRjaEtpbmQgICBraW5kLCAKCSAgICAgIEZjUXVhbAkgICAgcXVhbCwKCSAgICAgIGNvbnN0IEZjQ2hhcjggKmZpZWxkLAoJICAgICAgRmNPcAkgICAgY29tcGFyZSwKCSAgICAgIEZjRXhwcgkgICAgKmV4cHIpCnsKICAgIEZjVGVzdAkqdGVzdCA9IChGY1Rlc3QgKikgbWFsbG9jIChzaXplb2YgKEZjVGVzdCkpOwoKICAgIGlmICh0ZXN0KQogICAgewoJRmNNZW1BbGxvYyAoRkNfTUVNX1RFU1QsIHNpemVvZiAoRmNUZXN0KSk7Cgl0ZXN0LT5uZXh0ID0gMDsKCXRlc3QtPmtpbmQgPSBraW5kOwoJdGVzdC0+cXVhbCA9IHF1YWw7Cgl0ZXN0LT5maWVsZCA9IChjaGFyICopIEZjU3RyQ29weSAoZmllbGQpOwoJdGVzdC0+b3AgPSBjb21wYXJlOwoJdGVzdC0+ZXhwciA9IGV4cHI7CiAgICB9CiAgICByZXR1cm4gdGVzdDsKfQoKdm9pZApGY1Rlc3REZXN0cm95IChGY1Rlc3QgKnRlc3QpCnsKICAgIGlmICh0ZXN0LT5uZXh0KQoJRmNUZXN0RGVzdHJveSAodGVzdC0+bmV4dCk7CiAgICBGY0V4cHJEZXN0cm95ICh0ZXN0LT5leHByKTsKICAgIEZjU3RyRnJlZSAoKEZjQ2hhcjggKikgdGVzdC0+ZmllbGQpOwogICAgRmNNZW1GcmVlIChGQ19NRU1fVEVTVCwgc2l6ZW9mIChGY1Rlc3QpKTsKICAgIGZyZWUgKHRlc3QpOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVJbnRlZ2VyIChpbnQgaSkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CglGY01lbUFsbG9jIChGQ19NRU1fRVhQUiwgc2l6ZW9mIChGY0V4cHIpKTsKCWUtPm9wID0gRmNPcEludGVnZXI7CgllLT51Lml2YWwgPSBpOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZURvdWJsZSAoZG91YmxlIGQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJRmNNZW1BbGxvYyAoRkNfTUVNX0VYUFIsIHNpemVvZiAoRmNFeHByKSk7CgllLT5vcCA9IEZjT3BEb3VibGU7CgllLT51LmR2YWwgPSBkOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZVN0cmluZyAoY29uc3QgRmNDaGFyOCAqcykKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CglGY01lbUFsbG9jIChGQ19NRU1fRVhQUiwgc2l6ZW9mIChGY0V4cHIpKTsKCWUtPm9wID0gRmNPcFN0cmluZzsKCWUtPnUuc3ZhbCA9IEZjU3RyQ29weSAocyk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlTWF0cml4IChjb25zdCBGY01hdHJpeCAqbSkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CglGY01lbUFsbG9jIChGQ19NRU1fRVhQUiwgc2l6ZW9mIChGY0V4cHIpKTsKCWUtPm9wID0gRmNPcE1hdHJpeDsKCWUtPnUubXZhbCA9IEZjTWF0cml4Q29weSAobSk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlQm9vbCAoRmNCb29sIGIpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJRmNNZW1BbGxvYyAoRkNfTUVNX0VYUFIsIHNpemVvZiAoRmNFeHByKSk7CgllLT5vcCA9IEZjT3BCb29sOwoJZS0+dS5idmFsID0gYjsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVOaWwgKHZvaWQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJRmNNZW1BbGxvYyAoRkNfTUVNX0VYUFIsIHNpemVvZiAoRmNFeHByKSk7CgllLT5vcCA9IEZjT3BOaWw7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCUZjTWVtQWxsb2MgKEZDX01FTV9FWFBSLCBzaXplb2YgKEZjRXhwcikpOwoJZS0+b3AgPSBGY09wRmllbGQ7CgllLT51LmZpZWxkID0gKGNoYXIgKikgRmNTdHJDb3B5ICgoRmNDaGFyOCAqKSBmaWVsZCk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlQ29uc3QgKGNvbnN0IEZjQ2hhcjggKmNvbnN0YW50KQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCUZjTWVtQWxsb2MgKEZDX01FTV9FWFBSLCBzaXplb2YgKEZjRXhwcikpOwoJZS0+b3AgPSBGY09wQ29uc3Q7CgllLT51LmNvbnN0YW50ID0gRmNTdHJDb3B5IChjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlT3AgKEZjRXhwciAqbGVmdCwgRmNPcCBvcCwgRmNFeHByICpyaWdodCkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CglGY01lbUFsbG9jIChGQ19NRU1fRVhQUiwgc2l6ZW9mIChGY0V4cHIpKTsKCWUtPm9wID0gb3A7CgllLT51LnRyZWUubGVmdCA9IGxlZnQ7CgllLT51LnRyZWUucmlnaHQgPSByaWdodDsKICAgIH0KICAgIHJldHVybiBlOwp9Cgp2b2lkCkZjRXhwckRlc3Ryb3kgKEZjRXhwciAqZSkKewogICAgaWYgKCFlKQoJcmV0dXJuOwogICAgc3dpdGNoIChlLT5vcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjoKCWJyZWFrOwogICAgY2FzZSBGY09wRG91YmxlOgoJYnJlYWs7CiAgICBjYXNlIEZjT3BTdHJpbmc6CglGY1N0ckZyZWUgKGUtPnUuc3ZhbCk7CglicmVhazsKICAgIGNhc2UgRmNPcE1hdHJpeDoKCUZjTWF0cml4RnJlZSAoZS0+dS5tdmFsKTsKCWJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDoKCUZjQ2hhclNldERlc3Ryb3kgKGUtPnUuY3ZhbCk7CglicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6CglicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOgoJRmNTdHJGcmVlICgoRmNDaGFyOCAqKSBlLT51LmZpZWxkKTsKCWJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6CglGY1N0ckZyZWUgKGUtPnUuY29uc3RhbnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ246CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOgogICAgY2FzZSBGY09wUHJlcGVuZDoKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDoKICAgIGNhc2UgRmNPcEFwcGVuZDoKICAgIGNhc2UgRmNPcEFwcGVuZExhc3Q6CglicmVhazsKICAgIGNhc2UgRmNPcE9yOgogICAgY2FzZSBGY09wQW5kOgogICAgY2FzZSBGY09wRXF1YWw6CiAgICBjYXNlIEZjT3BOb3RFcXVhbDoKICAgIGNhc2UgRmNPcExlc3M6CiAgICBjYXNlIEZjT3BMZXNzRXF1YWw6CiAgICBjYXNlIEZjT3BNb3JlOgogICAgY2FzZSBGY09wTW9yZUVxdWFsOgogICAgY2FzZSBGY09wQ29udGFpbnM6CiAgICBjYXNlIEZjT3BMaXN0aW5nOgogICAgY2FzZSBGY09wTm90Q29udGFpbnM6CiAgICBjYXNlIEZjT3BQbHVzOgogICAgY2FzZSBGY09wTWludXM6CiAgICBjYXNlIEZjT3BUaW1lczoKICAgIGNhc2UgRmNPcERpdmlkZToKICAgIGNhc2UgRmNPcFF1ZXN0OgogICAgY2FzZSBGY09wQ29tbWE6CglGY0V4cHJEZXN0cm95IChlLT51LnRyZWUucmlnaHQpOwoJLyogZmFsbCB0aHJvdWdoICovCiAgICBjYXNlIEZjT3BOb3Q6CiAgICBjYXNlIEZjT3BGbG9vcjoKICAgIGNhc2UgRmNPcENlaWw6CiAgICBjYXNlIEZjT3BSb3VuZDoKICAgIGNhc2UgRmNPcFRydW5jOgoJRmNFeHByRGVzdHJveSAoZS0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BOaWw6CiAgICBjYXNlIEZjT3BJbnZhbGlkOgoJYnJlYWs7CiAgICB9CiAgICBGY01lbUZyZWUgKEZDX01FTV9FWFBSLCBzaXplb2YgKEZjRXhwcikpOwogICAgZnJlZSAoZSk7Cn0KCkZjRWRpdCAqCkZjRWRpdENyZWF0ZSAoY29uc3QgY2hhciAqZmllbGQsIEZjT3Agb3AsIEZjRXhwciAqZXhwciwgRmNWYWx1ZUJpbmRpbmcgYmluZGluZykKewogICAgRmNFZGl0ICplID0gKEZjRWRpdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNFZGl0KSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5uZXh0ID0gMDsKCWUtPmZpZWxkID0gZmllbGQ7ICAgLyogYWxyZWFkeSBzYXZlZCBpbiBncmFtbWFyICovCgllLT5vcCA9IG9wOwoJZS0+ZXhwciA9IGV4cHI7CgllLT5iaW5kaW5nID0gYmluZGluZzsKICAgIH0KICAgIHJldHVybiBlOwp9Cgp2b2lkCkZjRWRpdERlc3Ryb3kgKEZjRWRpdCAqZSkKewogICAgaWYgKGUtPm5leHQpCglGY0VkaXREZXN0cm95IChlLT5uZXh0KTsKICAgIEZjU3RyRnJlZSAoKEZjQ2hhcjggKikgZS0+ZmllbGQpOwogICAgaWYgKGUtPmV4cHIpCglGY0V4cHJEZXN0cm95IChlLT5leHByKTsKICAgIGZyZWUgKGUpOwp9CgpjaGFyICoKRmNDb25maWdTYXZlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKQp7CiAgICByZXR1cm4gKGNoYXIgKikgRmNTdHJDb3B5ICgoRmNDaGFyOCAqKSBmaWVsZCk7Cn0KCnR5cGVkZWYgZW51bSBfRmNFbGVtZW50IHsKICAgIEZjRWxlbWVudE5vbmUsCiAgICBGY0VsZW1lbnRGb250Y29uZmlnLAogICAgRmNFbGVtZW50RGlyLAogICAgRmNFbGVtZW50Q2FjaGUsCiAgICBGY0VsZW1lbnRJbmNsdWRlLAogICAgRmNFbGVtZW50Q29uZmlnLAogICAgRmNFbGVtZW50TWF0Y2gsCiAgICBGY0VsZW1lbnRBbGlhcywKCQogICAgRmNFbGVtZW50QmxhbmssCiAgICBGY0VsZW1lbnRSZXNjYW4sCgogICAgRmNFbGVtZW50UHJlZmVyLAogICAgRmNFbGVtZW50QWNjZXB0LAogICAgRmNFbGVtZW50RGVmYXVsdCwKICAgIEZjRWxlbWVudEZhbWlseSwKCiAgICBGY0VsZW1lbnRTZWxlY3Rmb250LAogICAgRmNFbGVtZW50QWNjZXB0Zm9udCwKICAgIEZjRWxlbWVudFJlamVjdGZvbnQsCiAgICBGY0VsZW1lbnRHbG9iLAoKICAgIEZjRWxlbWVudFRlc3QsCiAgICBGY0VsZW1lbnRFZGl0LAogICAgRmNFbGVtZW50SW50LAogICAgRmNFbGVtZW50RG91YmxlLAogICAgRmNFbGVtZW50U3RyaW5nLAogICAgRmNFbGVtZW50TWF0cml4LAogICAgRmNFbGVtZW50Qm9vbCwKICAgIEZjRWxlbWVudENoYXJzZXQsCiAgICBGY0VsZW1lbnROYW1lLAogICAgRmNFbGVtZW50Q29uc3QsCiAgICBGY0VsZW1lbnRPciwKICAgIEZjRWxlbWVudEFuZCwKICAgIEZjRWxlbWVudEVxLAogICAgRmNFbGVtZW50Tm90RXEsCiAgICBGY0VsZW1lbnRMZXNzLAogICAgRmNFbGVtZW50TGVzc0VxLAogICAgRmNFbGVtZW50TW9yZSwKICAgIEZjRWxlbWVudE1vcmVFcSwKICAgIEZjRWxlbWVudENvbnRhaW5zLAogICAgRmNFbGVtZW50Tm90Q29udGFpbnMsCiAgICBGY0VsZW1lbnRQbHVzLAogICAgRmNFbGVtZW50TWludXMsCiAgICBGY0VsZW1lbnRUaW1lcywKICAgIEZjRWxlbWVudERpdmlkZSwKICAgIEZjRWxlbWVudE5vdCwKICAgIEZjRWxlbWVudElmLAogICAgRmNFbGVtZW50Rmxvb3IsCiAgICBGY0VsZW1lbnRDZWlsLAogICAgRmNFbGVtZW50Um91bmQsCiAgICBGY0VsZW1lbnRUcnVuYywKICAgIEZjRWxlbWVudFVua25vd24KfSBGY0VsZW1lbnQ7CgpzdGF0aWMgRmNFbGVtZW50CkZjRWxlbWVudE1hcCAoY29uc3QgWE1MX0NoYXIgKm5hbWUpCnsKICAgIHN0YXRpYyBzdHJ1Y3QgewoJY2hhcgkgICAgKm5hbWU7CglGY0VsZW1lbnQgICBlbGVtZW50OwogICAgfSBmY0VsZW1lbnRNYXBbXSA9IHsKCXsgImZvbnRjb25maWciLAlGY0VsZW1lbnRGb250Y29uZmlnIH0sCgl7ICJkaXIiLAlGY0VsZW1lbnREaXIgfSwKCXsgImNhY2hlIiwJRmNFbGVtZW50Q2FjaGUgfSwKCXsgImluY2x1ZGUiLAlGY0VsZW1lbnRJbmNsdWRlIH0sCgl7ICJjb25maWciLAlGY0VsZW1lbnRDb25maWcgfSwKCXsgIm1hdGNoIiwJRmNFbGVtZW50TWF0Y2ggfSwKCXsgImFsaWFzIiwJRmNFbGVtZW50QWxpYXMgfSwKCQoJeyAiYmxhbmsiLAlGY0VsZW1lbnRCbGFuayB9LAoJeyAicmVzY2FuIiwJRmNFbGVtZW50UmVzY2FuIH0sCgoJeyAicHJlZmVyIiwJRmNFbGVtZW50UHJlZmVyIH0sCgl7ICJhY2NlcHQiLAlGY0VsZW1lbnRBY2NlcHQgfSwKCXsgImRlZmF1bHQiLAlGY0VsZW1lbnREZWZhdWx0IH0sCgl7ICJmYW1pbHkiLAlGY0VsZW1lbnRGYW1pbHkgfSwKCgl7ICJzZWxlY3Rmb250IiwJRmNFbGVtZW50U2VsZWN0Zm9udCB9LAoJeyAiYWNjZXB0Zm9udCIsCUZjRWxlbWVudEFjY2VwdGZvbnQgfSwKCXsgInJlamVjdGZvbnQiLAlGY0VsZW1lbnRSZWplY3Rmb250IH0sCgl7ICJnbG9iIiwJRmNFbGVtZW50R2xvYiB9LAoKCXsgInRlc3QiLAlGY0VsZW1lbnRUZXN0IH0sCgl7ICJlZGl0IiwJRmNFbGVtZW50RWRpdCB9LAoJeyAiaW50IiwJRmNFbGVtZW50SW50IH0sCgl7ICJkb3VibGUiLAlGY0VsZW1lbnREb3VibGUgfSwKCXsgInN0cmluZyIsCUZjRWxlbWVudFN0cmluZyB9LAoJeyAibWF0cml4IiwJRmNFbGVtZW50TWF0cml4IH0sCgl7ICJib29sIiwJRmNFbGVtZW50Qm9vbCB9LAoJeyAiY2hhcnNldCIsCUZjRWxlbWVudENoYXJzZXQgfSwKCXsgIm5hbWUiLAlGY0VsZW1lbnROYW1lIH0sCgl7ICJjb25zdCIsCUZjRWxlbWVudENvbnN0IH0sCgl7ICJvciIsCQlGY0VsZW1lbnRPciB9LAoJeyAiYW5kIiwJRmNFbGVtZW50QW5kIH0sCgl7ICJlcSIsCQlGY0VsZW1lbnRFcSB9LAoJeyAibm90X2VxIiwJRmNFbGVtZW50Tm90RXEgfSwKCXsgImxlc3MiLAlGY0VsZW1lbnRMZXNzIH0sCgl7ICJsZXNzX2VxIiwJRmNFbGVtZW50TGVzc0VxIH0sCgl7ICJtb3JlIiwJRmNFbGVtZW50TW9yZSB9LAoJeyAibW9yZV9lcSIsCUZjRWxlbWVudE1vcmVFcSB9LAoJeyAiY29udGFpbnMiLAlGY0VsZW1lbnRDb250YWlucyB9LAoJeyAibm90X2NvbnRhaW5zIixGY0VsZW1lbnROb3RDb250YWlucyB9LAoJeyAicGx1cyIsCUZjRWxlbWVudFBsdXMgfSwKCXsgIm1pbnVzIiwJRmNFbGVtZW50TWludXMgfSwKCXsgInRpbWVzIiwJRmNFbGVtZW50VGltZXMgfSwKCXsgImRpdmlkZSIsCUZjRWxlbWVudERpdmlkZSB9LAoJeyAibm90IiwJRmNFbGVtZW50Tm90IH0sCgl7ICJpZiIsCQlGY0VsZW1lbnRJZiB9LAoJeyAiZmxvb3IiLAlGY0VsZW1lbnRGbG9vciB9LAoJeyAiY2VpbCIsCUZjRWxlbWVudENlaWwgfSwKCXsgInJvdW5kIiwJRmNFbGVtZW50Um91bmQgfSwKCXsgInRydW5jIiwJRmNFbGVtZW50VHJ1bmMgfSwKCQoJeyAwLAkJMCB9CiAgICB9OwoKICAgIGludAkgICAgaTsKICAgIGZvciAoaSA9IDA7IGZjRWxlbWVudE1hcFtpXS5uYW1lOyBpKyspCglpZiAoIXN0cmNtcCAoKGNoYXIgKikgbmFtZSwgZmNFbGVtZW50TWFwW2ldLm5hbWUpKQoJICAgIHJldHVybiBmY0VsZW1lbnRNYXBbaV0uZWxlbWVudDsKICAgIHJldHVybiBGY0VsZW1lbnRVbmtub3duOwp9Cgp0eXBlZGVmIHN0cnVjdCBfRmNQU3RhY2sgewogICAgc3RydWN0IF9GY1BTdGFjayAgICpwcmV2OwogICAgRmNFbGVtZW50CQllbGVtZW50OwogICAgRmNDaGFyOAkJKiphdHRyOwogICAgRmNTdHJCdWYJCXN0cjsKfSBGY1BTdGFjazsKICAgIAp0eXBlZGVmIGVudW0gX0ZjVlN0YWNrVGFnIHsKICAgIEZjVlN0YWNrTm9uZSwKCiAgICBGY1ZTdGFja1N0cmluZywKICAgIEZjVlN0YWNrRmFtaWx5LAogICAgRmNWU3RhY2tGaWVsZCwKICAgIEZjVlN0YWNrQ29uc3RhbnQsCiAgICBGY1ZTdGFja0dsb2IsCiAgICAKICAgIEZjVlN0YWNrUHJlZmVyLAogICAgRmNWU3RhY2tBY2NlcHQsCiAgICBGY1ZTdGFja0RlZmF1bHQsCiAgICAKICAgIEZjVlN0YWNrSW50ZWdlciwKICAgIEZjVlN0YWNrRG91YmxlLAogICAgRmNWU3RhY2tNYXRyaXgsCiAgICBGY1ZTdGFja0Jvb2wsCiAgICAKICAgIEZjVlN0YWNrVGVzdCwKICAgIEZjVlN0YWNrRXhwciwKICAgIEZjVlN0YWNrRWRpdAp9IEZjVlN0YWNrVGFnOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVlN0YWNrIHsKICAgIHN0cnVjdCBfRmNWU3RhY2sJKnByZXY7CiAgICBGY1BTdGFjawkJKnBzdGFjazsJLyogcmVsYXRlZCBwYXJzZSBlbGVtZW50ICovCiAgICBGY1ZTdGFja1RhZwkJdGFnOwogICAgdW5pb24gewoJRmNDaGFyOAkJKnN0cmluZzsKCglpbnQJCWludGVnZXI7Cglkb3VibGUJCV9kb3VibGU7CglGY01hdHJpeAkqbWF0cml4OwoJRmNCb29sCQlib29sOwoKCUZjVGVzdAkJKnRlc3Q7CglGY1F1YWwJCXF1YWw7CglGY09wCQlvcDsKCUZjRXhwcgkJKmV4cHI7CglGY0VkaXQJCSplZGl0OwogICAgfSB1Owp9IEZjVlN0YWNrOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ29uZmlnUGFyc2UgewogICAgRmNQU3RhY2sJICAgICpwc3RhY2s7CiAgICBGY1ZTdGFjawkgICAgKnZzdGFjazsKICAgIEZjQm9vbAkgICAgZXJyb3I7CiAgICBjb25zdCBGY0NoYXI4ICAgKm5hbWU7CiAgICBGY0NvbmZpZwkgICAgKmNvbmZpZzsKICAgIFhNTF9QYXJzZXIJICAgIHBhcnNlcjsKfSBGY0NvbmZpZ1BhcnNlOwoKdHlwZWRlZiBlbnVtIF9GY0NvbmZpZ1NldmVyaXR5IHsKICAgIEZjU2V2ZXJlSW5mbywgRmNTZXZlcmVXYXJuaW5nLCBGY1NldmVyZUVycm9yCn0gRmNDb25maWdTZXZlcml0eTsKCnN0YXRpYyB2b2lkCkZjQ29uZmlnTWVzc2FnZSAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjQ29uZmlnU2V2ZXJpdHkgc2V2ZXJlLCBjaGFyICpmbXQsIC4uLikKewogICAgY2hhcgkqcyA9ICJ1bmtub3duIjsKICAgIHZhX2xpc3QJYXJnczsKCiAgICB2YV9zdGFydCAoYXJncywgZm10KTsKCiAgICBzd2l0Y2ggKHNldmVyZSkgewogICAgY2FzZSBGY1NldmVyZUluZm86IHMgPSAiaW5mbyI7IGJyZWFrOwogICAgY2FzZSBGY1NldmVyZVdhcm5pbmc6IHMgPSAid2FybmluZyI7IGJyZWFrOwogICAgY2FzZSBGY1NldmVyZUVycm9yOiBzID0gImVycm9yIjsgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyc2UpCiAgICB7CglpZiAocGFyc2UtPm5hbWUpCgkgICAgZnByaW50ZiAoc3RkZXJyLCAiRm9udGNvbmZpZyAlczogXCIlc1wiLCBsaW5lICVkOiAiLCBzLAoJCSAgICAgcGFyc2UtPm5hbWUsIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAocGFyc2UtPnBhcnNlcikpOwoJZWxzZQoJICAgIGZwcmludGYgKHN0ZGVyciwgIkZvbnRjb25maWcgJXM6IGxpbmUgJWQ6ICIsIHMsCgkJICAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgKHBhcnNlLT5wYXJzZXIpKTsKCWlmIChzZXZlcmUgPj0gRmNTZXZlcmVFcnJvcikKCSAgICBwYXJzZS0+ZXJyb3IgPSBGY1RydWU7CiAgICB9CiAgICBlbHNlCglmcHJpbnRmIChzdGRlcnIsICJGb250Y29uZmlnICVzOiAiLCBzKTsKICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CiAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwogICAgdmFfZW5kIChhcmdzKTsKfQoKc3RhdGljIHZvaWQKRmNWU3RhY2tQdXNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2sgKnZzdGFjaykKewogICAgdnN0YWNrLT5wcmV2ID0gcGFyc2UtPnZzdGFjazsKICAgIHZzdGFjay0+cHN0YWNrID0gcGFyc2UtPnBzdGFjayA/IHBhcnNlLT5wc3RhY2stPnByZXYgOiAwOwogICAgcGFyc2UtPnZzdGFjayA9IHZzdGFjazsKfQoKc3RhdGljIEZjVlN0YWNrICoKRmNWU3RhY2tDcmVhdGUgKHZvaWQpCnsKICAgIEZjVlN0YWNrICAgICpuZXc7CgogICAgbmV3ID0gbWFsbG9jIChzaXplb2YgKEZjVlN0YWNrKSk7CiAgICBpZiAoIW5ldykKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX1ZTVEFDSywgc2l6ZW9mIChGY1ZTdGFjaykpOwogICAgbmV3LT50YWcgPSBGY1ZTdGFja05vbmU7CiAgICBuZXctPnByZXYgPSAwOwogICAgcmV0dXJuIG5ldzsKfQoKc3RhdGljIHZvaWQKRmNWU3RhY2tEZXN0cm95IChGY1ZTdGFjayAqdnN0YWNrKQp7CiAgICBGY1ZTdGFjayAgICAqcHJldjsKCiAgICBmb3IgKDsgdnN0YWNrOyB2c3RhY2sgPSBwcmV2KQogICAgewoJcHJldiA9IHZzdGFjay0+cHJldjsKCXN3aXRjaCAodnN0YWNrLT50YWcpIHsKCWNhc2UgRmNWU3RhY2tOb25lOgoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja1N0cmluZzoKCWNhc2UgRmNWU3RhY2tGYW1pbHk6CgljYXNlIEZjVlN0YWNrRmllbGQ6CgljYXNlIEZjVlN0YWNrQ29uc3RhbnQ6CgljYXNlIEZjVlN0YWNrR2xvYjoKCSAgICBGY1N0ckZyZWUgKHZzdGFjay0+dS5zdHJpbmcpOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0ludGVnZXI6CgljYXNlIEZjVlN0YWNrRG91YmxlOgoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja01hdHJpeDoKCSAgICBGY01hdHJpeEZyZWUgKHZzdGFjay0+dS5tYXRyaXgpOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0Jvb2w6CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrVGVzdDoKCSAgICBGY1Rlc3REZXN0cm95ICh2c3RhY2stPnUudGVzdCk7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRXhwcjoKCWNhc2UgRmNWU3RhY2tQcmVmZXI6CgljYXNlIEZjVlN0YWNrQWNjZXB0OgoJY2FzZSBGY1ZTdGFja0RlZmF1bHQ6CgkgICAgRmNFeHByRGVzdHJveSAodnN0YWNrLT51LmV4cHIpOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0VkaXQ6CgkgICAgRmNFZGl0RGVzdHJveSAodnN0YWNrLT51LmVkaXQpOwoJICAgIGJyZWFrOwoJfQoJRmNNZW1GcmVlIChGQ19NRU1fVlNUQUNLLCBzaXplb2YgKEZjVlN0YWNrKSk7CglmcmVlICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaFN0cmluZyAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrVGFnIHRhZywgRmNDaGFyOCAqc3RyaW5nKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LnN0cmluZyA9IHN0cmluZzsKICAgIHZzdGFjay0+dGFnID0gdGFnOwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoSW50ZWdlciAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGludCBpbnRlZ2VyKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmludGVnZXIgPSBpbnRlZ2VyOwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0ludGVnZXI7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hEb3VibGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBkb3VibGUgX2RvdWJsZSkKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS5fZG91YmxlID0gX2RvdWJsZTsKICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tEb3VibGU7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hNYXRyaXggKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY01hdHJpeCAqbWF0cml4KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgbWF0cml4ID0gRmNNYXRyaXhDb3B5IChtYXRyaXgpOwogICAgaWYgKCFtYXRyaXgpCiAgICB7CglGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHZzdGFjay0+dS5tYXRyaXggPSBtYXRyaXg7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTWF0cml4OwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoQm9vbCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjQm9vbCBib29sKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmJvb2wgPSBib29sOwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0Jvb2w7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hUZXN0IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNUZXN0ICp0ZXN0KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LnRlc3QgPSB0ZXN0OwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja1Rlc3Q7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hFeHByIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2tUYWcgdGFnLCBGY0V4cHIgKmV4cHIpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuZXhwciA9IGV4cHI7CiAgICB2c3RhY2stPnRhZyA9IHRhZzsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaEVkaXQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY0VkaXQgKmVkaXQpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuZWRpdCA9IGVkaXQ7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrRWRpdDsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja0ZldGNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgaW50IG9mZikKewogICAgRmNWU3RhY2sgICAgKnZzdGFjazsKCiAgICBmb3IgKHZzdGFjayA9IHBhcnNlLT52c3RhY2s7IHZzdGFjayAmJiBvZmYtLSA+IDA7IHZzdGFjayA9IHZzdGFjay0+cHJldik7CiAgICByZXR1cm4gdnN0YWNrOwp9CgpzdGF0aWMgdm9pZApGY1ZTdGFja0NsZWFyIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgd2hpbGUgKHBhcnNlLT52c3RhY2sgJiYgcGFyc2UtPnZzdGFjay0+cHN0YWNrID09IHBhcnNlLT5wc3RhY2spCiAgICB7CglGY1ZTdGFjayAgICAqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKCXBhcnNlLT52c3RhY2sgPSB2c3RhY2stPnByZXY7Cgl2c3RhY2stPnByZXYgPSAwOwoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja1BvcCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjVlN0YWNrCSp2c3RhY2sgPSBwYXJzZS0+dnN0YWNrOwogICAgCiAgICBpZiAoIXZzdGFjayB8fCB2c3RhY2stPnBzdGFjayAhPSBwYXJzZS0+cHN0YWNrKQoJcmV0dXJuIDA7CiAgICBwYXJzZS0+dnN0YWNrID0gdnN0YWNrLT5wcmV2OwogICAgdnN0YWNrLT5wcmV2ID0gMDsKICAgIHJldHVybiB2c3RhY2s7Cn0KCnN0YXRpYyBpbnQKRmNWU3RhY2tFbGVtZW50cyAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGludAkJaCA9IDA7CiAgICBGY1ZTdGFjawkqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKICAgIHdoaWxlICh2c3RhY2sgJiYgdnN0YWNrLT5wc3RhY2sgPT0gcGFyc2UtPnBzdGFjaykKICAgIHsKCWgrKzsKCXZzdGFjayA9IHZzdGFjay0+cHJldjsKICAgIH0KICAgIHJldHVybiBoOwp9CgpzdGF0aWMgRmNDaGFyOCAqKgpGY0NvbmZpZ1NhdmVBdHRyIChjb25zdCBYTUxfQ2hhciAqKmF0dHIpCnsKICAgIGludAkJbjsKICAgIGludAkJc2xlbjsKICAgIGludAkJaTsKICAgIEZjQ2hhcjgJKipuZXc7CiAgICBGY0NoYXI4CSpzOwoKICAgIGlmICghYXR0cikKCXJldHVybiAwOwogICAgc2xlbiA9IDA7CiAgICBmb3IgKGkgPSAwOyBhdHRyW2ldOyBpKyspCglzbGVuICs9IHN0cmxlbiAoYXR0cltpXSkgKyAxOwogICAgbiA9IGk7CiAgICBuZXcgPSBtYWxsb2MgKChpICsgMSkgKiBzaXplb2YgKEZjQ2hhcjggKikgKyBzbGVuKTsKICAgIGlmICghbmV3KQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fQVRUUiwgMSk7ICAgIC8qIHNpemUgaXMgdG9vIGV4cGVuc2l2ZSAqLwogICAgcyA9IChGY0NoYXI4ICopIChuZXcgKyAoaSArIDEpKTsKICAgIGZvciAoaSA9IDA7IGF0dHJbaV07IGkrKykKICAgIHsKCW5ld1tpXSA9IHM7CglzdHJjcHkgKChjaGFyICopIHMsIChjaGFyICopIGF0dHJbaV0pOwoJcyArPSBzdHJsZW4gKChjaGFyICopIHMpICsgMTsKICAgIH0KICAgIG5ld1tpXSA9IDA7CiAgICByZXR1cm4gbmV3Owp9CgpzdGF0aWMgRmNCb29sCkZjUFN0YWNrUHVzaCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjRWxlbWVudCBlbGVtZW50LCBjb25zdCBYTUxfQ2hhciAqKmF0dHIpCnsKICAgIEZjUFN0YWNrICAgKm5ldyA9IG1hbGxvYyAoc2l6ZW9mIChGY1BTdGFjaykpOwoKICAgIGlmICghbmV3KQoJcmV0dXJuIEZjRmFsc2U7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fUFNUQUNLLCBzaXplb2YgKEZjUFN0YWNrKSk7CiAgICBuZXctPnByZXYgPSBwYXJzZS0+cHN0YWNrOwogICAgbmV3LT5lbGVtZW50ID0gZWxlbWVudDsKICAgIGlmIChhdHRyKQogICAgewoJbmV3LT5hdHRyID0gRmNDb25maWdTYXZlQXR0ciAoYXR0cik7CglpZiAoIW5ldy0+YXR0cikKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwogICAgfQogICAgZWxzZQoJbmV3LT5hdHRyID0gMDsKICAgIEZjU3RyQnVmSW5pdCAoJm5ldy0+c3RyLCAwLCAwKTsKICAgIHBhcnNlLT5wc3RhY2sgPSBuZXc7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjUFN0YWNrUG9wIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNQU3RhY2sgICAqb2xkOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spIAogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm1pc21hdGNoaW5nIGVsZW1lbnQiKTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgRmNWU3RhY2tDbGVhciAocGFyc2UpOwogICAgb2xkID0gcGFyc2UtPnBzdGFjazsKICAgIHBhcnNlLT5wc3RhY2sgPSBvbGQtPnByZXY7CiAgICBGY1N0ckJ1ZkRlc3Ryb3kgKCZvbGQtPnN0cik7CiAgICBpZiAob2xkLT5hdHRyKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQVRUUiwgMSk7IC8qIHNpemUgaXMgdG8gZXhwZW5zaXZlICovCglmcmVlIChvbGQtPmF0dHIpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fUFNUQUNLLCBzaXplb2YgKEZjUFN0YWNrKSk7CiAgICBmcmVlIChvbGQpOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY0NvbmZpZ0luaXQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBjb25zdCBGY0NoYXI4ICpuYW1lLCBGY0NvbmZpZyAqY29uZmlnLCBYTUxfUGFyc2VyIHBhcnNlcikKewogICAgcGFyc2UtPnBzdGFjayA9IDA7CiAgICBwYXJzZS0+dnN0YWNrID0gMDsKICAgIHBhcnNlLT5lcnJvciA9IEZjRmFsc2U7CiAgICBwYXJzZS0+bmFtZSA9IG5hbWU7CiAgICBwYXJzZS0+Y29uZmlnID0gY29uZmlnOwogICAgcGFyc2UtPnBhcnNlciA9IHBhcnNlcjsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyB2b2lkCkZjQ29uZmlnQ2xlYW51cCAoRmNDb25maWdQYXJzZQkqcGFyc2UpCnsKICAgIHdoaWxlIChwYXJzZS0+cHN0YWNrKQoJRmNQU3RhY2tQb3AgKHBhcnNlKTsKfQoKc3RhdGljIGNvbnN0IEZjQ2hhcjggKgpGY0NvbmZpZ0dldEF0dHJpYnV0ZSAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGNoYXIgKmF0dHIpCnsKICAgIEZjQ2hhcjggKiphdHRyczsKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybiAwOwoKICAgIGF0dHJzID0gcGFyc2UtPnBzdGFjay0+YXR0cjsKICAgIHdoaWxlICgqYXR0cnMpCiAgICB7CglpZiAoIXN0cmNtcCAoKGNoYXIgKikgKmF0dHJzLCBhdHRyKSkKCSAgICByZXR1cm4gYXR0cnNbMV07CglhdHRycyArPSAyOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCkZjU3RhcnRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwgY29uc3QgWE1MX0NoYXIgKiphdHRyKQp7CiAgICBGY0NvbmZpZ1BhcnNlICAgKnBhcnNlID0gdXNlckRhdGE7CiAgICBGY0VsZW1lbnQJICAgIGVsZW1lbnQ7CiAgICAKICAgIGVsZW1lbnQgPSBGY0VsZW1lbnRNYXAgKG5hbWUpOwogICAgaWYgKGVsZW1lbnQgPT0gRmNFbGVtZW50VW5rbm93bikKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgInVua25vd24gZWxlbWVudCBcIiVzXCIiLCBuYW1lKTsKICAgIAogICAgaWYgKCFGY1BTdGFja1B1c2ggKHBhcnNlLCBlbGVtZW50LCBhdHRyKSkKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VCbGFuayAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGludAkgICAgbiA9IEZjVlN0YWNrRWxlbWVudHMgKHBhcnNlKTsKICAgIHdoaWxlIChuLS0gPiAwKQogICAgewoJRmNWU3RhY2sgICAgKnYgPSBGY1ZTdGFja0ZldGNoIChwYXJzZSwgbik7CglpZiAodi0+dGFnICE9IEZjVlN0YWNrSW50ZWdlcikKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAibm9uLWludGVnZXIgYmxhbmsiKTsKCWVsc2UKCXsKCSAgICBpZiAoIXBhcnNlLT5jb25maWctPmJsYW5rcykKCSAgICB7CgkJcGFyc2UtPmNvbmZpZy0+YmxhbmtzID0gRmNCbGFua3NDcmVhdGUgKCk7CgkJaWYgKCFwYXJzZS0+Y29uZmlnLT5ibGFua3MpCgkJewoJCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJCSAgICBicmVhazsKCQl9CgkgICAgfQoJICAgIGlmICghRmNCbGFua3NBZGQgKHBhcnNlLT5jb25maWctPmJsYW5rcywgdi0+dS5pbnRlZ2VyKSkKCSAgICB7CgkJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VSZXNjYW4gKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBpbnQJICAgIG4gPSBGY1ZTdGFja0VsZW1lbnRzIChwYXJzZSk7CiAgICB3aGlsZSAobi0tID4gMCkKICAgIHsKCUZjVlN0YWNrICAgICp2ID0gRmNWU3RhY2tGZXRjaCAocGFyc2UsIG4pOwoJaWYgKHYtPnRhZyAhPSBGY1ZTdGFja0ludGVnZXIpCgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAibm9uLWludGVnZXIgcmVzY2FuIik7CgllbHNlCgkgICAgcGFyc2UtPmNvbmZpZy0+cmVzY2FuSW50ZXJ2YWwgPSB2LT51LmludGVnZXI7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VJbnQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4ICpzLCAqZW5kOwogICAgaW50CSAgICBsOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBlbmQgPSAwOwogICAgbCA9IChpbnQpIHN0cnRvbCAoKGNoYXIgKikgcywgKGNoYXIgKiopJmVuZCwgMCk7CiAgICBpZiAoZW5kICE9IHMgKyBzdHJsZW4gKChjaGFyICopIHMpKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIlwiJXNcIjogbm90IGEgdmFsaWQgaW50ZWdlciIsIHMpOwogICAgZWxzZQoJRmNWU3RhY2tQdXNoSW50ZWdlciAocGFyc2UsIGwpOwogICAgRmNTdHJGcmVlIChzKTsKfQoKLyoKICogaWRlYSBjb3BpZWQgZnJvbSBnbGliIGdfYXNjaWlfc3RydG9kIHdpdGggCiAqIHBlcm1pc3Npb24gb2YgdGhlIGF1dGhvciAoQWxleGFuZGVyIExhcnNzb24pIAogKi8KCiNpbmNsdWRlIDxsb2NhbGUuaD4KCnN0YXRpYyBkb3VibGUgCkZjU3RydG9kIChjaGFyICpzLCBjaGFyICoqZW5kKQp7CiAgICBzdHJ1Y3QgbGNvbnYgICAgKmxvY2FsZV9kYXRhOwogICAgY2hhcgkgICAgKmRvdDsKICAgIGRvdWJsZQkgICAgdjsKCiAgICAvKgogICAgICogSGF2ZSB0byBzd2FwIHRoZSBkZWNpbWFsIHBvaW50IHRvIG1hdGNoIHRoZSBjdXJyZW50IGxvY2FsZQogICAgICogaWYgdGhhdCBsb2NhbGUgZG9lc24ndCB1c2UgMHgyZQogICAgICovCiAgICBpZiAoKGRvdCA9IHN0cmNociAocywgMHgyZSkpICYmCgkobG9jYWxlX2RhdGEgPSBsb2NhbGVjb252ICgpKSAmJgoJKGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50WzBdICE9IDB4MmUgfHwKCSBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludFsxXSAhPSAwKSkKICAgIHsKCWNoYXIJYnVmWzEyOF07CglpbnQJc2xlbiA9IHN0cmxlbiAocyk7CglpbnQJZGxlbiA9IHN0cmxlbiAobG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQpOwoJCglpZiAoc2xlbiArIGRsZW4gPiBzaXplb2YgKGJ1ZikpCgl7CgkgICAgaWYgKGVuZCkKCQkqZW5kID0gczsKCSAgICB2ID0gMDsKCX0KCWVsc2UKCXsKCSAgICBjaGFyCSpidWZfZW5kOwoJICAgIC8qIG1hbnRpc3NhICovCgkgICAgc3RybmNweSAoYnVmLCBzLCBkb3QgLSBzKTsKCSAgICAvKiBkZWNpbWFsIHBvaW50ICovCgkgICAgc3RyY3B5IChidWYgKyAoZG90IC0gcyksIGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50KTsKCSAgICAvKiByZXN0IG9mIG51bWJlciAqLwoJICAgIHN0cmNweSAoYnVmICsgKGRvdCAtIHMpICsgZGxlbiwgZG90ICsgMSk7CgkgICAgYnVmX2VuZCA9IDA7CgkgICAgdiA9IHN0cnRvZCAoYnVmLCAmYnVmX2VuZCk7CgkgICAgaWYgKGJ1Zl9lbmQpIHsKCQlidWZfZW5kID0gcyArIChidWZfZW5kIC0gYnVmKTsKCQlpZiAoYnVmX2VuZCA+IGRvdCkKCQkgICAgYnVmX2VuZCAtPSBkbGVuIC0gMTsKCSAgICB9CgkgICAgaWYgKGVuZCkKCQkqZW5kID0gYnVmX2VuZDsKCX0KICAgIH0KICAgIGVsc2UKCXYgPSBzdHJ0b2QgKHMsIGVuZCk7CiAgICByZXR1cm4gdjsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZURvdWJsZSAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjQ2hhcjggKnMsICplbmQ7CiAgICBkb3VibGUgIGQ7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIGVuZCA9IDA7CiAgICBkID0gRmNTdHJ0b2QgKChjaGFyICopIHMsIChjaGFyICoqKSZlbmQpOwogICAgaWYgKGVuZCAhPSBzICsgc3RybGVuICgoY2hhciAqKSBzKSkKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJcIiVzXCI6IG5vdCBhIHZhbGlkIGRvdWJsZSIsIHMpOwogICAgZWxzZQoJRmNWU3RhY2tQdXNoRG91YmxlIChwYXJzZSwgZCk7CiAgICBGY1N0ckZyZWUgKHMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlU3RyaW5nIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2tUYWcgdGFnKQp7CiAgICBGY0NoYXI4ICpzOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBpZiAoIUZjVlN0YWNrUHVzaFN0cmluZyAocGFyc2UsIHRhZywgcykpCglGY1N0ckZyZWUgKHMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlTWF0cml4IChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNWU3RhY2sJKnZzdGFjazsKICAgIGVudW0geyBtX2RvbmUsIG1feHgsIG1feHksIG1feXgsIG1feXkgfSBtYXRyaXhfc3RhdGUgPSBtX3l5OwogICAgRmNNYXRyaXgJbTsKICAgIAogICAgd2hpbGUgKCh2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpKSkKICAgIHsKCWRvdWJsZQl2OwoJc3dpdGNoICh2c3RhY2stPnRhZykgewoJY2FzZSBGY1ZTdGFja0ludGVnZXI6CgkgICAgdiA9IHZzdGFjay0+dS5pbnRlZ2VyOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0RvdWJsZToKCSAgICB2ID0gdnN0YWNrLT51Ll9kb3VibGU7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJub24tZG91YmxlIG1hdHJpeCBlbGVtZW50Iik7CgkgICAgdiA9IDEuMDsKCSAgICBicmVhazsKCX0KCXN3aXRjaCAobWF0cml4X3N0YXRlKSB7CgljYXNlIG1feHg6IG0ueHggPSB2OyBicmVhazsKCWNhc2UgbV94eTogbS54eSA9IHY7IGJyZWFrOwoJY2FzZSBtX3l4OiBtLnl4ID0gdjsgYnJlYWs7CgljYXNlIG1feXk6IG0ueXkgPSB2OyBicmVhazsKCWRlZmF1bHQ6IGJyZWFrOwoJfQoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwoJbWF0cml4X3N0YXRlLS07CiAgICB9CiAgICBpZiAobWF0cml4X3N0YXRlICE9IG1fZG9uZSkKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgbWF0cml4IGVsZW1lbnRzIik7CiAgICBlbHNlCglGY1ZTdGFja1B1c2hNYXRyaXggKHBhcnNlLCAmbSk7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDb25maWdMZXhCb29sIChjb25zdCBGY0NoYXI4ICpib29sKQp7CiAgICBpZiAoKmJvb2wgPT0gJ3QnIHx8ICpib29sID09ICdUJykKCXJldHVybiBGY1RydWU7CiAgICBpZiAoKmJvb2wgPT0gJ3knIHx8ICpib29sID09ICdZJykKCXJldHVybiBGY1RydWU7CiAgICBpZiAoKmJvb2wgPT0gJzEnKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIHJldHVybiBGY0ZhbHNlOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlQm9vbCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjQ2hhcjggKnM7CgogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgRmNWU3RhY2tQdXNoQm9vbCAocGFyc2UsIEZjQ29uZmlnTGV4Qm9vbCAocykpOwogICAgRmNTdHJGcmVlIChzKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUZhbWlsaWVzIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2tUYWcgdGFnKQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrOwogICAgRmNFeHByCSpsZWZ0LCAqZXhwciA9IDAsICpuZXc7CgogICAgd2hpbGUgKCh2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpKSkKICAgIHsKCWlmICh2c3RhY2stPnRhZyAhPSBGY1ZTdGFja0ZhbWlseSkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJub24tZmFtaWx5Iik7CgkgICAgRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwoJICAgIGNvbnRpbnVlOwoJfQoJbGVmdCA9IHZzdGFjay0+dS5leHByOwoJdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CglGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CglpZiAoZXhwcikKCXsKCSAgICBuZXcgPSBGY0V4cHJDcmVhdGVPcCAobGVmdCwgRmNPcENvbW1hLCBleHByKTsKCSAgICBpZiAoIW5ldykKCSAgICB7CgkJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCQlGY0V4cHJEZXN0cm95IChsZWZ0KTsKCQlGY0V4cHJEZXN0cm95IChleHByKTsKCQlicmVhazsKCSAgICB9CgkgICAgZXhwciA9IG5ldzsKCX0KCWVsc2UKCSAgICBleHByID0gbGVmdDsKICAgIH0KICAgIGlmIChleHByKQogICAgewoJaWYgKCFGY1ZTdGFja1B1c2hFeHByIChwYXJzZSwgdGFnLCBleHByKSkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJICAgIGlmIChleHByKQoJCUZjRXhwckRlc3Ryb3kgKGV4cHIpOwoJfQogICAgfQp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRmFtaWx5IChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqczsKICAgIEZjRXhwciAgKmV4cHI7CgogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgZXhwciA9IEZjRXhwckNyZWF0ZVN0cmluZyAocyk7CiAgICBGY1N0ckZyZWUgKHMpOwogICAgaWYgKGV4cHIpCglGY1ZTdGFja1B1c2hFeHByIChwYXJzZSwgRmNWU3RhY2tGYW1pbHksIGV4cHIpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlQWxpYXMgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0V4cHIJKmZhbWlseSA9IDAsICphY2NlcHQgPSAwLCAqcHJlZmVyID0gMCwgKmRlZiA9IDAsICpuZXcgPSAwOwogICAgRmNFZGl0CSplZGl0ID0gMCwgKm5leHQ7CiAgICBGY1ZTdGFjawkqdnN0YWNrOwogICAgRmNUZXN0CSp0ZXN0OwoKICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpIAogICAgewoJc3dpdGNoICh2c3RhY2stPnRhZykgewoJY2FzZSBGY1ZTdGFja0ZhbWlseToKCSAgICBpZiAoZmFtaWx5KQoJICAgIHsKCQluZXcgPSBGY0V4cHJDcmVhdGVPcCAodnN0YWNrLT51LmV4cHIsIEZjT3BDb21tYSwgZmFtaWx5KTsKCQlpZiAoIW5ldykKCQkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCQllbHNlCgkJICAgIGZhbWlseSA9IG5ldzsKCSAgICB9CgkgICAgZWxzZQoJCW5ldyA9IHZzdGFjay0+dS5leHByOwoJICAgIGlmIChuZXcpCgkgICAgewoJCWZhbWlseSA9IG5ldzsKCQl2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrUHJlZmVyOgoJICAgIGlmIChwcmVmZXIpCgkJRmNFeHByRGVzdHJveSAocHJlZmVyKTsKCSAgICBwcmVmZXIgPSB2c3RhY2stPnUuZXhwcjsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tBY2NlcHQ6CgkgICAgaWYgKGFjY2VwdCkKCQlGY0V4cHJEZXN0cm95IChhY2NlcHQpOwoJICAgIGFjY2VwdCA9IHZzdGFjay0+dS5leHByOwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0RlZmF1bHQ6CgkgICAgaWYgKGRlZikKCQlGY0V4cHJEZXN0cm95IChkZWYpOwoJICAgIGRlZiA9IHZzdGFjay0+dS5leHByOwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJiYWQgYWxpYXMiKTsKCSAgICBicmVhazsKCX0KCUZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKICAgIH0KICAgIGlmICghZmFtaWx5KQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm1pc3NpbmcgZmFtaWx5IGluIGFsaWFzIik7CglpZiAocHJlZmVyKQoJICAgIEZjRXhwckRlc3Ryb3kgKHByZWZlcik7CglpZiAoYWNjZXB0KQoJICAgIEZjRXhwckRlc3Ryb3kgKGFjY2VwdCk7CglpZiAoZGVmKQoJICAgIEZjRXhwckRlc3Ryb3kgKGRlZik7CglyZXR1cm47CiAgICB9CiAgICBpZiAocHJlZmVyKQogICAgewoJZWRpdCA9IEZjRWRpdENyZWF0ZSAoRmNDb25maWdTYXZlRmllbGQgKCJmYW1pbHkiKSwKCQkJICAgICBGY09wUHJlcGVuZCwKCQkJICAgICBwcmVmZXIsCgkJCSAgICAgRmNWYWx1ZUJpbmRpbmdXZWFrKTsKCWlmIChlZGl0KQoJICAgIGVkaXQtPm5leHQgPSAwOwoJZWxzZQoJICAgIEZjRXhwckRlc3Ryb3kgKHByZWZlcik7CiAgICB9CiAgICBpZiAoYWNjZXB0KQogICAgewoJbmV4dCA9IGVkaXQ7CgllZGl0ID0gRmNFZGl0Q3JlYXRlIChGY0NvbmZpZ1NhdmVGaWVsZCAoImZhbWlseSIpLAoJCQkgICAgIEZjT3BBcHBlbmQsCgkJCSAgICAgYWNjZXB0LAoJCQkgICAgIEZjVmFsdWVCaW5kaW5nV2Vhayk7CglpZiAoZWRpdCkKCSAgICBlZGl0LT5uZXh0ID0gbmV4dDsKCWVsc2UKCSAgICBGY0V4cHJEZXN0cm95IChhY2NlcHQpOwogICAgfQogICAgaWYgKGRlZikKICAgIHsKCW5leHQgPSBlZGl0OwoJZWRpdCA9IEZjRWRpdENyZWF0ZSAoRmNDb25maWdTYXZlRmllbGQgKCJmYW1pbHkiKSwKCQkJICAgICBGY09wQXBwZW5kTGFzdCwKCQkJICAgICBkZWYsCgkJCSAgICAgRmNWYWx1ZUJpbmRpbmdXZWFrKTsKCWlmIChlZGl0KQoJICAgIGVkaXQtPm5leHQgPSBuZXh0OwoJZWxzZQoJICAgIEZjRXhwckRlc3Ryb3kgKGRlZik7CiAgICB9CiAgICBpZiAoZWRpdCkKICAgIHsKCXRlc3QgPSBGY1Rlc3RDcmVhdGUgKEZjTWF0Y2hQYXR0ZXJuLAoJCQkgICAgIEZjUXVhbEFueSwKCQkJICAgICAoRmNDaGFyOCAqKSBGQ19GQU1JTFksCgkJCSAgICAgRmNPcEVxdWFsLAoJCQkgICAgIGZhbWlseSk7CglpZiAodGVzdCkKCSAgICBpZiAoIUZjQ29uZmlnQWRkRWRpdCAocGFyc2UtPmNvbmZpZywgdGVzdCwgZWRpdCwgRmNNYXRjaFBhdHRlcm4pKQoJCUZjVGVzdERlc3Ryb3kgKHRlc3QpOwogICAgfQogICAgZWxzZQoJRmNFeHByRGVzdHJveSAoZmFtaWx5KTsKfQoKc3RhdGljIEZjRXhwciAqCkZjUG9wRXhwciAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjVlN0YWNrCSp2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpOwogICAgRmNFeHByCSpleHByID0gMDsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIDA7CiAgICBzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CiAgICBjYXNlIEZjVlN0YWNrTm9uZToKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja1N0cmluZzoKICAgIGNhc2UgRmNWU3RhY2tGYW1pbHk6CglleHByID0gRmNFeHByQ3JlYXRlU3RyaW5nICh2c3RhY2stPnUuc3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0ZpZWxkOgoJZXhwciA9IEZjRXhwckNyZWF0ZUZpZWxkICgoY2hhciAqKSB2c3RhY2stPnUuc3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0NvbnN0YW50OgoJZXhwciA9IEZjRXhwckNyZWF0ZUNvbnN0ICh2c3RhY2stPnUuc3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0dsb2I6CgkvKiBYWFg6IFdoYXQncyB0aGUgY29ycmVjdCBhY3Rpb24gaGVyZT8gKENEVykgKi8KCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja1ByZWZlcjoKICAgIGNhc2UgRmNWU3RhY2tBY2NlcHQ6CiAgICBjYXNlIEZjVlN0YWNrRGVmYXVsdDoKCWV4cHIgPSB2c3RhY2stPnUuZXhwcjsKCXZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrSW50ZWdlcjoKCWV4cHIgPSBGY0V4cHJDcmVhdGVJbnRlZ2VyICh2c3RhY2stPnUuaW50ZWdlcik7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tEb3VibGU6CglleHByID0gRmNFeHByQ3JlYXRlRG91YmxlICh2c3RhY2stPnUuX2RvdWJsZSk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tNYXRyaXg6CglleHByID0gRmNFeHByQ3JlYXRlTWF0cml4ICh2c3RhY2stPnUubWF0cml4KTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0Jvb2w6CglleHByID0gRmNFeHByQ3JlYXRlQm9vbCAodnN0YWNrLT51LmJvb2wpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrVGVzdDoKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0V4cHI6CglleHByID0gdnN0YWNrLT51LmV4cHI7Cgl2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0VkaXQ6CglicmVhazsKICAgIH0KICAgIEZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKICAgIHJldHVybiBleHByOwp9CgovKgogKiBUaGlzIGJ1aWxkcyBhIHRyZWUgb2YgYmluYXJ5IG9wZXJhdGlvbnMuICBOb3RlCiAqIHRoYXQgZXZlcnkgb3BlcmF0b3IgaXMgZGVmaW5lZCBzbyB0aGF0IGlmIG9ubHkKICogYSBzaW5nbGUgb3BlcmFuZCBpcyBjb250YWluZWQsIHRoZSB2YWx1ZSBvZiB0aGUKICogd2hvbGUgZXhwcmVzc2lvbiBpcyB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuCiAqCiAqIFRoaXMgY29kZSByZWR1Y2VzIGluIHRoYXQgY2FzZSB0byByZXR1cm5pbmcgdGhhdAogKiBvcGVyYW5kLgogKi8Kc3RhdGljIEZjRXhwciAqCkZjUG9wQmluYXJ5IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNPcCBvcCkKewogICAgRmNFeHByICAqbGVmdCwgKmV4cHIgPSAwLCAqbmV3OwoKICAgIHdoaWxlICgobGVmdCA9IEZjUG9wRXhwciAocGFyc2UpKSkKICAgIHsKCWlmIChleHByKQoJewoJICAgIG5ldyA9IEZjRXhwckNyZWF0ZU9wIChsZWZ0LCBvcCwgZXhwcik7CgkgICAgaWYgKCFuZXcpCgkgICAgewoJCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkJRmNFeHByRGVzdHJveSAobGVmdCk7CgkJRmNFeHByRGVzdHJveSAoZXhwcik7CgkJYnJlYWs7CgkgICAgfQoJICAgIGV4cHIgPSBuZXc7Cgl9CgllbHNlCgkgICAgZXhwciA9IGxlZnQ7CiAgICB9CiAgICByZXR1cm4gZXhwcjsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUJpbmFyeSAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjT3Agb3ApCnsKICAgIEZjRXhwciAgKmV4cHIgPSBGY1BvcEJpbmFyeSAocGFyc2UsIG9wKTsKICAgIGlmIChleHByKQoJRmNWU3RhY2tQdXNoRXhwciAocGFyc2UsIEZjVlN0YWNrRXhwciwgZXhwcik7Cn0KCi8qCiAqIFRoaXMgYnVpbGRzIGEgYSB1bmFyeSBvcGVyYXRvciwgaXQgY29uc3VtZXMgb25seQogKiBhIHNpbmdsZSBvcGVyYW5kCiAqLwoKc3RhdGljIEZjRXhwciAqCkZjUG9wVW5hcnkgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY09wIG9wKQp7CiAgICBGY0V4cHIgICpvcGVyYW5kLCAqbmV3ID0gMDsKCiAgICBpZiAoKG9wZXJhbmQgPSBGY1BvcEV4cHIgKHBhcnNlKSkpCiAgICB7CgluZXcgPSBGY0V4cHJDcmVhdGVPcCAob3BlcmFuZCwgb3AsIDApOwoJaWYgKCFuZXcpCgl7CgkgICAgRmNFeHByRGVzdHJveSAob3BlcmFuZCk7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCX0KICAgIH0KICAgIHJldHVybiBuZXc7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VVbmFyeSAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjT3Agb3ApCnsKICAgIEZjRXhwciAgKmV4cHIgPSBGY1BvcFVuYXJ5IChwYXJzZSwgb3ApOwogICAgaWYgKGV4cHIpCglGY1ZTdGFja1B1c2hFeHByIChwYXJzZSwgRmNWU3RhY2tFeHByLCBleHByKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUluY2x1ZGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4CSAgICAqczsKICAgIGNvbnN0IEZjQ2hhcjggICAqaTsKICAgIEZjQm9vbAkgICAgaWdub3JlX21pc3NpbmcgPSBGY0ZhbHNlOwogICAgCiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBpID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAiaWdub3JlX21pc3NpbmciKTsKICAgIGlmIChpICYmIEZjQ29uZmlnTGV4Qm9vbCAoKEZjQ2hhcjggKikgaSkgPT0gRmNUcnVlKQoJaWdub3JlX21pc3NpbmcgPSBGY1RydWU7CiAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkIChwYXJzZS0+Y29uZmlnLCBzLCAhaWdub3JlX21pc3NpbmcpKQoJcGFyc2UtPmVycm9yID0gRmNUcnVlOwogICAgRmNTdHJGcmVlIChzKTsKfQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjT3BNYXAgewogICAgY2hhciAgICAqbmFtZTsKICAgIEZjT3AgICAgb3A7Cn0gRmNPcE1hcDsKCnN0YXRpYyBGY09wCkZjQ29uZmlnTGV4T3AgKGNvbnN0IEZjQ2hhcjggKm9wLCBjb25zdCBGY09wTWFwCSptYXAsIGludCBubWFwKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbm1hcDsgaSsrKQoJaWYgKCFzdHJjbXAgKChjaGFyICopIG9wLCBtYXBbaV0ubmFtZSkpIAoJICAgIHJldHVybiBtYXBbaV0ub3A7CiAgICByZXR1cm4gRmNPcEludmFsaWQ7Cn0KCnN0YXRpYyBjb25zdCBGY09wTWFwIGZjQ29tcGFyZU9wc1tdID0gewogICAgeyAiZXEiLAkJRmNPcEVxdWFsCSAgICB9LAogICAgeyAibm90X2VxIiwJCUZjT3BOb3RFcXVhbAkgICAgfSwKICAgIHsgImxlc3MiLAkJRmNPcExlc3MJICAgIH0sCiAgICB7ICJsZXNzX2VxIiwJRmNPcExlc3NFcXVhbAkgICAgfSwKICAgIHsgIm1vcmUiLAkJRmNPcE1vcmUJICAgIH0sCiAgICB7ICJtb3JlX2VxIiwJRmNPcE1vcmVFcXVhbAkgICAgfSwKICAgIHsgImNvbnRhaW5zIiwJRmNPcENvbnRhaW5zCSAgICB9LAogICAgeyAibm90X2NvbnRhaW5zIiwJRmNPcE5vdENvbnRhaW5zCSAgICB9Cn07CgojZGVmaW5lIE5VTV9DT01QQVJFX09QUyAoc2l6ZW9mIGZjQ29tcGFyZU9wcyAvIHNpemVvZiBmY0NvbXBhcmVPcHNbMF0pCgpzdGF0aWMgRmNPcApGY0NvbmZpZ0xleENvbXBhcmUgKGNvbnN0IEZjQ2hhcjggKmNvbXBhcmUpCnsKICAgIHJldHVybiBGY0NvbmZpZ0xleE9wIChjb21wYXJlLCBmY0NvbXBhcmVPcHMsIE5VTV9DT01QQVJFX09QUyk7Cn0KCgpzdGF0aWMgdm9pZApGY1BhcnNlVGVzdCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAqa2luZF9zdHJpbmc7CiAgICBGY01hdGNoS2luZAkgICAga2luZDsKICAgIGNvbnN0IEZjQ2hhcjggICAqcXVhbF9zdHJpbmc7CiAgICBGY1F1YWwJICAgIHF1YWw7CiAgICBjb25zdCBGY0NoYXI4ICAgKm5hbWU7CiAgICBjb25zdCBGY0NoYXI4ICAgKmNvbXBhcmVfc3RyaW5nOwogICAgRmNPcAkgICAgY29tcGFyZTsKICAgIEZjRXhwcgkgICAgKmV4cHI7CiAgICBGY1Rlc3QJICAgICp0ZXN0OwoKICAgIGtpbmRfc3RyaW5nID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAidGFyZ2V0Iik7CiAgICBpZiAoIWtpbmRfc3RyaW5nKQoJa2luZCA9IEZjTWF0Y2hEZWZhdWx0OwogICAgZWxzZQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopIGtpbmRfc3RyaW5nLCAicGF0dGVybiIpKQoJICAgIGtpbmQgPSBGY01hdGNoUGF0dGVybjsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIGtpbmRfc3RyaW5nLCAiZm9udCIpKQoJICAgIGtpbmQgPSBGY01hdGNoRm9udDsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIGtpbmRfc3RyaW5nLCAiZGVmYXVsdCIpKQoJICAgIGtpbmQgPSBGY01hdGNoRGVmYXVsdDsKCWVsc2UKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIHRlc3QgdGFyZ2V0IFwiJXNcIiIsIGtpbmRfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBxdWFsX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgInF1YWwiKTsKICAgIGlmICghcXVhbF9zdHJpbmcpCglxdWFsID0gRmNRdWFsQW55OwogICAgZWxzZQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopIHF1YWxfc3RyaW5nLCAiYW55IikpCgkgICAgcXVhbCA9IEZjUXVhbEFueTsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIHF1YWxfc3RyaW5nLCAiYWxsIikpCgkgICAgcXVhbCA9IEZjUXVhbEFsbDsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIHF1YWxfc3RyaW5nLCAiZmlyc3QiKSkKCSAgICBxdWFsID0gRmNRdWFsRmlyc3Q7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBxdWFsX3N0cmluZywgIm5vdF9maXJzdCIpKQoJICAgIHF1YWwgPSBGY1F1YWxOb3RGaXJzdDsKCWVsc2UKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIHRlc3QgcXVhbCBcIiVzXCIiLCBxdWFsX3N0cmluZyk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm5hbWUiKTsKICAgIGlmICghbmFtZSkKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgIm1pc3NpbmcgdGVzdCBuYW1lIik7CglyZXR1cm47CiAgICB9CiAgICBjb21wYXJlX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgImNvbXBhcmUiKTsKICAgIGlmICghY29tcGFyZV9zdHJpbmcpCgljb21wYXJlID0gRmNPcEVxdWFsOwogICAgZWxzZQogICAgewoJY29tcGFyZSA9IEZjQ29uZmlnTGV4Q29tcGFyZSAoY29tcGFyZV9zdHJpbmcpOwoJaWYgKGNvbXBhcmUgPT0gRmNPcEludmFsaWQpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCB0ZXN0IGNvbXBhcmUgXCIlc1wiIiwgY29tcGFyZV9zdHJpbmcpOwoJICAgIHJldHVybjsKCX0KICAgIH0KICAgIGV4cHIgPSBGY1BvcEJpbmFyeSAocGFyc2UsIEZjT3BDb21tYSk7CiAgICBpZiAoIWV4cHIpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJtaXNzaW5nIHRlc3QgZXhwcmVzc2lvbiIpOwoJcmV0dXJuOwogICAgfQogICAgdGVzdCA9IEZjVGVzdENyZWF0ZSAoa2luZCwgcXVhbCwgbmFtZSwgY29tcGFyZSwgZXhwcik7CiAgICBpZiAoIXRlc3QpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgRmNWU3RhY2tQdXNoVGVzdCAocGFyc2UsIHRlc3QpOwp9CgpzdGF0aWMgY29uc3QgRmNPcE1hcCBmY01vZGVPcHNbXSA9IHsKICAgIHsgImFzc2lnbiIsCQlGY09wQXNzaWduCSAgICB9LAogICAgeyAiYXNzaWduX3JlcGxhY2UiLAlGY09wQXNzaWduUmVwbGFjZSAgIH0sCiAgICB7ICJwcmVwZW5kIiwJRmNPcFByZXBlbmQJICAgIH0sCiAgICB7ICJwcmVwZW5kX2ZpcnN0IiwJRmNPcFByZXBlbmRGaXJzdCAgICB9LAogICAgeyAiYXBwZW5kIiwJCUZjT3BBcHBlbmQJICAgIH0sCiAgICB7ICJhcHBlbmRfbGFzdCIsCUZjT3BBcHBlbmRMYXN0CSAgICB9LAp9OwoKI2RlZmluZSBOVU1fTU9ERV9PUFMgKHNpemVvZiBmY01vZGVPcHMgLyBzaXplb2YgZmNNb2RlT3BzWzBdKQoKc3RhdGljIEZjT3AKRmNDb25maWdMZXhNb2RlIChjb25zdCBGY0NoYXI4ICptb2RlKQp7CiAgICByZXR1cm4gRmNDb25maWdMZXhPcCAobW9kZSwgZmNNb2RlT3BzLCBOVU1fTU9ERV9PUFMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRWRpdCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAqbmFtZTsKICAgIGNvbnN0IEZjQ2hhcjggICAqbW9kZV9zdHJpbmc7CiAgICBjb25zdCBGY0NoYXI4ICAgKmJpbmRpbmdfc3RyaW5nOwogICAgRmNPcAkgICAgbW9kZTsKICAgIEZjVmFsdWVCaW5kaW5nICBiaW5kaW5nOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjRWRpdAkgICAgKmVkaXQ7CgogICAgbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm5hbWUiKTsKICAgIGlmICghbmFtZSkKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgIm1pc3NpbmcgZWRpdCBuYW1lIik7CglyZXR1cm47CiAgICB9CiAgICBtb2RlX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm1vZGUiKTsKICAgIGlmICghbW9kZV9zdHJpbmcpCgltb2RlID0gRmNPcEFzc2lnbjsKICAgIGVsc2UKICAgIHsKCW1vZGUgPSBGY0NvbmZpZ0xleE1vZGUgKG1vZGVfc3RyaW5nKTsKCWlmIChtb2RlID09IEZjT3BJbnZhbGlkKQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImludmFsaWQgZWRpdCBtb2RlIFwiJXNcIiIsIG1vZGVfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBiaW5kaW5nX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgImJpbmRpbmciKTsKICAgIGlmICghYmluZGluZ19zdHJpbmcpCgliaW5kaW5nID0gRmNWYWx1ZUJpbmRpbmdXZWFrOwogICAgZWxzZQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopIGJpbmRpbmdfc3RyaW5nLCAid2VhayIpKQoJICAgIGJpbmRpbmcgPSBGY1ZhbHVlQmluZGluZ1dlYWs7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBiaW5kaW5nX3N0cmluZywgInN0cm9uZyIpKQoJICAgIGJpbmRpbmcgPSBGY1ZhbHVlQmluZGluZ1N0cm9uZzsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIGJpbmRpbmdfc3RyaW5nLCAic2FtZSIpKQoJICAgIGJpbmRpbmcgPSBGY1ZhbHVlQmluZGluZ1NhbWU7CgllbHNlCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCBlZGl0IGJpbmRpbmcgXCIlc1wiIiwgYmluZGluZ19zdHJpbmcpOwoJICAgIHJldHVybjsKCX0KICAgIH0KICAgIGV4cHIgPSBGY1BvcEJpbmFyeSAocGFyc2UsIEZjT3BDb21tYSk7CiAgICBlZGl0ID0gRmNFZGl0Q3JlYXRlICgoY2hhciAqKSBGY1N0ckNvcHkgKG5hbWUpLCBtb2RlLCBleHByLCBiaW5kaW5nKTsKICAgIGlmICghZWRpdCkKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglGY0V4cHJEZXN0cm95IChleHByKTsKCXJldHVybjsKICAgIH0KICAgIGlmICghRmNWU3RhY2tQdXNoRWRpdCAocGFyc2UsIGVkaXQpKQoJRmNFZGl0RGVzdHJveSAoZWRpdCk7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VNYXRjaCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAqa2luZF9uYW1lOwogICAgRmNNYXRjaEtpbmQJICAgIGtpbmQ7CiAgICBGY1Rlc3QJICAgICp0ZXN0ID0gMDsKICAgIEZjRWRpdAkgICAgKmVkaXQgPSAwOwogICAgRmNWU3RhY2sJICAgICp2c3RhY2s7CgogICAga2luZF9uYW1lID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAidGFyZ2V0Iik7CiAgICBpZiAoIWtpbmRfbmFtZSkKCWtpbmQgPSBGY01hdGNoUGF0dGVybjsKICAgIGVsc2UKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSBraW5kX25hbWUsICJwYXR0ZXJuIikpCgkgICAga2luZCA9IEZjTWF0Y2hQYXR0ZXJuOwoJZWxzZSBpZiAoIXN0cmNtcCAoKGNoYXIgKikga2luZF9uYW1lLCAiZm9udCIpKQoJICAgIGtpbmQgPSBGY01hdGNoRm9udDsKCWVsc2UKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIG1hdGNoIHRhcmdldCBcIiVzXCIiLCBraW5kX25hbWUpOwoJICAgIHJldHVybjsKCX0KICAgIH0KICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpCiAgICB7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrVGVzdDoKCSAgICB2c3RhY2stPnUudGVzdC0+bmV4dCA9IHRlc3Q7CgkgICAgdGVzdCA9IHZzdGFjay0+dS50ZXN0OwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0VkaXQ6CgkgICAgdnN0YWNrLT51LmVkaXQtPm5leHQgPSBlZGl0OwoJICAgIGVkaXQgPSB2c3RhY2stPnUuZWRpdDsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCBtYXRjaCBlbGVtZW50Iik7CgkgICAgYnJlYWs7Cgl9CglGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CiAgICB9CiAgICBpZiAoIUZjQ29uZmlnQWRkRWRpdCAocGFyc2UtPmNvbmZpZywgdGVzdCwgZWRpdCwga2luZCkpCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlQWNjZXB0UmVqZWN0Rm9udCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjRWxlbWVudCBlbGVtZW50KQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrOwoKICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpCiAgICB7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrR2xvYjoKCSAgICBpZiAoIUZjQ29uZmlnR2xvYkFkZCAocGFyc2UtPmNvbmZpZywgCgkJCQkgIHZzdGFjay0+dS5zdHJpbmcsCgkJCQkgIGVsZW1lbnQgPT0gRmNFbGVtZW50QWNjZXB0Zm9udCkpCgkgICAgewoJCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkgICAgfQoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJiYWQgZm9udCBzZWxlY3RvciIpOwoJICAgIGJyZWFrOwoJfQoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgdm9pZApGY0VuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQp7CiAgICBGY0NvbmZpZ1BhcnNlICAgKnBhcnNlID0gdXNlckRhdGE7CiAgICBGY0NoYXI4CSAgICAqZGF0YTsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgc3dpdGNoIChwYXJzZS0+cHN0YWNrLT5lbGVtZW50KSB7CiAgICBjYXNlIEZjRWxlbWVudE5vbmU6CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Rm9udGNvbmZpZzoKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnREaXI6CglkYXRhID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKCWlmICghZGF0YSkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJICAgIGJyZWFrOwoJfQojaWZkZWYgX1dJTjMyCglpZiAoc3RyY21wIChkYXRhLCAiV0lORE9XU0ZPTlRESVIiKSA9PSAwKQoJewoJICAgIGludCByYzsKCSAgICBGY1N0ckZyZWUgKGRhdGEpOwoJICAgIGRhdGEgPSBtYWxsb2MgKDEwMDApOwoJICAgIGlmICghZGF0YSkKCSAgICB7CgkJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCQlicmVhazsKCSAgICB9CgkgICAgRmNNZW1BbGxvYyAoRkNfTUVNX1NUUklORywgMTAwMCk7CgkgICAgcmMgPSBHZXRXaW5kb3dzRGlyZWN0b3J5IChkYXRhLCA4MDApOwoJICAgIGlmIChyYyA9PSAwIHx8IHJjID4gODAwKQoJICAgIHsKCQlGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAiR2V0V2luZG93c0RpcmVjdG9yeSBmYWlsZWQiKTsKCQlGY1N0ckZyZWUgKGRhdGEpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBpZiAoZGF0YSBbc3RybGVuIChkYXRhKSAtIDFdICE9ICdcXCcpCgkJc3RyY2F0IChkYXRhLCAiXFwiKTsKCSAgICBzdHJjYXQgKGRhdGEsICJmb250cyIpOwoJfQojZW5kaWYKCWlmICghRmNTdHJVc2VzSG9tZSAoZGF0YSkgfHwgRmNDb25maWdIb21lICgpKQoJewoJICAgIGlmICghRmNDb25maWdBZGREaXIgKHBhcnNlLT5jb25maWcsIGRhdGEpKQoJCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7Cgl9CglGY1N0ckZyZWUgKGRhdGEpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudENhY2hlOgoJZGF0YSA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CglpZiAoIWRhdGEpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCSAgICBicmVhazsKCX0KCWlmICghRmNTdHJVc2VzSG9tZSAoZGF0YSkgfHwgRmNDb25maWdIb21lICgpKQoJewoJICAgIGlmICghRmNDb25maWdTZXRDYWNoZSAocGFyc2UtPmNvbmZpZywgZGF0YSkpCgkJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCX0KCUZjU3RyRnJlZSAoZGF0YSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50SW5jbHVkZToKCUZjUGFyc2VJbmNsdWRlIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q29uZmlnOgoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE1hdGNoOgoJRmNQYXJzZU1hdGNoIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50QWxpYXM6CglGY1BhcnNlQWxpYXMgKHBhcnNlKTsKCWJyZWFrOwoKICAgIGNhc2UgRmNFbGVtZW50Qmxhbms6CglGY1BhcnNlQmxhbmsgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRSZXNjYW46CglGY1BhcnNlUmVzY2FuIChwYXJzZSk7CglicmVhazsKCQogICAgY2FzZSBGY0VsZW1lbnRQcmVmZXI6CglGY1BhcnNlRmFtaWxpZXMgKHBhcnNlLCBGY1ZTdGFja1ByZWZlcik7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50QWNjZXB0OgoJRmNQYXJzZUZhbWlsaWVzIChwYXJzZSwgRmNWU3RhY2tBY2NlcHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudERlZmF1bHQ6CglGY1BhcnNlRmFtaWxpZXMgKHBhcnNlLCBGY1ZTdGFja0RlZmF1bHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEZhbWlseToKCUZjUGFyc2VGYW1pbHkgKHBhcnNlKTsKCWJyZWFrOwoKICAgIGNhc2UgRmNFbGVtZW50VGVzdDoKCUZjUGFyc2VUZXN0IChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RWRpdDoKCUZjUGFyc2VFZGl0IChwYXJzZSk7CglicmVhazsKCiAgICBjYXNlIEZjRWxlbWVudEludDoKCUZjUGFyc2VJbnQgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnREb3VibGU6CglGY1BhcnNlRG91YmxlIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50U3RyaW5nOgoJRmNQYXJzZVN0cmluZyAocGFyc2UsIEZjVlN0YWNrU3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRNYXRyaXg6CglGY1BhcnNlTWF0cml4IChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Qm9vbDoKCUZjUGFyc2VCb29sIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q2hhcnNldDoKLyoJRmNQYXJzZUNoYXJzZXQgKHBhcnNlKTsgKi8KCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRTZWxlY3Rmb250OgoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEFjY2VwdGZvbnQ6CiAgICBjYXNlIEZjRWxlbWVudFJlamVjdGZvbnQ6CglGY1BhcnNlQWNjZXB0UmVqZWN0Rm9udCAocGFyc2UsIHBhcnNlLT5wc3RhY2stPmVsZW1lbnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEdsb2I6CglGY1BhcnNlU3RyaW5nIChwYXJzZSwgRmNWU3RhY2tHbG9iKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnROYW1lOgoJRmNQYXJzZVN0cmluZyAocGFyc2UsIEZjVlN0YWNrRmllbGQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudENvbnN0OgoJRmNQYXJzZVN0cmluZyAocGFyc2UsIEZjVlN0YWNrQ29uc3RhbnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE9yOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BPcik7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50QW5kOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BBbmQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEVxOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BFcXVhbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Tm90RXE6CglGY1BhcnNlQmluYXJ5IChwYXJzZSwgRmNPcE5vdEVxdWFsKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRMZXNzOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BMZXNzKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRMZXNzRXE6CglGY1BhcnNlQmluYXJ5IChwYXJzZSwgRmNPcExlc3NFcXVhbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TW9yZToKCUZjUGFyc2VCaW5hcnkgKHBhcnNlLCBGY09wTW9yZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TW9yZUVxOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BNb3JlRXF1YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudENvbnRhaW5zOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BDb250YWlucyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Tm90Q29udGFpbnM6CglGY1BhcnNlQmluYXJ5IChwYXJzZSwgRmNPcE5vdENvbnRhaW5zKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRQbHVzOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BQbHVzKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRNaW51czoKCUZjUGFyc2VCaW5hcnkgKHBhcnNlLCBGY09wTWludXMpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFRpbWVzOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BUaW1lcyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RGl2aWRlOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BEaXZpZGUpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE5vdDoKCUZjUGFyc2VVbmFyeSAocGFyc2UsIEZjT3BOb3QpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudElmOgoJRmNQYXJzZUJpbmFyeSAocGFyc2UsIEZjT3BRdWVzdCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Rmxvb3I6CglGY1BhcnNlVW5hcnkgKHBhcnNlLCBGY09wRmxvb3IpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudENlaWw6CglGY1BhcnNlVW5hcnkgKHBhcnNlLCBGY09wQ2VpbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Um91bmQ6CglGY1BhcnNlVW5hcnkgKHBhcnNlLCBGY09wUm91bmQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFRydW5jOgoJRmNQYXJzZVVuYXJ5IChwYXJzZSwgRmNPcFRydW5jKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRVbmtub3duOgoJYnJlYWs7CiAgICB9CiAgICAodm9pZCkgRmNQU3RhY2tQb3AgKHBhcnNlKTsKfQoKc3RhdGljIHZvaWQKRmNDaGFyYWN0ZXJEYXRhICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCnsKICAgIEZjQ29uZmlnUGFyc2UgICAqcGFyc2UgPSB1c2VyRGF0YTsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgaWYgKCFGY1N0ckJ1ZkRhdGEgKCZwYXJzZS0+cHN0YWNrLT5zdHIsIChGY0NoYXI4ICopIHMsIGxlbikpCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwp9CgpzdGF0aWMgdm9pZApGY1N0YXJ0RG9jdHlwZURlY2wgKHZvaWQJICAgICp1c2VyRGF0YSwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpkb2N0eXBlTmFtZSwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpzeXNpZCwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpwdWJpZCwKCQkgICAgaW50CQkgICAgaGFzX2ludGVybmFsX3N1YnNldCkKewogICAgRmNDb25maWdQYXJzZSAgICpwYXJzZSA9IHVzZXJEYXRhOwoKICAgIGlmIChzdHJjbXAgKChjaGFyICopIGRvY3R5cGVOYW1lLCAiZm9udGNvbmZpZyIpICE9IDApCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAiaW52YWxpZCBkb2N0eXBlIFwiJXNcIiIsIGRvY3R5cGVOYW1lKTsKfQoKc3RhdGljIHZvaWQKRmNFbmREb2N0eXBlRGVjbCAodm9pZCAqdXNlckRhdGEpCnsKfQoKRmNCb29sCkZjQ29uZmlnUGFyc2VBbmRMb2FkIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgICBjb25zdCBGY0NoYXI4ICpuYW1lLAoJCSAgICAgIEZjQm9vbAkgICAgY29tcGxhaW4pCnsKCiAgICBYTUxfUGFyc2VyCSAgICBwOwogICAgRmNDaGFyOAkgICAgKmZpbGVuYW1lOwogICAgRklMRQkgICAgKmY7CiAgICBpbnQJCSAgICBsZW47CiAgICB2b2lkCSAgICAqYnVmOwogICAgRmNDb25maWdQYXJzZSAgIHBhcnNlOwogICAgRmNCb29sCSAgICBlcnJvciA9IEZjVHJ1ZTsKICAgIAogICAgZmlsZW5hbWUgPSBGY0NvbmZpZ0ZpbGVuYW1lIChuYW1lKTsKICAgIGlmICghZmlsZW5hbWUpCglnb3RvIGJhaWwwOwogICAgCiAgICBpZiAoIUZjU3RyU2V0QWRkIChjb25maWctPmNvbmZpZ0ZpbGVzLCBmaWxlbmFtZSkpCiAgICB7CglGY1N0ckZyZWUgKGZpbGVuYW1lKTsKCWdvdG8gYmFpbDA7CiAgICB9CgogICAgZiA9IGZvcGVuICgoY2hhciAqKSBmaWxlbmFtZSwgInIiKTsKICAgIEZjU3RyRnJlZSAoZmlsZW5hbWUpOwogICAgaWYgKCFmKQoJZ290byBiYWlsMDsKICAgIAogICAgcCA9IFhNTF9QYXJzZXJDcmVhdGUgKCJVVEYtOCIpOwogICAgaWYgKCFwKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjQ29uZmlnSW5pdCAoJnBhcnNlLCBuYW1lLCBjb25maWcsIHApKQoJZ290byBiYWlsMjsKCiAgICBYTUxfU2V0VXNlckRhdGEgKHAsICZwYXJzZSk7CiAgICAKICAgIFhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIgKHAsIEZjU3RhcnREb2N0eXBlRGVjbCwgRmNFbmREb2N0eXBlRGVjbCk7CiAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIgKHAsIEZjU3RhcnRFbGVtZW50LCBGY0VuZEVsZW1lbnQpOwogICAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIChwLCBGY0NoYXJhY3RlckRhdGEpOwoJCiAgICBkbyB7CglidWYgPSBYTUxfR2V0QnVmZmVyIChwLCBCVUZTSVopOwoJaWYgKCFidWYpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlICgmcGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJjYW5ub3QgZ2V0IHBhcnNlIGJ1ZmZlciIpOwoJICAgIGdvdG8gYmFpbDM7Cgl9CglsZW4gPSBmcmVhZCAoYnVmLCAxLCBCVUZTSVosIGYpOwoJaWYgKGxlbiA8IDApCgl7CgkgICAgRmNDb25maWdNZXNzYWdlICgmcGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJmYWlsZWQgcmVhZGluZyBjb25maWcgZmlsZSIpOwoJICAgIGdvdG8gYmFpbDM7Cgl9CglpZiAoIVhNTF9QYXJzZUJ1ZmZlciAocCwgbGVuLCBsZW4gPT0gMCkpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlICgmcGFyc2UsIEZjU2V2ZXJlRXJyb3IsICIlcyIsIAoJCQkgICBYTUxfRXJyb3JTdHJpbmcgKFhNTF9HZXRFcnJvckNvZGUgKHApKSk7CgkgICAgZ290byBiYWlsMzsKCX0KICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKICAgIGVycm9yID0gcGFyc2UuZXJyb3I7CmJhaWwzOgogICAgRmNDb25maWdDbGVhbnVwICgmcGFyc2UpOwpiYWlsMjoKICAgIFhNTF9QYXJzZXJGcmVlIChwKTsKYmFpbDE6CiAgICBmY2xvc2UgKGYpOwpiYWlsMDoKICAgIGlmIChlcnJvciAmJiBjb21wbGFpbikKICAgIHsKCWlmIChuYW1lKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAoMCwgRmNTZXZlcmVFcnJvciwgIkNhbm5vdCBsb2FkIGNvbmZpZyBmaWxlIFwiJXNcIiIsIG5hbWUpOwoJZWxzZQoJICAgIEZjQ29uZmlnTWVzc2FnZSAoMCwgRmNTZXZlcmVFcnJvciwgIkNhbm5vdCBsb2FkIGRlZmF1bHQgY29uZmlnIGZpbGUiKTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQo=