LyoKICogRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiA0RyBTeXN0ZW1zIE1UWC0xIGJvYXJkcwogKgogKiAkSWQ6IG10eC0xX2ZsYXNoLmMsdiAxLjIgMjAwNS8xMS8wNyAxMToxNDoyNyBnbGVpeG5lciBFeHAgJAogKgogKiAoQykgMjAwNSBCcnVubyBSYW5kb2xmIDxicnVuby5yYW5kb2xmQDRnLXN5c3RlbXMuYml6PgogKiAoQykgMjAwNSBK9nJuIEVuZ2VsIDxqb2VybkB3b2huaGVpbS5maC13ZWRlbC5kZT4KICoKICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgoKc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBtdHgxX21hcCA9IHsKCS5uYW1lID0gIk1UWC0xIGZsYXNoIiwKCS5iYW5rd2lkdGggPSA0LAoJLnNpemUgPSAweDIwMDAwMDAsCgkucGh5cyA9IDB4MUUwMDAwMDAsCn07CgpzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbXR4MV9wYXJ0aXRpb25zW10gPSB7CiAgICAgICAgewogICAgICAgICAgICAgICAgLm5hbWUgPSAiZmlsZXN5c3RlbSIsCiAgICAgICAgICAgICAgICAuc2l6ZSA9IDB4MDFDMDAwMDAsCiAgICAgICAgICAgICAgICAub2Zmc2V0ID0gMCwKICAgICAgICB9LHsKICAgICAgICAgICAgICAgIC5uYW1lID0gInlhbW9uIiwKICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMDEwMDAwMCwKICAgICAgICAgICAgICAgIC5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCiAgICAgICAgICAgICAgICAubWFza19mbGFncyA9IE1URF9XUklURUFCTEUsCiAgICAgICAgfSx7CiAgICAgICAgICAgICAgICAubmFtZSA9ICJrZXJuZWwiLAogICAgICAgICAgICAgICAgLnNpemUgPSAweDAwMmMwMDAwLAogICAgICAgICAgICAgICAgLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKICAgICAgICB9LHsKICAgICAgICAgICAgICAgIC5uYW1lID0gInlhbW9uIGVudiIsCiAgICAgICAgICAgICAgICAuc2l6ZSA9IDB4MDAwNDAwMDAsCiAgICAgICAgICAgICAgICAub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAogICAgICAgIH0KfTsKCnN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm10eDFfbXRkOwoKaW50IF9faW5pdCBtdHgxX210ZF9pbml0KHZvaWQpCnsKCWludCByZXQgPSAtRU5YSU87CgoJc2ltcGxlX21hcF9pbml0KCZtdHgxX21hcCk7CgoJbXR4MV9tYXAudmlydCA9IGlvcmVtYXAobXR4MV9tYXAucGh5cywgbXR4MV9tYXAuc2l6ZSk7CglpZiAoIW10eDFfbWFwLnZpcnQpCgkJcmV0dXJuIC1FSU87CgoJbXR4MV9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZtdHgxX21hcCk7CglpZiAoIW10eDFfbXRkKQoJCWdvdG8gZXJyOwoKCW10eDFfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwoKCXJldCA9IGFkZF9tdGRfcGFydGl0aW9ucyhtdHgxX210ZCwgbXR4MV9wYXJ0aXRpb25zLAoJCQlBUlJBWV9TSVpFKG10eDFfcGFydGl0aW9ucykpOwoJaWYgKHJldCkKCQlnb3RvIGVycjsKCglyZXR1cm4gMDsKCmVycjoKICAgICAgIGlvdW5tYXAobXR4MV9tYXAudmlydCk7CiAgICAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgbXR4MV9tdGRfY2xlYW51cCh2b2lkKQp7CglpZiAobXR4MV9tdGQpIHsKCQlkZWxfbXRkX3BhcnRpdGlvbnMobXR4MV9tdGQpOwoJCW1hcF9kZXN0cm95KG10eDFfbXRkKTsKCX0KCWlmIChtdHgxX21hcC52aXJ0KQoJCWlvdW5tYXAobXR4MV9tYXAudmlydCk7Cn0KCm1vZHVsZV9pbml0KG10eDFfbXRkX2luaXQpOwptb2R1bGVfZXhpdChtdHgxX210ZF9jbGVhbnVwKTsKCk1PRFVMRV9BVVRIT1IoIkJydW5vIFJhbmRvbGYgPGJydW5vLnJhbmRvbGZANGctc3lzdGVtcy5iaXo+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTVRYLTEgZmxhc2ggbWFwIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK