LyogS2VybmVsIG1vZHVsZSB0byBjb250cm9sIHRoZSByYXRlCiAqCiAqIDIgU2VwdGVtYmVyIDE5OTk6IENoYW5nZWQgZnJvbSB0aGUgdGFyZ2V0IFJBVEUgdG8gdGhlIG1hdGNoCiAqICAgICAgICAgICAgICAgICAgIGBsaW1pdCcsIHJlbW92ZWQgbG9nZ2luZy4gIERpZCBJIG1lbnRpb24gdGhhdAogKiAgICAgICAgICAgICAgICAgICBBbGV4ZXkgaXMgYSBmdWNraW5nIGdlbml1cz8KICogICAgICAgICAgICAgICAgICAgUnVzdHkgUnVzc2VsbCAocnVzdHlAcnVzdGNvcnAuY29tLmF1KS4gICovCgovKiAoQykgMTk5OSBK6XL0bWUgZGUgVml2aWUgPGRldml2aWVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KICogKEMpIDE5OTkgSGVydukgRXljaGVubmUgPGV5Y2hlbm5lQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgoKI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgojaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0Lmg+CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIkhlcnZlIEV5Y2hlbm5lIDxydkB3YWxsZmlyZS5vcmc+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgcmF0ZSBsaW1pdCBtYXRjaCIpOwpNT0RVTEVfQUxJQVMoImlwdF9saW1pdCIpOwpNT0RVTEVfQUxJQVMoImlwNnRfbGltaXQiKTsKCi8qIFRoZSBhbGdvcml0aG0gdXNlZCBpcyB0aGUgU2ltcGxlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgKFRCRikKICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCiAqLwoKc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKCi8qIFJ1c3R5OiBUaGlzIGlzIG15IChub24tbWF0aGVtYXRpY2FsbHktaW5jbGluZWQpIHVuZGVyc3RhbmRpbmcgb2YKICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAogICBhbW91bnQgb2YgY3JlZGl0IGBjcmVkaXQnIGFuZCB0aGUgbW9zdCBjcmVkaXQgeW91IGNhbiBldmVyIGhhdmUKICAgYGNyZWRpdF9jYXAnLiAgVGhlIGBwZWFrIHJhdGUnIGJlY29tZXMgdGhlIGNvc3Qgb2YgcGFzc2luZyB0aGUKICAgdGVzdCwgYGNvc3QnLgoKICAgYHByZXYnIHRyYWNrcyB0aGUgbGFzdCBwYWNrZXQgaGl0OiB5b3UgZ2FpbiBvbmUgY3JlZGl0IHBlciBqaWZmeS4KICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcwogICBkaXNjYXJkZWQuICBFdmVyeSB0aW1lIHRoZSBtYXRjaCBwYXNzZXMsIHlvdSBsb3NlIGBjb3N0JyBjcmVkaXRzOwogICBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGF0IG1hbnksIHRoZSB0ZXN0IGZhaWxzLgoKICAgU2VlIEFsZXhleSdzIGZvcm1hbCBleHBsYW5hdGlvbiBpbiBuZXQvc2NoZWQvc2NoX3RiZi5jLgoKICAgVG8gZ2V0IHRoZSBtYXhtdW0gcmFuZ2UsIHdlIG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIChpZS4geW91IGdldCBOCiAgIGNyZWRpdHMgcGVyIGppZmZ5KS4gIFdlIHdhbnQgdG8gYWxsb3cgYSByYXRlIGFzIGxvdyBhcyAxIHBlciBkYXkKICAgKHNsb3dlc3QgdXNlcnNwYWNlIHRvb2wgYWxsb3dzKSwgd2hpY2ggbWVhbnMKICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyLiBpZS4gKi8KI2RlZmluZSBNQVhfQ1BKICgweEZGRkZGRkZGIC8gKEhaKjYwKjYwKjI0KSkKCi8qIFJlcGVhdGVkIHNoaWZ0IGFuZCBvciBnaXZlcyB1cyBhbGwgMXMsIGZpbmFsIHNoaWZ0IGFuZCBhZGQgMSBnaXZlcwogKiB1cyB0aGUgcG93ZXIgb2YgMiBiZWxvdyB0aGUgdGhlb3JldGljYWwgbWF4LCBzbyBHQ0Mgc2ltcGx5IGRvZXMgYQogKiBzaGlmdC4gKi8KI2RlZmluZSBfUE9XMl9CRUxPVzIoeCkgKCh4KXwoKHgpPj4xKSkKI2RlZmluZSBfUE9XMl9CRUxPVzQoeCkgKF9QT1cyX0JFTE9XMih4KXxfUE9XMl9CRUxPVzIoKHgpPj4yKSkKI2RlZmluZSBfUE9XMl9CRUxPVzgoeCkgKF9QT1cyX0JFTE9XNCh4KXxfUE9XMl9CRUxPVzQoKHgpPj40KSkKI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCiNkZWZpbmUgX1BPVzJfQkVMT1czMih4KSAoX1BPVzJfQkVMT1cxNih4KXxfUE9XMl9CRUxPVzE2KCh4KT4+MTYpKQojZGVmaW5lIFBPVzJfQkVMT1czMih4KSAoKF9QT1cyX0JFTE9XMzIoeCk+PjEpICsgMSkKCiNkZWZpbmUgQ1JFRElUU19QRVJfSklGRlkgUE9XMl9CRUxPVzMyKE1BWF9DUEopCgpzdGF0aWMgaW50CmlwdF9saW1pdF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAoJCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKCQlpbnQgb2Zmc2V0LAoJCXVuc2lnbmVkIGludCBwcm90b2ZmLAoJCWludCAqaG90ZHJvcCkKewoJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgeHRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7Cgl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CgoJc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKCXItPmNyZWRpdCArPSAobm93IC0geGNoZygmci0+cHJldiwgbm93KSkgKiBDUkVESVRTX1BFUl9KSUZGWTsKCWlmIChyLT5jcmVkaXQgPiByLT5jcmVkaXRfY2FwKQoJCXItPmNyZWRpdCA9IHItPmNyZWRpdF9jYXA7CgoJaWYgKHItPmNyZWRpdCA+PSByLT5jb3N0KSB7CgkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCgkJci0+Y3JlZGl0IC09IHItPmNvc3Q7CgkJc3Bpbl91bmxvY2tfYmgoJmxpbWl0X2xvY2spOwoJCXJldHVybiAxOwoJfQoKICAgICAgIAlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7CglyZXR1cm4gMDsKfQoKLyogUHJlY2lzaW9uIHNhdmVyLiAqLwpzdGF0aWMgdV9pbnQzMl90CnVzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKewoJLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCgkJLyogRGl2aWRlIGZpcnN0LiAqLwoJCXJldHVybiAodXNlciAvIFhUX0xJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CgoJcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBYVF9MSU1JVF9TQ0FMRTsKfQoKc3RhdGljIGludAppcHRfbGltaXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCgkJICAgICBjb25zdCB2b2lkICppbmYsCgkJICAgICB2b2lkICptYXRjaGluZm8sCgkJICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAoJCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKewoJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gbWF0Y2hpbmZvOwoKCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9yYXRlaW5mbykpKQoJCXJldHVybiAwOwoKCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KCWlmIChyLT5idXJzdCA9PSAwCgkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhyLT5hdmcpKSB7CgkJcHJpbnRrKCJPdmVyZmxvdyBpbiB4dF9saW1pdCwgdHJ5IGxvd2VyOiAldS8ldVxuIiwKCQkgICAgICAgci0+YXZnLCByLT5idXJzdCk7CgkJcmV0dXJuIDA7Cgl9CgoJLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIFhUX0xJTUlUX1NDQUxFOiBjb252ZXJ0IHRvIGppZmZpZXMgKgoJICAgMTI4LiAqLwoJci0+cHJldiA9IGppZmZpZXM7CglyLT5jcmVkaXQgPSB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpOwkgLyogQ3JlZGl0cyBmdWxsLiAqLwoJci0+Y3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7IC8qIENyZWRpdHMgZnVsbC4gKi8KCXItPmNvc3QgPSB1c2VyMmNyZWRpdHMoci0+YXZnKTsKCgkvKiBGb3IgU01QLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIG9uZSBzZXQgb2YgY291bnRlcnMuICovCglyLT5tYXN0ZXIgPSByOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgc3RydWN0IHh0X21hdGNoIGlwdF9saW1pdF9yZWcgPSB7CgkubmFtZQkJPSAibGltaXQiLAoJLm1hdGNoCQk9IGlwdF9saW1pdF9tYXRjaCwKCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCgkubWUJCT0gVEhJU19NT0RVTEUsCn07CnN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbGltaXQ2X3JlZyA9IHsKCS5uYW1lCQk9ICJsaW1pdCIsCgkubWF0Y2gJCT0gaXB0X2xpbWl0X21hdGNoLAoJLmNoZWNrZW50cnkJPSBpcHRfbGltaXRfY2hlY2tlbnRyeSwKCS5tZQkJPSBUSElTX01PRFVMRSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKewoJaW50IHJldDsKCQoJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmlwdF9saW1pdF9yZWcpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJCglyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmxpbWl0Nl9yZWcpOwoJaWYgKHJldCkKCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpcHRfbGltaXRfcmVnKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQp7Cgl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpcHRfbGltaXRfcmVnKTsKCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZsaW1pdDZfcmVnKTsKfQoKbW9kdWxlX2luaXQoaW5pdCk7Cm1vZHVsZV9leGl0KGZpbmkpOwo=