LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBUdW9tYXMgSi4gTHVra2EKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFR1b21hcyBMdWtrYSBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFR1b21hcyBMdWtrYSBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogVFVPTUFTIExVS0tBIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIFRVT01BUyBMVUtLQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgImZjaW50LmgiCgpjb25zdCBGY01hdHJpeCAgICBGY0lkZW50aXR5TWF0cml4ID0geyAxLCAwLCAwLCAxIH07CgpGY01hdHJpeCAqCkZjTWF0cml4Q29weSAoY29uc3QgRmNNYXRyaXggKm1hdCkgCnsKICAgIEZjTWF0cml4ICpyOwogICAgaWYoIW1hdCkgCglyZXR1cm4gMDsKICAgIHIgPSAoRmNNYXRyaXggKikgbWFsbG9jIChzaXplb2YgKCpyKSApOwogICAgaWYgKCFyKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fTUFUUklYLCBzaXplb2YgKEZjTWF0cml4KSk7CiAgICAqciA9ICptYXQ7CiAgICByZXR1cm4gcjsKfQoKdm9pZApGY01hdHJpeEZyZWUgKEZjTWF0cml4ICptYXQpCnsKICAgIGlmIChtYXQgIT0gJkZjSWRlbnRpdHlNYXRyaXgpCiAgICB7CglGY01lbUZyZWUgKEZDX01FTV9NQVRSSVgsIHNpemVvZiAoRmNNYXRyaXgpKTsKCWZyZWUgKG1hdCk7CiAgICB9Cn0KCkZjQm9vbApGY01hdHJpeEVxdWFsIChjb25zdCBGY01hdHJpeCAqbWF0MSwgY29uc3QgRmNNYXRyaXggKm1hdDIpCnsKICAgIGlmKG1hdDEgPT0gbWF0MikgcmV0dXJuIEZjVHJ1ZTsKICAgIGlmKG1hdDEgPT0gMCB8fCBtYXQyID09IDApIHJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIG1hdDEtPnh4ID09IG1hdDItPnh4ICYmIAoJICAgbWF0MS0+eHkgPT0gbWF0Mi0+eHkgJiYKCSAgIG1hdDEtPnl4ID09IG1hdDItPnl4ICYmCgkgICBtYXQxLT55eSA9PSBtYXQyLT55eTsKfQoKdm9pZApGY01hdHJpeE11bHRpcGx5IChGY01hdHJpeCAqcmVzdWx0LCBjb25zdCBGY01hdHJpeCAqYSwgY29uc3QgRmNNYXRyaXggKmIpCnsKICAgIEZjTWF0cml4CXI7CgogICAgci54eCA9IGEtPnh4ICogYi0+eHggKyBhLT54eSAqIGItPnl4OwogICAgci54eSA9IGEtPnh4ICogYi0+eHkgKyBhLT54eSAqIGItPnl5OwogICAgci55eCA9IGEtPnl4ICogYi0+eHggKyBhLT55eSAqIGItPnl4OwogICAgci55eSA9IGEtPnl4ICogYi0+eHkgKyBhLT55eSAqIGItPnl5OwogICAgKnJlc3VsdCA9IHI7Cn0KCnZvaWQKRmNNYXRyaXhSb3RhdGUgKEZjTWF0cml4ICptLCBkb3VibGUgYywgZG91YmxlIHMpCnsKICAgIEZjTWF0cml4CXI7CgogICAgLyoKICAgICAqIFggQ29vcmRpbmF0ZSBzeXN0ZW0gaXMgdXBzaWRlIGRvd24sIHN3YXAgdG8gbWFrZQogICAgICogcm90YXRpb25zIGNvdW50ZXJjbG9ja3dpc2UKICAgICAqLwogICAgci54eCA9IGM7CiAgICByLnh5ID0gLXM7CiAgICByLnl4ID0gczsKICAgIHIueXkgPSBjOwogICAgRmNNYXRyaXhNdWx0aXBseSAobSwgJnIsIG0pOwp9Cgp2b2lkCkZjTWF0cml4U2NhbGUgKEZjTWF0cml4ICptLCBkb3VibGUgc3gsIGRvdWJsZSBzeSkKewogICAgRmNNYXRyaXgJcjsKCiAgICByLnh4ID0gc3g7CiAgICByLnh5ID0gMDsKICAgIHIueXggPSAwOwogICAgci55eSA9IHN5OwogICAgRmNNYXRyaXhNdWx0aXBseSAobSwgJnIsIG0pOwp9Cgp2b2lkCkZjTWF0cml4U2hlYXIgKEZjTWF0cml4ICptLCBkb3VibGUgc2gsIGRvdWJsZSBzdikKewogICAgRmNNYXRyaXgJcjsKCiAgICByLnh4ID0gMTsKICAgIHIueHkgPSBzaDsKICAgIHIueXggPSBzdjsKICAgIHIueXkgPSAxOwogICAgRmNNYXRyaXhNdWx0aXBseSAobSwgJnIsIG0pOwp9Cg==