LyogQm9vc3QgaW50ZXJ2YWwvcm91bmRlZF90cmFuc2MuaHBwIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uIGZpbGUKICoKICogQ29weXJpZ2h0IDIwMDItMjAwMyBIZXJ26SBCcvZubmltYW5uLCBHdWlsbGF1bWUgTWVscXVpb25kLCBTeWx2YWluIFBpb24KICoKICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgogKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgogKiBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKICovCgojaWZuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfUk9VTkRFRF9UUkFOU0NfSFBQCiNkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ST1VOREVEX1RSQU5TQ19IUFAKCiNpbmNsdWRlIDxib29zdC9udW1lcmljL2ludGVydmFsL3JvdW5kaW5nLmhwcD4KI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvaW50ZXJ2YWwvZGV0YWlsL2J1Z3MuaHBwPgojaW5jbHVkZSA8Ym9vc3QvY29uZmlnL25vX3RyMS9jbWF0aC5ocHA+CgpuYW1lc3BhY2UgYm9vc3QgewpuYW1lc3BhY2UgbnVtZXJpYyB7Cm5hbWVzcGFjZSBpbnRlcnZhbF9saWIgewoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUm91bmRpbmc+CnN0cnVjdCByb3VuZGVkX3RyYW5zY19leGFjdDogUm91bmRpbmcKewojIGRlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGYpIFwKICAgIFQgZiMjX2Rvd24oY29uc3QgVCYgeCkgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX21hdGgoZik7IHJldHVybiBmKHgpOyB9IFwKICAgIFQgZiMjX3VwICAoY29uc3QgVCYgeCkgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX21hdGgoZik7IHJldHVybiBmKHgpOyB9CiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhleHApCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhsb2cpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhzaW4pCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhjb3MpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyh0YW4pCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhhc2luKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoYWNvcykKICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGF0YW4pCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhzaW5oKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoY29zaCkKICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKHRhbmgpCiMgdW5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYwojIGRlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGYpIFwKICAgIFQgZiMjX2Rvd24oY29uc3QgVCYgeCkgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX2FoeXAoZik7IHJldHVybiBmKHgpOyB9IFwKICAgIFQgZiMjX3VwICAoY29uc3QgVCYgeCkgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX2FoeXAoZik7IHJldHVybiBmKHgpOyB9CiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhhc2luaCkKICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGFjb3NoKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoYXRhbmgpCiMgdW5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYwp9OwogIAp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBSb3VuZGluZz4Kc3RydWN0IHJvdW5kZWRfdHJhbnNjX3N0ZDogUm91bmRpbmcKewojIGRlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGYpIFwKICAgIFQgZiMjX2Rvd24oY29uc3QgVCYgeCkgXAogICAgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX21hdGgoZik7IFwKICAgICAgdGhpcy0+ZG93bndhcmQoKTsgcmV0dXJuIHRoaXMtPmZvcmNlX3JvdW5kaW5nKGYoeCkpOyB9IFwKICAgIFQgZiMjX3VwICAoY29uc3QgVCYgeCkgXAogICAgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX21hdGgoZik7IFwKICAgICAgdGhpcy0+dXB3YXJkKCk7IHJldHVybiB0aGlzLT5mb3JjZV9yb3VuZGluZyhmKHgpKTsgfQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoZXhwKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMobG9nKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoc2luKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoY29zKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmModGFuKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoYXNpbikKICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGFjb3MpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhhdGFuKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoc2luaCkKICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGNvc2gpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyh0YW5oKQojIHVuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMKIyBkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhmKSBcCiAgICBUIGYjI19kb3duKGNvbnN0IFQmIHgpIFwKICAgIHsgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF91c2luZ19haHlwKGYpOyBcCiAgICAgIHRoaXMtPmRvd253YXJkKCk7IHJldHVybiB0aGlzLT5mb3JjZV9yb3VuZGluZyhmKHgpKTsgfSBcCiAgICBUIGYjI191cCAgKGNvbnN0IFQmIHgpIFwKICAgIHsgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF91c2luZ19haHlwKGYpOyBcCiAgICAgIHRoaXMtPnVwd2FyZCgpOyByZXR1cm4gdGhpcy0+Zm9yY2Vfcm91bmRpbmcoZih4KSk7IH0KICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGFzaW5oKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoYWNvc2gpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhhdGFuaCkKIyB1bmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jCn07Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBSb3VuZGluZz4Kc3RydWN0IHJvdW5kZWRfdHJhbnNjX29wcDogUm91bmRpbmcKewojIGRlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGYpIFwKICAgIFQgZiMjX2Rvd24oY29uc3QgVCYgeCkgXAogICAgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX21hdGgoZik7IFwKICAgICAgdGhpcy0+ZG93bndhcmQoKTsgVCB5ID0gdGhpcy0+Zm9yY2Vfcm91bmRpbmcoZih4KSk7IFwKICAgICAgdGhpcy0+dXB3YXJkKCk7IHJldHVybiB5OyB9IFwKICAgIFQgZiMjX3VwICAoY29uc3QgVCYgeCkgXAogICAgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX21hdGgoZik7IFwKICAgICAgcmV0dXJuIHRoaXMtPmZvcmNlX3JvdW5kaW5nKGYoeCkpOyB9CiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhleHApCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhsb2cpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhjb3MpCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhhY29zKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoY29zaCkKIyB1bmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jCiMgZGVmaW5lIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoZikgXAogICAgVCBmIyNfZG93bihjb25zdCBUJiB4KSBcCiAgICB7IEJPT1NUX05VTUVSSUNfSU5URVJWQUxfdXNpbmdfbWF0aChmKTsgXAogICAgICByZXR1cm4gLXRoaXMtPmZvcmNlX3JvdW5kaW5nKC1mKHgpKTsgfSBcCiAgICBUIGYjI191cCAgKGNvbnN0IFQmIHgpIFwKICAgIHsgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF91c2luZ19tYXRoKGYpOyBcCiAgICAgIHJldHVybiB0aGlzLT5mb3JjZV9yb3VuZGluZyhmKHgpKTsgfQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoc2luKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmModGFuKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoYXNpbikKICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGF0YW4pCiAgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYyhzaW5oKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmModGFuaCkKIyB1bmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jCiMgZGVmaW5lIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoZikgXAogICAgVCBmIyNfZG93bihjb25zdCBUJiB4KSBcCiAgICB7IEJPT1NUX05VTUVSSUNfSU5URVJWQUxfdXNpbmdfYWh5cChmKTsgXAogICAgICB0aGlzLT5kb3dud2FyZCgpOyBUIHkgPSB0aGlzLT5mb3JjZV9yb3VuZGluZyhmKHgpKTsgXAogICAgICB0aGlzLT51cHdhcmQoKTsgcmV0dXJuIHk7IH0gXAogICAgVCBmIyNfdXAgIChjb25zdCBUJiB4KSBcCiAgICB7IEJPT1NUX05VTUVSSUNfSU5URVJWQUxfdXNpbmdfYWh5cChmKTsgXAogICAgICByZXR1cm4gdGhpcy0+Zm9yY2Vfcm91bmRpbmcoZih4KSk7IH0KICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGFzaW5oKQogIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMoYXRhbmgpCiMgdW5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9uZXdfZnVuYwojIGRlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGYpIFwKICAgIFQgZiMjX2Rvd24oY29uc3QgVCYgeCkgXAogICAgeyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX3VzaW5nX2FoeXAoZik7IFwKICAgICAgcmV0dXJuIC10aGlzLT5mb3JjZV9yb3VuZGluZygtZih4KSk7IH0gXAogICAgVCBmIyNfdXAgIChjb25zdCBUJiB4KSBcCiAgICB7IEJPT1NUX05VTUVSSUNfSU5URVJWQUxfdXNpbmdfYWh5cChmKTsgXAogICAgICByZXR1cm4gdGhpcy0+Zm9yY2Vfcm91bmRpbmcoZih4KSk7IH0KICBCT09TVF9OVU1FUklDX0lOVEVSVkFMX25ld19mdW5jKGFjb3NoKQojIHVuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfbmV3X2Z1bmMKfTsKICAKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMKfSAvLyBuYW1lc3BhY2UgYm9vc3QKCiNlbmRpZiAvLyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX1JPVU5ERURfVFJBTlNDX0hQUAo=