LyoKICogIGxpbnV4L2ZzL2JpbmZtdF9lbTg2LmMKICoKICogIEJhc2VkIG9uIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYwogKiAgQ29weXJpZ2h0IChDKSAxOTk2ICBNYXJ0aW4gdm9uIEz2d2lzCiAqICBvcmlnaW5hbCAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KICoKICogIGVtODYgY2hhbmdlcyBDb3B5cmlnaHQgKEMpIDE5OTcgIEppbSBQYXJhZGlzCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiNpbmNsdWRlIDxsaW51eC9lbGYuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgoKCiNkZWZpbmUgRU04Nl9JTlRFUlAJIi91c3IvYmluL2VtODYiCiNkZWZpbmUgRU04Nl9JX05BTUUJImVtODYiCgpzdGF0aWMgaW50IGxvYWRfZW04NihzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7CgljaGFyICppbnRlcnAsICppX25hbWUsICppX2FyZzsKCXN0cnVjdCBmaWxlICogZmlsZTsKCWludCByZXR2YWw7CglzdHJ1Y3QgZWxmaGRyCWVsZl9leDsKCgkvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIExpbnV4L0ludGVsIEVMRiBleGVjdXRhYmxlLi4uICovCgllbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopYnBybS0+YnVmKTsKCglpZiAobWVtY21wKGVsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCgkJcmV0dXJuICAtRU5PRVhFQzsKCgkvKiBGaXJzdCBvZiBhbGwsIHNvbWUgc2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNrcyAqLwoJaWYgKChlbGZfZXguZV90eXBlICE9IEVUX0VYRUMgJiYgZWxmX2V4LmVfdHlwZSAhPSBFVF9EWU4pIHx8CgkJKCEoKGVsZl9leC5lX21hY2hpbmUgPT0gRU1fMzg2KSB8fCAoZWxmX2V4LmVfbWFjaGluZSA9PSBFTV80ODYpKSkgfHwKCQkoIWJwcm0tPmZpbGUtPmZfb3AgfHwgIWJwcm0tPmZpbGUtPmZfb3AtPm1tYXApKSB7CgkJCXJldHVybiAtRU5PRVhFQzsKCX0KCglicHJtLT5zaF9iYW5nKys7CS8qIFdlbGwsIHRoZSBiYW5nLXNoZWxsIGlzIGltcGxpY2l0Li4uICovCglhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CglmcHV0KGJwcm0tPmZpbGUpOwoJYnBybS0+ZmlsZSA9IE5VTEw7CgoJLyogVW5saWtlIGluIHRoZSBzY3JpcHQgY2FzZSwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgaGFpcnkKCSAqIHBhcnNpbmcgdG8gZmluZCBvdXIgaW50ZXJwcmV0ZXIuLi4gaXQncyBoYXJkY29kZWQhCgkgKi8KCWludGVycCA9IEVNODZfSU5URVJQOwoJaV9uYW1lID0gRU04Nl9JX05BTUU7CglpX2FyZyA9IE5VTEw7CQkvKiBXZSByZXNlcnZlIHRoZSByaWdodCB0byBhZGQgYW4gYXJnIGxhdGVyICovCgoJLyoKCSAqIFNwbGljZSBpbiAoMSkgdGhlIGludGVycHJldGVyJ3MgbmFtZSBmb3IgYXJndlswXQoJICogICAgICAgICAgICgyKSAob3B0aW9uYWwpIGFyZ3VtZW50IHRvIGludGVycHJldGVyCgkgKiAgICAgICAgICAgKDMpIGZpbGVuYW1lIG9mIGVtdWxhdGVkIGZpbGUgKHJlcGxhY2UgYXJndlswXSkKCSAqCgkgKiBUaGlzIGlzIGRvbmUgaW4gcmV2ZXJzZSBvcmRlciwgYmVjYXVzZSBvZiBob3cgdGhlCgkgKiB1c2VyIGVudmlyb25tZW50IGFuZCBhcmd1bWVudHMgYXJlIHN0b3JlZC4KCSAqLwoJcmVtb3ZlX2FyZ196ZXJvKGJwcm0pOwoJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmYnBybS0+ZmlsZW5hbWUsIGJwcm0pOwoJaWYgKHJldHZhbCA8IDApIHJldHVybiByZXR2YWw7IAoJYnBybS0+YXJnYysrOwoJaWYgKGlfYXJnKSB7CgkJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmaV9hcmcsIGJwcm0pOwoJCWlmIChyZXR2YWwgPCAwKSByZXR1cm4gcmV0dmFsOyAKCQlicHJtLT5hcmdjKys7Cgl9CglyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX25hbWUsIGJwcm0pOwoJaWYgKHJldHZhbCA8IDApCXJldHVybiByZXR2YWw7CglicHJtLT5hcmdjKys7CgoJLyoKCSAqIE9LLCBub3cgcmVzdGFydCB0aGUgcHJvY2VzcyB3aXRoIHRoZSBpbnRlcnByZXRlcidzIGlub2RlLgoJICogTm90ZSB0aGF0IHdlIHVzZSBvcGVuX2V4ZWMoKSBhcyB0aGUgbmFtZSBpcyBub3cgaW4ga2VybmVsCgkgKiBzcGFjZSwgYW5kIHdlIGRvbid0IG5lZWQgdG8gY29weSBpdC4KCSAqLwoJZmlsZSA9IG9wZW5fZXhlYyhpbnRlcnApOwoJaWYgKElTX0VSUihmaWxlKSkKCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKCglicHJtLT5maWxlID0gZmlsZTsKCglyZXR2YWwgPSBwcmVwYXJlX2JpbnBybShicHJtKTsKCWlmIChyZXR2YWwgPCAwKQoJCXJldHVybiByZXR2YWw7CgoJcmV0dXJuIHNlYXJjaF9iaW5hcnlfaGFuZGxlcihicHJtLCByZWdzKTsKfQoKc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZW04Nl9mb3JtYXQgPSB7CgkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAoJLmxvYWRfYmluYXJ5CT0gbG9hZF9lbTg2LAp9OwoKc3RhdGljIGludCBfX2luaXQgaW5pdF9lbTg2X2JpbmZtdCh2b2lkKQp7CglyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZlbTg2X2Zvcm1hdCk7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2VtODZfYmluZm10KHZvaWQpCnsKCXVucmVnaXN0ZXJfYmluZm10KCZlbTg2X2Zvcm1hdCk7Cn0KCmNvcmVfaW5pdGNhbGwoaW5pdF9lbTg2X2JpbmZtdCk7Cm1vZHVsZV9leGl0KGV4aXRfZW04Nl9iaW5mbXQpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==