LyogKEMpIDE5OTkgSuly9G1lIGRlIFZpdmllIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CiAqIChDKSAxOTk5IEhlcnbpIEV5Y2hlbm5lIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KCiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9saW1pdC5oPgoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQVVUSE9SKCJIZXJ2ZSBFeWNoZW5uZSA8cnZAd2FsbGZpcmUub3JnPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHJhdGUgbGltaXQgbWF0Y2giKTsKTU9EVUxFX0FMSUFTKCJpcHRfbGltaXQiKTsKTU9EVUxFX0FMSUFTKCJpcDZ0X2xpbWl0Iik7CgovKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgdGhlIFNpbXBsZSBUb2tlbiBCdWNrZXQgRmlsdGVyIChUQkYpCiAqIHNlZSBuZXQvc2NoZWQvc2NoX3RiZi5jIGluIHRoZSBsaW51eCBzb3VyY2UgdHJlZQogKi8KCnN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobGltaXRfbG9jayk7CgovKiBSdXN0eTogVGhpcyBpcyBteSAobm9uLW1hdGhlbWF0aWNhbGx5LWluY2xpbmVkKSB1bmRlcnN0YW5kaW5nIG9mCiAgIHRoaXMgYWxnb3JpdGhtLiAgVGhlIGBhdmVyYWdlIHJhdGUnIGluIGppZmZpZXMgYmVjb21lcyB5b3VyIGluaXRpYWwKICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCiAgIGBjcmVkaXRfY2FwJy4gIFRoZSBgcGVhayByYXRlJyBiZWNvbWVzIHRoZSBjb3N0IG9mIHBhc3NpbmcgdGhlCiAgIHRlc3QsIGBjb3N0Jy4KCiAgIGBwcmV2JyB0cmFja3MgdGhlIGxhc3QgcGFja2V0IGhpdDogeW91IGdhaW4gb25lIGNyZWRpdCBwZXIgamlmZnkuCiAgIElmIHlvdSBnZXQgY3JlZGl0IGJhbGFuY2UgbW9yZSB0aGFuIHRoaXMsIHRoZSBleHRyYSBjcmVkaXQgaXMKICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKICAgaWYgeW91IGRvbid0IGhhdmUgdGhhdCBtYW55LCB0aGUgdGVzdCBmYWlscy4KCiAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KCiAgIFRvIGdldCB0aGUgbWF4bXVtIHJhbmdlLCB3ZSBtdWx0aXBseSBieSB0aGlzIGZhY3RvciAoaWUuIHlvdSBnZXQgTgogICBjcmVkaXRzIHBlciBqaWZmeSkuICBXZSB3YW50IHRvIGFsbG93IGEgcmF0ZSBhcyBsb3cgYXMgMSBwZXIgZGF5CiAgIChzbG93ZXN0IHVzZXJzcGFjZSB0b29sIGFsbG93cyksIHdoaWNoIG1lYW5zCiAgIENSRURJVFNfUEVSX0pJRkZZKkhaKjYwKjYwKjI0IDwgMl4zMi4gaWUuICovCiNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCgovKiBSZXBlYXRlZCBzaGlmdCBhbmQgb3IgZ2l2ZXMgdXMgYWxsIDFzLCBmaW5hbCBzaGlmdCBhbmQgYWRkIDEgZ2l2ZXMKICogdXMgdGhlIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHRoZW9yZXRpY2FsIG1heCwgc28gR0NDIHNpbXBseSBkb2VzIGEKICogc2hpZnQuICovCiNkZWZpbmUgX1BPVzJfQkVMT1cyKHgpICgoeCl8KCh4KT4+MSkpCiNkZWZpbmUgX1BPVzJfQkVMT1c0KHgpIChfUE9XMl9CRUxPVzIoeCl8X1BPVzJfQkVMT1cyKCh4KT4+MikpCiNkZWZpbmUgX1BPVzJfQkVMT1c4KHgpIChfUE9XMl9CRUxPVzQoeCl8X1BPVzJfQkVMT1c0KCh4KT4+NCkpCiNkZWZpbmUgX1BPVzJfQkVMT1cxNih4KSAoX1BPVzJfQkVMT1c4KHgpfF9QT1cyX0JFTE9XOCgoeCk+PjgpKQojZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKI2RlZmluZSBQT1cyX0JFTE9XMzIoeCkgKChfUE9XMl9CRUxPVzMyKHgpPj4xKSArIDEpCgojZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIFBPVzJfQkVMT1czMihNQVhfQ1BKKQoKc3RhdGljIGludAppcHRfbGltaXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCgkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKCQljb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAoJCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKCQlpbnQgb2Zmc2V0LAoJCXVuc2lnbmVkIGludCBwcm90b2ZmLAoJCWludCAqaG90ZHJvcCkKewoJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgeHRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7Cgl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CgoJc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKCXItPmNyZWRpdCArPSAobm93IC0geGNoZygmci0+cHJldiwgbm93KSkgKiBDUkVESVRTX1BFUl9KSUZGWTsKCWlmIChyLT5jcmVkaXQgPiByLT5jcmVkaXRfY2FwKQoJCXItPmNyZWRpdCA9IHItPmNyZWRpdF9jYXA7CgoJaWYgKHItPmNyZWRpdCA+PSByLT5jb3N0KSB7CgkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCgkJci0+Y3JlZGl0IC09IHItPmNvc3Q7CgkJc3Bpbl91bmxvY2tfYmgoJmxpbWl0X2xvY2spOwoJCXJldHVybiAxOwoJfQoKCXNwaW5fdW5sb2NrX2JoKCZsaW1pdF9sb2NrKTsKCXJldHVybiAwOwp9CgovKiBQcmVjaXNpb24gc2F2ZXIuICovCnN0YXRpYyB1X2ludDMyX3QKdXNlcjJjcmVkaXRzKHVfaW50MzJfdCB1c2VyKQp7CgkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwoJaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKCQkvKiBEaXZpZGUgZmlyc3QuICovCgkJcmV0dXJuICh1c2VyIC8gWFRfTElNSVRfU0NBTEUpICogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKCglyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIFhUX0xJTUlUX1NDQUxFOwp9CgpzdGF0aWMgaW50CmlwdF9saW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKCQkgICAgIGNvbnN0IHZvaWQgKmluZiwKCQkgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCgkJICAgICB2b2lkICptYXRjaGluZm8sCgkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQp7CglzdHJ1Y3QgeHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87CgoJLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLwoJaWYgKHItPmJ1cnN0ID09IDAKCSAgICB8fCB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpIDwgdXNlcjJjcmVkaXRzKHItPmF2ZykpIHsKCQlwcmludGsoIk92ZXJmbG93IGluIHh0X2xpbWl0LCB0cnkgbG93ZXI6ICV1LyV1XG4iLAoJCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKCQlyZXR1cm4gMDsKCX0KCgkvKiBGb3IgU01QLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIG9uZSBzZXQgb2YgY291bnRlcnMuICovCglyLT5tYXN0ZXIgPSByOwoJaWYgKHItPmNvc3QgPT0gMCkgewoJCS8qIFVzZXIgYXZnIGluIHNlY29uZHMgKiBYVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICoKCQkgICAxMjguICovCgkJci0+cHJldiA9IGppZmZpZXM7CgkJci0+Y3JlZGl0ID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsJIC8qIENyZWRpdHMgZnVsbC4gKi8KCQlyLT5jcmVkaXRfY2FwID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsgLyogQ3JlZGl0cyBmdWxsLiAqLwoJCXItPmNvc3QgPSB1c2VyMmNyZWRpdHMoci0+YXZnKTsKCX0KCXJldHVybiAxOwp9CgojaWZkZWYgQ09ORklHX0NPTVBBVApzdHJ1Y3QgY29tcGF0X3h0X3JhdGVpbmZvIHsKCXVfaW50MzJfdCBhdmc7Cgl1X2ludDMyX3QgYnVyc3Q7CgoJY29tcGF0X3Vsb25nX3QgcHJldjsKCXVfaW50MzJfdCBjcmVkaXQ7Cgl1X2ludDMyX3QgY3JlZGl0X2NhcCwgY29zdDsKCgl1X2ludDMyX3QgbWFzdGVyOwp9OwoKLyogVG8ga2VlcCB0aGUgZnVsbCAicHJldiIgdGltZXN0YW1wLCB0aGUgdXBwZXIgMzIgYml0cyBhcmUgc3RvcmVkIGluIHRoZQogKiBtYXN0ZXIgcG9pbnRlciwgd2hpY2ggZG9lcyBub3QgbmVlZCB0byBiZSBwcmVzZXJ2ZWQuICovCnN0YXRpYyB2b2lkIGNvbXBhdF9mcm9tX3VzZXIodm9pZCAqZHN0LCB2b2lkICpzcmMpCnsKCXN0cnVjdCBjb21wYXRfeHRfcmF0ZWluZm8gKmNtID0gc3JjOwoJc3RydWN0IHh0X3JhdGVpbmZvIG0gPSB7CgkJLmF2ZwkJPSBjbS0+YXZnLAoJCS5idXJzdAkJPSBjbS0+YnVyc3QsCgkJLnByZXYJCT0gY20tPnByZXYgfCAodW5zaWduZWQgbG9uZyljbS0+bWFzdGVyIDw8IDMyLAoJCS5jcmVkaXQJCT0gY20tPmNyZWRpdCwKCQkuY3JlZGl0X2NhcAk9IGNtLT5jcmVkaXRfY2FwLAoJCS5jb3N0CQk9IGNtLT5jb3N0LAoJfTsKCW1lbWNweShkc3QsICZtLCBzaXplb2YobSkpOwp9CgpzdGF0aWMgaW50IGNvbXBhdF90b191c2VyKHZvaWQgX191c2VyICpkc3QsIHZvaWQgKnNyYykKewoJc3RydWN0IHh0X3JhdGVpbmZvICptID0gc3JjOwoJc3RydWN0IGNvbXBhdF94dF9yYXRlaW5mbyBjbSA9IHsKCQkuYXZnCQk9IG0tPmF2ZywKCQkuYnVyc3QJCT0gbS0+YnVyc3QsCgkJLnByZXYJCT0gbS0+cHJldiwKCQkuY3JlZGl0CQk9IG0tPmNyZWRpdCwKCQkuY3JlZGl0X2NhcAk9IG0tPmNyZWRpdF9jYXAsCgkJLmNvc3QJCT0gbS0+Y29zdCwKCQkubWFzdGVyCQk9IG0tPnByZXYgPj4gMzIsCgl9OwoJcmV0dXJuIGNvcHlfdG9fdXNlcihkc3QsICZjbSwgc2l6ZW9mKGNtKSkgPyAtRUZBVUxUIDogMDsKfQojZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwoKc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB4dF9saW1pdF9tYXRjaFtdID0gewoJewoJCS5uYW1lCQk9ICJsaW1pdCIsCgkJLmZhbWlseQkJPSBBRl9JTkVULAoJCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCgkJLm1hdGNoCQk9IGlwdF9saW1pdF9tYXRjaCwKCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9yYXRlaW5mbyksCiNpZmRlZiBDT05GSUdfQ09NUEFUCgkJLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF94dF9yYXRlaW5mbyksCgkJLmNvbXBhdF9mcm9tX3VzZXIgPSBjb21wYXRfZnJvbV91c2VyLAoJCS5jb21wYXRfdG9fdXNlcgk9IGNvbXBhdF90b191c2VyLAojZW5kaWYKCQkubWUJCT0gVEhJU19NT0RVTEUsCgl9LAoJewoJCS5uYW1lCQk9ICJsaW1pdCIsCgkJLmZhbWlseQkJPSBBRl9JTkVUNiwKCQkuY2hlY2tlbnRyeQk9IGlwdF9saW1pdF9jaGVja2VudHJ5LAoJCS5tYXRjaAkJPSBpcHRfbGltaXRfbWF0Y2gsCgkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcmF0ZWluZm8pLAoJCS5tZQkJPSBUSElTX01PRFVMRSwKCX0sCn07CgpzdGF0aWMgaW50IF9faW5pdCB4dF9saW1pdF9pbml0KHZvaWQpCnsKCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaGVzKHh0X2xpbWl0X21hdGNoLCBBUlJBWV9TSVpFKHh0X2xpbWl0X21hdGNoKSk7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCB4dF9saW1pdF9maW5pKHZvaWQpCnsKCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyh4dF9saW1pdF9tYXRjaCwgQVJSQVlfU0laRSh4dF9saW1pdF9tYXRjaCkpOwp9Cgptb2R1bGVfaW5pdCh4dF9saW1pdF9pbml0KTsKbW9kdWxlX2V4aXQoeHRfbGltaXRfZmluaSk7Cg==