LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8ZGlyZW50Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCiNkZWZpbmUgRkNfSU5WQUxJRF9GT05UX0ZJTEUgIi4iCgpGY0Jvb2wKRmNGaWxlU2NhbiAoRmNGb250U2V0CSpzZXQsCgkgICAgRmNGaWxlQ2FjaGUJKmNhY2hlLAoJICAgIEZjQmxhbmtzCSpibGFua3MsCgkgICAgY29uc3QgY2hhcgkqZmlsZSwKCSAgICBGY0Jvb2wJZm9yY2UpCnsKICAgIGludAkJICAgIGlkOwogICAgY2hhcgkgICAgKm5hbWU7CiAgICBGY1BhdHRlcm4JICAgICpmb250OwogICAgRmNCb29sCSAgICByZXQgPSBGY1RydWU7CiAgICBpbnQJCSAgICBjb3VudDsKICAgIAogICAgaWQgPSAwOwogICAgZG8KICAgIHsKCWlmICghZm9yY2UgJiYgY2FjaGUpCgkgICAgbmFtZSA9IEZjRmlsZUNhY2hlRmluZCAoY2FjaGUsIGZpbGUsIGlkLCAmY291bnQpOwoJZWxzZQoJICAgIG5hbWUgPSAwOwoJaWYgKG5hbWUpCgl7CgkgICAgLyogIi4iIG1lYW5zIHRoZSBmaWxlIGRvZXNuJ3QgY29udGFpbiBhIGZvbnQgKi8KCSAgICBpZiAoc3RyY21wIChuYW1lLCBGQ19JTlZBTElEX0ZPTlRfRklMRSkgIT0gMCkKCSAgICB7CgkJZm9udCA9IEZjTmFtZVBhcnNlIChuYW1lKTsKCQlpZiAoZm9udCkKCQkgICAgRmNQYXR0ZXJuQWRkU3RyaW5nIChmb250LCBGQ19GSUxFLCBmaWxlKTsKCSAgICB9CgkgICAgZWxzZQoJCWZvbnQgPSAwOwoJfQoJZWxzZQoJewoJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU4pCgkgICAgewoJCXByaW50ZiAoIlx0U2Nhbm5pbmcgZmlsZSAlcy4uLiIsIGZpbGUpOwoJCWZmbHVzaCAoc3Rkb3V0KTsKCSAgICB9CgkgICAgZm9udCA9IEZjRnJlZVR5cGVRdWVyeSAoZmlsZSwgaWQsIGJsYW5rcywgJmNvdW50KTsKCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19TQ0FOKQoJCXByaW50ZiAoImRvbmVcbiIpOwoJICAgIGlmICghZm9yY2UgJiYgY2FjaGUpCgkgICAgewoJCWlmIChmb250KQoJCXsKCQkgICAgRmNDaGFyOAkqdW5wYXJzZTsKCgkJICAgIHVucGFyc2UgPSBGY05hbWVVbnBhcnNlIChmb250KTsKCQkgICAgaWYgKHVucGFyc2UpCgkJICAgIHsKCQkJKHZvaWQpIEZjRmlsZUNhY2hlVXBkYXRlIChjYWNoZSwgZmlsZSwgaWQsIHVucGFyc2UpOwoJCQlmcmVlICh1bnBhcnNlKTsKCQkgICAgfQoJCX0KCQllbHNlCgkJewoJCSAgICAvKiBuZWdhdGl2ZSBjYWNoZSBmaWxlcyBub3QgY29udGFpbmluZyBmb250cyAqLwoJCSAgICBGY0ZpbGVDYWNoZVVwZGF0ZSAoY2FjaGUsIGZpbGUsIGlkLCBGQ19JTlZBTElEX0ZPTlRfRklMRSk7CgkJfQoJICAgIH0KCX0KCWlmIChmb250KQoJewoJICAgIGlmICghRmNGb250U2V0QWRkIChzZXQsIGZvbnQpKQoJICAgIHsKCQlGY1BhdHRlcm5EZXN0cm95IChmb250KTsKCQlmb250ID0gMDsKCQlyZXQgPSBGY0ZhbHNlOwoJICAgIH0KCX0KCWlkKys7CiAgICB9IHdoaWxlIChmb250ICYmIHJldCAmJiBpZCA8IGNvdW50KTsKICAgIHJldHVybiByZXQ7Cn0KCkZjQm9vbApGY0RpclNjYW4gKEZjRm9udFNldAkqc2V0LAoJICAgRmNGaWxlQ2FjaGUJKmNhY2hlLAoJICAgRmNCbGFua3MJKmJsYW5rcywKCSAgIGNvbnN0IGNoYXIJKmRpciwKCSAgIEZjQm9vbAlmb3JjZSkKewogICAgRElSCQkgICAgKmQ7CiAgICBzdHJ1Y3QgZGlyZW50ICAgKmU7CiAgICBjaGFyCSAgICAqZmlsZTsKICAgIGNoYXIJICAgICpiYXNlOwogICAgRmNCb29sCSAgICByZXQgPSBGY1RydWU7CgogICAgZmlsZSA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChkaXIpICsgMSArIDI1NiArIDEpOwogICAgaWYgKCFmaWxlKQoJcmV0dXJuIEZjRmFsc2U7CgogICAgc3RyY3B5IChmaWxlLCBkaXIpOwogICAgc3RyY2F0IChmaWxlLCAiLyIpOwogICAgYmFzZSA9IGZpbGUgKyBzdHJsZW4gKGZpbGUpOwogICAgaWYgKCFmb3JjZSkKICAgIHsKCXN0cmNweSAoYmFzZSwgRkNfRElSX0NBQ0hFX0ZJTEUpOwoJCglpZiAoRmNGaWxlQ2FjaGVSZWFkRGlyIChzZXQsIGZpbGUpKQoJewoJICAgIGZyZWUgKGZpbGUpOwoJICAgIHJldHVybiBGY1RydWU7Cgl9CiAgICB9CiAgICAKICAgIGQgPSBvcGVuZGlyIChkaXIpOwogICAgaWYgKCFkKQogICAgewoJZnJlZSAoZmlsZSk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHdoaWxlIChyZXQgJiYgKGUgPSByZWFkZGlyIChkKSkpCiAgICB7CglpZiAoZS0+ZF9uYW1lWzBdICE9ICcuJykKCXsKCSAgICBzdHJjcHkgKGJhc2UsIGUtPmRfbmFtZSk7CgkgICAgRmNGaWxlU2NhbiAoc2V0LCBjYWNoZSwgYmxhbmtzLCBmaWxlLCBmb3JjZSk7Cgl9CiAgICB9CiAgICBmcmVlIChmaWxlKTsKICAgIGNsb3NlZGlyIChkKTsKICAgIHJldHVybiByZXQ7Cn0KCkZjQm9vbApGY0RpclNhdmUgKEZjRm9udFNldCAqc2V0LCBjb25zdCBjaGFyICpkaXIpCnsKICAgIGNoYXIJICAgICpmaWxlOwogICAgY2hhcgkgICAgKmJhc2U7CiAgICBGY0Jvb2wJICAgIHJldDsKICAgIAogICAgZmlsZSA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChkaXIpICsgMSArIDI1NiArIDEpOwogICAgaWYgKCFmaWxlKQoJcmV0dXJuIEZjRmFsc2U7CgogICAgc3RyY3B5IChmaWxlLCBkaXIpOwogICAgc3RyY2F0IChmaWxlLCAiLyIpOwogICAgYmFzZSA9IGZpbGUgKyBzdHJsZW4gKGZpbGUpOwogICAgc3RyY3B5IChiYXNlLCBGQ19ESVJfQ0FDSEVfRklMRSk7CiAgICByZXQgPSBGY0ZpbGVDYWNoZVdyaXRlRGlyIChzZXQsIGZpbGUpOwogICAgZnJlZSAoZmlsZSk7CiAgICByZXR1cm4gcmV0Owp9Cgo=