LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY3htbC5jLHYgMS4yMCAyMDAyLzA4LzIwIDIzOjE3OjAzIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKI2lmbmRlZiBIQVZFX1hNTFBBUlNFX0gKI2RlZmluZSBIQVZFX1hNTFBBUlNFX0ggMAojZW5kaWYKCiNpZiBIQVZFX1hNTFBBUlNFX0gKI2luY2x1ZGUgPHhtbHBhcnNlLmg+CiNlbHNlCiNpbmNsdWRlIDxleHBhdC5oPgojZW5kaWYKCkZjVGVzdCAqCkZjVGVzdENyZWF0ZSAoRmNNYXRjaEtpbmQgICBraW5kLCAKCSAgICAgIEZjUXVhbAkgICAgcXVhbCwKCSAgICAgIGNvbnN0IEZjQ2hhcjggKmZpZWxkLAoJICAgICAgRmNPcAkgICAgY29tcGFyZSwKCSAgICAgIEZjRXhwcgkgICAgKmV4cHIpCnsKICAgIEZjVGVzdAkqdGVzdCA9IChGY1Rlc3QgKikgbWFsbG9jIChzaXplb2YgKEZjVGVzdCkpOwoKICAgIGlmICh0ZXN0KQogICAgewoJdGVzdC0+bmV4dCA9IDA7Cgl0ZXN0LT5raW5kID0ga2luZDsKCXRlc3QtPnF1YWwgPSBxdWFsOwoJdGVzdC0+ZmllbGQgPSAoY2hhciAqKSBGY1N0ckNvcHkgKGZpZWxkKTsKCXRlc3QtPm9wID0gY29tcGFyZTsKCXRlc3QtPmV4cHIgPSBleHByOwogICAgfQogICAgcmV0dXJuIHRlc3Q7Cn0KCnZvaWQKRmNUZXN0RGVzdHJveSAoRmNUZXN0ICp0ZXN0KQp7CiAgICBpZiAodGVzdC0+bmV4dCkKCUZjVGVzdERlc3Ryb3kgKHRlc3QtPm5leHQpOwogICAgRmNFeHByRGVzdHJveSAodGVzdC0+ZXhwcik7CiAgICBGY1N0ckZyZWUgKChGY0NoYXI4ICopIHRlc3QtPmZpZWxkKTsKICAgIGZyZWUgKHRlc3QpOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVJbnRlZ2VyIChpbnQgaSkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BJbnRlZ2VyOwoJZS0+dS5pdmFsID0gaTsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVEb3VibGUgKGRvdWJsZSBkKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcERvdWJsZTsKCWUtPnUuZHZhbCA9IGQ7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlU3RyaW5nIChjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcFN0cmluZzsKCWUtPnUuc3ZhbCA9IEZjU3RyQ29weSAocyk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlTWF0cml4IChjb25zdCBGY01hdHJpeCAqbSkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BNYXRyaXg7CgllLT51Lm12YWwgPSBGY01hdHJpeENvcHkgKG0pOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZUJvb2wgKEZjQm9vbCBiKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcEJvb2w7CgllLT51LmJ2YWwgPSBiOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZU5pbCAodm9pZCkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BOaWw7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcEZpZWxkOwoJZS0+dS5maWVsZCA9IChjaGFyICopIEZjU3RyQ29weSAoKEZjQ2hhcjggKikgZmllbGQpOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZUNvbnN0IChjb25zdCBGY0NoYXI4ICpjb25zdGFudCkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BDb25zdDsKCWUtPnUuY29uc3RhbnQgPSBGY1N0ckNvcHkgKGNvbnN0YW50KTsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVPcCAoRmNFeHByICpsZWZ0LCBGY09wIG9wLCBGY0V4cHIgKnJpZ2h0KQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gb3A7CgllLT51LnRyZWUubGVmdCA9IGxlZnQ7CgllLT51LnRyZWUucmlnaHQgPSByaWdodDsKICAgIH0KICAgIHJldHVybiBlOwp9Cgp2b2lkCkZjRXhwckRlc3Ryb3kgKEZjRXhwciAqZSkKewogICAgc3dpdGNoIChlLT5vcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjoKCWJyZWFrOwogICAgY2FzZSBGY09wRG91YmxlOgoJYnJlYWs7CiAgICBjYXNlIEZjT3BTdHJpbmc6CglGY1N0ckZyZWUgKGUtPnUuc3ZhbCk7CglicmVhazsKICAgIGNhc2UgRmNPcE1hdHJpeDoKCUZjTWF0cml4RnJlZSAoZS0+dS5tdmFsKTsKCWJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDoKCUZjQ2hhclNldERlc3Ryb3kgKGUtPnUuY3ZhbCk7CglicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6CglicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOgoJRmNTdHJGcmVlICgoRmNDaGFyOCAqKSBlLT51LmZpZWxkKTsKCWJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6CglGY1N0ckZyZWUgKGUtPnUuY29uc3RhbnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ246CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOgogICAgY2FzZSBGY09wUHJlcGVuZDoKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDoKICAgIGNhc2UgRmNPcEFwcGVuZDoKICAgIGNhc2UgRmNPcEFwcGVuZExhc3Q6CglicmVhazsKICAgIGNhc2UgRmNPcE9yOgogICAgY2FzZSBGY09wQW5kOgogICAgY2FzZSBGY09wRXF1YWw6CiAgICBjYXNlIEZjT3BOb3RFcXVhbDoKICAgIGNhc2UgRmNPcExlc3M6CiAgICBjYXNlIEZjT3BMZXNzRXF1YWw6CiAgICBjYXNlIEZjT3BNb3JlOgogICAgY2FzZSBGY09wTW9yZUVxdWFsOgogICAgY2FzZSBGY09wQ29udGFpbnM6CiAgICBjYXNlIEZjT3BOb3RDb250YWluczoKICAgIGNhc2UgRmNPcFBsdXM6CiAgICBjYXNlIEZjT3BNaW51czoKICAgIGNhc2UgRmNPcFRpbWVzOgogICAgY2FzZSBGY09wRGl2aWRlOgogICAgY2FzZSBGY09wUXVlc3Q6CiAgICBjYXNlIEZjT3BDb21tYToKCUZjRXhwckRlc3Ryb3kgKGUtPnUudHJlZS5yaWdodCk7CgkvKiBmYWxsIHRocm91Z2ggKi8KICAgIGNhc2UgRmNPcE5vdDoKCUZjRXhwckRlc3Ryb3kgKGUtPnUudHJlZS5sZWZ0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wTmlsOgogICAgY2FzZSBGY09wSW52YWxpZDoKCWJyZWFrOwogICAgfQogICAgZnJlZSAoZSk7Cn0KCkZjRWRpdCAqCkZjRWRpdENyZWF0ZSAoY29uc3QgY2hhciAqZmllbGQsIEZjT3Agb3AsIEZjRXhwciAqZXhwciwgRmNWYWx1ZUJpbmRpbmcgYmluZGluZykKewogICAgRmNFZGl0ICplID0gKEZjRWRpdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNFZGl0KSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5uZXh0ID0gMDsKCWUtPmZpZWxkID0gZmllbGQ7ICAgLyogYWxyZWFkeSBzYXZlZCBpbiBncmFtbWFyICovCgllLT5vcCA9IG9wOwoJZS0+ZXhwciA9IGV4cHI7CgllLT5iaW5kaW5nID0gYmluZGluZzsKICAgIH0KICAgIHJldHVybiBlOwp9Cgp2b2lkCkZjRWRpdERlc3Ryb3kgKEZjRWRpdCAqZSkKewogICAgaWYgKGUtPm5leHQpCglGY0VkaXREZXN0cm95IChlLT5uZXh0KTsKICAgIEZjU3RyRnJlZSAoKEZjQ2hhcjggKikgZS0+ZmllbGQpOwogICAgaWYgKGUtPmV4cHIpCglGY0V4cHJEZXN0cm95IChlLT5leHByKTsKfQoKY2hhciAqCkZjQ29uZmlnU2F2ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCkKewogICAgcmV0dXJuIChjaGFyICopIEZjU3RyQ29weSAoKEZjQ2hhcjggKikgZmllbGQpOwp9Cgp0eXBlZGVmIGVudW0gX0ZjRWxlbWVudCB7CiAgICBGY0VsZW1lbnROb25lLAogICAgRmNFbGVtZW50Rm9udGNvbmZpZywKICAgIEZjRWxlbWVudERpciwKICAgIEZjRWxlbWVudENhY2hlLAogICAgRmNFbGVtZW50SW5jbHVkZSwKICAgIEZjRWxlbWVudENvbmZpZywKICAgIEZjRWxlbWVudE1hdGNoLAogICAgRmNFbGVtZW50QWxpYXMsCgkKICAgIEZjRWxlbWVudEJsYW5rLAogICAgRmNFbGVtZW50UmVzY2FuLAoKICAgIEZjRWxlbWVudFByZWZlciwKICAgIEZjRWxlbWVudEFjY2VwdCwKICAgIEZjRWxlbWVudERlZmF1bHQsCiAgICBGY0VsZW1lbnRGYW1pbHksCgogICAgRmNFbGVtZW50VGVzdCwKICAgIEZjRWxlbWVudEVkaXQsCiAgICBGY0VsZW1lbnRJbnQsCiAgICBGY0VsZW1lbnREb3VibGUsCiAgICBGY0VsZW1lbnRTdHJpbmcsCiAgICBGY0VsZW1lbnRNYXRyaXgsCiAgICBGY0VsZW1lbnRCb29sLAogICAgRmNFbGVtZW50Q2hhcnNldCwKICAgIEZjRWxlbWVudE5hbWUsCiAgICBGY0VsZW1lbnRDb25zdCwKICAgIEZjRWxlbWVudE9yLAogICAgRmNFbGVtZW50QW5kLAogICAgRmNFbGVtZW50RXEsCiAgICBGY0VsZW1lbnROb3RFcSwKICAgIEZjRWxlbWVudExlc3MsCiAgICBGY0VsZW1lbnRMZXNzRXEsCiAgICBGY0VsZW1lbnRNb3JlLAogICAgRmNFbGVtZW50TW9yZUVxLAogICAgRmNFbGVtZW50Q29udGFpbnMsCiAgICBGY0VsZW1lbnROb3RDb250YWlucywKICAgIEZjRWxlbWVudFBsdXMsCiAgICBGY0VsZW1lbnRNaW51cywKICAgIEZjRWxlbWVudFRpbWVzLAogICAgRmNFbGVtZW50RGl2aWRlLAogICAgRmNFbGVtZW50Tm90LAogICAgRmNFbGVtZW50SWYsCiAgICBGY0VsZW1lbnRVbmtub3duCn0gRmNFbGVtZW50OwoKc3RhdGljIEZjRWxlbWVudApGY0VsZW1lbnRNYXAgKGNvbnN0IFhNTF9DaGFyICpuYW1lKQp7CiAgICBzdGF0aWMgc3RydWN0IHsKCWNoYXIJICAgICpuYW1lOwoJRmNFbGVtZW50ICAgZWxlbWVudDsKICAgIH0gZmNFbGVtZW50TWFwW10gPSB7Cgl7ICJmb250Y29uZmlnIiwJRmNFbGVtZW50Rm9udGNvbmZpZyB9LAoJeyAiZGlyIiwJRmNFbGVtZW50RGlyIH0sCgl7ICJjYWNoZSIsCUZjRWxlbWVudENhY2hlIH0sCgl7ICJpbmNsdWRlIiwJRmNFbGVtZW50SW5jbHVkZSB9LAoJeyAiY29uZmlnIiwJRmNFbGVtZW50Q29uZmlnIH0sCgl7ICJtYXRjaCIsCUZjRWxlbWVudE1hdGNoIH0sCgl7ICJhbGlhcyIsCUZjRWxlbWVudEFsaWFzIH0sCgkKCXsgImJsYW5rIiwJRmNFbGVtZW50QmxhbmsgfSwKCXsgInJlc2NhbiIsCUZjRWxlbWVudFJlc2NhbiB9LAoKCXsgInByZWZlciIsCUZjRWxlbWVudFByZWZlciB9LAoJeyAiYWNjZXB0IiwJRmNFbGVtZW50QWNjZXB0IH0sCgl7ICJkZWZhdWx0IiwJRmNFbGVtZW50RGVmYXVsdCB9LAoJeyAiZmFtaWx5IiwJRmNFbGVtZW50RmFtaWx5IH0sCgoJeyAidGVzdCIsCUZjRWxlbWVudFRlc3QgfSwKCXsgImVkaXQiLAlGY0VsZW1lbnRFZGl0IH0sCgl7ICJpbnQiLAlGY0VsZW1lbnRJbnQgfSwKCXsgImRvdWJsZSIsCUZjRWxlbWVudERvdWJsZSB9LAoJeyAic3RyaW5nIiwJRmNFbGVtZW50U3RyaW5nIH0sCgl7ICJtYXRyaXgiLAlGY0VsZW1lbnRNYXRyaXggfSwKCXsgImJvb2wiLAlGY0VsZW1lbnRCb29sIH0sCgl7ICJjaGFyc2V0IiwJRmNFbGVtZW50Q2hhcnNldCB9LAoJeyAibmFtZSIsCUZjRWxlbWVudE5hbWUgfSwKCXsgImNvbnN0IiwJRmNFbGVtZW50Q29uc3QgfSwKCXsgIm9yIiwJCUZjRWxlbWVudE9yIH0sCgl7ICJhbmQiLAlGY0VsZW1lbnRBbmQgfSwKCXsgImVxIiwJCUZjRWxlbWVudEVxIH0sCgl7ICJub3RfZXEiLAlGY0VsZW1lbnROb3RFcSB9LAoJeyAibGVzcyIsCUZjRWxlbWVudExlc3MgfSwKCXsgImxlc3NfZXEiLAlGY0VsZW1lbnRMZXNzRXEgfSwKCXsgIm1vcmUiLAlGY0VsZW1lbnRNb3JlIH0sCgl7ICJtb3JlX2VxIiwJRmNFbGVtZW50TW9yZUVxIH0sCgl7ICJjb250YWlucyIsCUZjRWxlbWVudENvbnRhaW5zIH0sCgl7ICJub3RfY29udGFpbnMiLEZjRWxlbWVudE5vdENvbnRhaW5zIH0sCgl7ICJwbHVzIiwJRmNFbGVtZW50UGx1cyB9LAoJeyAibWludXMiLAlGY0VsZW1lbnRNaW51cyB9LAoJeyAidGltZXMiLAlGY0VsZW1lbnRUaW1lcyB9LAoJeyAiZGl2aWRlIiwJRmNFbGVtZW50RGl2aWRlIH0sCgl7ICJub3QiLAlGY0VsZW1lbnROb3QgfSwKCXsgImlmIiwJCUZjRWxlbWVudElmIH0sCgkKCXsgMCwJCTAgfQogICAgfTsKCiAgICBpbnQJICAgIGk7CiAgICBmb3IgKGkgPSAwOyBmY0VsZW1lbnRNYXBbaV0ubmFtZTsgaSsrKQoJaWYgKCFzdHJjbXAgKChjaGFyICopIG5hbWUsIGZjRWxlbWVudE1hcFtpXS5uYW1lKSkKCSAgICByZXR1cm4gZmNFbGVtZW50TWFwW2ldLmVsZW1lbnQ7CiAgICByZXR1cm4gRmNFbGVtZW50VW5rbm93bjsKfQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjUFN0YWNrIHsKICAgIHN0cnVjdCBfRmNQU3RhY2sgICAqcHJldjsKICAgIEZjRWxlbWVudAkJZWxlbWVudDsKICAgIEZjQ2hhcjgJCSoqYXR0cjsKICAgIEZjU3RyQnVmCQlzdHI7Cn0gRmNQU3RhY2s7CiAgICAKdHlwZWRlZiBlbnVtIF9GY1ZTdGFja1RhZyB7CiAgICBGY1ZTdGFja05vbmUsCgogICAgRmNWU3RhY2tTdHJpbmcsCiAgICBGY1ZTdGFja0ZhbWlseSwKICAgIEZjVlN0YWNrRmllbGQsCiAgICBGY1ZTdGFja0NvbnN0YW50LAogICAgCiAgICBGY1ZTdGFja1ByZWZlciwKICAgIEZjVlN0YWNrQWNjZXB0LAogICAgRmNWU3RhY2tEZWZhdWx0LAogICAgCiAgICBGY1ZTdGFja0ludGVnZXIsCiAgICBGY1ZTdGFja0RvdWJsZSwKICAgIEZjVlN0YWNrTWF0cml4LAogICAgRmNWU3RhY2tCb29sLAogICAgCiAgICBGY1ZTdGFja1Rlc3QsCiAgICBGY1ZTdGFja0V4cHIsCiAgICBGY1ZTdGFja0VkaXQKfSBGY1ZTdGFja1RhZzsKCnR5cGVkZWYgc3RydWN0IF9GY1ZTdGFjayB7CiAgICBzdHJ1Y3QgX0ZjVlN0YWNrCSpwcmV2OwogICAgRmNQU3RhY2sJCSpwc3RhY2s7CS8qIHJlbGF0ZWQgcGFyc2UgZWxlbWVudCAqLwogICAgRmNWU3RhY2tUYWcJCXRhZzsKICAgIHVuaW9uIHsKCUZjQ2hhcjgJCSpzdHJpbmc7CgoJaW50CQlpbnRlZ2VyOwoJZG91YmxlCQlfZG91YmxlOwoJRmNNYXRyaXgJKm1hdHJpeDsKCUZjQm9vbAkJYm9vbDsKCglGY1Rlc3QJCSp0ZXN0OwoJRmNRdWFsCQlxdWFsOwoJRmNPcAkJb3A7CglGY0V4cHIJCSpleHByOwoJRmNFZGl0CQkqZWRpdDsKICAgIH0gdTsKfSBGY1ZTdGFjazsKCnR5cGVkZWYgc3RydWN0IF9GY0NvbmZpZ1BhcnNlIHsKICAgIEZjUFN0YWNrCSAgICAqcHN0YWNrOwogICAgRmNWU3RhY2sJICAgICp2c3RhY2s7CiAgICBGY0Jvb2wJICAgIGVycm9yOwogICAgY29uc3QgRmNDaGFyOCAgICpuYW1lOwogICAgRmNDb25maWcJICAgICpjb25maWc7CiAgICBYTUxfUGFyc2VyCSAgICBwYXJzZXI7Cn0gRmNDb25maWdQYXJzZTsKCnR5cGVkZWYgZW51bSBfRmNDb25maWdTZXZlcml0eSB7CiAgICBGY1NldmVyZUluZm8sIEZjU2V2ZXJlV2FybmluZywgRmNTZXZlcmVFcnJvcgp9IEZjQ29uZmlnU2V2ZXJpdHk7CgpzdGF0aWMgdm9pZApGY0NvbmZpZ01lc3NhZ2UgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY0NvbmZpZ1NldmVyaXR5IHNldmVyZSwgY2hhciAqZm10LCAuLi4pCnsKICAgIGNoYXIJKnMgPSAidW5rbm93biI7CiAgICB2YV9saXN0CWFyZ3M7CgogICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CgogICAgc3dpdGNoIChzZXZlcmUpIHsKICAgIGNhc2UgRmNTZXZlcmVJbmZvOiBzID0gImluZm8iOyBicmVhazsKICAgIGNhc2UgRmNTZXZlcmVXYXJuaW5nOiBzID0gIndhcm5pbmciOyBicmVhazsKICAgIGNhc2UgRmNTZXZlcmVFcnJvcjogcyA9ICJlcnJvciI7IGJyZWFrOwogICAgfQogICAgaWYgKHBhcnNlKQogICAgewoJaWYgKHBhcnNlLT5uYW1lKQoJICAgIGZwcmludGYgKHN0ZGVyciwgIkZvbnRjb25maWcgJXM6IFwiJXNcIiwgbGluZSAlZDogIiwgcywKCQkgICAgIHBhcnNlLT5uYW1lLCBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgKHBhcnNlLT5wYXJzZXIpKTsKCWVsc2UKCSAgICBmcHJpbnRmIChzdGRlcnIsICJGb250Y29uZmlnICVzOiBsaW5lICVkOiAiLCBzLAoJCSAgICAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIChwYXJzZS0+cGFyc2VyKSk7CglpZiAoc2V2ZXJlID49IEZjU2V2ZXJlRXJyb3IpCgkgICAgcGFyc2UtPmVycm9yID0gRmNUcnVlOwogICAgfQogICAgZWxzZQoJZnByaW50ZiAoc3RkZXJyLCAiRm9udGNvbmZpZyAlczogIiwgcyk7CiAgICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKICAgIHZhX2VuZCAoYXJncyk7Cn0KCnN0YXRpYyB2b2lkCkZjVlN0YWNrUHVzaCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrICp2c3RhY2spCnsKICAgIHZzdGFjay0+cHJldiA9IHBhcnNlLT52c3RhY2s7CiAgICB2c3RhY2stPnBzdGFjayA9IHBhcnNlLT5wc3RhY2sgPyBwYXJzZS0+cHN0YWNrLT5wcmV2IDogMDsKICAgIHBhcnNlLT52c3RhY2sgPSB2c3RhY2s7Cn0KCnN0YXRpYyBGY1ZTdGFjayAqCkZjVlN0YWNrQ3JlYXRlICh2b2lkKQp7CiAgICBGY1ZTdGFjayAgICAqbmV3OwoKICAgIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChGY1ZTdGFjaykpOwogICAgaWYgKCFuZXcpCglyZXR1cm4gMDsKICAgIG5ldy0+dGFnID0gRmNWU3RhY2tOb25lOwogICAgbmV3LT5wcmV2ID0gMDsKICAgIHJldHVybiBuZXc7Cn0KCnN0YXRpYyB2b2lkCkZjVlN0YWNrRGVzdHJveSAoRmNWU3RhY2sgKnZzdGFjaykKewogICAgRmNWU3RhY2sgICAgKnByZXY7CgogICAgZm9yICg7IHZzdGFjazsgdnN0YWNrID0gcHJldikKICAgIHsKCXByZXYgPSB2c3RhY2stPnByZXY7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrTm9uZToKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tTdHJpbmc6CgljYXNlIEZjVlN0YWNrRmFtaWx5OgoJY2FzZSBGY1ZTdGFja0ZpZWxkOgoJY2FzZSBGY1ZTdGFja0NvbnN0YW50OgoJICAgIEZjU3RyRnJlZSAodnN0YWNrLT51LnN0cmluZyk7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrSW50ZWdlcjoKCWNhc2UgRmNWU3RhY2tEb3VibGU6CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrTWF0cml4OgoJICAgIEZjTWF0cml4RnJlZSAodnN0YWNrLT51Lm1hdHJpeCk7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrQm9vbDoKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tUZXN0OgoJICAgIEZjVGVzdERlc3Ryb3kgKHZzdGFjay0+dS50ZXN0KTsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tFeHByOgoJY2FzZSBGY1ZTdGFja1ByZWZlcjoKCWNhc2UgRmNWU3RhY2tBY2NlcHQ6CgljYXNlIEZjVlN0YWNrRGVmYXVsdDoKCSAgICBGY0V4cHJEZXN0cm95ICh2c3RhY2stPnUuZXhwcik7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRWRpdDoKCSAgICBGY0VkaXREZXN0cm95ICh2c3RhY2stPnUuZWRpdCk7CgkgICAgYnJlYWs7Cgl9CglmcmVlICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaFN0cmluZyAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrVGFnIHRhZywgRmNDaGFyOCAqc3RyaW5nKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LnN0cmluZyA9IHN0cmluZzsKICAgIHZzdGFjay0+dGFnID0gdGFnOwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoSW50ZWdlciAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGludCBpbnRlZ2VyKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmludGVnZXIgPSBpbnRlZ2VyOwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0ludGVnZXI7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hEb3VibGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBkb3VibGUgX2RvdWJsZSkKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS5fZG91YmxlID0gX2RvdWJsZTsKICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tEb3VibGU7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hNYXRyaXggKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY01hdHJpeCAqbWF0cml4KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgbWF0cml4ID0gRmNNYXRyaXhDb3B5IChtYXRyaXgpOwogICAgaWYgKCFtYXRyaXgpCiAgICB7CglGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHZzdGFjay0+dS5tYXRyaXggPSBtYXRyaXg7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTWF0cml4OwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoQm9vbCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjQm9vbCBib29sKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmJvb2wgPSBib29sOwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0Jvb2w7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hUZXN0IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNUZXN0ICp0ZXN0KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LnRlc3QgPSB0ZXN0OwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja1Rlc3Q7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hFeHByIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2tUYWcgdGFnLCBGY0V4cHIgKmV4cHIpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuZXhwciA9IGV4cHI7CiAgICB2c3RhY2stPnRhZyA9IHRhZzsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaEVkaXQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY0VkaXQgKmVkaXQpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuZWRpdCA9IGVkaXQ7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrRWRpdDsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja0ZldGNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgaW50IG9mZikKewogICAgRmNWU3RhY2sgICAgKnZzdGFjazsKCiAgICBmb3IgKHZzdGFjayA9IHBhcnNlLT52c3RhY2s7IHZzdGFjayAmJiBvZmYtLSA+IDA7IHZzdGFjayA9IHZzdGFjay0+cHJldik7CiAgICByZXR1cm4gdnN0YWNrOwp9CgpzdGF0aWMgdm9pZApGY1ZTdGFja0NsZWFyIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgd2hpbGUgKHBhcnNlLT52c3RhY2sgJiYgcGFyc2UtPnZzdGFjay0+cHN0YWNrID09IHBhcnNlLT5wc3RhY2spCiAgICB7CglGY1ZTdGFjayAgICAqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKCXBhcnNlLT52c3RhY2sgPSB2c3RhY2stPnByZXY7Cgl2c3RhY2stPnByZXYgPSAwOwoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja1BvcCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjVlN0YWNrCSp2c3RhY2sgPSBwYXJzZS0+dnN0YWNrOwogICAgCiAgICBpZiAoIXZzdGFjayB8fCB2c3RhY2stPnBzdGFjayAhPSBwYXJzZS0+cHN0YWNrKQoJcmV0dXJuIDA7CiAgICBwYXJzZS0+dnN0YWNrID0gdnN0YWNrLT5wcmV2OwogICAgdnN0YWNrLT5wcmV2ID0gMDsKICAgIHJldHVybiB2c3RhY2s7Cn0KCnN0YXRpYyBpbnQKRmNWU3RhY2tFbGVtZW50cyAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGludAkJaCA9IDA7CiAgICBGY1ZTdGFjawkqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKICAgIHdoaWxlICh2c3RhY2sgJiYgdnN0YWNrLT5wc3RhY2sgPT0gcGFyc2UtPnBzdGFjaykKICAgIHsKCWgrKzsKCXZzdGFjayA9IHZzdGFjay0+cHJldjsKICAgIH0KICAgIHJldHVybiBoOwp9CgpzdGF0aWMgRmNDaGFyOCAqKgpGY0NvbmZpZ1NhdmVBdHRyIChjb25zdCBYTUxfQ2hhciAqKmF0dHIpCnsKICAgIGludAkJbjsKICAgIGludAkJc2xlbjsKICAgIGludAkJaTsKICAgIEZjQ2hhcjgJKipuZXc7CiAgICBGY0NoYXI4CSpzOwoKICAgIGlmICghYXR0cikKCXJldHVybiAwOwogICAgc2xlbiA9IDA7CiAgICBmb3IgKGkgPSAwOyBhdHRyW2ldOyBpKyspCglzbGVuICs9IHN0cmxlbiAoYXR0cltpXSkgKyAxOwogICAgbiA9IGk7CiAgICBuZXcgPSBtYWxsb2MgKChpICsgMSkgKiBzaXplb2YgKEZjQ2hhcjggKikgKyBzbGVuKTsKICAgIGlmICghbmV3KQoJcmV0dXJuIDA7CiAgICBzID0gKEZjQ2hhcjggKikgKG5ldyArIChpICsgMSkpOwogICAgZm9yIChpID0gMDsgYXR0cltpXTsgaSsrKQogICAgewoJbmV3W2ldID0gczsKCXN0cmNweSAoKGNoYXIgKikgcywgKGNoYXIgKikgYXR0cltpXSk7CglzICs9IHN0cmxlbiAoKGNoYXIgKikgcykgKyAxOwogICAgfQogICAgbmV3W2ldID0gMDsKICAgIHJldHVybiBuZXc7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNQU3RhY2tQdXNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNFbGVtZW50IGVsZW1lbnQsIGNvbnN0IFhNTF9DaGFyICoqYXR0cikKewogICAgRmNQU3RhY2sgICAqbmV3ID0gbWFsbG9jIChzaXplb2YgKEZjUFN0YWNrKSk7CgogICAgaWYgKCFuZXcpCglyZXR1cm4gRmNGYWxzZTsKICAgIG5ldy0+cHJldiA9IHBhcnNlLT5wc3RhY2s7CiAgICBuZXctPmVsZW1lbnQgPSBlbGVtZW50OwogICAgaWYgKGF0dHIpCiAgICB7CgluZXctPmF0dHIgPSBGY0NvbmZpZ1NhdmVBdHRyIChhdHRyKTsKCWlmICghbmV3LT5hdHRyKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CiAgICB9CiAgICBlbHNlCgluZXctPmF0dHIgPSAwOwogICAgRmNTdHJCdWZJbml0ICgmbmV3LT5zdHIsIDAsIDApOwogICAgcGFyc2UtPnBzdGFjayA9IG5ldzsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNQU3RhY2tQb3AgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY1BTdGFjayAgICpvbGQ7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykgCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAibWlzbWF0Y2hpbmcgZWxlbWVudCIpOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICBGY1ZTdGFja0NsZWFyIChwYXJzZSk7CiAgICBvbGQgPSBwYXJzZS0+cHN0YWNrOwogICAgcGFyc2UtPnBzdGFjayA9IG9sZC0+cHJldjsKICAgIEZjU3RyQnVmRGVzdHJveSAoJm9sZC0+c3RyKTsKICAgIGlmIChvbGQtPmF0dHIpCglmcmVlIChvbGQtPmF0dHIpOwogICAgZnJlZSAob2xkKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDb25maWdJbml0IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgY29uc3QgRmNDaGFyOCAqbmFtZSwgRmNDb25maWcgKmNvbmZpZywgWE1MX1BhcnNlciBwYXJzZXIpCnsKICAgIHBhcnNlLT5wc3RhY2sgPSAwOwogICAgcGFyc2UtPnZzdGFjayA9IDA7CiAgICBwYXJzZS0+ZXJyb3IgPSBGY0ZhbHNlOwogICAgcGFyc2UtPm5hbWUgPSBuYW1lOwogICAgcGFyc2UtPmNvbmZpZyA9IGNvbmZpZzsKICAgIHBhcnNlLT5wYXJzZXIgPSBwYXJzZXI7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgdm9pZApGY0NvbmZpZ0NsZWFudXAgKEZjQ29uZmlnUGFyc2UJKnBhcnNlKQp7CiAgICB3aGlsZSAocGFyc2UtPnBzdGFjaykKCUZjUFN0YWNrUG9wIChwYXJzZSk7Cn0KCnN0YXRpYyBjb25zdCBGY0NoYXI4ICoKRmNDb25maWdHZXRBdHRyaWJ1dGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBjaGFyICphdHRyKQp7CiAgICBGY0NoYXI4ICoqYXR0cnM7CiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm4gMDsKCiAgICBhdHRycyA9IHBhcnNlLT5wc3RhY2stPmF0dHI7CiAgICB3aGlsZSAoKmF0dHJzKQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopICphdHRycywgYXR0cikpCgkgICAgcmV0dXJuIGF0dHJzWzFdOwoJYXR0cnMgKz0gMjsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApGY1N0YXJ0RWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cikKewogICAgRmNDb25maWdQYXJzZSAgICpwYXJzZSA9IHVzZXJEYXRhOwogICAgRmNFbGVtZW50CSAgICBlbGVtZW50OwogICAgCiAgICBlbGVtZW50ID0gRmNFbGVtZW50TWFwIChuYW1lKTsKICAgIGlmIChlbGVtZW50ID09IEZjRWxlbWVudFVua25vd24pCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJ1bmtub3duIGVsZW1lbnQgXCIlc1wiIiwgbmFtZSk7CiAgICAKICAgIGlmICghRmNQU3RhY2tQdXNoIChwYXJzZSwgZWxlbWVudCwgYXR0cikpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgcmV0dXJuOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlQmxhbmsgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBpbnQJICAgIG4gPSBGY1ZTdGFja0VsZW1lbnRzIChwYXJzZSk7CiAgICB3aGlsZSAobi0tID4gMCkKICAgIHsKCUZjVlN0YWNrICAgICp2ID0gRmNWU3RhY2tGZXRjaCAocGFyc2UsIG4pOwoJaWYgKHYtPnRhZyAhPSBGY1ZTdGFja0ludGVnZXIpCgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm5vbi1pbnRlZ2VyIGJsYW5rIik7CgllbHNlCgl7CgkgICAgaWYgKCFwYXJzZS0+Y29uZmlnLT5ibGFua3MpCgkgICAgewoJCXBhcnNlLT5jb25maWctPmJsYW5rcyA9IEZjQmxhbmtzQ3JlYXRlICgpOwoJCWlmICghcGFyc2UtPmNvbmZpZy0+YmxhbmtzKQoJCXsKCQkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCQkgICAgYnJlYWs7CgkJfQoJICAgIH0KCSAgICBpZiAoIUZjQmxhbmtzQWRkIChwYXJzZS0+Y29uZmlnLT5ibGFua3MsIHYtPnUuaW50ZWdlcikpCgkgICAgewoJCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkJYnJlYWs7CgkgICAgfQoJfQogICAgfQp9CgpzdGF0aWMgdm9pZApGY1BhcnNlUmVzY2FuIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgaW50CSAgICBuID0gRmNWU3RhY2tFbGVtZW50cyAocGFyc2UpOwogICAgd2hpbGUgKG4tLSA+IDApCiAgICB7CglGY1ZTdGFjayAgICAqdiA9IEZjVlN0YWNrRmV0Y2ggKHBhcnNlLCBuKTsKCWlmICh2LT50YWcgIT0gRmNWU3RhY2tJbnRlZ2VyKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgIm5vbi1pbnRlZ2VyIHJlc2NhbiIpOwoJZWxzZQoJICAgIHBhcnNlLT5jb25maWctPnJlc2NhbkludGVydmFsID0gdi0+dS5pbnRlZ2VyOwogICAgfQp9CgpzdGF0aWMgdm9pZApGY1BhcnNlSW50IChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqcywgKmVuZDsKICAgIGludAkgICAgbDsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgZW5kID0gMDsKICAgIGwgPSAoaW50KSBzdHJ0b2wgKChjaGFyICopIHMsIChjaGFyICoqKSZlbmQsIDApOwogICAgaWYgKGVuZCAhPSBzICsgc3RybGVuICgoY2hhciAqKSBzKSkKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJcIiVzXCI6IG5vdCBhIHZhbGlkIGludGVnZXIiLCBzKTsKICAgIGVsc2UKCUZjVlN0YWNrUHVzaEludGVnZXIgKHBhcnNlLCBsKTsKICAgIEZjU3RyRnJlZSAocyk7Cn0KCi8qCiAqIGlkZWEgY29waWVkIGZyb20gZ2xpYiBnX2FzY2lpX3N0cnRvZCB3aXRoIAogKiBwZXJtaXNzaW9uIG9mIHRoZSBhdXRob3IgKEFsZXhhbmRlciBMYXJzc29uKSAKICovCgojaW5jbHVkZSA8bG9jYWxlLmg+CgpzdGF0aWMgZG91YmxlIApGY1N0cnRvZCAoY2hhciAqcywgY2hhciAqKmVuZCkKewogICAgc3RydWN0IGxjb252ICAgICpsb2NhbGVfZGF0YTsKICAgIGNoYXIJICAgICpkb3Q7CiAgICBkb3VibGUJICAgIHY7CgogICAgLyoKICAgICAqIEhhdmUgdG8gc3dhcCB0aGUgZGVjaW1hbCBwb2ludCB0byBtYXRjaCB0aGUgY3VycmVudCBsb2NhbGUKICAgICAqIGlmIHRoYXQgbG9jYWxlIGRvZXNuJ3QgdXNlIDB4MmUKICAgICAqLwogICAgaWYgKChkb3QgPSBzdHJjaHIgKHMsIDB4MmUpKSAmJgoJKGxvY2FsZV9kYXRhID0gbG9jYWxlY29udiAoKSkgJiYKCShsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludFswXSAhPSAweDJlIHx8CgkgbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnRbMV0gIT0gMCkpCiAgICB7CgljaGFyCWJ1ZlsxMjhdOwoJaW50CXNsZW4gPSBzdHJsZW4gKHMpOwoJaW50CWRsZW4gPSBzdHJsZW4gKGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50KTsKCQoJaWYgKHNsZW4gKyBkbGVuID4gc2l6ZW9mIChidWYpKQoJewoJICAgIGlmIChlbmQpCgkJKmVuZCA9IHM7CgkgICAgdiA9IDA7Cgl9CgllbHNlCgl7CgkgICAgY2hhcgkqYnVmX2VuZDsKCSAgICAvKiBtYW50aXNzYSAqLwoJICAgIHN0cm5jcHkgKGJ1ZiwgcywgZG90IC0gcyk7CgkgICAgLyogZGVjaW1hbCBwb2ludCAqLwoJICAgIHN0cmNweSAoYnVmICsgKGRvdCAtIHMpLCBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludCk7CgkgICAgLyogcmVzdCBvZiBudW1iZXIgKi8KCSAgICBzdHJjcHkgKGJ1ZiArIChkb3QgLSBzKSArIGRsZW4sIGRvdCArIDEpOwoJICAgIGJ1Zl9lbmQgPSAwOwoJICAgIHYgPSBzdHJ0b2QgKGJ1ZiwgJmJ1Zl9lbmQpOwoJICAgIGlmIChidWZfZW5kKQoJCWJ1Zl9lbmQgPSBzICsgKGJ1Zl9lbmQgLSBidWYpOwoJICAgIGlmIChlbmQpCgkJKmVuZCA9IGJ1Zl9lbmQ7Cgl9CiAgICB9CiAgICBlbHNlCgl2ID0gc3RydG9kIChzLCBlbmQpOwogICAgcmV0dXJuIHY7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VEb3VibGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4ICpzLCAqZW5kOwogICAgZG91YmxlICBkOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBlbmQgPSAwOwogICAgZCA9IEZjU3RydG9kICgoY2hhciAqKSBzLCAoY2hhciAqKikmZW5kKTsKICAgIGlmIChlbmQgIT0gcyArIHN0cmxlbiAoKGNoYXIgKikgcykpCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAiXCIlc1wiOiBub3QgYSB2YWxpZCBkb3VibGUiLCBzKTsKICAgIGVsc2UKCUZjVlN0YWNrUHVzaERvdWJsZSAocGFyc2UsIGQpOwogICAgRmNTdHJGcmVlIChzKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZVN0cmluZyAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrVGFnIHRhZykKewogICAgRmNDaGFyOCAqczsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgaWYgKCFGY1ZTdGFja1B1c2hTdHJpbmcgKHBhcnNlLCB0YWcsIHMpKQoJRmNTdHJGcmVlIChzKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZU1hdHJpeCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjVlN0YWNrCSp2c3RhY2s7CiAgICBlbnVtIHsgbV9kb25lLCBtX3h4LCBtX3h5LCBtX3l4LCBtX3l5IH0gbWF0cml4X3N0YXRlID0gbV95eTsKICAgIEZjTWF0cml4CW07CiAgICAKICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpCiAgICB7Cglkb3VibGUJdjsKCXN3aXRjaCAodnN0YWNrLT50YWcpIHsKCWNhc2UgRmNWU3RhY2tJbnRlZ2VyOgoJICAgIHYgPSB2c3RhY2stPnUuaW50ZWdlcjsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tEb3VibGU6CgkgICAgdiA9IHZzdGFjay0+dS5fZG91YmxlOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAibm9uLWRvdWJsZSBtYXRyaXggZWxlbWVudCIpOwoJICAgIHYgPSAxLjA7CgkgICAgYnJlYWs7Cgl9Cglzd2l0Y2ggKG1hdHJpeF9zdGF0ZSkgewoJY2FzZSBtX3h4OiBtLnh4ID0gdjsgYnJlYWs7CgljYXNlIG1feHk6IG0ueHkgPSB2OyBicmVhazsKCWNhc2UgbV95eDogbS55eCA9IHY7IGJyZWFrOwoJY2FzZSBtX3l5OiBtLnl5ID0gdjsgYnJlYWs7CglkZWZhdWx0OiBicmVhazsKCX0KCUZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKCW1hdHJpeF9zdGF0ZS0tOwogICAgfQogICAgaWYgKG1hdHJpeF9zdGF0ZSAhPSBtX2RvbmUpCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAid3JvbmcgbnVtYmVyIG9mIG1hdHJpeCBlbGVtZW50cyIpOwogICAgZWxzZQoJRmNWU3RhY2tQdXNoTWF0cml4IChwYXJzZSwgJm0pOwp9CgpzdGF0aWMgRmNCb29sCkZjQ29uZmlnTGV4Qm9vbCAoY29uc3QgRmNDaGFyOCAqYm9vbCkKewogICAgaWYgKCpib29sID09ICd0JyB8fCAqYm9vbCA9PSAnVCcpCglyZXR1cm4gRmNUcnVlOwogICAgaWYgKCpib29sID09ICd5JyB8fCAqYm9vbCA9PSAnWScpCglyZXR1cm4gRmNUcnVlOwogICAgaWYgKCpib29sID09ICcxJykKCXJldHVybiBGY1RydWU7CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUJvb2wgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4ICpzOwoKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIEZjVlN0YWNrUHVzaEJvb2wgKHBhcnNlLCBGY0NvbmZpZ0xleEJvb2wgKHMpKTsKICAgIEZjU3RyRnJlZSAocyk7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VGYW1pbGllcyAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrVGFnIHRhZykKewogICAgRmNWU3RhY2sJKnZzdGFjazsKICAgIEZjRXhwcgkqbGVmdCwgKmV4cHIgPSAwLCAqbmV3OwoKICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpCiAgICB7CglpZiAodnN0YWNrLT50YWcgIT0gRmNWU3RhY2tGYW1pbHkpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAibm9uLWZhbWlseSIpOwoJICAgIEZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKCSAgICBjb250aW51ZTsKCX0KCWxlZnQgPSB2c3RhY2stPnUuZXhwcjsKCXZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwoJaWYgKGV4cHIpCgl7CgkgICAgbmV3ID0gRmNFeHByQ3JlYXRlT3AgKGxlZnQsIEZjT3BDb21tYSwgZXhwcik7CgkgICAgaWYgKCFuZXcpCgkgICAgewoJCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkJRmNFeHByRGVzdHJveSAobGVmdCk7CgkJRmNFeHByRGVzdHJveSAoZXhwcik7CgkJYnJlYWs7CgkgICAgfQoJICAgIGV4cHIgPSBuZXc7Cgl9CgllbHNlCgkgICAgZXhwciA9IGxlZnQ7CiAgICB9CiAgICBpZiAoZXhwcikKICAgIHsKCWlmICghRmNWU3RhY2tQdXNoRXhwciAocGFyc2UsIHRhZywgZXhwcikpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCSAgICBpZiAoZXhwcikKCQlGY0V4cHJEZXN0cm95IChleHByKTsKCX0KICAgIH0KfQoKc3RhdGljIHZvaWQKRmNQYXJzZUZhbWlseSAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjQ2hhcjggKnM7CiAgICBGY0V4cHIgICpleHByOwoKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIGV4cHIgPSBGY0V4cHJDcmVhdGVTdHJpbmcgKHMpOwogICAgRmNTdHJGcmVlIChzKTsKICAgIGlmIChleHByKQoJRmNWU3RhY2tQdXNoRXhwciAocGFyc2UsIEZjVlN0YWNrRmFtaWx5LCBleHByKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUFsaWFzIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNFeHByCSpmYW1pbHkgPSAwLCAqYWNjZXB0ID0gMCwgKnByZWZlciA9IDAsICpkZWYgPSAwLCAqbmV3ID0gMDsKICAgIEZjRWRpdAkqZWRpdCA9IDAsICpuZXh0OwogICAgRmNWU3RhY2sJKnZzdGFjazsKICAgIEZjVGVzdAkqdGVzdDsKCiAgICB3aGlsZSAoKHZzdGFjayA9IEZjVlN0YWNrUG9wIChwYXJzZSkpKSAKICAgIHsKCXN3aXRjaCAodnN0YWNrLT50YWcpIHsKCWNhc2UgRmNWU3RhY2tGYW1pbHk6CgkgICAgaWYgKGZhbWlseSkKCSAgICB7CgkJbmV3ID0gRmNFeHByQ3JlYXRlT3AgKHZzdGFjay0+dS5leHByLCBGY09wQ29tbWEsIGZhbWlseSk7CgkJaWYgKCFuZXcpCgkJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkJZWxzZQoJCSAgICBmYW1pbHkgPSBuZXc7CgkgICAgfQoJICAgIGVsc2UKCQluZXcgPSB2c3RhY2stPnUuZXhwcjsKCSAgICBpZiAobmV3KQoJICAgIHsKCQlmYW1pbHkgPSBuZXc7CgkJdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja1ByZWZlcjoKCSAgICBpZiAocHJlZmVyKQoJCUZjRXhwckRlc3Ryb3kgKHByZWZlcik7CgkgICAgcHJlZmVyID0gdnN0YWNrLT51LmV4cHI7CgkgICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrQWNjZXB0OgoJICAgIGlmIChhY2NlcHQpCgkJRmNFeHByRGVzdHJveSAoYWNjZXB0KTsKCSAgICBhY2NlcHQgPSB2c3RhY2stPnUuZXhwcjsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tEZWZhdWx0OgoJICAgIGlmIChkZWYpCgkJRmNFeHByRGVzdHJveSAoZGVmKTsKCSAgICBkZWYgPSB2c3RhY2stPnUuZXhwcjsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiYmFkIGFsaWFzIik7CgkgICAgYnJlYWs7Cgl9CglGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CiAgICB9CiAgICBpZiAoIWZhbWlseSkKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJtaXNzaW5nIGZhbWlseSBpbiBhbGlhcyIpOwoJaWYgKHByZWZlcikKCSAgICBGY0V4cHJEZXN0cm95IChwcmVmZXIpOwoJaWYgKGFjY2VwdCkKCSAgICBGY0V4cHJEZXN0cm95IChhY2NlcHQpOwoJaWYgKGRlZikKCSAgICBGY0V4cHJEZXN0cm95IChkZWYpOwoJcmV0dXJuOwogICAgfQogICAgaWYgKHByZWZlcikKICAgIHsKCWVkaXQgPSBGY0VkaXRDcmVhdGUgKEZjQ29uZmlnU2F2ZUZpZWxkICgiZmFtaWx5IiksCgkJCSAgICAgRmNPcFByZXBlbmQsCgkJCSAgICAgcHJlZmVyLAoJCQkgICAgIEZjVmFsdWVCaW5kaW5nV2Vhayk7CglpZiAoZWRpdCkKCSAgICBlZGl0LT5uZXh0ID0gMDsKCWVsc2UKCSAgICBGY0V4cHJEZXN0cm95IChwcmVmZXIpOwogICAgfQogICAgaWYgKGFjY2VwdCkKICAgIHsKCW5leHQgPSBlZGl0OwoJZWRpdCA9IEZjRWRpdENyZWF0ZSAoRmNDb25maWdTYXZlRmllbGQgKCJmYW1pbHkiKSwKCQkJICAgICBGY09wQXBwZW5kLAoJCQkgICAgIGFjY2VwdCwKCQkJICAgICBGY1ZhbHVlQmluZGluZ1dlYWspOwoJaWYgKGVkaXQpCgkgICAgZWRpdC0+bmV4dCA9IG5leHQ7CgllbHNlCgkgICAgRmNFeHByRGVzdHJveSAoYWNjZXB0KTsKICAgIH0KICAgIGlmIChkZWYpCiAgICB7CgluZXh0ID0gZWRpdDsKCWVkaXQgPSBGY0VkaXRDcmVhdGUgKEZjQ29uZmlnU2F2ZUZpZWxkICgiZmFtaWx5IiksCgkJCSAgICAgRmNPcEFwcGVuZExhc3QsCgkJCSAgICAgZGVmLAoJCQkgICAgIEZjVmFsdWVCaW5kaW5nV2Vhayk7CglpZiAoZWRpdCkKCSAgICBlZGl0LT5uZXh0ID0gbmV4dDsKCWVsc2UKCSAgICBGY0V4cHJEZXN0cm95IChkZWYpOwogICAgfQogICAgaWYgKGVkaXQpCiAgICB7Cgl0ZXN0ID0gRmNUZXN0Q3JlYXRlIChGY01hdGNoUGF0dGVybiwKCQkJICAgICBGY1F1YWxBbnksCgkJCSAgICAgKEZjQ2hhcjggKikgRkNfRkFNSUxZLAoJCQkgICAgIEZjT3BFcXVhbCwKCQkJICAgICBmYW1pbHkpOwoJaWYgKHRlc3QpCgkgICAgaWYgKCFGY0NvbmZpZ0FkZEVkaXQgKHBhcnNlLT5jb25maWcsIHRlc3QsIGVkaXQsIEZjTWF0Y2hQYXR0ZXJuKSkKCQlGY1Rlc3REZXN0cm95ICh0ZXN0KTsKICAgIH0KICAgIGVsc2UKCUZjRXhwckRlc3Ryb3kgKGZhbWlseSk7Cn0KCnN0YXRpYyBGY0V4cHIgKgpGY1BvcEV4cHIgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKTsKICAgIEZjRXhwcgkqZXhwciA9IDA7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiAwOwogICAgc3dpdGNoICh2c3RhY2stPnRhZykgewogICAgY2FzZSBGY1ZTdGFja05vbmU6CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tTdHJpbmc6CiAgICBjYXNlIEZjVlN0YWNrRmFtaWx5OgoJZXhwciA9IEZjRXhwckNyZWF0ZVN0cmluZyAodnN0YWNrLT51LnN0cmluZyk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tGaWVsZDoKCWV4cHIgPSBGY0V4cHJDcmVhdGVGaWVsZCAoKGNoYXIgKikgdnN0YWNrLT51LnN0cmluZyk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tDb25zdGFudDoKCWV4cHIgPSBGY0V4cHJDcmVhdGVDb25zdCAodnN0YWNrLT51LnN0cmluZyk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tQcmVmZXI6CiAgICBjYXNlIEZjVlN0YWNrQWNjZXB0OgogICAgY2FzZSBGY1ZTdGFja0RlZmF1bHQ6CglleHByID0gdnN0YWNrLT51LmV4cHI7Cgl2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0ludGVnZXI6CglleHByID0gRmNFeHByQ3JlYXRlSW50ZWdlciAodnN0YWNrLT51LmludGVnZXIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrRG91YmxlOgoJZXhwciA9IEZjRXhwckNyZWF0ZURvdWJsZSAodnN0YWNrLT51Ll9kb3VibGUpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrTWF0cml4OgoJZXhwciA9IEZjRXhwckNyZWF0ZU1hdHJpeCAodnN0YWNrLT51Lm1hdHJpeCk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tCb29sOgoJZXhwciA9IEZjRXhwckNyZWF0ZUJvb2wgKHZzdGFjay0+dS5ib29sKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja1Rlc3Q6CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tFeHByOgoJZXhwciA9IHZzdGFjay0+dS5leHByOwoJdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tFZGl0OgoJYnJlYWs7CiAgICB9CiAgICBGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CiAgICByZXR1cm4gZXhwcjsKfQoKc3RhdGljIEZjRXhwciAqCkZjUG9wRXhwcnMgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY09wIG9wKQp7CiAgICBGY0V4cHIgICpsZWZ0LCAqZXhwciA9IDAsICpuZXc7CgogICAgd2hpbGUgKChsZWZ0ID0gRmNQb3BFeHByIChwYXJzZSkpKQogICAgewoJaWYgKGV4cHIpCgl7CgkgICAgbmV3ID0gRmNFeHByQ3JlYXRlT3AgKGxlZnQsIG9wLCBleHByKTsKCSAgICBpZiAoIW5ldykKCSAgICB7CgkJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCQlGY0V4cHJEZXN0cm95IChsZWZ0KTsKCQlGY0V4cHJEZXN0cm95IChleHByKTsKCQlicmVhazsKCSAgICB9CgkgICAgZXhwciA9IG5ldzsKCX0KCWVsc2UKCSAgICBleHByID0gbGVmdDsKICAgIH0KICAgIHJldHVybiBleHByOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRXhwciAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjT3Agb3ApCnsKICAgIEZjRXhwciAgKmV4cHIgPSBGY1BvcEV4cHJzIChwYXJzZSwgb3ApOwogICAgaWYgKGV4cHIpCglGY1ZTdGFja1B1c2hFeHByIChwYXJzZSwgRmNWU3RhY2tFeHByLCBleHByKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUluY2x1ZGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4CSAgICAqczsKICAgIGNvbnN0IEZjQ2hhcjggICAqaTsKICAgIEZjQm9vbAkgICAgaWdub3JlX21pc3NpbmcgPSBGY0ZhbHNlOwogICAgCiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBpID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAiaWdub3JlX21pc3NpbmciKTsKICAgIGlmIChpICYmIEZjQ29uZmlnTGV4Qm9vbCAoKEZjQ2hhcjggKikgaSkgPT0gRmNUcnVlKQoJaWdub3JlX21pc3NpbmcgPSBGY1RydWU7CiAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkIChwYXJzZS0+Y29uZmlnLCBzLCAhaWdub3JlX21pc3NpbmcpKQoJcGFyc2UtPmVycm9yID0gRmNUcnVlOwogICAgZnJlZSAocyk7Cn0KCnR5cGVkZWYgc3RydWN0IF9GY09wTWFwIHsKICAgIGNoYXIgICAgKm5hbWU7CiAgICBGY09wICAgIG9wOwp9IEZjT3BNYXA7CgpzdGF0aWMgRmNPcApGY0NvbmZpZ0xleE9wIChjb25zdCBGY0NoYXI4ICpvcCwgY29uc3QgRmNPcE1hcAkqbWFwLCBpbnQgbm1hcCkKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IG5tYXA7IGkrKykKCWlmICghc3RyY21wICgoY2hhciAqKSBvcCwgbWFwW2ldLm5hbWUpKSAKCSAgICByZXR1cm4gbWFwW2ldLm9wOwogICAgcmV0dXJuIEZjT3BJbnZhbGlkOwp9CgpzdGF0aWMgY29uc3QgRmNPcE1hcCBmY0NvbXBhcmVPcHNbXSA9IHsKICAgIHsgImVxIiwJCUZjT3BFcXVhbAkgICAgfSwKICAgIHsgIm5vdF9lcSIsCQlGY09wTm90RXF1YWwJICAgIH0sCiAgICB7ICJsZXNzIiwJCUZjT3BMZXNzCSAgICB9LAogICAgeyAibGVzc19lcSIsCUZjT3BMZXNzRXF1YWwJICAgIH0sCiAgICB7ICJtb3JlIiwJCUZjT3BNb3JlCSAgICB9LAogICAgeyAibW9yZV9lcSIsCUZjT3BNb3JlRXF1YWwJICAgIH0sCiAgICB7ICJjb250YWlucyIsCUZjT3BDb250YWlucwkgICAgfSwKICAgIHsgIm5vdF9jb250YWlucyIsCUZjT3BOb3RDb250YWlucwkgICAgfQp9OwoKI2RlZmluZSBOVU1fQ09NUEFSRV9PUFMgKHNpemVvZiBmY0NvbXBhcmVPcHMgLyBzaXplb2YgZmNDb21wYXJlT3BzWzBdKQoKc3RhdGljIEZjT3AKRmNDb25maWdMZXhDb21wYXJlIChjb25zdCBGY0NoYXI4ICpjb21wYXJlKQp7CiAgICByZXR1cm4gRmNDb25maWdMZXhPcCAoY29tcGFyZSwgZmNDb21wYXJlT3BzLCBOVU1fQ09NUEFSRV9PUFMpOwp9CgoKc3RhdGljIHZvaWQKRmNQYXJzZVRlc3QgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBjb25zdCBGY0NoYXI4ICAgKmtpbmRfc3RyaW5nOwogICAgRmNNYXRjaEtpbmQJICAgIGtpbmQ7CiAgICBjb25zdCBGY0NoYXI4ICAgKnF1YWxfc3RyaW5nOwogICAgRmNRdWFsCSAgICBxdWFsOwogICAgY29uc3QgRmNDaGFyOCAgICpuYW1lOwogICAgY29uc3QgRmNDaGFyOCAgICpjb21wYXJlX3N0cmluZzsKICAgIEZjT3AJICAgIGNvbXBhcmU7CiAgICBGY0V4cHIJICAgICpleHByOwogICAgRmNUZXN0CSAgICAqdGVzdDsKCiAgICBraW5kX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgInRhcmdldCIpOwogICAgaWYgKCFraW5kX3N0cmluZykKCWtpbmQgPSBGY01hdGNoRGVmYXVsdDsKICAgIGVsc2UKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSBraW5kX3N0cmluZywgInBhdHRlcm4iKSkKCSAgICBraW5kID0gRmNNYXRjaFBhdHRlcm47CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBraW5kX3N0cmluZywgImZvbnQiKSkKCSAgICBraW5kID0gRmNNYXRjaEZvbnQ7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBraW5kX3N0cmluZywgImRlZmF1bHQiKSkKCSAgICBraW5kID0gRmNNYXRjaERlZmF1bHQ7CgllbHNlCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCB0ZXN0IHRhcmdldCBcIiVzXCIiLCBraW5kX3N0cmluZyk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgcXVhbF9zdHJpbmcgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJxdWFsIik7CiAgICBpZiAoIXF1YWxfc3RyaW5nKQoJcXVhbCA9IEZjUXVhbEFueTsKICAgIGVsc2UKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSBxdWFsX3N0cmluZywgImFueSIpKQoJICAgIHF1YWwgPSBGY1F1YWxBbnk7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBxdWFsX3N0cmluZywgImFsbCIpKQoJICAgIHF1YWwgPSBGY1F1YWxBbGw7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBxdWFsX3N0cmluZywgImZpcnN0IikpCgkgICAgcXVhbCA9IEZjUXVhbEZpcnN0OwoJZWxzZSBpZiAoIXN0cmNtcCAoKGNoYXIgKikgcXVhbF9zdHJpbmcsICJub3RfZmlyc3QiKSkKCSAgICBxdWFsID0gRmNRdWFsTm90Rmlyc3Q7CgllbHNlCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCB0ZXN0IHF1YWwgXCIlc1wiIiwgcXVhbF9zdHJpbmcpOwoJICAgIHJldHVybjsKCX0KICAgIH0KICAgIG5hbWUgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJuYW1lIik7CiAgICBpZiAoIW5hbWUpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJtaXNzaW5nIHRlc3QgbmFtZSIpOwoJcmV0dXJuOwogICAgfQogICAgY29tcGFyZV9zdHJpbmcgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJjb21wYXJlIik7CiAgICBpZiAoIWNvbXBhcmVfc3RyaW5nKQoJY29tcGFyZSA9IEZjT3BFcXVhbDsKICAgIGVsc2UKICAgIHsKCWNvbXBhcmUgPSBGY0NvbmZpZ0xleENvbXBhcmUgKGNvbXBhcmVfc3RyaW5nKTsKCWlmIChjb21wYXJlID09IEZjT3BJbnZhbGlkKQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImludmFsaWQgdGVzdCBjb21wYXJlIFwiJXNcIiIsIGNvbXBhcmVfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBleHByID0gRmNQb3BFeHBycyAocGFyc2UsIEZjT3BDb21tYSk7CiAgICBpZiAoIWV4cHIpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJtaXNzaW5nIHRlc3QgZXhwcmVzc2lvbiIpOwoJcmV0dXJuOwogICAgfQogICAgdGVzdCA9IEZjVGVzdENyZWF0ZSAoa2luZCwgcXVhbCwgbmFtZSwgY29tcGFyZSwgZXhwcik7CiAgICBpZiAoIXRlc3QpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgRmNWU3RhY2tQdXNoVGVzdCAocGFyc2UsIHRlc3QpOwp9CgpzdGF0aWMgY29uc3QgRmNPcE1hcCBmY01vZGVPcHNbXSA9IHsKICAgIHsgImFzc2lnbiIsCQlGY09wQXNzaWduCSAgICB9LAogICAgeyAiYXNzaWduX3JlcGxhY2UiLAlGY09wQXNzaWduUmVwbGFjZSAgIH0sCiAgICB7ICJwcmVwZW5kIiwJRmNPcFByZXBlbmQJICAgIH0sCiAgICB7ICJwcmVwZW5kX2ZpcnN0IiwJRmNPcFByZXBlbmRGaXJzdCAgICB9LAogICAgeyAiYXBwZW5kIiwJCUZjT3BBcHBlbmQJICAgIH0sCiAgICB7ICJhcHBlbmRfbGFzdCIsCUZjT3BBcHBlbmRMYXN0CSAgICB9LAp9OwoKI2RlZmluZSBOVU1fTU9ERV9PUFMgKHNpemVvZiBmY01vZGVPcHMgLyBzaXplb2YgZmNNb2RlT3BzWzBdKQoKc3RhdGljIEZjT3AKRmNDb25maWdMZXhNb2RlIChjb25zdCBGY0NoYXI4ICptb2RlKQp7CiAgICByZXR1cm4gRmNDb25maWdMZXhPcCAobW9kZSwgZmNNb2RlT3BzLCBOVU1fTU9ERV9PUFMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRWRpdCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAqbmFtZTsKICAgIGNvbnN0IEZjQ2hhcjggICAqbW9kZV9zdHJpbmc7CiAgICBjb25zdCBGY0NoYXI4ICAgKmJpbmRpbmdfc3RyaW5nOwogICAgRmNPcAkgICAgbW9kZTsKICAgIEZjVmFsdWVCaW5kaW5nICBiaW5kaW5nOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjRWRpdAkgICAgKmVkaXQ7CgogICAgbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm5hbWUiKTsKICAgIGlmICghbmFtZSkKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgIm1pc3NpbmcgZWRpdCBuYW1lIik7CglyZXR1cm47CiAgICB9CiAgICBtb2RlX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm1vZGUiKTsKICAgIGlmICghbW9kZV9zdHJpbmcpCgltb2RlID0gRmNPcEFzc2lnbjsKICAgIGVsc2UKICAgIHsKCW1vZGUgPSBGY0NvbmZpZ0xleE1vZGUgKG1vZGVfc3RyaW5nKTsKCWlmIChtb2RlID09IEZjT3BJbnZhbGlkKQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImludmFsaWQgZWRpdCBtb2RlIFwiJXNcIiIsIG1vZGVfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBiaW5kaW5nX3N0cmluZyA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgImJpbmRpbmciKTsKICAgIGlmICghYmluZGluZ19zdHJpbmcpCgliaW5kaW5nID0gRmNWYWx1ZUJpbmRpbmdXZWFrOwogICAgZWxzZQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopIGJpbmRpbmdfc3RyaW5nLCAid2VhayIpKQoJICAgIGJpbmRpbmcgPSBGY1ZhbHVlQmluZGluZ1dlYWs7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBiaW5kaW5nX3N0cmluZywgInN0cm9uZyIpKQoJICAgIGJpbmRpbmcgPSBGY1ZhbHVlQmluZGluZ1N0cm9uZzsKCWVsc2UKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIGVkaXQgYmluZGluZyBcIiVzXCIiLCBiaW5kaW5nX3N0cmluZyk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgZXhwciA9IEZjUG9wRXhwcnMgKHBhcnNlLCBGY09wQ29tbWEpOwogICAgZWRpdCA9IEZjRWRpdENyZWF0ZSAoKGNoYXIgKikgRmNTdHJDb3B5IChuYW1lKSwgbW9kZSwgZXhwciwgYmluZGluZyk7CiAgICBpZiAoIWVkaXQpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJRmNFeHByRGVzdHJveSAoZXhwcik7CglyZXR1cm47CiAgICB9CiAgICBpZiAoIUZjVlN0YWNrUHVzaEVkaXQgKHBhcnNlLCBlZGl0KSkKCUZjRWRpdERlc3Ryb3kgKGVkaXQpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlTWF0Y2ggKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBjb25zdCBGY0NoYXI4ICAgKmtpbmRfbmFtZTsKICAgIEZjTWF0Y2hLaW5kCSAgICBraW5kOwogICAgRmNUZXN0CSAgICAqdGVzdCA9IDA7CiAgICBGY0VkaXQJICAgICplZGl0ID0gMDsKICAgIEZjVlN0YWNrCSAgICAqdnN0YWNrOwoKICAgIGtpbmRfbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgInRhcmdldCIpOwogICAgaWYgKCFraW5kX25hbWUpCglraW5kID0gRmNNYXRjaFBhdHRlcm47CiAgICBlbHNlCiAgICB7CglpZiAoIXN0cmNtcCAoKGNoYXIgKikga2luZF9uYW1lLCAicGF0dGVybiIpKQoJICAgIGtpbmQgPSBGY01hdGNoUGF0dGVybjsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIGtpbmRfbmFtZSwgImZvbnQiKSkKCSAgICBraW5kID0gRmNNYXRjaEZvbnQ7CgllbHNlCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCBtYXRjaCB0YXJnZXQgXCIlc1wiIiwga2luZF9uYW1lKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICB3aGlsZSAoKHZzdGFjayA9IEZjVlN0YWNrUG9wIChwYXJzZSkpKQogICAgewoJc3dpdGNoICh2c3RhY2stPnRhZykgewoJY2FzZSBGY1ZTdGFja1Rlc3Q6CgkgICAgdnN0YWNrLT51LnRlc3QtPm5leHQgPSB0ZXN0OwoJICAgIHRlc3QgPSB2c3RhY2stPnUudGVzdDsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tFZGl0OgoJICAgIHZzdGFjay0+dS5lZGl0LT5uZXh0ID0gZWRpdDsKCSAgICBlZGl0ID0gdnN0YWNrLT51LmVkaXQ7CgkgICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImludmFsaWQgbWF0Y2ggZWxlbWVudCIpOwoJICAgIGJyZWFrOwoJfQoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQogICAgaWYgKCFGY0NvbmZpZ0FkZEVkaXQgKHBhcnNlLT5jb25maWcsIHRlc3QsIGVkaXQsIGtpbmQpKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKfQoKc3RhdGljIHZvaWQKRmNFbmRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKewogICAgRmNDb25maWdQYXJzZSAgICpwYXJzZSA9IHVzZXJEYXRhOwogICAgRmNDaGFyOAkgICAgKmRhdGE7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHN3aXRjaCAocGFyc2UtPnBzdGFjay0+ZWxlbWVudCkgewogICAgY2FzZSBGY0VsZW1lbnROb25lOgoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEZvbnRjb25maWc6CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RGlyOgoJZGF0YSA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CglpZiAoIWRhdGEpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCSAgICBicmVhazsKCX0KCWlmICghRmNDb25maWdBZGREaXIgKHBhcnNlLT5jb25maWcsIGRhdGEpKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglmcmVlIChkYXRhKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRDYWNoZToKCWRhdGEgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwoJaWYgKCFkYXRhKQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkgICAgYnJlYWs7Cgl9CglpZiAoIUZjQ29uZmlnU2V0Q2FjaGUgKHBhcnNlLT5jb25maWcsIGRhdGEpKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglmcmVlIChkYXRhKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRJbmNsdWRlOgoJRmNQYXJzZUluY2x1ZGUgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRDb25maWc6CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TWF0Y2g6CglGY1BhcnNlTWF0Y2ggKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRBbGlhczoKCUZjUGFyc2VBbGlhcyAocGFyc2UpOwoJYnJlYWs7CgogICAgY2FzZSBGY0VsZW1lbnRCbGFuazoKCUZjUGFyc2VCbGFuayAocGFyc2UpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFJlc2NhbjoKCUZjUGFyc2VSZXNjYW4gKHBhcnNlKTsKCWJyZWFrOwoJCiAgICBjYXNlIEZjRWxlbWVudFByZWZlcjoKCUZjUGFyc2VGYW1pbGllcyAocGFyc2UsIEZjVlN0YWNrUHJlZmVyKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRBY2NlcHQ6CglGY1BhcnNlRmFtaWxpZXMgKHBhcnNlLCBGY1ZTdGFja0FjY2VwdCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RGVmYXVsdDoKCUZjUGFyc2VGYW1pbGllcyAocGFyc2UsIEZjVlN0YWNrRGVmYXVsdCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RmFtaWx5OgoJRmNQYXJzZUZhbWlseSAocGFyc2UpOwoJYnJlYWs7CgogICAgY2FzZSBGY0VsZW1lbnRUZXN0OgoJRmNQYXJzZVRlc3QgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRFZGl0OgoJRmNQYXJzZUVkaXQgKHBhcnNlKTsKCWJyZWFrOwoKICAgIGNhc2UgRmNFbGVtZW50SW50OgoJRmNQYXJzZUludCAocGFyc2UpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudERvdWJsZToKCUZjUGFyc2VEb3VibGUgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRTdHJpbmc6CglGY1BhcnNlU3RyaW5nIChwYXJzZSwgRmNWU3RhY2tTdHJpbmcpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE1hdHJpeDoKCUZjUGFyc2VNYXRyaXggKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRCb29sOgoJRmNQYXJzZUJvb2wgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRDaGFyc2V0OgovKglGY1BhcnNlQ2hhcnNldCAocGFyc2UpOyAqLwoJYnJlYWs7CgogICAgY2FzZSBGY0VsZW1lbnROYW1lOgoJRmNQYXJzZVN0cmluZyAocGFyc2UsIEZjVlN0YWNrRmllbGQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudENvbnN0OgoJRmNQYXJzZVN0cmluZyAocGFyc2UsIEZjVlN0YWNrQ29uc3RhbnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE9yOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wT3IpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEFuZDoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcEFuZCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RXE6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BFcXVhbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Tm90RXE6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BOb3RFcXVhbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TGVzczoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcExlc3MpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudExlc3NFcToKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcExlc3NFcXVhbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TW9yZToKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcE1vcmUpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE1vcmVFcToKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcE1vcmVFcXVhbCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q29udGFpbnM6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BDb250YWlucyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Tm90Q29udGFpbnM6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BOb3RDb250YWlucyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50UGx1czoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcFBsdXMpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE1pbnVzOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTWludXMpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFRpbWVzOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wVGltZXMpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudERpdmlkZToKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcERpdmlkZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Tm90OgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTm90KTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRJZjoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcFF1ZXN0KTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRVbmtub3duOgoJYnJlYWs7CiAgICB9CiAgICAodm9pZCkgRmNQU3RhY2tQb3AgKHBhcnNlKTsKfQoKc3RhdGljIHZvaWQKRmNDaGFyYWN0ZXJEYXRhICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCnsKICAgIEZjQ29uZmlnUGFyc2UgICAqcGFyc2UgPSB1c2VyRGF0YTsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgaWYgKCFGY1N0ckJ1ZkRhdGEgKCZwYXJzZS0+cHN0YWNrLT5zdHIsIChGY0NoYXI4ICopIHMsIGxlbikpCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwp9CgpzdGF0aWMgdm9pZApGY1N0YXJ0RG9jdHlwZURlY2wgKHZvaWQJICAgICp1c2VyRGF0YSwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpkb2N0eXBlTmFtZSwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpzeXNpZCwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpwdWJpZCwKCQkgICAgaW50CQkgICAgaGFzX2ludGVybmFsX3N1YnNldCkKewogICAgRmNDb25maWdQYXJzZSAgICpwYXJzZSA9IHVzZXJEYXRhOwoKICAgIGlmIChzdHJjbXAgKChjaGFyICopIGRvY3R5cGVOYW1lLCAiZm9udGNvbmZpZyIpICE9IDApCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAiaW52YWxpZCBkb2N0eXBlIFwiJXNcIiIsIGRvY3R5cGVOYW1lKTsKfQoKc3RhdGljIHZvaWQKRmNFbmREb2N0eXBlRGVjbCAodm9pZCAqdXNlckRhdGEpCnsKfQoKRmNCb29sCkZjQ29uZmlnUGFyc2VBbmRMb2FkIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgICBjb25zdCBGY0NoYXI4ICpuYW1lLAoJCSAgICAgIEZjQm9vbAkgICAgY29tcGxhaW4pCnsKCiAgICBYTUxfUGFyc2VyCSAgICBwOwogICAgRmNDaGFyOAkgICAgKmZpbGVuYW1lOwogICAgRklMRQkgICAgKmY7CiAgICBpbnQJCSAgICBsZW47CiAgICB2b2lkCSAgICAqYnVmOwogICAgRmNDb25maWdQYXJzZSAgIHBhcnNlOwogICAgRmNCb29sCSAgICBlcnJvciA9IEZjVHJ1ZTsKICAgIAogICAgZmlsZW5hbWUgPSBGY0NvbmZpZ0ZpbGVuYW1lIChuYW1lKTsKICAgIGlmICghZmlsZW5hbWUpCglnb3RvIGJhaWwwOwogICAgCiAgICBpZiAoIUZjU3RyU2V0QWRkIChjb25maWctPmNvbmZpZ0ZpbGVzLCBmaWxlbmFtZSkpCglnb3RvIGJhaWwwOwoKICAgIGYgPSBmb3BlbiAoKGNoYXIgKikgZmlsZW5hbWUsICJyIik7CiAgICBmcmVlIChmaWxlbmFtZSk7CiAgICBpZiAoIWYpCglnb3RvIGJhaWwwOwogICAgCiAgICBwID0gWE1MX1BhcnNlckNyZWF0ZSAoIlVURi04Iik7CiAgICBpZiAoIXApCglnb3RvIGJhaWwxOwoKICAgIGlmICghRmNDb25maWdJbml0ICgmcGFyc2UsIG5hbWUsIGNvbmZpZywgcCkpCglnb3RvIGJhaWwyOwoKICAgIFhNTF9TZXRVc2VyRGF0YSAocCwgJnBhcnNlKTsKICAgIAogICAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciAocCwgRmNTdGFydERvY3R5cGVEZWNsLCBGY0VuZERvY3R5cGVEZWNsKTsKICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlciAocCwgRmNTdGFydEVsZW1lbnQsIEZjRW5kRWxlbWVudCk7CiAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIgKHAsIEZjQ2hhcmFjdGVyRGF0YSk7CgkKICAgIGRvIHsKCWJ1ZiA9IFhNTF9HZXRCdWZmZXIgKHAsIEJVRlNJWik7CglpZiAoIWJ1ZikKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKCZwYXJzZSwgRmNTZXZlcmVFcnJvciwgImNhbm5vdCBnZXQgcGFyc2UgYnVmZmVyIik7CgkgICAgZ290byBiYWlsMzsKCX0KCWxlbiA9IGZyZWFkIChidWYsIDEsIEJVRlNJWiwgZik7CglpZiAobGVuIDwgMCkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKCZwYXJzZSwgRmNTZXZlcmVFcnJvciwgImZhaWxlZCByZWFkaW5nIGNvbmZpZyBmaWxlIik7CgkgICAgZ290byBiYWlsMzsKCX0KCWlmICghWE1MX1BhcnNlQnVmZmVyIChwLCBsZW4sIGxlbiA9PSAwKSkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKCZwYXJzZSwgRmNTZXZlcmVFcnJvciwgIiVzIiwgCgkJCSAgIFhNTF9FcnJvclN0cmluZyAoWE1MX0dldEVycm9yQ29kZSAocCkpKTsKCSAgICBnb3RvIGJhaWwzOwoJfQogICAgfSB3aGlsZSAobGVuICE9IDApOwogICAgZXJyb3IgPSBwYXJzZS5lcnJvcjsKYmFpbDM6CiAgICBGY0NvbmZpZ0NsZWFudXAgKCZwYXJzZSk7CmJhaWwyOgogICAgWE1MX1BhcnNlckZyZWUgKHApOwpiYWlsMToKICAgIGZjbG9zZSAoZik7CmJhaWwwOgogICAgaWYgKGVycm9yICYmIGNvbXBsYWluKQogICAgewoJaWYgKG5hbWUpCgkgICAgRmNDb25maWdNZXNzYWdlICgwLCBGY1NldmVyZUVycm9yLCAiQ2Fubm90IGxvYWQgY29uZmlnIGZpbGUgXCIlc1wiIiwgbmFtZSk7CgllbHNlCgkgICAgRmNDb25maWdNZXNzYWdlICgwLCBGY1NldmVyZUVycm9yLCAiQ2Fubm90IGxvYWQgZGVmYXVsdCBjb25maWcgZmlsZSIpOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9Cg==