LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL3g4Nl9yb3VuZGluZ19jb250cm9sLmhwcCBmaWxlCiAqCiAqIENvcHlyaWdodCAyMDAwIEplbnMgTWF1cmVyCiAqIENvcHlyaWdodCAyMDAyIEhlcnbpIEJy9m5uaW1hbm4sIEd1aWxsYXVtZSBNZWxxdWlvbmQsIFN5bHZhaW4gUGlvbgogKgogKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCiAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCiAqIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQogKi8KCiNpZm5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfWDg2X1JPVU5ESU5HX0NPTlRST0xfSFBQCiNkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfWDg2X1JPVU5ESU5HX0NPTlRST0xfSFBQCgojaWZkZWYgX19HTlVDX18KIyAgaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9pbnRlcnZhbC9kZXRhaWwveDg2Z2NjX3JvdW5kaW5nX2NvbnRyb2wuaHBwPgojZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKIyAgaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9pbnRlcnZhbC9kZXRhaWwvYmNjX3JvdW5kaW5nX2NvbnRyb2wuaHBwPgojZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQojICBpbmNsdWRlIDxib29zdC9udW1lcmljL2ludGVydmFsL2RldGFpbC9tc3ZjX3JvdW5kaW5nX2NvbnRyb2wuaHBwPgojZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pIHx8IGRlZmluZWQoX19JQ0MpCiMgIGRlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX1VTRV9DOTlfU1VCU1lTVEVNCiMgIGluY2x1ZGUgPGJvb3N0L251bWVyaWMvaW50ZXJ2YWwvZGV0YWlsL2M5OXN1Yl9yb3VuZGluZ19jb250cm9sLmhwcD4KI2Vsc2UKIyAgZXJyb3IgVW5zdXBwb3J0ZWQgQysrIGNvbXBpbGVyLgojZW5kaWYKCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKbmFtZXNwYWNlIGludGVydmFsX2xpYiB7CgpuYW1lc3BhY2UgZGV0YWlsIHsKCiNpZmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX1VTRV9DOTlfU1VCU1lTVEVNCnR5cGVkZWYgYzk5X3JvdW5kaW5nIHg4Nl9yb3VuZGluZ19jb250cm9sOwojdW5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9VU0VfQzk5X1NVQlNZU1RFTQojZWxzZQpzdHJ1Y3QgZnB1X3JvdW5kaW5nX21vZGVzCnsKICB1bnNpZ25lZCBzaG9ydCB0b19uZWFyZXN0OwogIHVuc2lnbmVkIHNob3J0IGRvd253YXJkOwogIHVuc2lnbmVkIHNob3J0IHVwd2FyZDsKICB1bnNpZ25lZCBzaG9ydCB0b3dhcmRfemVybzsKfTsKCi8vIGV4Y2VwdGlvbnMgbWFza2VkLCBleHRlbmRlZCBwcmVjaXNpb24KLy8gaGFyZHdhcmUgZGVmYXVsdCBpcyAweDAzN2YgKDB4MTAwMCBvbmx5IGhhcyBhIG1lYW5pbmcgb24gMjg3KQpzdGF0aWMgY29uc3QgZnB1X3JvdW5kaW5nX21vZGVzIHJuZF9tb2RlID0geyAweDEzN2YsIDB4MTc3ZiwgMHgxYjdmLCAweDFmN2YgfTsKCnN0cnVjdCB4ODZfcm91bmRpbmdfY29udHJvbDogeDg2X3JvdW5kaW5nCnsKICBzdGF0aWMgdm9pZCB0b19uZWFyZXN0KCkgIHsgc2V0X3JvdW5kaW5nX21vZGUocm5kX21vZGUudG9fbmVhcmVzdCk7ICB9CiAgc3RhdGljIHZvaWQgZG93bndhcmQoKSAgICB7IHNldF9yb3VuZGluZ19tb2RlKHJuZF9tb2RlLmRvd253YXJkKTsgICAgfQogIHN0YXRpYyB2b2lkIHVwd2FyZCgpICAgICAgeyBzZXRfcm91bmRpbmdfbW9kZShybmRfbW9kZS51cHdhcmQpOyAgICAgIH0KICBzdGF0aWMgdm9pZCB0b3dhcmRfemVybygpIHsgc2V0X3JvdW5kaW5nX21vZGUocm5kX21vZGUudG93YXJkX3plcm8pOyB9Cn07CiNlbmRpZiAvLyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX1VTRV9DOTlfU1VCU1lTVEVNCgp9IC8vIG5hbWVzcGFjZSBkZXRhaWwKCnRlbXBsYXRlPD4Kc3RydWN0IHJvdW5kaW5nX2NvbnRyb2w8ZmxvYXQ+OiBkZXRhaWw6Ong4Nl9yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgZmxvYXQgZm9yY2Vfcm91bmRpbmcoY29uc3QgZmxvYXQmIHIpIAogIHsgdm9sYXRpbGUgZmxvYXQgcl8gPSByOyByZXR1cm4gcl87IH0KfTsKCnRlbXBsYXRlPD4Kc3RydWN0IHJvdW5kaW5nX2NvbnRyb2w8ZG91YmxlPjogZGV0YWlsOjp4ODZfcm91bmRpbmdfY29udHJvbAp7CiAgLypzdGF0aWMgZG91YmxlIGZvcmNlX3JvdW5kaW5nKGRvdWJsZSByKSAKICB7IGFzbSB2b2xhdGlsZSAoIiIgOiAiK20iKHIpIDogKTsgcmV0dXJuIHI7IH0qLwogIHN0YXRpYyBkb3VibGUgZm9yY2Vfcm91bmRpbmcoY29uc3QgZG91YmxlJiByKSAKICB7IHZvbGF0aWxlIGRvdWJsZSByXyA9IHI7IHJldHVybiByXzsgfQp9OwoKbmFtZXNwYWNlIGRldGFpbCB7Cgp0ZW1wbGF0ZTxib29sPgpzdHJ1Y3QgeDg2X3JvdW5kaW5nX2NvbnRyb2xfbG9uZ19kb3VibGU7Cgp0ZW1wbGF0ZTw+CnN0cnVjdCB4ODZfcm91bmRpbmdfY29udHJvbF9sb25nX2RvdWJsZTxmYWxzZT46IHg4Nl9yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgbG9uZyBkb3VibGUgZm9yY2Vfcm91bmRpbmcobG9uZyBkb3VibGUgY29uc3QgJnIpCiAgeyB2b2xhdGlsZSBsb25nIGRvdWJsZSByXyA9IHI7IHJldHVybiByXzsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgeDg2X3JvdW5kaW5nX2NvbnRyb2xfbG9uZ19kb3VibGU8dHJ1ZT46IHg4Nl9yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgbG9uZyBkb3VibGUgY29uc3QgJmZvcmNlX3JvdW5kaW5nKGxvbmcgZG91YmxlIGNvbnN0ICZyKQogIHsgcmV0dXJuIHI7IH0KfTsKCn0gLy8gbmFtZXNwYWNlIGRldGFpbAoKdGVtcGxhdGU8PgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbDxsb25nIGRvdWJsZT46CiAgZGV0YWlsOjp4ODZfcm91bmRpbmdfY29udHJvbF9sb25nX2RvdWJsZTwgKHNpemVvZihsb25nIGRvdWJsZSkgPj0gMTApID4Ke307Cgp9IC8vIG5hbWVzcGFjZSBpbnRlcnZhbF9saWIKfSAvLyBuYW1lc3BhY2UgbnVtZXJpYwp9IC8vIG5hbWVzcGFjZSBib29zdAoKI3VuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfTk9fSEFSRFdBUkUKCiNlbmRpZiAvKiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9YODZfUk9VTkRJTkdfQ09OVFJPTF9IUFAgKi8K