LyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAogICBDb3B5cmlnaHQgMTk5NiwgMjAwMCwgMjAwMSwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOQogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCiAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5peGxpYi5oPgojaW5jbHVkZSA8dW5peGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJmaWxlbmFtZXMuaCIKCiNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi8qIE1ha2UgdGhlIGJhc2ljIHR5cGVzIDY0LWJpdCBxdWFudGl0aWVzIG9uIHRoZSBob3N0LgogICBBbHNvIHByb3ZpZGUgdGhlIHN1cHBvcnQgbWFjcm9zIEJGRCBuZWVkcy4gICovCiMgaWZkZWYgX19HTlVDX18KIyAgZGVmaW5lCUJGRF9IT1NUXzY0X0JJVAlsb25nIGxvbmcKIyBlbHNlCiMgIGRlZmluZQlCRkRfSE9TVF82NF9CSVQJbG9uZwojIGVuZGlmCnR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUIHVpbnQ2NF90eXBlOwp0eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBpbnQ2NF90eXBlOwoKIyBkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCiMgZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwoKIyBkZWZpbmUgQllURVNfSU5fUFJJTlRGX0lOVCA0CgovKiBUaGVzZSBtdXN0IGhhdmUgdHlwZSB1bnNpZ25lZCBsb25nIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBhcwogICBhcmd1bWVudHMgaW4gcHJpbnRmIGZ1bmN0aW9ucy4gICovCiMgZGVmaW5lIHVpbnQ2NF90eXBlTE9XKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwojIGRlZmluZSB1aW50NjRfdHlwZUhJR0goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkgLyogQkZEX0hPU1RfNjRfQklUICovCgojZW5kaWYgLyogQkZEX0hPU1RfNjRfQklUICovCgojaW5jbHVkZSAiZm9wZW4tdm1zLmgiCgojZGVmaW5lIE5PX0ZDTlRMIDEKCiNpZm5kZWYgT19BQ0NNT0RFCiNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQojZW5kaWYKCmV4dGVybiBpbnQgZ2V0cGFnZXNpemUgKHZvaWQpOwpleHRlcm4gY2hhciAqc3RwY3B5IChjaGFyICosIGNvbnN0IGNoYXIgKik7CgovKiBObyBpbnRsLiAgKi8KI2RlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoTXNnaWQpCiNkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpIChNc2dpZCkKI2RlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KSAoTXNnaWQpCiNkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwojZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCiNkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCiNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQo=