LyoKICogVVNCIFZpQ2FtIFdlYkNhbSBkcml2ZXIKICogQ29weXJpZ2h0IChjKSAyMDAyIEpvZSBCdXJrcyAoamJ1cmtzQHdhdmljbGUub3JnKSwKICogICAgICAgICAgICAgICAgICAgIENocmlzdG9waGVyIEwgQ2hlbmV5IChjY2hlbmV5QGNoZW5leS5jeCksCiAqICAgICAgICAgICAgICAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opLAogKiAgICAgICAgICAgICAgICAgICAgSm9obiBUeW5lciAoanR5bmVyQGNzLnVjci5lZHUpLAogKiAgICAgICAgICAgICAgICAgICAgTW9ucm9lIFdpbGxpYW1zIChtb25yb2VAcG9ib3guY29tKQogKgogKiBTdXBwb3J0cyAzQ09NIEhvbWVDb25uZWN0IFBDIERpZ2l0YWwgV2ViQ2FtCiAqIFN1cHBvcnRzIENvbXBybyBQUzM5VSBXZWJDYW0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgYmFzZWQgaGVhdmlseSBvbiB0aGUgQ1BpQSB3ZWJjYW0gZHJpdmVyIHdoaWNoIHdhcwogKiB3cml0dGVuIGJ5IFBldGVyIFByZWdsZXIsIFNjb3R0IEouIEJlcnRpbiBhbmQgSm9oYW5uZXMgRXJkZmVsdAogKgogKiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgd2VyZSBhbHNvIGNvcGllZCBmcm9tIHVzYnZpZGVvLmMKICoKICogU3BlY2lhbCB0aGFua3MgdG8gdGhlIHdob2xlIHRlYW0gYXQgU291cmNlZm9yZ2UgZm9yIGhlbHAgbWFraW5nCiAqIHRoaXMgZHJpdmVyIGJlY29tZSBhIHJlYWxpdHkuICBOb3RhYmx5OgogKiBBbmR5IEFybXN0cm9uZyB3aG8gcmV2ZXJzZSBlbmdpbmVlcmVkIHRoZSBjb2xvciBlbmNvZGluZyBhbmQKICogUGF2ZWwgTWFjaGVrIGFuZCBDaHJpcyBDaGVuZXkgd2hvIHdvcmtlZCBvbiByZXZlcnNlIGVuZ2luZWVyaW5nIHRoZQogKiAgICBjYW1lcmEgY29udHJvbHMgYW5kIHdyb3RlIHRoZSBmaXJzdCBnZW5lcmF0aW9uIGRyaXZlci4KICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiNpbmNsdWRlIDxsaW51eC91c2IuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlICJ1c2J2aWRlby5oIgoKLy8gI2RlZmluZSBWSUNBTV9ERUJVRwoKI2lmZGVmIFZJQ0FNX0RFQlVHCiNkZWZpbmUgQURCRyhsaW5lbm8sZm10LGFyZ3MuLi4pIHByaW50ayhmbXQsIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgbGluZW5vLCAjI2FyZ3MpCiNkZWZpbmUgREJHKGZtdCxhcmdzLi4uKSBBREJHKChfX0xJTkVfXyksS0VSTl9ERUJVRyBfX0ZJTEVfXyIoJWxkKTolcyAoJWQpOiJmbXQsIyNhcmdzKQojZWxzZQojZGVmaW5lIERCRyhmbW4sYXJncy4uLikgZG8ge30gd2hpbGUoMCkKI2VuZGlmCgojZGVmaW5lIERSSVZFUl9BVVRIT1IgICAgICAgICAgICJKb2UgQnVya3MsIGpidXJrc0B3YXZpY2xlLm9yZyIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgICAgICAgICAiVmlDYW0gV2ViQ2FtIERyaXZlciIKCi8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KI2RlZmluZSBVU0JfVklDQU1fVkVORE9SX0lECTB4MDRjMQojZGVmaW5lIFVTQl9WSUNBTV9QUk9EVUNUX0lECTB4MDA5ZAojZGVmaW5lIFVTQl9DT01QUk9fVkVORE9SX0lECTB4MDYwMgojZGVmaW5lIFVTQl9DT01QUk9fUFJPRFVDVF9JRAkweDEwMDEKCiNkZWZpbmUgVklDQU1fQllURVNfUEVSX1BJWEVMICAgMwojZGVmaW5lIFZJQ0FNX01BWF9SRUFEX1NJWkUgICAgICg1MTIqMjQyKzEyOCkKI2RlZmluZSBWSUNBTV9NQVhfRlJBTUVfU0laRSAgICAoVklDQU1fQllURVNfUEVSX1BJWEVMKjMyMCoyNDApCiNkZWZpbmUgVklDQU1fRlJBTUVTICAgICAgICAgICAgMgoKI2RlZmluZSBWSUNBTV9IRUFERVJfU0laRSAgICAgICA2NAoKI2RlZmluZSBjbGFtcCggeCwgbCwgaCApICAgICAgICBtYXhfdCggX190eXBlb2ZfXyggeCApLCAgICAgICAgIFwKCQkJCSAgICAgICAoIGwgKSwgICAgICAgICAgICAgICAgICAgXAoJCQkJICAgICAgIG1pbl90KCBfX3R5cGVvZl9fKCB4ICksICBcCgkJCQkJICAgICAgKCBoICksICAgICAgICAgICAgXAoJCQkJCSAgICAgICggeCApICkgKQoKLyogTm90IHN1cmUgd2hhdCBhbGwgdGhlIGJ5dGVzIGluIHRoZXNlIGNoYXIKICogYXJyYXlzIGRvLCBidXQgdGhleSdyZSBuZWNlc3NhcnkgdG8gbWFrZQogKiB0aGUgY2FtZXJhIHdvcmsuCiAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAxW10gPSB7CgkweEI2LCAweEMzLCAweDFGLCAweDAwLCAweDAyLCAweDY0LCAweEU3LCAweDY3LAoJMHhGRCwgMHhGRiwgMHgwRSwgMHhDMCwgMHhFNywgMHgwOSwgMHhERSwgMHgwMCwKCTB4OEUsIDB4MDAsIDB4QzAsIDB4MDksIDB4NDAsIDB4MDMsIDB4QzAsIDB4MTcsCgkweDQ0LCAweDAzLCAweDRCLCAweEFGLCAweEMwLCAweDA3LCAweDAwLCAweDAwLAoJMHg0QiwgMHhBRiwgMHg5NywgMHhDRiwgMHgwMCwgMHgwMAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAyW10gPSB7CgkweEI2LCAweEMzLCAweDAzLCAweDAwLCAweDAzLCAweDY0LCAweDE4LCAweDAwLAoJMHgwMCwgMHgwMAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAzW10gPSB7CgkweEI2LCAweEMzLCAweDAxLCAweDAwLCAweDA2LCAweDY0LCAweDAwLCAweDAwCn07CgpzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDRbXSA9IHsKCTB4QjYsIDB4QzMsIDB4OEYsIDB4MDYsIDB4MDIsIDB4NjQsIDB4RTcsIDB4MDcsCgkweDAwLCAweDAwLCAweDA4LCAweEMwLCAweEU3LCAweDA3LCAweDAwLCAweDAwLAoJMHgzRSwgMHhDMCwgMHhFNywgMHgwNywgMHg1NCwgMHgwMSwgMHhBQSwgMHgwMCwKCTB4RTcsIDB4MDcsIDB4QzgsIDB4MDUsIDB4QjYsIDB4MDAsIDB4RTcsIDB4MDcsCgkweDQyLCAweDAxLCAweEQyLCAweDAwLCAweEU3LCAweDA3LCAweDdDLCAweDAwLAoJMHgxNiwgMHgwMCwgMHhFNywgMHgwNywgMHg1NiwgMHgwMCwgMHgxOCwgMHgwMCwKCTB4RTcsIDB4MDcsIDB4MDYsIDB4MDAsIDB4OTIsIDB4QzAsIDB4RTcsIDB4MDcsCgkweDAwLCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDA3LCAweEZGLCAweEZGLAoJMHgyMiwgMHhDMCwgMHhFNywgMHgwNywgMHgwNCwgMHgwMCwgMHgyNCwgMHhDMCwKCTB4RTcsIDB4MDcsIDB4RUMsIDB4MjcsIDB4MjgsIDB4QzAsIDB4RTcsIDB4MDcsCgkweDE2LCAweDAxLCAweDhFLCAweDAwLCAweEU3LCAweDg3LCAweDAxLCAweDAwLAoJMHgwRSwgMHhDMCwgMHg5NywgMHhDRiwgMHhENywgMHgwOSwgMHgwMCwgMHhDMCwKCTB4RTcsIDB4NzcsIDB4MDEsIDB4MDAsIDB4OTIsIDB4QzAsIDB4MDksIDB4QzEsCgkweEU3LCAweDA5LCAweEZFLCAweDA1LCAweDI0LCAweDAxLCAweEU3LCAweDA5LAoJMHgwNCwgMHgwNiwgMHgyNiwgMHgwMSwgMHhFNywgMHgwNywgMHgwNywgMHgwMCwKCTB4OTIsIDB4QzAsIDB4RTcsIDB4MDUsIDB4MDAsIDB4QzAsIDB4QzAsIDB4REYsCgkweDk3LCAweENGLCAweDE3LCAweDAwLCAweDU3LCAweDAwLCAweDE3LCAweDAyLAoJMHhENywgMHgwOSwgMHgwMCwgMHhDMCwgMHhFNywgMHg3NywgMHgwMSwgMHgwMCwKCTB4OTIsIDB4QzAsIDB4MEEsIDB4QzEsIDB4RTcsIDB4NTcsIDB4RkYsIDB4RkYsCgkweEZBLCAweDA1LCAweDBELCAweEMwLCAweEU3LCAweDU3LCAweDAwLCAweDAwLAoJMHhGQSwgMHgwNSwgMHgwRiwgMHhDMCwgMHg5RiwgMHhBRiwgMHhDNiwgMHgwMCwKCTB4RTcsIDB4MDUsIDB4MDAsIDB4QzAsIDB4QzgsIDB4MDUsIDB4QzEsIDB4MDUsCgkweEMwLCAweDA1LCAweEMwLCAweERGLCAweDk3LCAweENGLCAweDI3LCAweERBLAoJMHhGQSwgMHgwNSwgMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwQiwgMHgwNiwKCTB4NzMsIDB4Q0YsIDB4OUYsIDB4QUYsIDB4NzgsIDB4MDEsIDB4OUYsIDB4QUYsCgkweDFBLCAweDAzLCAweDZFLCAweENGLCAweEU3LCAweDA5LCAweEZDLCAweDA1LAoJMHgyNCwgMHgwMSwgMHhFNywgMHgwOSwgMHgwMiwgMHgwNiwgMHgyNiwgMHgwMSwKCTB4RTcsIDB4MDcsIDB4MDcsIDB4MDAsIDB4OTIsIDB4QzAsIDB4RTcsIDB4MDksCgkweEZDLCAweDA1LCAweEZFLCAweDA1LCAweEU3LCAweDA5LCAweDAyLCAweDA2LAoJMHgwNCwgMHgwNiwgMHhFNywgMHgwOSwgMHgwMCwgMHgwNiwgMHhGQywgMHgwNSwKCTB4RTcsIDB4MDksIDB4RkUsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MjcsIDB4REEsCgkweEZBLCAweDA1LCAweEU3LCAweDU3LCAweDAxLCAweDAwLCAweEZBLCAweDA1LAoJMHgwMiwgMHhDQSwgMHgwNCwgMHhDMCwgMHg5NywgMHhDRiwgMHg5RiwgMHhBRiwKCTB4NjYsIDB4MDUsIDB4OTcsIDB4Q0YsIDB4RTcsIDB4MDcsIDB4NDAsIDB4MDAsCgkweDAyLCAweDA2LCAweEM4LCAweDA5LCAweEZDLCAweDA1LCAweDlGLCAweEFGLAoJMHhEQSwgMHgwMiwgMHg5NywgMHhDRiwgMHhDRiwgMHgxNywgMHgwMiwgMHgwMCwKCTB4RUYsIDB4NTcsIDB4ODEsIDB4MDAsIDB4MDksIDB4MDYsIDB4OUYsIDB4QTAsCgkweEI2LCAweDAxLCAweEVGLCAweDU3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAoJMHg5RiwgMHhBMCwgMHg0MCwgMHgwMiwgMHhFRiwgMHg1NywgMHgwMSwgMHgwMCwKCTB4MEIsIDB4MDYsIDB4OUYsIDB4QTAsIDB4NDYsIDB4MDMsIDB4RTcsIDB4MDcsCgkweDAxLCAweDAwLCAweDBBLCAweEMwLCAweDQ2LCAweEFGLCAweDQ3LCAweEFGLAoJMHg5RiwgMHhBRiwgMHg0MCwgMHgwMiwgMHhFNywgMHgwNywgMHgyRSwgMHgwMCwKCTB4MEEsIDB4QzAsIDB4RUYsIDB4ODcsIDB4ODAsIDB4MDAsIDB4MDksIDB4MDYsCgkweDk3LCAweENGLCAweDAwLCAweDBFLCAweDAxLCAweDAwLCAweEMwLCAweDU3LAoJMHg1MSwgMHgwMCwgMHg5RiwgMHhDMCwgMHg5RSwgMHgwMiwgMHhDMCwgMHg1NywKCTB4NTAsIDB4MDAsIDB4MjAsIDB4QzAsIDB4QzAsIDB4NTcsIDB4NTUsIDB4MDAsCgkweDEyLCAweEMwLCAweEMwLCAweDU3LCAweDU2LCAweDAwLCAweDlGLCAweEMwLAoJMHg3MiwgMHgwMiwgMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHhDMSwgMHgwQiwKCTB4MDgsIDB4MDYsIDB4MDEsIDB4RDAsIDB4NkYsIDB4OTAsIDB4MDgsIDB4MDYsCgkweEMwLCAweDA3LCAweDA4LCAweDAwLCAweEMxLCAweDBCLCAweDA4LCAweDA2LAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHg5NywgMHhDRiwgMHgyRiwgMHgwRSwKCTB4MDIsIDB4MDAsIDB4MDgsIDB4MDYsIDB4QzAsIDB4MDcsIDB4MDgsIDB4MDAsCgkweEMxLCAweDBCLCAweDA4LCAweDA2LCAweDlGLCAweEFGLCAweDI4LCAweDA1LAoJMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHgyRiwgMHgwRSwgMHgwMiwgMHgwMCwKCTB4MDksIDB4MDYsIDB4RUYsIDB4ODcsIDB4ODAsIDB4MDAsIDB4MDksIDB4MDYsCgkweDlGLCAweENGLCAweEQ2LCAweDAyLCAweEVGLCAweDY3LCAweDdGLCAweEZGLAoJMHgwOSwgMHgwNiwgMHhFNywgMHg2NywgMHhGRiwgMHhGRCwgMHgyMiwgMHhDMCwKCTB4RTcsIDB4NjcsIDB4RUYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsCgkweDEwLCAweDAwLCAweDI4LCAweEMwLCAweDlGLCAweEFGLCAweEI4LCAweDA1LAoJMHhFNywgMHg4NywgMHhFMCwgMHgyMSwgMHgyNCwgMHhDMCwgMHg5RiwgMHhBRiwKCTB4QTgsIDB4MDUsIDB4RTcsIDB4ODcsIDB4MDgsIDB4MDAsIDB4MjQsIDB4QzAsCgkweEU3LCAweDY3LCAweERGLCAweEZGLCAweDI0LCAweEMwLCAweEM4LCAweDA3LAoJMHgwQSwgMHgwMCwgMHhDMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhDMSwgMHgwNywKCTB4MDEsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4OUYsIDB4QUYsCgkweEI4LCAweDA1LCAweEMwLCAweDA3LCAweDlFLCAweDAwLCAweDlGLCAweEFGLAoJMHg0NCwgMHgwNSwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwgMHgyNCwgMHhDMCwKCTB4QzAsIDB4MDksIDB4MjAsIDB4QzAsIDB4RTcsIDB4ODcsIDB4MDAsIDB4MDEsCgkweDI0LCAweEMwLCAweEMwLCAweDc3LCAweDAwLCAweDAyLCAweDBGLCAweEMxLAoJMHhFNywgMHg2NywgMHhGNywgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywKCTB4RjcsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsIDB4MDgsIDB4MDAsCgkweDI0LCAweEMwLCAweDA4LCAweERBLCAweDVFLCAweEMxLCAweEVGLCAweDA3LAoJMHg4MCwgMHgwMCwgMHgwOSwgMHgwNiwgMHg5NywgMHhDRiwgMHhFRiwgMHgwNywKCTB4MDEsIDB4MDAsIDB4MEEsIDB4MDYsIDB4OTcsIDB4Q0YsIDB4RUYsIDB4MDcsCgkweDAwLCAweDAwLCAweDBCLCAweDA2LCAweEVGLCAweDA3LCAweDAwLCAweDAwLAoJMHgwQSwgMHgwNiwgMHhFRiwgMHg2NywgMHg3RiwgMHhGRiwgMHgwOSwgMHgwNiwKCTB4RUYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDYsIDB4RTcsIDB4NjcsCgkweEVGLCAweEZGLCAweDI4LCAweEMwLCAweEU3LCAweDY3LCAweDE3LCAweEQ4LAoJMHgyNCwgMHhDMCwgMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHgxRSwgMHhDMCwKCTB4RTcsIDB4MDcsIDB4RkYsIDB4RkYsIDB4MjIsIDB4QzAsIDB4OTcsIDB4Q0YsCgkweEM4LCAweDA3LCAweDBFLCAweDA2LCAweDlGLCAweEFGLCAweERBLCAweDAyLAoJMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHhGMiwgMHgwNSwgMHhFNywgMHgwNywKCTB4MTAsIDB4MDAsIDB4RjYsIDB4MDUsIDB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsCgkweEY0LCAweDA1LCAweEU3LCAweDA3LCAweEQ2LCAweDAyLCAweEY4LCAweDA1LAoJMHhDOCwgMHgwNywgMHhGMiwgMHgwNSwgMHhDMSwgMHgwNywgMHgwMCwgMHg4MCwKCTB4NTAsIDB4QUYsIDB4OTcsIDB4Q0YsIDB4MkYsIDB4MEMsIDB4MDIsIDB4MDAsCgkweDA3LCAweDA2LCAweDJGLCAweDBDLCAweDA0LCAweDAwLCAweDA2LCAweDA2LAoJMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHhGMiwgMHgwNSwgMHhFNywgMHgwNywKCTB4MTAsIDB4MDAsIDB4RjYsIDB4MDUsIDB4RTcsIDB4MDcsIDB4RTIsIDB4MDUsCgkweEY0LCAweDA1LCAweEU3LCAweDA3LCAweENFLCAweDAyLCAweEY4LCAweDA1LAoJMHhDOCwgMHgwNywgMHhGMiwgMHgwNSwgMHhDMSwgMHgwNywgMHgwMCwgMHg4MCwKCTB4NTEsIDB4QUYsIDB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsIDB4NjYsIDB4MDQsCgkweDlGLCAweEFGLCAweDFBLCAweDAzLCAweDU5LCAweEFGLCAweDk3LCAweENGLAoJMHhDMCwgMHgwNywgMHgwRSwgMHgwMCwgMHhDMSwgMHgwQiwgMHgwQywgMHgwNiwKCTB4NDEsIDB4RDEsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDNDLCAweDAwLCAweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweDY4LCAweDAwLAoJMHhDMCwgMHgwNywgMHgzQiwgMHgwMCwgMHg5RiwgMHhBRiwgMHg0NCwgMHgwNSwKCTB4NkYsIDB4MDAsIDB4MEMsIDB4MDYsIDB4NjgsIDB4MDAsIDB4RTAsIDB4MDcsCgkweDA0LCAweDAxLCAweEU4LCAweDBCLCAweDBBLCAweDA2LCAweEU4LCAweDA3LAoJMHgwMCwgMHgwMCwgMHhFMCwgMHgwNywgMHgwMCwgMHgwMiwgMHhFMCwgMHgwNywKCTB4RUMsIDB4MDEsIDB4RTAsIDB4MDcsIDB4RkMsIDB4RkYsIDB4OTcsIDB4Q0YsCgkweEU3LCAweDA3LCAweEZGLCAweEZGLCAweEZBLCAweDA1LCAweEVGLCAweDA3LAoJMHgwMCwgMHgwMCwgMHgwQiwgMHgwNiwgMHhFNywgMHgwNywgMHgwRSwgMHgwNiwKCTB4MjQsIDB4MDEsIDB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsIDB4RkUsIDB4MDUsCgkweEU3LCAweDA3LCAweDQwLCAweDAwLCAweDI2LCAweDAxLCAweEU3LCAweDA3LAoJMHg0MCwgMHgwMCwgMHgwNCwgMHgwNiwgMHhFNywgMHgwNywgMHgwNywgMHgwMCwKCTB4OTIsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RUYsIDB4MDcsIDB4MDIsIDB4MDAsCgkweDBCLCAweDA2LCAweDlGLCAweEFGLCAweDc4LCAweDAxLCAweEVGLCAweDc3LAoJMHg4MCwgMHgwMCwgMHgwNywgMHgwNiwgMHg5RiwgMHhDMCwgMHgxNCwgMHgwNCwKCTB4RUYsIDB4NzcsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDYsIDB4MzcsIDB4QzAsCgkweEVGLCAweDc3LCAweDAxLCAweDAwLCAweDBELCAweDA2LCAweDBGLCAweEMxLAoJMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwRCwgMHgwNiwgMHhDMCwgMHgwNywKCTB4MDIsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MzAsIDB4MDAsIDB4OUYsIDB4QUYsCgkweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDAxLCAweDAwLCAweEMxLCAweDA3LAoJMHgwMiwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDOCwgMHgwNywKCTB4RkYsIDB4NEYsIDB4OUYsIDB4QUYsIDB4QTgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDM4LCAweDAwLCAweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweEMxLCAweDc3LAoJMHgwMywgMHgwMCwgMHgwMiwgMHhDMSwgMHgwOCwgMHhEQSwgMHg3NSwgMHhDMSwKCTB4QzEsIDB4NzcsIDB4MDEsIDB4MDAsIDB4MEEsIDB4QzEsIDB4QzAsIDB4MDcsCgkweDAxLCAweDAwLCAweEMxLCAweDA3LCAweDAyLCAweDAwLCAweDlGLCAweEFGLAoJMHgyOCwgMHgwNSwgMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwNiwgMHgwNiwKCTB4MkMsIDB4Q0YsIDB4QzAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4QzEsIDB4MDcsCgkweDA0LCAweDAwLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEVGLCAweDA3LAoJMHgwMCwgMHgwMCwgMHgwNiwgMHgwNiwgMHgyMiwgMHhDRiwgMHhFRiwgMHgwNywKCTB4MDAsIDB4MDAsIDB4MEQsIDB4MDYsIDB4RUYsIDB4NTcsIDB4MDEsIDB4MDAsCgkweDA2LCAweDA2LCAweDFCLCAweEMwLCAweEMwLCAweDA3LCAweDAxLCAweDAwLAoJMHhDMSwgMHgwNywgMHgwMSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4QzAsIDB4MDcsIDB4MDIsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MzAsIDB4MDAsCgkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEM4LCAweDA3LCAweEZGLCAweDRGLAoJMHg5RiwgMHhBRiwgMHhBOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgzOCwgMHgwMCwKCTB4OUYsIDB4QUYsIDB4NDQsIDB4MDUsIDB4QzEsIDB4NjcsIDB4MDMsIDB4MDAsCgkweEMxLCAweDU3LCAweDAzLCAweDAwLCAweDAyLCAweEMwLCAweDA4LCAweERBLAoJMHg3MywgMHhDMSwgMHhDMCwgMHgwNywgMHgwMiwgMHgwMCwgMHhDMSwgMHgwNywKCTB4MTIsIDB4MDAsIDB4RUYsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDYsCgkweDAyLCAweEMwLCAweEMxLCAweDA3LCAweDIzLCAweDAwLCAweDlGLCAweEFGLAoJMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgxNCwgMHgwMCwgMHhDMSwgMHgwQiwKCTB4RUEsIDB4MDUsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDNFLCAweDAwLCAweDlGLCAweEFGLCAweDBBLCAweDA1LCAweEU3LCAweDA5LAoJMHhFNCwgMHgwNSwgMHhGQSwgMHgwNSwgMHgyNywgMHhEOCwgMHhGQSwgMHgwNSwKCTB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsIDB4RkMsIDB4MDUsIDB4RTcsIDB4MDcsCgkweDRFLCAweDA2LCAweDAwLCAweDA2LCAweEU3LCAweDA3LCAweDQwLCAweDAwLAoJMHgwMiwgMHgwNiwgMHg5RiwgMHhBRiwgMHg2NiwgMHgwNSwgMHg5RiwgMHhBRiwKCTB4QzYsIDB4MDAsIDB4OTcsIDB4Q0YsIDB4QzEsIDB4MEIsIDB4RTIsIDB4MDUsCgkweDQxLCAweEQwLCAweDAxLCAweEQyLCAweEMxLCAweDE3LCAweDIzLCAweDAwLAoJMHg5RiwgMHhBRiwgMHhEQywgMHgwNCwgMHhDMCwgMHgwNywgMHgwNCwgMHgwMCwKCTB4QzEsIDB4MEIsIDB4RTMsIDB4MDUsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCgkweEMwLCAweDA3LCAweDA2LCAweDAwLCAweEMxLCAweDA5LCAweEU2LCAweDA1LAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwNywgMHgwMCwKCTB4QzEsIDB4MDksIDB4RTYsIDB4MDUsIDB4QzEsIDB4RDEsIDB4OUYsIDB4QUYsCgkweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBCLCAweDAwLCAweEMxLCAweDA5LAoJMHhFOCwgMHgwNSwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywKCTB4MEMsIDB4MDAsIDB4QzEsIDB4MDksIDB4RTgsIDB4MDUsIDB4QzEsIDB4RDEsCgkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBELCAweDAwLAoJMHhDMSwgMHgwNywgMHgwOSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4QzAsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MzIsIDB4MDAsCgkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBGLCAweDAwLAoJMHhDMSwgMHgwNywgMHgwMCwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4OTcsIDB4Q0YsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RDksIDB4MjQsIDB4QzAsCgkweEM4LCAweDA3LCAweDBBLCAweDAwLCAweDQwLCAweDAwLCAweEMwLCAweDY3LAoJMHgwMCwgMHgwMiwgMHgyNywgMHg4MCwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKCTB4MDAsIDB4MDQsIDB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RjksCgkweDI0LCAweEMwLCAweDAxLCAweEQyLCAweDA4LCAweERBLCAweDcyLCAweEMxLAoJMHhFNywgMHg4NywgMHgwMCwgMHgyMCwgMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwKCTB4MjcsIDB4MDAsIDB4MUUsIDB4QzAsIDB4RTcsIDB4ODcsIDB4RkYsIDB4MDAsCgkweDIyLCAweEMwLCAweEU3LCAweDY3LCAweDdGLCAweEZGLCAweDI0LCAweEMwLAoJMHhFNywgMHg4NywgMHg4MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKCTB4ODAsIDB4MDAsIDB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsCgkweDBBLCAweDA1LCAweDY3LCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDY3LAoJMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywgMHg0MCwgMHgwMCwKCTB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsIDB4MjQsIDB4QzAsCgkweDk3LCAweENGLCAweDlGLCAweEFGLCAweDBBLCAweDA1LCAweEU3LCAweDY3LAoJMHgwMCwgMHhGRiwgMHgyMiwgMHhDMCwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwKCTB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsIDB4MjQsIDB4QzAsCgkweEMxLCAweDA5LCAweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDAwLCAweDAxLAoJMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwgMHhDMCwgMHgwNywgMHg0MCwgMHgwMCwKCTB4QzgsIDB4MDksIDB4RkMsIDB4MDUsIDB4RTcsIDB4NjcsIDB4MDAsIDB4RkYsCgkweDIyLCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEZFLCAweDI0LCAweEMwLAoJMHhFNywgMHg2NywgMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywKCTB4QkYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4MDAsIDB4REEsIDB4RTgsIDB4MDksCgkweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDQwLCAweDAwLCAweDI0LCAweEMwLAoJMHhFNywgMHg4NywgMHg0MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHgwMCwgMHhEQSwKCTB4RTgsIDB4MDksIDB4MjAsIDB4QzAsIDB4NkQsIDB4QzEsIDB4RTcsIDB4ODcsCgkweDAwLCAweDAxLCAweDI0LCAweEMwLCAweDk3LCAweENGLCAweEU3LCAweDA3LAoJMHgzMiwgMHgwMCwgMHgxMiwgMHhDMCwgMHhFNywgMHg3NywgMHgwMCwgMHg4MCwKCTB4MTIsIDB4QzAsIDB4N0MsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RTcsIDB4MDcsCgkweDIwLCAweDRFLCAweDEyLCAweEMwLCAweEU3LCAweDc3LCAweDAwLCAweDgwLAoJMHgxMiwgMHhDMCwgMHg3QywgMHhDMCwgMHg5NywgMHhDRiwgMHgwOSwgMHgwMiwKCTB4MTksIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4ODAsIDB4OTYsIDB4MDksCgkweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwNywgMHgwNSwgMHg4MSwgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCn07CgpzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDVbXSA9IHsKCTB4QjYsIDB4QzMsIDB4MkYsIDB4MDEsIDB4MDMsIDB4NjQsIDB4MEUsIDB4MDAsCgkweDE0LCAweDAwLCAweDFBLCAweDAwLCAweDIwLCAweDAwLCAweDI2LCAweDAwLAoJMHg0QSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2QSwgMHgwMCwgMHg5MiwgMHgwMCwKCTB4OUEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4QjIsIDB4MDAsIDB4QjgsIDB4MDAsCgkweEJFLCAweDAwLCAweEMyLCAweDAwLCAweEM4LCAweDAwLCAweENFLCAweDAwLAoJMHhEQywgMHgwMCwgMHhEQSwgMHgwMCwgMHhFMiwgMHgwMCwgMHhFMCwgMHgwMCwKCTB4RTgsIDB4MDAsIDB4RTYsIDB4MDAsIDB4RUUsIDB4MDAsIDB4RUMsIDB4MDAsCgkweEYyLCAweDAwLCAweEY4LCAweDAwLCAweDAyLCAweDAxLCAweDBBLCAweDAxLAoJMHgwRSwgMHgwMSwgMHgxMiwgMHgwMSwgMHgxRSwgMHgwMSwgMHgyMiwgMHgwMSwKCTB4MjgsIDB4MDEsIDB4MkMsIDB4MDEsIDB4MzIsIDB4MDEsIDB4MzYsIDB4MDEsCgkweDQ0LCAweDAxLCAweDUwLCAweDAxLCAweDVFLCAweDAxLCAweDcyLCAweDAxLAoJMHg3NiwgMHgwMSwgMHg3QSwgMHgwMSwgMHg4MCwgMHgwMSwgMHg4OCwgMHgwMSwKCTB4OEMsIDB4MDEsIDB4OTQsIDB4MDEsIDB4OUMsIDB4MDEsIDB4QTAsIDB4MDEsCgkweEE0LCAweDAxLCAweEFBLCAweDAxLCAweEIwLCAweDAxLCAweEI0LCAweDAxLAoJMHhCQSwgMHgwMSwgMHhEMCwgMHgwMSwgMHhEQSwgMHgwMSwgMHhGNiwgMHgwMSwKCTB4RkEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MzQsIDB4MDIsIDB4M0MsIDB4MDIsCgkweDQ0LCAweDAyLCAweDRBLCAweDAyLCAweDUwLCAweDAyLCAweDU2LCAweDAyLAoJMHg3NCwgMHgwMiwgMHg3OCwgMHgwMiwgMHg3RSwgMHgwMiwgMHg4NCwgMHgwMiwKCTB4OEEsIDB4MDIsIDB4ODgsIDB4MDIsIDB4OTAsIDB4MDIsIDB4OEUsIDB4MDIsCgkweDk0LCAweDAyLCAweEEyLCAweDAyLCAweEE4LCAweDAyLCAweEFFLCAweDAyLAoJMHhCNCwgMHgwMiwgMHhCQSwgMHgwMiwgMHhCOCwgMHgwMiwgMHhDMCwgMHgwMiwKCTB4QkUsIDB4MDIsIDB4QzQsIDB4MDIsIDB4RDAsIDB4MDIsIDB4RDQsIDB4MDIsCgkweEUwLCAweDAyLCAweEU2LCAweDAyLCAweEVFLCAweDAyLCAweEY4LCAweDAyLAoJMHhGQywgMHgwMiwgMHgwNiwgMHgwMywgMHgxRSwgMHgwMywgMHgyNCwgMHgwMywKCTB4MjgsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MkUsIDB4MDMsIDB4M0MsIDB4MDMsCgkweDRBLCAweDAzLCAweDRFLCAweDAzLCAweDU0LCAweDAzLCAweDU4LCAweDAzLAoJMHg1RSwgMHgwMywgMHg2NiwgMHgwMywgMHg2RSwgMHgwMywgMHg3QSwgMHgwMywKCTB4ODYsIDB4MDMsIDB4OEUsIDB4MDMsIDB4OTYsIDB4MDMsIDB4QjIsIDB4MDMsCgkweEI4LCAweDAzLCAweEM2LCAweDAzLCAweENDLCAweDAzLCAweEQ0LCAweDAzLAoJMHhEQSwgMHgwMywgMHhFOCwgMHgwMywgMHhGNCwgMHgwMywgMHhGQywgMHgwMywKCTB4MDQsIDB4MDQsIDB4MjAsIDB4MDQsIDB4MkEsIDB4MDQsIDB4MzIsIDB4MDQsCgkweDM2LCAweDA0LCAweDNFLCAweDA0LCAweDQ0LCAweDA0LCAweDQyLCAweDA0LAoJMHg0OCwgMHgwNCwgMHg0RSwgMHgwNCwgMHg0QywgMHgwNCwgMHg1NCwgMHgwNCwKCTB4NTIsIDB4MDQsIDB4NUEsIDB4MDQsIDB4NUUsIDB4MDQsIDB4NjIsIDB4MDQsCgkweDY4LCAweDA0LCAweDc0LCAweDA0LCAweDdDLCAweDA0LCAweDgwLCAweDA0LAoJMHg4OCwgMHgwNCwgMHg4QywgMHgwNCwgMHg5NCwgMHgwNCwgMHg5QSwgMHgwNCwKCTB4QTIsIDB4MDQsIDB4QTYsIDB4MDQsIDB4QUUsIDB4MDQsIDB4QjQsIDB4MDQsCgkweEMwLCAweDA0LCAweENDLCAweDA0LCAweEQ4LCAweDA0LCAweDJBLCAweDA1LAoJMHg0NiwgMHgwNSwgMHg2QywgMHgwNSwgMHgwMCwgMHgwMAp9OwoKLyogcnZtYWxsb2MgLyBydmZyZWUgY29waWVkIGZyb20gdXNidmlkZW8uYwogKgogKiBOb3Qgc3VyZSB3aHkgdGhlc2UgYXJlIG5vdCB5ZXQgbm9uLXN0YXRpY3Mgd2hpY2ggSSBjYW4gcmVmZXJlbmNlIHRocm91Z2gKICogdXNidmlkZW8uaCB0aGUgc2FtZSBhcyBpdCBpcyBpbiAyLjQuMjAuICBJIGJldCB0aGlzIHdpbGwgZ2V0IGZpeGVkIHNvbWV0aW1lCiAqIGluIHRoZSBmdXR1cmUuCiAqCiovCnN0YXRpYyB2b2lkICpydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCnsKCXZvaWQgKm1lbTsKCXVuc2lnbmVkIGxvbmcgYWRyOwoKCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwoJbWVtID0gdm1hbGxvY18zMihzaXplKTsKCWlmICghbWVtKQoJCXJldHVybiBOVUxMOwoKCW1lbXNldChtZW0sIDAsIHNpemUpOyAvKiBDbGVhciB0aGUgcmFtIG91dCwgbm8ganVuayB0byB0aGUgdXNlciAqLwoJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKCXdoaWxlIChzaXplID4gMCkgewoJCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKCQlhZHIgKz0gUEFHRV9TSVpFOwoJCXNpemUgLT0gUEFHRV9TSVpFOwoJfQoKCXJldHVybiBtZW07Cn0KCnN0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJdW5zaWduZWQgbG9uZyBhZHI7CgoJaWYgKCFtZW0pCgkJcmV0dXJuOwoKCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07Cgl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CgkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CgkJYWRyICs9IFBBR0VfU0laRTsKCQlzaXplIC09IFBBR0VfU0laRTsKCX0KCXZmcmVlKG1lbSk7Cn0KCnN0cnVjdCB2aWNhbV9jYW1lcmEgewoJdTE2IHNodXR0ZXJfc3BlZWQ7CS8vIGNhcHR1cmUgc2h1dHRlciBzcGVlZAoJdTE2IGdhaW47CQkvLyBjYXB0dXJlIGdhaW4KCgl1OCAqcmF3X2ltYWdlOwkJLy8gcmF3IGRhdGEgY2FwdHVyZWQgZnJvbSB0aGUgY2FtZXJhCgl1OCAqZnJhbWVidWY7CQkvLyBwcm9jZXNzZWQgZGF0YSBpbiBSR0IyNCBmb3JtYXQKCXU4ICpjbnRybGJ1ZjsJCS8vIGFyZWEgdXNlZCB0byBzZW5kIGNvbnRyb2wgbXNncwoKCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsJLy8gdjRsIHZpZGVvIGRldmljZQoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8vIHVzYiBkZXZpY2UKCgkvKiBndWFyZCBhZ2FpbnN0IHNpbXVsdGFuZW91cyBhY2Nlc3NlcyB0byB0aGUgY2FtZXJhICovCglzdHJ1Y3QgbXV0ZXggY2FtX2xvY2s7CgoJaW50IGlzX2luaXRpYWxpemVkOwoJdTggb3Blbl9jb3VudDsKCXU4IGJ1bGtFbmRwb2ludDsKCWludCBuZWVkc0R1bW15UmVhZDsKfTsKCnN0YXRpYyBpbnQgdmljYW1fcHJvYmUoIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwpzdGF0aWMgdm9pZCB2aWNhbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKc3RhdGljIHZvaWQgcmVhZF9mcmFtZShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZW51bSk7CnN0YXRpYyB2b2lkIHZpY2FtX2RlY29kZV9jb2xvcihjb25zdCB1OCAqLCB1OCAqKTsKCnN0YXRpYyBpbnQgX19zZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwKCQkJICAgICAgdTggcmVxdWVzdCwKCQkJICAgICAgdTE2IHZhbHVlLAoJCQkgICAgICB1MTYgaW5kZXgsCgkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNwLAoJCQkgICAgICB1MTYgc2l6ZSkKewoJaW50IHN0YXR1czsKCgkvKiBjcCBtdXN0IGJlIG1lbW9yeSB0aGF0IGhhcyBiZWVuIGFsbG9jYXRlZCBieSBrbWFsbG9jICovCgoJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKGNhbS0+dWRldiwKCQkJCSB1c2Jfc25kY3RybHBpcGUoY2FtLT51ZGV2LCAwKSwKCQkJCSByZXF1ZXN0LAoJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKCQkJCSBVU0JfUkVDSVBfREVWSUNFLCB2YWx1ZSwgaW5kZXgsCgkJCQkgY3AsIHNpemUsIDEwMDApOwoKCXN0YXR1cyA9IG1pbihzdGF0dXMsIDApOwoKCWlmIChzdGF0dXMgPCAwKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHNlbmRpbmcgY29udHJvbCBtZXNzYWdlLCBlcnJvciAlZC5cbiIsCgkJICAgICAgIHN0YXR1cyk7Cgl9CgoJcmV0dXJuIHN0YXR1czsKfQoKc3RhdGljIGludCBzZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwKCQkJICAgIHU4IHJlcXVlc3QsCgkJCSAgICB1MTYgdmFsdWUsCgkJCSAgICB1MTYgaW5kZXgsCgkJCSAgICB1bnNpZ25lZCBjaGFyICpjcCwKCQkJICAgIHUxNiBzaXplKQp7CglpbnQgc3RhdHVzID0gLUVOT0RFVjsKCW11dGV4X2xvY2soJmNhbS0+Y2FtX2xvY2spOwoJaWYgKGNhbS0+dWRldikgewoJCXN0YXR1cyA9IF9fc2VuZF9jb250cm9sX21zZyhjYW0sIHJlcXVlc3QsIHZhbHVlLAoJCQkJCSAgICBpbmRleCwgY3AsIHNpemUpOwoJfQoJbXV0ZXhfdW5sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCXJldHVybiBzdGF0dXM7Cn0Kc3RhdGljIGludAppbml0aWFsaXplX2NhbWVyYShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0pCnsKCWNvbnN0IHN0cnVjdCB7CgkJdTggKmRhdGE7CgkJdTMyIHNpemU7Cgl9IGZpcm13YXJlW10gPSB7CgkJeyAuZGF0YSA9IHNldHVwMSwgLnNpemUgPSBzaXplb2Yoc2V0dXAxKSB9LAoJCXsgLmRhdGEgPSBzZXR1cDIsIC5zaXplID0gc2l6ZW9mKHNldHVwMikgfSwKCQl7IC5kYXRhID0gc2V0dXAzLCAuc2l6ZSA9IHNpemVvZihzZXR1cDMpIH0sCgkJeyAuZGF0YSA9IHNldHVwNCwgLnNpemUgPSBzaXplb2Yoc2V0dXA0KSB9LAoJCXsgLmRhdGEgPSBzZXR1cDUsIC5zaXplID0gc2l6ZW9mKHNldHVwNSkgfSwKCQl7IC5kYXRhID0gc2V0dXAzLCAuc2l6ZSA9IHNpemVvZihzZXR1cDMpIH0sCgkJeyAuZGF0YSA9IE5VTEwsIC5zaXplID0gMCB9Cgl9OwoKCWludCBlcnIsIGk7CgoJZm9yIChpID0gMCwgZXJyID0gMDsgZmlybXdhcmVbaV0uZGF0YSAmJiAhZXJyOyBpKyspIHsKCQltZW1jcHkoY2FtLT5jbnRybGJ1ZiwgZmlybXdhcmVbaV0uZGF0YSwgZmlybXdhcmVbaV0uc2l6ZSk7CgoJCWVyciA9IHNlbmRfY29udHJvbF9tc2coY2FtLCAweGZmLCAwLCAwLAoJCQkJICAgICAgIGNhbS0+Y250cmxidWYsIGZpcm13YXJlW2ldLnNpemUpOwoJfQoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQKc2V0X2NhbWVyYV9wb3dlcihzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0sIGludCBzdGF0ZSkKewoJaW50IHN0YXR1czsKCglpZiAoKHN0YXR1cyA9IHNlbmRfY29udHJvbF9tc2coY2FtLCAweDUwLCBzdGF0ZSwgMCwgTlVMTCwgMCkpIDwgMCkKCQlyZXR1cm4gc3RhdHVzOwoKCWlmIChzdGF0ZSkgewoJCXNlbmRfY29udHJvbF9tc2coY2FtLCAweDU1LCAxLCAwLCBOVUxMLCAwKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp2aWNhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGlvY3RsbnIsIHVuc2lnbmVkIGxvbmcgYXJnKQp7Cgl2b2lkIF9fdXNlciAqdXNlcl9hcmcgPSAodm9pZCBfX3VzZXIgKilhcmc7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CglpbnQgcmV0dmFsID0gMDsKCglpZiAoIWNhbSkKCQlyZXR1cm4gLUVOT0RFVjsKCglzd2l0Y2ggKGlvY3RsbnIpIHsKCQkvKiBxdWVyeSBjYXBhYmlsaXRpZXMgKi8KCWNhc2UgVklESU9DR0NBUDoKCQl7CgkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGI7CgoJCQlEQkcoIlZJRElPQ0dDQVBcbiIpOwoJCQltZW1zZXQoJmIsIDAsIHNpemVvZihiKSk7CgkJCXN0cmNweShiLm5hbWUsICJWaUNhbS1iYXNlZCBDYW1lcmEiKTsKCQkJYi50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKCQkJYi5jaGFubmVscyA9IDE7CgkJCWIuYXVkaW9zID0gMDsKCQkJYi5tYXh3aWR0aCA9IDMyMDsJLyogVklERU9TSVpFX0NJRiAqLwoJCQliLm1heGhlaWdodCA9IDI0MDsKCQkJYi5taW53aWR0aCA9IDMyMDsJLyogVklERU9TSVpFXzQ4XzQ4ICovCgkJCWIubWluaGVpZ2h0ID0gMjQwOwoKCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmIsIHNpemVvZihiKSkpCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoKCQkJYnJlYWs7CgkJfQoJCS8qIGdldC9zZXQgdmlkZW8gc291cmNlIC0gd2UgYXJlIGEgY2FtZXJhIGFuZCBub3RoaW5nIGVsc2UgKi8KCWNhc2UgVklESU9DR0NIQU46CgkJewoJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCB2OwoKCQkJREJHKCJWSURJT0NHQ0hBTlxuIik7CgkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgdXNlcl9hcmcsIHNpemVvZih2KSkpIHsKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAodi5jaGFubmVsICE9IDApIHsKCQkJCXJldHZhbCA9IC1FSU5WQUw7CgkJCQlicmVhazsKCQkJfQoKCQkJdi5jaGFubmVsID0gMDsKCQkJc3RyY3B5KHYubmFtZSwgIkNhbWVyYSIpOwoJCQl2LnR1bmVycyA9IDA7CgkJCXYuZmxhZ3MgPSAwOwoJCQl2LnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKCQkJdi5ub3JtID0gMDsKCgkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZ2LCBzaXplb2YodikpKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoKCWNhc2UgVklESU9DU0NIQU46CgkJewoJCQlpbnQgdjsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgdXNlcl9hcmcsIHNpemVvZih2KSkpCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQlEQkcoIlZJRElPQ1NDSEFOICVkXG4iLCB2KTsKCgkJCWlmIChyZXR2YWwgPT0gMCAmJiB2ICE9IDApCgkJCQlyZXR2YWwgPSAtRUlOVkFMOwoKCQkJYnJlYWs7CgkJfQoKCQkvKiBpbWFnZSBwcm9wZXJ0aWVzICovCgljYXNlIFZJRElPQ0dQSUNUOgoJCXsKCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgdnA7CgkJCURCRygiVklESU9DR1BJQ1RcbiIpOwoJCQltZW1zZXQoJnZwLCAwLCBzaXplb2YgKHN0cnVjdCB2aWRlb19waWN0dXJlKSk7CgkJCXZwLmJyaWdodG5lc3MgPSBjYW0tPmdhaW4gPDwgODsKCQkJdnAuZGVwdGggPSAyNDsKCQkJdnAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CgkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZ2cCwgc2l6ZW9mIChzdHJ1Y3QgdmlkZW9fcGljdHVyZSkpKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoKCWNhc2UgVklESU9DU1BJQ1Q6CgkJewoJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cDsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcigmdnAsIHVzZXJfYXJnLCBzaXplb2YodnApKSkgewoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJCWJyZWFrOwoJCQl9CgoJCQlEQkcoIlZJRElPQ1NQSUNUIGRlcHRoID0gJWQsIHBhbCA9ICVkXG4iLCB2cC5kZXB0aCwKCQkJICAgIHZwLnBhbGV0dGUpOwoKCQkJY2FtLT5nYWluID0gdnAuYnJpZ2h0bmVzcyA+PiA4OwoKCQkJaWYgKHZwLmRlcHRoICE9IDI0CgkJCSAgICB8fCB2cC5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkdCMjQpCgkJCQlyZXR2YWwgPSAtRUlOVkFMOwoKCQkJYnJlYWs7CgkJfQoKCQkvKiBnZXQvc2V0IGNhcHR1cmUgd2luZG93ICovCgljYXNlIFZJRElPQ0dXSU46CgkJewoJCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OwoJCQl2dy54ID0gMDsKCQkJdncueSA9IDA7CgkJCXZ3LndpZHRoID0gMzIwOwoJCQl2dy5oZWlnaHQgPSAyNDA7CgkJCXZ3LmNocm9tYWtleSA9IDA7CgkJCXZ3LmZsYWdzID0gMDsKCQkJdncuY2xpcHMgPSBOVUxMOwoJCQl2dy5jbGlwY291bnQgPSAwOwoKCQkJREJHKCJWSURJT0NHV0lOXG4iKTsKCgkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICh2b2lkICopJnZ3LCBzaXplb2YodncpKSkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgoJCQkvLyBJJ20gbm90IHN1cmUgd2hhdCB0aGUgZGVhbCB3aXRoIGEgY2FwdHVyZSB3aW5kb3cgaXMsIGl0IGlzIHZlcnkgcG9vcmx5IGRlc2NyaWJlZAoJCQkvLyBpbiB0aGUgZG9jLiAgU28gSSB3b24ndCBzdXBwb3J0IGl0IG5vdy4KCQkJYnJlYWs7CgkJfQoKCWNhc2UgVklESU9DU1dJTjoKCQl7CgoJCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OwoKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2dywgdXNlcl9hcmcsIHNpemVvZih2dykpKSB7CgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQkJYnJlYWs7CgkJCX0KCgkJCURCRygiVklESU9DU1dJTiAlZCB4ICVkXG4iLCB2dy53aWR0aCwgdncuaGVpZ2h0KTsKCgkJCWlmICggdncud2lkdGggIT0gMzIwIHx8IHZ3LmhlaWdodCAhPSAyNDAgKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCgkJCWJyZWFrOwoJCX0KCgkJLyogbW1hcCBpbnRlcmZhY2UgKi8KCWNhc2UgVklESU9DR01CVUY6CgkJewoJCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiB2bTsKCQkJaW50IGk7CgoJCQlEQkcoIlZJRElPQ0dNQlVGXG4iKTsKCQkJbWVtc2V0KCZ2bSwgMCwgc2l6ZW9mICh2bSkpOwoJCQl2bS5zaXplID0KCQkJICAgIFZJQ0FNX01BWF9GUkFNRV9TSVpFICogVklDQU1fRlJBTUVTOwoJCQl2bS5mcmFtZXMgPSBWSUNBTV9GUkFNRVM7CgkJCWZvciAoaSA9IDA7IGkgPCBWSUNBTV9GUkFNRVM7IGkrKykKCQkJCXZtLm9mZnNldHNbaV0gPSBWSUNBTV9NQVhfRlJBTUVfU0laRSAqIGk7CgoJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAodm9pZCAqKSZ2bSwgc2l6ZW9mKHZtKSkpCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoKCQkJYnJlYWs7CgkJfQoKCWNhc2UgVklESU9DTUNBUFRVUkU6CgkJewoJCQlzdHJ1Y3QgdmlkZW9fbW1hcCB2bTsKCQkJLy8gaW50IHZpZGVvX3NpemU7CgoJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdm0sIHVzZXJfYXJnLCBzaXplb2Yodm0pKSkgewoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJCWJyZWFrOwoJCQl9CgoJCQlEQkcoIlZJRElPQ01DQVBUVVJFIGZyYW1lPSVkLCBoZWlnaHQ9JWQsIHdpZHRoPSVkLCBmb3JtYXQ9JWQuXG4iLHZtLmZyYW1lLHZtLndpZHRoLHZtLmhlaWdodCx2bS5mb3JtYXQpOwoKCQkJaWYgKCB2bS5mcmFtZSA+PSBWSUNBTV9GUkFNRVMgfHwgdm0uZm9ybWF0ICE9IFZJREVPX1BBTEVUVEVfUkdCMjQgKQoJCQkJcmV0dmFsID0gLUVJTlZBTDsKCgkJCS8vIGluIHRoZW9yeSByaWdodCBoZXJlIHdlJ2Qgc3RhcnQgdGhlIGltYWdlIGNhcHR1cmluZwoJCQkvLyAoZmlsbCBpbiBhIGJ1bGsgdXJiIGFuZCBzdWJtaXQgaXQgYXN5bmNocm9ub3VzbHkpCgkJCS8vCgkJCS8vIEluc3RlYWQgd2UncmUgZ29pbmcgdG8gZG8gYSB0b3RhbCBoYWNrIGpvYiBmb3Igbm93IGFuZAoJCQkvLyByZXRyaWV2ZSB0aGUgZnJhbWUgaW4gVklESU9DU1lOQwoKCQkJYnJlYWs7CgkJfQoKCWNhc2UgVklESU9DU1lOQzoKCQl7CgkJCWludCBmcmFtZTsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZmcmFtZSwgdXNlcl9hcmcsIHNpemVvZihpbnQpKSkgewoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJCWJyZWFrOwoJCQl9CgkJCURCRygiVklESU9DU1lOQzogJWRcbiIsIGZyYW1lKTsKCgkJCXJlYWRfZnJhbWUoY2FtLCBmcmFtZSk7CgkJCXZpY2FtX2RlY29kZV9jb2xvcihjYW0tPnJhd19pbWFnZSwKCQkJCQkgICBjYW0tPmZyYW1lYnVmICsKCQkJCQkgICBmcmFtZSAqIFZJQ0FNX01BWF9GUkFNRV9TSVpFICk7CgoJCQlicmVhazsKCQl9CgoJCS8qIHBvaW50bGVzcyB0byBpbXBsZW1lbnQgb3ZlcmxheSB3aXRoIHRoaXMgY2FtZXJhICovCgljYXNlIFZJRElPQ0NBUFRVUkU6CgljYXNlIFZJRElPQ0dGQlVGOgoJY2FzZSBWSURJT0NTRkJVRjoKCWNhc2UgVklESU9DS0VZOgoJCXJldHZhbCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoJCS8qIHR1bmVyIGludGVyZmFjZSAtIHdlIGhhdmUgbm9uZSAqLwoJY2FzZSBWSURJT0NHVFVORVI6CgljYXNlIFZJRElPQ1NUVU5FUjoKCWNhc2UgVklESU9DR0ZSRVE6CgljYXNlIFZJRElPQ1NGUkVROgoJCXJldHZhbCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoJCS8qIGF1ZGlvIGludGVyZmFjZSAtIHdlIGhhdmUgbm9uZSAqLwoJY2FzZSBWSURJT0NHQVVESU86CgljYXNlIFZJRElPQ1NBVURJTzoKCQlyZXR2YWwgPSAtRUlOVkFMOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR2YWwgPSAtRU5PSU9DVExDTUQ7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIGludAp2aWNhbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0KCSAgICAoc3RydWN0IHZpY2FtX2NhbWVyYSAqKSBkZXYtPnByaXY7CglEQkcoIm9wZW5cbiIpOwoKCWlmICghY2FtKSB7CgkJcHJpbnRrKEtFUk5fRVJSCgkJICAgICAgICJ2aWNhbSB2aWRlb19kZXZpY2UgaW1wcm9wZXJseSBpbml0aWFsaXplZCIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8qIHRoZSB2aWRlb2Rldl9sb2NrIGhlbGQgYWJvdmUgdXMgcHJvdGVjdHMgdXMgZnJvbQoJICogc2ltdWx0YW5lb3VzIG9wZW5zLi4uZm9yIG5vdy4gd2UgcHJvYmFibHkgc2hvdWxkbid0CgkgKiByZWx5IG9uIHRoaXMgZmFjdCBmb3JldmVyLgoJICovCgoJaWYgKGNhbS0+b3Blbl9jb3VudCA+IDApIHsKCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJ2aWNhbV9vcGVuIGNhbGxlZCBvbiBhbHJlYWR5IG9wZW5lZCBjYW1lcmEiKTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoKCWNhbS0+cmF3X2ltYWdlID0ga21hbGxvYyhWSUNBTV9NQVhfUkVBRF9TSVpFLCBHRlBfS0VSTkVMKTsKCWlmICghY2FtLT5yYXdfaW1hZ2UpIHsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgljYW0tPmZyYW1lYnVmID0gcnZtYWxsb2MoVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOwoJaWYgKCFjYW0tPmZyYW1lYnVmKSB7CgkJa2ZyZWUoY2FtLT5yYXdfaW1hZ2UpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWNhbS0+Y250cmxidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CglpZiAoIWNhbS0+Y250cmxidWYpIHsKCQlrZnJlZShjYW0tPnJhd19pbWFnZSk7CgkJcnZmcmVlKGNhbS0+ZnJhbWVidWYsIFZJQ0FNX01BWF9GUkFNRV9TSVpFICogVklDQU1fRlJBTUVTKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgkvLyBGaXJzdCB1cGxvYWQgZmlybXdhcmUsIHRoZW4gdHVybiB0aGUgY2FtZXJhIG9uCgoJaWYgKCFjYW0tPmlzX2luaXRpYWxpemVkKSB7CgkJaW5pdGlhbGl6ZV9jYW1lcmEoY2FtKTsKCgkJY2FtLT5pc19pbml0aWFsaXplZCA9IDE7Cgl9CgoJc2V0X2NhbWVyYV9wb3dlcihjYW0sIDEpOwoKCWNhbS0+bmVlZHNEdW1teVJlYWQgPSAxOwoJY2FtLT5vcGVuX2NvdW50Kys7CgoJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FtOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnZpY2FtX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CglpbnQgb3Blbl9jb3VudDsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoKCURCRygiY2xvc2VcbiIpOwoKCS8qIGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkIGlmCgkgKiB3ZSBmYWlsIHRvIHR1cm4gdGhlIGNhbWVyYSBvZmYuCgkgKi8KCglzZXRfY2FtZXJhX3Bvd2VyKGNhbSwgMCk7CgoJa2ZyZWUoY2FtLT5yYXdfaW1hZ2UpOwoJcnZmcmVlKGNhbS0+ZnJhbWVidWYsIFZJQ0FNX01BWF9GUkFNRV9TSVpFICogVklDQU1fRlJBTUVTKTsKCWtmcmVlKGNhbS0+Y250cmxidWYpOwoKCW11dGV4X2xvY2soJmNhbS0+Y2FtX2xvY2spOwoKCWNhbS0+b3Blbl9jb3VudC0tOwoJb3Blbl9jb3VudCA9IGNhbS0+b3Blbl9jb3VudDsKCXVkZXYgPSBjYW0tPnVkZXY7CgoJbXV0ZXhfdW5sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCglpZiAoIW9wZW5fY291bnQgJiYgIXVkZXYpIHsKCQlrZnJlZShjYW0pOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCB2aWNhbV9kZWNvZGVfY29sb3IoY29uc3QgdTggKmRhdGEsIHU4ICpyZ2IpCnsKCS8qIHZpY2FtX2RlY29kZV9jb2xvciAtIENvbnZlcnQgZnJvbSBWaWNhbSBZLUNyLUNiIHRvIFJHQgoJICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbnJvZSBXaWxsaWFtcyAobW9ucm9lQHBvYm94LmNvbSkKCSAqLwoKCWludCBpLCBwcmV2WSwgbmV4dFk7CgoJcHJldlkgPSA1MTI7CgluZXh0WSA9IDUxMjsKCglkYXRhICs9IFZJQ0FNX0hFQURFUl9TSVpFOwoKCWZvciggaSA9IDA7IGkgPCAyNDA7IGkrKywgZGF0YSArPSA1MTIgKSB7CgkJY29uc3QgaW50IHkgPSAoIGkgKiAyNDIgKSAvIDI0MDsKCgkJaW50IGosIHByZXZYLCBuZXh0WDsKCQlpbnQgWSwgQ3IsIENiOwoKCQlpZiAoIHkgPT0gMjQyIC0gMSApIHsKCQkJbmV4dFkgPSAtNTEyOwoJCX0KCgkJcHJldlggPSAxOwoJCW5leHRYID0gMTsKCgkJZm9yICggaiA9IDA7IGogPCAzMjA7IGorKywgcmdiICs9IDMgKSB7CgkJCWNvbnN0IGludCB4ID0gKCBqICogNTEyICkgLyAzMjA7CgkJCWNvbnN0IHU4ICogY29uc3Qgc3JjID0gJmRhdGFbeF07CgoJCQlpZiAoIHggPT0gNTEyIC0gMSApIHsKCQkJCW5leHRYID0gLTE7CgkJCX0KCgkJCUNyID0gKCBzcmNbcHJldlhdIC0gc3JjWzBdICkgKwoJCQkJKCBzcmNbbmV4dFhdIC0gc3JjWzBdICk7CgkJCUNyIC89IDI7CgoJCQlDYiA9ICggc3JjW3ByZXZZXSAtIHNyY1twcmV2WCArIHByZXZZXSApICsKCQkJCSggc3JjW3ByZXZZXSAtIHNyY1tuZXh0WCArIHByZXZZXSApICsKCQkJCSggc3JjW25leHRZXSAtIHNyY1twcmV2WCArIG5leHRZXSApICsKCQkJCSggc3JjW25leHRZXSAtIHNyY1tuZXh0WCArIG5leHRZXSApOwoJCQlDYiAvPSA0OwoKCQkJWSA9IDExNjAgKiAoIHNyY1swXSArICggQ3IgLyAyICkgLSAxNiApOwoKCQkJaWYgKCBpICYgMSApIHsKCQkJCWludCBDdCA9IENyOwoJCQkJQ3IgPSBDYjsKCQkJCUNiID0gQ3Q7CgkJCX0KCgkJCWlmICggKCB4IF4gaSApICYgMSApIHsKCQkJCUNyID0gLUNyOwoJCQkJQ2IgPSAtQ2I7CgkJCX0KCgkJCXJnYlswXSA9IGNsYW1wKCAoICggWSArICggMjAxNyAqIENiICkgKSArCgkJCQkJNTAwICkgLyA5MDAsIDAsIDI1NSApOwoJCQlyZ2JbMV0gPSBjbGFtcCggKCAoIFkgLSAoIDM5MiAqIENiICkgLQoJCQkJCSAgKCA4MTMgKiBDciApICkgKwoJCQkJCSAgNTAwICkgLyAxMDAwLCAwLCAyNTUgKTsKCQkJcmdiWzJdID0gY2xhbXAoICggKCBZICsgKCAxNTk0ICogQ3IgKSApICsKCQkJCQk1MDAgKSAvIDEzMDAsIDAsIDI1NSApOwoKCQkJcHJldlggPSAtMTsKCQl9CgoJCXByZXZZID0gLTUxMjsKCX0KfQoKc3RhdGljIHZvaWQKcmVhZF9mcmFtZShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZW51bSkKewoJdW5zaWduZWQgY2hhciAqcmVxdWVzdCA9IGNhbS0+Y250cmxidWY7CglpbnQgcmVhbFNodXR0ZXI7CglpbnQgbjsKCWludCBhY3R1YWxfbGVuZ3RoOwoKCWlmIChjYW0tPm5lZWRzRHVtbXlSZWFkKSB7CgkJY2FtLT5uZWVkc0R1bW15UmVhZCA9IDA7CgkJcmVhZF9mcmFtZShjYW0sIGZyYW1lbnVtKTsKCX0KCgltZW1zZXQocmVxdWVzdCwgMCwgMTYpOwoJcmVxdWVzdFswXSA9IGNhbS0+Z2FpbjsJLy8gMCA9IDAlIGdhaW4sIEZGID0gMTAwJSBnYWluCgoJcmVxdWVzdFsxXSA9IDA7CS8vIDUxMngyNDIgY2FwdHVyZQoKCXJlcXVlc3RbMl0gPSAweDkwOwkvLyB0aGUgZnVuY3Rpb24gb2YgdGhlc2UgdHdvIGJ5dGVzCglyZXF1ZXN0WzNdID0gMHgwNzsJLy8gaXMgbm90IHlldCB1bmRlcnN0b29kCgoJaWYgKGNhbS0+c2h1dHRlcl9zcGVlZCA+IDYwKSB7CgkJLy8gU2hvcnQgZXhwb3N1cmUKCQlyZWFsU2h1dHRlciA9CgkJICAgICgoLTE1NjMxOTAwIC8gY2FtLT5zaHV0dGVyX3NwZWVkKSArIDI2MDUzMykgLyAxMDAwOwoJCXJlcXVlc3RbNF0gPSByZWFsU2h1dHRlciAmIDB4RkY7CgkJcmVxdWVzdFs1XSA9IChyZWFsU2h1dHRlciA+PiA4KSAmIDB4RkY7CgkJcmVxdWVzdFs2XSA9IDB4MDM7CgkJcmVxdWVzdFs3XSA9IDB4MDE7Cgl9IGVsc2UgewoJCS8vIExvbmcgZXhwb3N1cmUKCQlyZWFsU2h1dHRlciA9IDE1NjAwIC8gY2FtLT5zaHV0dGVyX3NwZWVkIC0gMTsKCQlyZXF1ZXN0WzRdID0gMDsKCQlyZXF1ZXN0WzVdID0gMDsKCQlyZXF1ZXN0WzZdID0gcmVhbFNodXR0ZXIgJiAweEZGOwoJCXJlcXVlc3RbN10gPSByZWFsU2h1dHRlciA+PiA4OwoJfQoKCS8vIFBlciBKb2huIE1hcmt1cyBCavhybmRhbGVuLCBieXRlIGF0IGluZGV4IDggY2F1c2VzIHByb2JsZW1zIGlmIGl0IGlzbid0IDAKCXJlcXVlc3RbOF0gPSAwOwoJLy8gYnl0ZXMgOS0xNSBkbyBub3Qgc2VlbSB0byBhZmZlY3QgZXhwb3N1cmUgb3IgaW1hZ2UgcXVhbGl0eQoKCW11dGV4X2xvY2soJmNhbS0+Y2FtX2xvY2spOwoKCWlmICghY2FtLT51ZGV2KSB7CgkJZ290byBkb25lOwoJfQoKCW4gPSBfX3NlbmRfY29udHJvbF9tc2coY2FtLCAweDUxLCAweDgwLCAwLCByZXF1ZXN0LCAxNik7CgoJaWYgKG4gPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSCgkJICAgICAgICIgUHJvYmxlbSBzZW5kaW5nIGZyYW1lIGNhcHR1cmUgY29udHJvbCBtZXNzYWdlIik7CgkJZ290byBkb25lOwoJfQoKCW4gPSB1c2JfYnVsa19tc2coY2FtLT51ZGV2LAoJCQkgdXNiX3JjdmJ1bGtwaXBlKGNhbS0+dWRldiwgY2FtLT5idWxrRW5kcG9pbnQpLAoJCQkgY2FtLT5yYXdfaW1hZ2UsCgkJCSA1MTIgKiAyNDIgKyAxMjgsICZhY3R1YWxfbGVuZ3RoLCAxMDAwMCk7CgoJaWYgKG4gPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJQcm9ibGVtIGR1cmluZyBidWxrIHJlYWQgb2YgZnJhbWUgZGF0YTogJWRcbiIsCgkJICAgICAgIG4pOwoJfQoKIGRvbmU6CgltdXRleF91bmxvY2soJmNhbS0+Y2FtX2xvY2spOwp9CgpzdGF0aWMgc3NpemVfdAp2aWNhbV9yZWFkKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MgKQp7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CgoJREJHKCJyZWFkICVkIGJ5dGVzLlxuIiwgKGludCkgY291bnQpOwoKCWlmICgqcHBvcyA+PSBWSUNBTV9NQVhfRlJBTUVfU0laRSkgewoJCSpwcG9zID0gMDsKCQlyZXR1cm4gMDsKCX0KCglpZiAoKnBwb3MgPT0gMCkgewoJCXJlYWRfZnJhbWUoY2FtLCAwKTsKCQl2aWNhbV9kZWNvZGVfY29sb3IoY2FtLT5yYXdfaW1hZ2UsCgkJCQkgICBjYW0tPmZyYW1lYnVmICsKCQkJCSAgIDAgKiBWSUNBTV9NQVhfRlJBTUVfU0laRSk7Cgl9CgoJY291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBWSUNBTV9NQVhfRlJBTUVfU0laRSAtICpwcG9zKTsKCglpZiAoY29weV90b191c2VyKGJ1ZiwgJmNhbS0+ZnJhbWVidWZbKnBwb3NdLCBjb3VudCkpIHsKCQljb3VudCA9IC1FRkFVTFQ7Cgl9IGVsc2UgewoJCSpwcG9zICs9IGNvdW50OwoJfQoKCWlmIChjb3VudCA9PSBWSUNBTV9NQVhfRlJBTUVfU0laRSkgewoJCSpwcG9zID0gMDsKCX0KCglyZXR1cm4gY291bnQ7Cn0KCgpzdGF0aWMgaW50CnZpY2FtX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CgkvLyBUT0RPOiBhbGxvY2F0ZSB0aGUgcmF3IGZyYW1lIGJ1ZmZlciBpZiBuZWNlc3NhcnkKCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOwoJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7Cgl1bnNpZ25lZCBsb25nIHNpemUgID0gdm1hLT52bV9lbmQtdm1hLT52bV9zdGFydDsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhbSkKCQlyZXR1cm4gLUVOT0RFVjsKCglEQkcoInZpY2FtX21tYXA6ICVsZFxuIiwgc2l6ZSk7CgoJLyogV2UgbGV0IG1tYXAgYWxsb2NhdGUgYXMgbXVjaCBhcyBpdCB3YW50cyBiZWNhdXNlIExpbnV4IHdhcyBhZGRpbmcgMjA0OCBieXRlcwoJICogdG8gdGhlIHNpemUgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBmb3IgbW1hcCBhbmQgaXQgd2FzIHNjcmV3aW5nIGFwcHMgdXAuCgkgaWYgKHNpemUgPiBWSUNBTV9GUkFNRVMqVklDQU1fTUFYX0ZSQU1FX1NJWkUpCgkgcmV0dXJuIC1FSU5WQUw7CgkgKi8KCglwb3MgPSAodW5zaWduZWQgbG9uZyljYW0tPmZyYW1lYnVmOwoJd2hpbGUgKHNpemUgPiAwKSB7CgkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKQoJCQlyZXR1cm4gLUVBR0FJTjsKCgkJc3RhcnQgKz0gUEFHRV9TSVpFOwoJCXBvcyArPSBQQUdFX1NJWkU7CgkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCgkJCXNpemUgLT0gUEFHRV9TSVpFOwoJCWVsc2UKCQkJc2l6ZSA9IDA7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpY2FtX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkub3BlbgkJPSB2aWNhbV9vcGVuLAoJLnJlbGVhc2UJPSB2aWNhbV9jbG9zZSwKCS5yZWFkCQk9IHZpY2FtX3JlYWQsCgkubW1hcAkJPSB2aWNhbV9tbWFwLAoJLmlvY3RsCQk9IHZpY2FtX2lvY3RsLAoJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAp9OwoKc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdmljYW1fdGVtcGxhdGUgPSB7Cgkub3duZXIgCQk9IFRISVNfTU9EVUxFLAoJLm5hbWUgCQk9ICJWaUNhbS1iYXNlZCBVU0IgQ2FtZXJhIiwKCS50eXBlIAkJPSBWSURfVFlQRV9DQVBUVVJFLAoJLmhhcmR3YXJlIAk9IFZJRF9IQVJEV0FSRV9WSUNBTSwKCS5mb3BzIAkJPSAmdmljYW1fZm9wcywKCS5taW5vciAJCT0gLTEsCn07CgovKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCnN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB2aWNhbV90YWJsZVtdID0gewoJe1VTQl9ERVZJQ0UoVVNCX1ZJQ0FNX1ZFTkRPUl9JRCwgVVNCX1ZJQ0FNX1BST0RVQ1RfSUQpfSwKCXtVU0JfREVWSUNFKFVTQl9DT01QUk9fVkVORE9SX0lELCBVU0JfQ09NUFJPX1BST0RVQ1RfSUQpfSwKCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB2aWNhbV90YWJsZSk7CgpzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdmljYW1fZHJpdmVyID0gewoJLm5hbWUJCT0gInZpY2FtIiwKCS5wcm9iZQkJPSB2aWNhbV9wcm9iZSwKCS5kaXNjb25uZWN0CT0gdmljYW1fZGlzY29ubmVjdCwKCS5pZF90YWJsZQk9IHZpY2FtX3RhYmxlCn07CgovKioKICoJdmljYW1fcHJvYmUKICoJQGludGY6IHRoZSBpbnRlcmZhY2UKICoJQGlkOiB0aGUgZGV2aWNlIGlkCiAqCiAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCiAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCiAqLwpzdGF0aWMgaW50CnZpY2FtX3Byb2JlKCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKCWludCBidWxrRW5kcG9pbnQgPSAwOwoJY29uc3Qgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOwoJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbTsKCglwcmludGsoS0VSTl9JTkZPICJWaUNhbSBiYXNlZCB3ZWJjYW0gY29ubmVjdGVkXG4iKTsKCglpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKCglEQkcoS0VSTl9ERUJVRyAiSW50ZXJmYWNlICVkLiBoYXMgJXUuIGVuZHBvaW50cyFcbiIsCgkgICAgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsICh1bnNpZ25lZCkgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7CgllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CgoJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApICYmCgkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMikpIHsKCQkvKiB3ZSBmb3VuZCBhIGJ1bGsgaW4gZW5kcG9pbnQgKi8KCQlidWxrRW5kcG9pbnQgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKCX0gZWxzZSB7CgkJcHJpbnRrKEtFUk5fRVJSCgkJICAgICAgICJObyBidWxrIGluIGVuZHBvaW50IHdhcyBmb3VuZCA/ISAodGhpcyBpcyBiYWQpXG4iKTsKCX0KCglpZiAoKGNhbSA9CgkgICAgIGt6YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgdmljYW1fY2FtZXJhKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUga2VybmVsIG1lbW9yeSBmb3IgdmljYW1fY2FtZXJhIHN0cnVjdFxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoKCWNhbS0+c2h1dHRlcl9zcGVlZCA9IDE1OwoKCW11dGV4X2luaXQoJmNhbS0+Y2FtX2xvY2spOwoKCW1lbWNweSgmY2FtLT52ZGV2LCAmdmljYW1fdGVtcGxhdGUsCgkgICAgICAgc2l6ZW9mICh2aWNhbV90ZW1wbGF0ZSkpOwoJY2FtLT52ZGV2LnByaXYgPSBjYW07CS8vIHNvcnQgb2YgYSByZXZlcnNlIG1hcHBpbmcgZm9yIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGdldCB2ZGV2IG9ubHkKCgljYW0tPnVkZXYgPSBkZXY7CgljYW0tPmJ1bGtFbmRwb2ludCA9IGJ1bGtFbmRwb2ludDsKCglpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKSA9PSAtMSkgewoJCWtmcmVlKGNhbSk7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZFxuIik7CgkJcmV0dXJuIC1FSU87Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiVmlDYW0gd2ViY2FtIGRyaXZlciBub3cgY29udHJvbGxpbmcgdmlkZW8gZGV2aWNlICVkXG4iLGNhbS0+dmRldi5taW5vcik7CgoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgY2FtKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKdmljYW1fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKewoJaW50IG9wZW5fY291bnQ7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOwoKCS8qIHdlIG11c3QgdW5yZWdpc3RlciB0aGUgZGV2aWNlIGJlZm9yZSB0YWtpbmcgaXRzCgkgKiBjYW1fbG9jay4gVGhpcyBpcyBiZWNhdXNlIHRoZSB2aWRlbyBvcGVuIGNhbGwKCSAqIGhvbGRzIHRoZSBzYW1lIGxvY2sgYXMgdmlkZW8gdW5yZWdpc3Rlci4gaWYgd2UKCSAqIHVucmVnaXN0ZXIgaW5zaWRlIG9mIHRoZSBjYW1fbG9jayBhbmQgb3BlbiBhbHNvCgkgKiB1c2VzIHRoZSBjYW1fbG9jaywgd2UgZ2V0IGRlYWRsb2NrLgoJICovCgoJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldik7CgoJLyogc3RvcCB0aGUgY2FtZXJhIGZyb20gYmVpbmcgdXNlZCAqLwoKCW11dGV4X2xvY2soJmNhbS0+Y2FtX2xvY2spOwoKCS8qIG1hcmsgdGhlIGNhbWVyYSBhcyBnb25lICovCgoJY2FtLT51ZGV2ID0gTlVMTDsKCgkvKiB0aGUgb25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHN5bmNocm9uaXplIHdpdGgKCSAqIG91ciBjbG9zZS9yZWxlYXNlIGZ1bmN0aW9uIG9uIHdobyBzaG91bGQgcmVsZWFzZQoJICogdGhlIGNhbWVyYSBtZW1vcnkuIGlmIHRoZXJlIGFyZSBhbnkgdXNlcnMgdXNpbmcgdGhlCgkgKiBjYW1lcmEsIGl0J3MgdGhlaXIgam9iLiBpZiB0aGVyZSBhcmUgbm8gdXNlcnMsCgkgKiBpdCdzIG91cnMuCgkgKi8KCglvcGVuX2NvdW50ID0gY2FtLT5vcGVuX2NvdW50OwoKCW11dGV4X3VubG9jaygmY2FtLT5jYW1fbG9jayk7CgoJaWYgKCFvcGVuX2NvdW50KSB7CgkJa2ZyZWUoY2FtKTsKCX0KCglwcmludGsoS0VSTl9ERUJVRyAiVmlDYW0tYmFzZWQgV2ViQ2FtIGRpc2Nvbm5lY3RlZFxuIik7Cn0KCi8qCiAqLwpzdGF0aWMgaW50IF9faW5pdAp1c2JfdmljYW1faW5pdCh2b2lkKQp7CglpbnQgcmV0dmFsOwoJREJHKEtFUk5fSU5GTyAiVmlDYW0tYmFzZWQgV2ViQ2FtIGRyaXZlciBzdGFydHVwXG4iKTsKCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmdmljYW1fZHJpdmVyKTsKCWlmIChyZXR2YWwpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAidXNiX3JlZ2lzdGVyIGZhaWxlZCFcbiIpOwoJcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIHZvaWQgX19leGl0CnVzYl92aWNhbV9leGl0KHZvaWQpCnsKCURCRyhLRVJOX0lORk8KCSAgICAgICAiVmlDYW0tYmFzZWQgV2ViQ2FtIGRyaXZlciBzaHV0ZG93blxuIik7CgoJdXNiX2RlcmVnaXN0ZXIoJnZpY2FtX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KHVzYl92aWNhbV9pbml0KTsKbW9kdWxlX2V4aXQodXNiX3ZpY2FtX2V4aXQpOwoKTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=