LyoKICogQ29weXJpZ2h0IChDKSAyMDAwIEZyYW7nb2lzIEdvdWdldAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaWZuZGVmIE1BUElfSAojZGVmaW5lIE1BUElfSAoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCi8qIFNvbWUgdHlwZXMgKi8KCiNpZm5kZWYgX19MSEFORExFCiNkZWZpbmUgX19MSEFORExFCnR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICAgTEhBTkRMRSwgKkxQTEhBTkRMRTsKI2VuZGlmCiNkZWZpbmUgbGhTZXNzaW9uTnVsbCAgICAgICAgICAgKChMSEFORExFKTApCgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIEZMQUdTOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgVUxPTkcgdWxSZXNlcnZlZDsKICAgIFVMT05HIGZsRmxhZ3M7CiAgICBVTE9ORyBuUG9zaXRpb247CiAgICBMUFNUUiBscHN6UGF0aE5hbWU7CiAgICBMUFNUUiBscHN6RmlsZU5hbWU7CiAgICBMUFZPSUQgbHBGaWxlVHlwZTsKfSBNYXBpRmlsZURlc2MsICpscE1hcGlGaWxlRGVzYzsKCnR5cGVkZWYgc3RydWN0CnsKICAgIFVMT05HIHVsUmVzZXJ2ZWQ7CiAgICBVTE9ORyB1bFJlY2lwQ2xhc3M7CiAgICBMUFNUUiBscHN6TmFtZTsKICAgIExQU1RSIGxwc3pBZGRyZXNzOwogICAgVUxPTkcgdWxFSURTaXplOwogICAgTFBWT0lEIGxwRW50cnlJRDsKfSBNYXBpUmVjaXBEZXNjLCAqbHBNYXBpUmVjaXBEZXNjOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgVUxPTkcgdWxSZXNlcnZlZDsKICAgIExQU1RSIGxwc3pTdWJqZWN0OwogICAgTFBTVFIgbHBzek5vdGVUZXh0OwogICAgTFBTVFIgbHBzek1lc3NhZ2VUeXBlOwogICAgTFBTVFIgbHBzekRhdGVSZWNlaXZlZDsKICAgIExQU1RSIGxwc3pDb252ZXJzYXRpb25JRDsKICAgIEZMQUdTIGZsRmxhZ3M7CiAgICBscE1hcGlSZWNpcERlc2MgbHBPcmlnaW5hdG9yOwogICAgVUxPTkcgblJlY2lwQ291bnQ7CiAgICBscE1hcGlSZWNpcERlc2MgbHBSZWNpcHM7CiAgICBVTE9ORyBuRmlsZUNvdW50OwogICAgbHBNYXBpRmlsZURlc2MgbHBGaWxlczsKfSBNYXBpTWVzc2FnZSwgKmxwTWFwaU1lc3NhZ2U7CgoKLyogRXJyb3IgY29kZXMgKi8KCiNkZWZpbmUgU1VDQ0VTU19TVUNDRVNTICAgICAgICAgICAgICAgICAwCiNkZWZpbmUgTUFQSV9VU0VSX0FCT1JUICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgTUFQSV9FX1VTRVJfQUJPUlQgICAgICAgICAgICAgICBNQVBJX1VTRVJfQUJPUlQKI2RlZmluZSBNQVBJX0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgIDIKI2RlZmluZSBNQVBJX0VfTE9HT05fRkFJTFVSRSAgICAgICAgICAgIDMKI2RlZmluZSBNQVBJX0VfTE9HSU5fRkFJTFVSRSAgICAgICAgICAgIE1BUElfRV9MT0dPTl9GQUlMVVJFCiNkZWZpbmUgTUFQSV9FX0RJU0tfRlVMTCAgICAgICAgICAgICAgICA0CiNkZWZpbmUgTUFQSV9FX0lOU1VGRklDSUVOVF9NRU1PUlkgICAgICA1CiNkZWZpbmUgTUFQSV9FX0FDQ0VTU19ERU5JRUQgICAgICAgICAgICA2CiNkZWZpbmUgTUFQSV9FX1RPT19NQU5ZX1NFU1NJT05TICAgICAgICA4CiNkZWZpbmUgTUFQSV9FX1RPT19NQU5ZX0ZJTEVTICAgICAgICAgICA5CiNkZWZpbmUgTUFQSV9FX1RPT19NQU5ZX1JFQ0lQSUVOVFMgICAgICAxMAojZGVmaW5lIE1BUElfRV9BVFRBQ0hNRU5UX05PVF9GT1VORCAgICAgMTEKI2RlZmluZSBNQVBJX0VfQVRUQUNITUVOVF9PUEVOX0ZBSUxVUkUgIDEyCiNkZWZpbmUgTUFQSV9FX0FUVEFDSE1FTlRfV1JJVEVfRkFJTFVSRSAxMwojZGVmaW5lIE1BUElfRV9VTktOT1dOX1JFQ0lQSUVOVCAgICAgICAgMTQKI2RlZmluZSBNQVBJX0VfQkFEX1JFQ0lQVFlQRSAgICAgICAgICAgIDE1CiNkZWZpbmUgTUFQSV9FX05PX01FU1NBR0VTICAgICAgICAgICAgICAxNgojZGVmaW5lIE1BUElfRV9JTlZBTElEX01FU1NBR0UgICAgICAgICAgMTcKI2RlZmluZSBNQVBJX0VfVEVYVF9UT09fTEFSR0UgICAgICAgICAgIDE4CiNkZWZpbmUgTUFQSV9FX0lOVkFMSURfU0VTU0lPTiAgICAgICAgICAxOQojZGVmaW5lIE1BUElfRV9UWVBFX05PVF9TVVBQT1JURUQgICAgICAgMjAKI2RlZmluZSBNQVBJX0VfQU1CSUdVT1VTX1JFQ0lQSUVOVCAgICAgIDIxCiNkZWZpbmUgTUFQSV9FX0FNQklHX1JFQ0lQICAgICAgICAgICAgICBNQVBJX0VfQU1CSUdVT1VTX1JFQ0lQSUVOVAojZGVmaW5lIE1BUElfRV9NRVNTQUdFX0lOX1VTRSAgICAgICAgICAgMjIKI2RlZmluZSBNQVBJX0VfTkVUV09SS19GQUlMVVJFICAgICAgICAgIDIzCiNkZWZpbmUgTUFQSV9FX0lOVkFMSURfRURJVEZJRUxEUyAgICAgICAyNAojZGVmaW5lIE1BUElfRV9JTlZBTElEX1JFQ0lQUyAgICAgICAgICAgMjUKI2RlZmluZSBNQVBJX0VfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgIDI2CgoKLyogTUFQSUxvZ29uICovCgojZGVmaW5lIE1BUElfTE9HT05fVUkgICAgICAgICAgIDB4MDAwMDAwMDEKI2RlZmluZSBNQVBJX1BBU1NXT1JEX1VJICAgICAgICAweDAwMDIwMDAwCiNkZWZpbmUgTUFQSV9ORVdfU0VTU0lPTiAgICAgICAgMHgwMDAwMDAwMgojZGVmaW5lIE1BUElfRk9SQ0VfRE9XTkxPQUQgICAgIDB4MDAwMDEwMDAKI2RlZmluZSBNQVBJX0VYVEVOREVEICAgICAgICAgICAweDAwMDAwMDIwCgoKLyogTUFQSVNlbmRNYWlsICovCgojZGVmaW5lIE1BUElfRElBTE9HICAgICAgICAgICAgIDB4MDAwMDAwMDgKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiBNQVBJX0ggKi8K