LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCkZjQm9vbApGY0luaXRGb250cyAodm9pZCkKewogICAgRmNDb25maWcJKmNvbmZpZzsKCiAgICBjb25maWcgPSBGY0NvbmZpZ0dldEN1cnJlbnQgKCk7CiAgICBpZiAoIWNvbmZpZykKCXJldHVybiBGY0ZhbHNlOwoKICAgIGlmIChGY0NvbmZpZ0dldEZvbnRzIChjb25maWcsIEZjU2V0U3lzdGVtKSkKCXJldHVybiBGY1RydWU7CgogICAgcmV0dXJuIEZjQ29uZmlnQnVpbGRGb250cyAoY29uZmlnKTsKfQoKc3RhdGljIEZjQm9vbApGY0luaXRGYWxsYmFja0NvbmZpZyAodm9pZCkKewogICAgRmNDb25maWcJKmNvbmZpZzsKCiAgICBjb25maWcgPSBGY0NvbmZpZ0NyZWF0ZSAoKTsKICAgIGlmICghY29uZmlnKQoJZ290byBiYWlsMDsKICAgIGlmICghRmNDb25maWdBZGREaXIgKGNvbmZpZywgRkNfRkFMTEJBQ0tfRk9OVFMpKQoJZ290byBiYWlsMTsKICAgIEZjQ29uZmlnU2V0Q3VycmVudCAoY29uZmlnKTsKICAgIHJldHVybiBGY1RydWU7CgpiYWlsMToKICAgIEZjQ29uZmlnRGVzdHJveSAoY29uZmlnKTsKYmFpbDA6CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKLyoKICogTG9jYXRlIGFuZCBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCiAqLwpGY0Jvb2wKRmNJbml0Q29uZmlnICh2b2lkKQp7CiAgICBGY0NvbmZpZyAgICAqY29uZmlnOwogICAgCiAgICBpZiAoRmNDb25maWdHZXRDdXJyZW50ICgpKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIAogICAgY29uZmlnID0gRmNDb25maWdDcmVhdGUgKCk7CiAgICBpZiAoIWNvbmZpZykKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkIChjb25maWcsIDAsIEZjVHJ1ZSkpCiAgICB7CglGY0NvbmZpZ0Rlc3Ryb3kgKGNvbmZpZyk7CglyZXR1cm4gRmNJbml0RmFsbGJhY2tDb25maWcgKCk7CiAgICB9CiAgICAKICAgIEZjQ29uZmlnU2V0Q3VycmVudCAoY29uZmlnKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY0luaXQgKHZvaWQpCnsKICAgIHJldHVybiBGY0luaXRDb25maWcgKCkgJiYgRmNJbml0Rm9udHMgKCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgewogICAgY2hhciAgICAqbmFtZTsKICAgIGludAkgICAgYWxsb2NfY291bnQ7CiAgICBpbnQJICAgIGFsbG9jX21lbTsKICAgIGludAkgICAgZnJlZV9jb3VudDsKICAgIGludAkgICAgZnJlZV9tZW07Cn0gRmNJblVzZVtGQ19NRU1fTlVNXSA9IHsKICAgIHsgImNoYXJzZXQiLCAwLCAwIH0sCiAgICB7ICJjaGFybm9kZSIsIDAgLDAgfSwKICAgIHsgImZvbnRzZXQiLCAwLCAwIH0sCiAgICB7ICJmb250cHRyIiwgMCwgMCB9LAogICAgeyAib2JqZWN0c2V0IiwgMCwgMCB9LAogICAgeyAib2JqZWN0cHRyIiwgMCwgMCB9LAogICAgeyAibWF0cml4IiwgMCwgMCB9LAogICAgeyAicGF0dGVybiIsIDAsIDAgfSwKICAgIHsgInBhdGVsdCIsIDAsIDAgfSwKICAgIHsgInZhbGxpc3QiLCAwLCAwIH0sCiAgICB7ICJzdWJzdGF0ZSIsIDAsIDAgfSwKICAgIHsgInN0cmluZyIsIDAsIDAgfSwKICAgIHsgImxpc3RidWNrIiwgMCwgMCB9LAp9OwoKc3RhdGljIGludCAgRmNBbGxvY0NvdW50LCBGY0FsbG9jTWVtOwpzdGF0aWMgaW50ICBGY0ZyZWVDb3VudCwgRmNGcmVlTWVtOwoKc3RhdGljIGludCAgRmNNZW1Ob3RpY2UgPSAxKjEwMjQqMTAyNDsKCnN0YXRpYyBpbnQgIEZjQWxsb2NOb3RpZnksIEZjRnJlZU5vdGlmeTsKCnZvaWQKRmNNZW1SZXBvcnQgKHZvaWQpCnsKICAgIGludAlpOwogICAgcHJpbnRmICgiRmMgTWVtb3J5IFVzYWdlOlxuIik7CiAgICBwcmludGYgKCJcdCAgIFdoaWNoICAgICAgIEFsbG9jICAgICAgICAgICBGcmVlICAgICAgICAgICBBY3RpdmVcbiIpOwogICAgcHJpbnRmICgiXHQgICAgICAgICAgIGNvdW50ICAgYnl0ZXMgICBjb3VudCAgIGJ5dGVzICAgY291bnQgICBieXRlc1xuIik7CiAgICBmb3IgKGkgPSAwOyBpIDwgRkNfTUVNX05VTTsgaSsrKQoJcHJpbnRmICgiXHQlOC44cyU4ZCU4ZCU4ZCU4ZCU4ZCU4ZFxuIiwKCQlGY0luVXNlW2ldLm5hbWUsCgkJRmNJblVzZVtpXS5hbGxvY19jb3VudCwgRmNJblVzZVtpXS5hbGxvY19tZW0sCgkJRmNJblVzZVtpXS5mcmVlX2NvdW50LCBGY0luVXNlW2ldLmZyZWVfbWVtLAoJCUZjSW5Vc2VbaV0uYWxsb2NfY291bnQgLSBGY0luVXNlW2ldLmZyZWVfY291bnQsCgkJRmNJblVzZVtpXS5hbGxvY19tZW0gLSBGY0luVXNlW2ldLmZyZWVfbWVtKTsKICAgIHByaW50ZiAoIlx0JTguOHMlOGQlOGQlOGQlOGQlOGQlOGRcbiIsCgkgICAgIlRvdGFsIiwKCSAgICBGY0FsbG9jQ291bnQsIEZjQWxsb2NNZW0sCgkgICAgRmNGcmVlQ291bnQsIEZjRnJlZU1lbSwKCSAgICBGY0FsbG9jQ291bnQgLSBGY0ZyZWVDb3VudCwKCSAgICBGY0FsbG9jTWVtIC0gRmNGcmVlTWVtKTsKICAgIEZjQWxsb2NOb3RpZnkgPSAwOwogICAgRmNGcmVlTm90aWZ5ID0gMDsKfQoKdm9pZApGY01lbUFsbG9jIChpbnQga2luZCwgaW50IHNpemUpCnsKICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfTUVNT1JZKQogICAgewoJRmNJblVzZVtraW5kXS5hbGxvY19jb3VudCsrOwoJRmNJblVzZVtraW5kXS5hbGxvY19tZW0gKz0gc2l6ZTsKCUZjQWxsb2NDb3VudCsrOwoJRmNBbGxvY01lbSArPSBzaXplOwoJRmNBbGxvY05vdGlmeSArPSBzaXplOwoJaWYgKEZjQWxsb2NOb3RpZnkgPiBGY01lbU5vdGljZSkKCSAgICBGY01lbVJlcG9ydCAoKTsKICAgIH0KfQoKdm9pZApGY01lbUZyZWUgKGludCBraW5kLCBpbnQgc2l6ZSkKewogICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19NRU1PUlkpCiAgICB7CglGY0luVXNlW2tpbmRdLmZyZWVfY291bnQrKzsKCUZjSW5Vc2Vba2luZF0uZnJlZV9tZW0gKz0gc2l6ZTsKCUZjRnJlZUNvdW50Kys7CglGY0ZyZWVNZW0gKz0gc2l6ZTsKCUZjRnJlZU5vdGlmeSArPSBzaXplOwoJaWYgKEZjRnJlZU5vdGlmeSA+IEZjTWVtTm90aWNlKQoJICAgIEZjTWVtUmVwb3J0ICgpOwogICAgfQp9Cg==