LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCiNpbmNsdWRlICJTRExfY29uZmlnLmgiCgovKgogICAgTU1YIGFzc2VtYmxlciB2ZXJzaW9uIG9mIFNETF9NaXhBdWRpbyBmb3Igc2lnbmVkIGxpdHRsZSBlbmRpYW4gMTYgYml0IHNhbXBsZXMgYW5kIHNpZ25lZCA4IGJpdCBzYW1wbGVzCiAgICBDb3B5cmlnaHQgMjAwMiBTdGVwaGFuZSBNYXJjaGVzaW4gKHN0ZXBoYW5lLm1hcmNoZXNpbkB3YW5hZG9vLmZyKQogICAgVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMIChzZWUgQ09QWUlORyBmb3IgZGV0YWlscykKIAogICAgQXNzdW1lcyBidWZmZXIgc2l6ZSBpbiBieXRlcyBpcyBhIG11bHRpcGxlIG9mIDE2CiAgICBBc3N1bWVzIFNETF9NSVhfTUFYVk9MVU1FID0gMTI4CiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBNaXhpbmcgZm9yIDE2IGJpdCBzaWduZWQgYnVmZmVycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKFNETF9CVUdHWV9NTVhfTUlYRVJTKSAvKiBidWdneSwgc28gd2UncmUgZGlzYWJsaW5nIHRoZW0uIC0tcnlhbi4gKi8KI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQp2b2lkIFNETF9NaXhBdWRpb19NTVhfUzE2KGNoYXIqIGRzdCxjaGFyKiBzcmMsdW5zaWduZWQgaW50IHNpemUsaW50IHZvbHVtZSkKewogICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAoKIgltb3ZsICUzLCUlZWF4XG4iCS8qIGVheCA9IHZvbHVtZSAqLwoKIgltb3ZsICUyLCUlZWR4XG4iCS8qIGVkeCA9IHNpemUgKi8KCiIJc2hybCAkNCwlJWVkeFxuIgkvKiBwcm9jZXNzIDE2IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMgKi8KCiIJanogLmVuZFMxNlxuIgoKIglweG9yICUlbW0wLCUlbW0wXG4iCgoiCW1vdmQgJSVlYXgsJSVtbTBcbiIKIgltb3ZxICUlbW0wLCUlbW0xXG4iCiIJcHNsbHEgJDE2LCUlbW0wXG4iCiIJcG9yICUlbW0xLCUlbW0wXG4iCiIJcHNsbHEgJDE2LCUlbW0wXG4iCiIJcG9yICUlbW0xLCUlbW0wXG4iCiIJcHNsbHEgJDE2LCUlbW0wXG4iCiIJcG9yICUlbW0xLCUlbW0wXG4iCQkvKiBtbTAgPSB2b2x8dm9sfHZvbHx2b2wgKi8KCiIuYWxpZ24gOFxuIgoiCS5taXhsb29wUzE2OlxuIgoKIgltb3ZxICglMSksJSVtbTFcbiIgLyogbW0xID0gYXxifGN8ZCAqLwoKIgltb3ZxICUlbW0xLCUlbW0yXG4iIC8qIG1tMiA9IGF8YnxjfGQgKi8KCiIJbW92cSA4KCUxKSwlJW1tNFxuIiAvKiBtbTQgPSBlfGZ8Z3xoICovCgoJLyogcHLpIGNoYXJnZXIgbGUgYnVmZmVyIGRzdCBkYW5zIG1tNyAqLwoiCW1vdnEgKCUwKSwlJW1tN1xuIiAvKiBtbTcgPSBkc3RbMF0gKi8KCgkvKiBtdWx0aXBsaWVyIHBhciBsZSB2b2x1bWUgKi8KIglwbXVsbHcgJSVtbTAsJSVtbTFcbiIgLyogbW0xID0gbChhKnYpfGwoYip2KXxsKGMqdil8bChkKnYpICovCgoiCXBtdWxodyAlJW1tMCwlJW1tMlxuIiAvKiBtbTIgPSBoKGEqdil8aChiKnYpfGgoYyp2KXxoKGQqdikgKi8KIgltb3ZxICUlbW00LCUlbW01XG4iIC8qIG1tNSA9IGV8ZnxnfGggKi8KCiIJcG11bGx3ICUlbW0wLCUlbW00XG4iIC8qIG1tNCA9IGwoZSp2KXxsKGYqdil8bChnKnYpfGwoaCp2KSAqLwoKIglwbXVsaHcgJSVtbTAsJSVtbTVcbiIgLyogbW01ID0gaChlKnYpfGgoZip2KXxoKGcqdil8aChoKnYpICovCiIJbW92cSAlJW1tMSwlJW1tM1xuIiAvKiBtbTMgPSBsKGEqdil8bChiKnYpfGwoYyp2KXxsKGQqdikgKi8KCiIJcHVucGNraHdkICUlbW0yLCUlbW0xXG4iIC8qIG1tMSA9IGEqdnxiKnYgKi8KCiIJbW92cSAlJW1tNCwlJW1tNlxuIiAvKiBtbTYgPSBsKGUqdil8bChmKnYpfGwoZyp2KXxsKGgqdikgKi8KIglwdW5wY2tsd2QgJSVtbTIsJSVtbTNcbiIgLyogbW0zID0gYyp2fGQqdiAqLwoKIglwdW5wY2tod2QgJSVtbTUsJSVtbTRcbiIgLyogbW00ID0gZSpmfGYqdiAqLwoKIglwdW5wY2tsd2QgJSVtbTUsJSVtbTZcbiIgLyogbW02ID0gZyp2fGgqdiAqLwoKCS8qIHBy6SBjaGFyZ2VyIGxlIGJ1ZmZlciBkc3QgZGFucyBtbTUgKi8KIgltb3ZxIDgoJTApLCUlbW01XG4iIC8qIG1tNSA9IGRzdFsxXSAqLwoKCS8qIGRpdmlzZXIgcGFyIDEyOCAqLwoiCXBzcmFkICQ3LCUlbW0xXG4iIC8qIG1tMSA9IGEqdi8xMjh8Yip2LzEyOCAsIDEyOCA9IFNETF9NSVhfTUFYVk9MVU1FICovCiIJYWRkICQxNiwlMVxuIgoKIglwc3JhZCAkNywlJW1tM1xuIiAvKiBtbTMgPSBjKnYvMTI4fGQqdi8xMjggKi8KCiIJcHNyYWQgJDcsJSVtbTRcbiIgLyogbW00ID0gZSp2LzEyOHxmKnYvMTI4ICovCgoJLyogbW0xID0gbGUgc2FtcGxlIGF2ZWMgbGUgdm9sdW1lIG1vZGlmaekgKi8KIglwYWNrc3NkdyAlJW1tMSwlJW1tM1xuIiAvKiBtbTMgPSBzKGEqdnxiKnZ8Yyp2fGQqdikgKi8KCiIJcHNyYWQgJDcsJSVtbTZcbiIgLyogbW02PSBnKnYvMTI4fGgqdi8xMjggKi8KIglwYWRkc3cgJSVtbTcsJSVtbTNcbiIgLyogbW0zID0gYWRqdXN0X3ZvbHVtZShzcmMpK2RzdCAqLwoKCS8qIG1tNCA9IGxlIHNhbXBsZSBhdmVjIGxlIHZvbHVtZSBtb2RpZmnpICovCiIJcGFja3NzZHcgJSVtbTQsJSVtbTZcbiIgLyogbW02ID0gcyhlKnZ8Zip2fGcqdnxoKnYpICovCiIJbW92cSAlJW1tMywoJTApXG4iCgoiCXBhZGRzdyAlJW1tNSwlJW1tNlxuIiAvKiBtbTYgPSBhZGp1c3Rfdm9sdW1lKHNyYykrZHN0ICovCgoiCW1vdnEgJSVtbTYsOCglMClcbiIKCiIJYWRkICQxNiwlMFxuIgoKIglkZWMgJSVlZHhcbiIKCiIJam56IC5taXhsb29wUzE2XG4iCgoiCWVtbXNcbiIKCiIuZW5kUzE2OlxuIgoJIDoKCSA6ICJyIiAoZHN0KSwgInIiKHNyYyksIm0iKHNpemUpLAoJICJtIih2b2x1bWUpCgkgOiAiZWF4IiwiZWR4IiwibWVtb3J5IgoJICk7Cn0KCgoKLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi8qIE1peGluZyBmb3IgOCBiaXQgc2lnbmVkIGJ1ZmZlcnMgKi8KLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCgp2b2lkIFNETF9NaXhBdWRpb19NTVhfUzgoY2hhciogZHN0LGNoYXIqIHNyYyx1bnNpZ25lZCBpbnQgc2l6ZSxpbnQgdm9sdW1lKQp7CiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCgoiCW1vdmwgJTMsJSVlYXhcbiIJLyogZWF4ID0gdm9sdW1lICovCgoiCW1vdmQgJSVlYXgsJSVtbTBcbiIKIgltb3ZxICUlbW0wLCUlbW0xXG4iCiIJcHNsbHEgJDE2LCUlbW0wXG4iCiIJcG9yICUlbW0xLCUlbW0wXG4iCiIJcHNsbHEgJDE2LCUlbW0wXG4iCiIJcG9yICUlbW0xLCUlbW0wXG4iCiIJcHNsbHEgJDE2LCUlbW0wXG4iCiIJcG9yICUlbW0xLCUlbW0wXG4iCgoiCW1vdmwgJTIsJSVlZHhcbiIJLyogZWR4ID0gc2l6ZSAqLwoiCXNociAkMywlJWVkeFxuIgkvKiBwcm9jZXNzIDggYnl0ZXMgcGVyIGl0ZXJhdGlvbiA9IDggc2FtcGxlcyAqLwoKIgljbXAgJDAsJSVlZHhcbiIKIglqZSAuZW5kUzhcbiIKCiIuYWxpZ24gOFxuIgoiCS5taXhsb29wUzg6XG4iCgoiCXB4b3IgJSVtbTIsJSVtbTJcbiIJCS8qIG1tMiA9IDAgKi8KIgltb3ZxICglMSksJSVtbTFcbiIJLyogbW0xID0gYXxifGN8ZHxlfGZ8Z3xoICovCgoiCW1vdnEgJSVtbTEsJSVtbTNcbiIgCS8qIG1tMyA9IGF8YnxjfGR8ZXxmfGd8aCAqLwoKCS8qIG9uIHZhIGZhaXJlIGxlICJzaWduIGV4dGVuc2lvbiIgZW4gZmFpc2FudCB1biBjbXAgYXZlYyAwIHF1aSByZXRvdXJuZSAxIHNpIDwwLCAwIHNpID4wICovCiIJcGNtcGd0YiAlJW1tMSwlJW1tMlxuIgkvKiBtbTIgPSAxMTExMTExMXwwMDAwMDAwMHwwMDAwMDAwMC4uLi4gKi8KCiIJcHVucGNraGJ3ICUlbW0yLCUlbW0xXG4iCS8qIG1tMSA9IDB8YXwwfGJ8MHxjfDB8ZCAqLwoKIglwdW5wY2tsYncgJSVtbTIsJSVtbTNcbiIJLyogbW0zID0gMHxlfDB8ZnwwfGd8MHxoICovCiIJbW92cSAoJTApLCUlbW0yXG4iCS8qIG1tMiA9IGRlc3RpbmF0aW9uICovCgoiCXBtdWxsdyAlJW1tMCwlJW1tMVxuIgkvKiBtbTEgPSB2KmF8dipifHYqY3x2KmQgKi8KIglhZGQgJDgsJTFcbiIKCiIJcG11bGx3ICUlbW0wLCUlbW0zXG4iCS8qIG1tMyA9IHYqZXx2KmZ8dipnfHYqaCAqLwoiCXBzcmF3ICQ3LCUlbW0xXG4iCQkvKiBtbTEgPSB2KmEvMTI4fHYqYi8xMjh8dipjLzEyOHx2KmQvMTI4ICAqLwoKIglwc3JhdyAkNywlJW1tM1xuIgkJLyogbW0zID0gdiplLzEyOHx2KmYvMTI4fHYqZy8xMjh8dipoLzEyOCAqLwoKIglwYWNrc3N3YiAlJW1tMSwlJW1tM1xuIgkvKiBtbTEgPSB2KmEvMTI4fHYqYi8xMjh8dipjLzEyOHx2KmQvMTI4fHYqZS8xMjh8dipmLzEyOHx2KmcvMTI4fHYqaC8xMjggKi8KCiIJcGFkZHNiICUlbW0yLCUlbW0zXG4iCS8qIGFkZCB0byBkZXN0aW5hdGlvbiBidWZmZXIgKi8KCiIJbW92cSAlJW1tMywoJTApXG4iCS8qIHN0b3JlIGJhY2sgdG8gcmFtICovCiIJYWRkICQ4LCUwXG4iCgoiCWRlYyAlJWVkeFxuIgoKIglqbnogLm1peGxvb3BTOFxuIgoKIi5lbmRTODpcbiIKIgllbW1zXG4iCgkgOgoJIDogInIiIChkc3QpLCAiciIoc3JjKSwibSIoc2l6ZSksCgkgIm0iKHZvbHVtZSkKCSA6ICJlYXgiLCJlZHgiLCJtZW1vcnkiCgkgKTsKfQojZW5kaWYKI2VuZGlmCg==