ZGlmZiAtLWdpdCBhL3NyYy9NYWtlX2JjMy5tYWsgYi9zcmMvTWFrZV9iYzMubWFrCmluZGV4IGU0ODU3NTAuLjIwN2I4NjEgMTAwNjQ0Ci0tLSBhL3NyYy9NYWtlX2JjMy5tYWsKKysrIGIvc3JjL01ha2VfYmMzLm1hawpAQCAtNjUsNiArNjUsNyBAQAogCWZpbGVpby5vYmogXAogCWZvbGQub2JqIFwKIAlnZXRjaGFyLm9iaiBcCisJaGFyZGNvcHkub2JqIFwKIAloYXNodGFibGUub2JqIFwKIAltYWluLm9iaiBcCiAJbWFyay5vYmogXApkaWZmIC0tZ2l0IGEvc3JjL01ha2VfYmM1Lm1hayBiL3NyYy9NYWtlX2JjNS5tYWsKaW5kZXggMTk1ZDc5Zi4uOTkwMDljNSAxMDA2NDQKLS0tIGEvc3JjL01ha2VfYmM1Lm1haworKysgYi9zcmMvTWFrZV9iYzUubWFrCkBAIC01NDYsNiArNTQ2LDcgQEAKIAkkKE9CSkRJUilcZmlsZWlvLm9iaiBcCiAJJChPQkpESVIpXGZvbGQub2JqIFwKIAkkKE9CSkRJUilcZ2V0Y2hhci5vYmogXAorCSQoT0JKRElSKVxoYXJkY29weS5vYmogXAogCSQoT0JKRElSKVxoYXNodGFibGUub2JqIFwKIAkkKE9CSkRJUilcbWFpbi5vYmogXAogCSQoT0JKRElSKVxtYXJrLm9iaiBcCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9jeWcubWFrIGIvc3JjL01ha2VfY3lnLm1hawppbmRleCBjN2Y4MzM3Li44ODBmMjkyIDEwMDY0NAotLS0gYS9zcmMvTWFrZV9jeWcubWFrCisrKyBiL3NyYy9NYWtlX2N5Zy5tYWsKQEAgLTEsNiArMSw2IEBACiAjCiAjIE1ha2VmaWxlIGZvciBWSU0gb24gV2luMzIsIHVzaW5nIEN5Z251cyBnY2MKLSMgTGFzdCB1cGRhdGVkIGJ5IERhbiBTaGFycC4gIExhc3QgQ2hhbmdlOiAyMDA1IE1hciAyMQorIyBMYXN0IHVwZGF0ZWQgYnkgRGFuIFNoYXJwLiAgTGFzdCBDaGFuZ2U6IDIwMDUgSnVsIDIzCiAjCiAjIEFsc28gcmVhZCBJTlNUQUxMcGMudHh0IQogIwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJJChPVVRESVIpL2ZpbGVpby5vIFwKIAkkKE9VVERJUikvZm9sZC5vIFwKIAkkKE9VVERJUikvZ2V0Y2hhci5vIFwKKwkkKE9VVERJUikvaGFyZGNvcHkubyBcCiAJJChPVVRESVIpL2hhc2h0YWJsZS5vIFwKIAkkKE9VVERJUikvbWFpbi5vIFwKIAkkKE9VVERJUikvbWFyay5vIFwKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX2RpY2UubWFrIGIvc3JjL01ha2VfZGljZS5tYWsKaW5kZXggYzVmZWE1ZS4uZmU3NGY1MiAxMDA2NDQKLS0tIGEvc3JjL01ha2VfZGljZS5tYWsKKysrIGIvc3JjL01ha2VfZGljZS5tYWsKQEAgLTQwLDYgKzQwLDcgQEAKIAlmaWxlaW8uYyBcCiAJZm9sZC5jIFwKIAlnZXRjaGFyLmMgXAorCWhhcmRjb3B5LmMgXAogCWhhc2h0YWJsZS5jIFwKIAltYWluLmMgXAogCW1hcmsuYyBcCkBAIC04Miw2ICs4Myw3IEBACiAJby9maWxlaW8ubyBcCiAJby9mb2xkLm8gXAogCW8vZ2V0Y2hhci5vIFwKKwlvL2hhcmRjb3B5Lm8gXAogCW8vaGFzaHRhYmxlLm8gXAogCW8vbWFpbi5vIFwKIAlvL21hcmsubyBcCkBAIC0xNTcsNiArMTU5LDggQEAKIAogby9nZXRjaGFyLm86IGdldGNoYXIuYwkkKFNZTVMpCiAKK28vaGFyZGNvcHkubzogaGFyZGNvcHkuYwkkKFNZTVMpCisKIG8vaGFzaHRhYmxlLm86IGhhc2h0YWJsZS5jCSQoU1lNUykKIAogby9tYWluLm86IG1haW4uYyAkKFNZTVMpCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9kamcubWFrIGIvc3JjL01ha2VfZGpnLm1hawppbmRleCAwYmE1MTQwLi5mYTRhZjQwIDEwMDY0NAotLS0gYS9zcmMvTWFrZV9kamcubWFrCisrKyBiL3NyYy9NYWtlX2RqZy5tYWsKQEAgLTMzLDYgKzMzLDcgQEAKIAlvYmovZmlsZWlvLm8gXAogCW9iai9mb2xkLm8gXAogCW9iai9nZXRjaGFyLm8gXAorCW9iai9oYXJkY29weS5vIFwKIAlvYmovaGFzaHRhYmxlLm8gXAogCW9iai9tYWluLm8gXAogCW9iai9tYXJrLm8gXApkaWZmIC0tZ2l0IGEvc3JjL01ha2VfaXZjLm1hayBiL3NyYy9NYWtlX2l2Yy5tYWsKaW5kZXggMmNhMDcwZS4uNDRmNThmYiAxMDA2NDQKLS0tIGEvc3JjL01ha2VfaXZjLm1haworKysgYi9zcmMvTWFrZV9pdmMubWFrCkBAIC0yMjQsNiArMjI0LDcgQEAKIAkiJChJTlRESVIpL2ZpbGVpby5vYmoiIFwKIAkiJChJTlRESVIpL2ZvbGQub2JqIiBcCiAJIiQoSU5URElSKS9nZXRjaGFyLm9iaiIgXAorCSIkKElOVERJUikvaGFyZGNvcHkub2JqIiBcCiAJIiQoSU5URElSKS9oYXNodGFibGUub2JqIiBcCiAJIiQoSU5URElSKS9tYWluLm9iaiIgXAogCSIkKElOVERJUikvbWFyay5vYmoiIFwKQEAgLTM3OCw2ICszNzksMTAgQEAKICMgRW5kIFNvdXJjZSBGaWxlCiAjIEJlZ2luIFNvdXJjZSBGaWxlCiAKK1NPVVJDRT0uXGhhcmRjb3B5LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKIFNPVVJDRT0uXGhhc2h0YWJsZS5jCiAjIEVuZCBTb3VyY2UgRmlsZQogIyBCZWdpbiBTb3VyY2UgRmlsZQpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfbWFueC5tYWsgYi9zcmMvTWFrZV9tYW54Lm1hawppbmRleCA1YmI4ZTZiLi41MmI5ZTQ4IDEwMDY0NAotLS0gYS9zcmMvTWFrZV9tYW54Lm1haworKysgYi9zcmMvTWFrZV9tYW54Lm1hawpAQCAtNDgsNiArNDgsNyBAQAogCWZpbGVpby5jIFwKIAlmb2xkLmMgXAogCWdldGNoYXIuYyBcCisJaGFyZGNvcHkuYyBcCiAJaGFzaHRhYmxlLmMgXAogCW1haW4uYyBcCiAJbWFyay5jIFwKQEAgLTkyLDYgKzkzLDcgQEAKIAlvYmovZmlsZWlvLm8gXAogCW9iai9mb2xkLm8gXAogCW9iai9nZXRjaGFyLm8gXAorCW9iai9oYXJkY29weS5vIFwKIAlvYmovaGFzaHRhYmxlLm8gXAogCW9iai9tYWluLm8gXAogCW9iai9tYXJrLm8gXApAQCAtMTM0LDYgKzEzNiw3IEBACiAJcHJvdG8vZmlsZWlvLnBybyBcCiAJcHJvdG8vZm9sZC5wcm8gXAogCXByb3RvL2dldGNoYXIucHJvIFwKKwlwcm90by9oYXJkY29weS5wcm8gXAogCXByb3RvL2hhc2h0YWJsZS5wcm8gXAogCXByb3RvL21haW4ucHJvIFwKIAlwcm90by9tYXJrLnBybyBcCkBAIC0yNDksNiArMjUyLDkgQEAKIG9iai9nZXRjaGFyLm86CWdldGNoYXIuYwogCSQoQ0NTWU0pICRAIGdldGNoYXIuYwogCitvYmovaGFyZGNvcHkubzoJaGFyZGNvcHkuYworCSQoQ0NTWU0pICRAIGhhcmRjb3B5LmMKKwogb2JqL2hhc2h0YWJsZS5vOgloYXNodGFibGUuYwogCSQoQ0NTWU0pICRAIGhhc2h0YWJsZS5jCiAKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX21pbmcubWFrIGIvc3JjL01ha2VfbWluZy5tYWsKaW5kZXggNjkwNjI3My4uOWQ3OGRhNSAxMDA2NDQKLS0tIGEvc3JjL01ha2VfbWluZy5tYWsKKysrIGIvc3JjL01ha2VfbWluZy5tYWsKQEAgLTM3MSw2ICszNzEsNyBAQAogCSQoT1VURElSKS9maWxlaW8ubyBcCiAJJChPVVRESVIpL2ZvbGQubyBcCiAJJChPVVRESVIpL2dldGNoYXIubyBcCisJJChPVVRESVIpL2hhcmRjb3B5Lm8gXAogCSQoT1VURElSKS9oYXNodGFibGUubyBcCiAJJChPVVRESVIpL21haW4ubyBcCiAJJChPVVRESVIpL21hcmsubyBcCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9tb3JwaC5tYWsgYi9zcmMvTWFrZV9tb3JwaC5tYWsKaW5kZXggMmM2N2RhYi4uNTQ0MjJmZSAxMDA2NDQKLS0tIGEvc3JjL01ha2VfbW9ycGgubWFrCisrKyBiL3NyYy9NYWtlX21vcnBoLm1hawpAQCAtMzgsNiArMzgsNyBAQAogCWZpbGVpby5jCQkJCQkJXAogCWZvbGQuYwkJCQkJCQlcCiAJZ2V0Y2hhci5jCQkJCQkJXAorCWhhcmRjb3B5LmMJCQkJCQlcCiAJaGFzaHRhYmxlLmMJCQkJCQlcCiAJbWFpbi5jCQkJCQkJCVwKIAltYXJrLmMJCQkJCQkJXApkaWZmIC0tZ2l0IGEvc3JjL01ha2VfbXB3Lm1hayBiL3NyYy9NYWtlX21wdy5tYWsKaW5kZXggNGVlMGU1Mi4uNWJlNzAzYSAxMDA2NDQKLS0tIGEvc3JjL01ha2VfbXB3Lm1haworKysgYi9zcmMvTWFrZV9tcHcubWFrCkBAIC0zMiw2ICszMiw3IEBACiAJCQkJICA6c3JjOmZpbGVpby5jILYKIAkJCQkgIDpzcmM6Zm9sZC5jILYKIAkJCQkgIDpzcmM6Z2V0Y2hhci5jILYKKwkJCQkgIDpzcmM6aGFyZGNvcHkuYyC2CiAJCQkJICA6c3JjOmhhc2h0YWJsZS5jILYKIAkJCQkgIDpzcmM6Z3VpLmMgtgogCQkJCSAgOnNyYzpndWlfbWFjLmMgtgpAQCAtODQsNiArODUsNyBAQAogCQkJCSAgIntPYmpEaXJ9ZmlsZWlvLmMueCIgtgogCQkJCSAgIntPYmpEaXJ9Zm9sZC5jLngiILYKIAkJCQkgICJ7T2JqRGlyfWdldGNoYXIuYy54IiC2CisJCQkJICAie09iakRpcn1oYXJkY29weS5jLngiILYKIAkJCQkgICJ7T2JqRGlyfWhhc2h0YWJsZS5jLngiILYKIAkJCQkgICJ7T2JqRGlyfWd1aS5jLngiILYKIAkJCQkgICJ7T2JqRGlyfWd1aV9tYWMuYy54IiC2CkBAIC0xNjcsNiArMTY5LDcgQEAKICJ7T2JqRGlyfWZpbGVpby5jLngiICDEICA6c3JjOmZpbGVpby5jCiAie09iakRpcn1mb2xkLmMueCIgIMQgIDpzcmM6Zm9sZC5jCiAie09iakRpcn1nZXRjaGFyLmMueCIgIMQgIDpzcmM6Z2V0Y2hhci5jCisie09iakRpcn1oYXJkY29weS5jLngiICDEICA6c3JjOmhhcmRjb3B5LmMKICJ7T2JqRGlyfWhhc2h0YWJsZS5jLngiICDEICA6c3JjOmhhc2h0YWJsZS5jCiAie09iakRpcn1ndWkuYy54IiAgxCAgOnNyYzpndWkuYwogIntPYmpEaXJ9Z3VpX21hYy5jLngiICDEICA6c3JjOmd1aV9tYWMuYwpAQCAtMjU3LDYgKzI2MCw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0zMzksNiArMzQzLDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTQyMSw2ICs0MjYsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtNTAzLDYgKzUwOSw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC01ODUsNiArNTkyLDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTY2OCw2ICs2NzYsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtNzUwLDYgKzc1OSw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC04MzIsNiArODQyLDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTkxNCw2ICs5MjUsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtOTk2LDYgKzEwMDgsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMTA3OCw2ICsxMDkxLDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTExNjAsNiArMTE3NCw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0xMjQyLDYgKzEyNTcsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMTM2Niw2ICsxMzgyLDg5IEBACiAJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CiAJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KIAorOm9iajpoYXJkY29weS5jLngJxCAgtgorCTpzcmM6aGFyZGNvcHkuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgorCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzcGVsbC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCiA6b2JqOmhhc2h0YWJsZS5jLngJxCAgtgogCTpzcmM6aGFzaHRhYmxlLmMgtgogCTpzcmM6dmltLmggtgpAQCAtMTQwNSw2ICsxNTA0LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTE0ODcsNiArMTU4Nyw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0xNTY5LDYgKzE2NzAsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMTY3Nyw2ICsxNzc5LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTE3NjAsNiArMTg2Myw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0xODQyLDYgKzE5NDYsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMTkyNCw2ICsyMDI5LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTIwMDYsNiArMjExMiw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0yMDg4LDYgKzIxOTUsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMjE3MCw2ICsyMjc4LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTIyNTMsNiArMjM2Miw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0yMzM1LDYgKzI0NDUsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMjQxNyw2ICsyNTI4LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTI0OTksNiArMjYxMSw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0yNTgxLDYgKzI2OTQsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMjY2Myw2ICsyNzc3LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTI3NDUsNiArMjg2MCw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0yODI3LDYgKzI5NDMsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMjkwOSw2ICszMDI2LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTI5OTEsNiArMzEwOSw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0zMDczLDYgKzMxOTIsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMzE1NSw2ICszMjc1LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTMyMzcsNiArMzM1OCw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0zMzE5LDYgKzM0NDEsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMzQwMSw2ICszNTI0LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTM0ODMsNiArMzYwNyw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0zNTY1LDYgKzM2OTAsNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMzY0OCw2ICszNzc0LDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTM3MjksNiArMzg1Niw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC0zODExLDYgKzM5MzksNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpAQCAtMzg5NCw2ICs0MDIzLDcgQEAKIAk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgogCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgogCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFyZGNvcHkucHJvILYKIAk6c3JjOnByb3RvOmhhc2h0YWJsZS5wcm8gtgogCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKIAk6c3JjOnByb3RvOm1haW4ucHJvILYKQEAgLTM5NzYsNiArNDEwNiw3IEBACiAJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKIAk6c3JjOnByb3RvOmZvbGQucHJvILYKIAk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhcmRjb3B5LnBybyC2CiAJOnNyYzpwcm90bzpoYXNodGFibGUucHJvILYKIAk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CiAJOnNyYzpwcm90bzptYWluLnBybyC2CkBAIC00MDU4LDYgKzQxODksNyBAQAogCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CiAJOnNyYzpwcm90bzpmb2xkLnBybyC2CiAJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYXJkY29weS5wcm8gtgogCTpzcmM6cHJvdG86aGFzaHRhYmxlLnBybyC2CiAJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgogCTpzcmM6cHJvdG86bWFpbi5wcm8gtgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfbXZjLm1hayBiL3NyYy9NYWtlX212Yy5tYWsKaW5kZXggNTk5NzY3Yi4uZTRiMzQ0NiAxMDA2NDQKLS0tIGEvc3JjL01ha2VfbXZjLm1haworKysgYi9zcmMvTWFrZV9tdmMubWFrCkBAIC0zODQsNiArMzg0LDcgQEAKIAkkKE9VVERJUilcZmlsZWlvLm9iaiBcCiAJJChPVVRESVIpXGZvbGQub2JqIFwKIAkkKE9VVERJUilcZ2V0Y2hhci5vYmogXAorCSQoT1VURElSKVxoYXJkY29weS5vYmogXAogCSQoT1VURElSKVxoYXNodGFibGUub2JqIFwKIAkkKE9VVERJUilcbWFpbi5vYmogXAogCSQoT1VURElSKVxtYXJrLm9iaiBcCkBAIC04MTcsNiArODE4LDggQEAKIAogJChPVVRESVIpL2dldGNoYXIub2JqOgkkKE9VVERJUikgZ2V0Y2hhci5jICAkKElOQ0wpCiAKKyQoT1VURElSKS9oYXJkY29weS5vYmo6CSQoT1VURElSKSBoYXJkY29weS5jICAkKElOQ0wpCisKICQoT1VURElSKS9oYXNodGFibGUub2JqOgkkKE9VVERJUikgaGFzaHRhYmxlLmMgICQoSU5DTCkKIAogJChPVVRESVIpL2d1aS5vYmo6CSQoT1VURElSKSBndWkuYyAgJChJTkNMKSAkKEdVSV9JTkNMKQpAQCAtOTY1LDYgKzk2OCw3IEBACiAJcHJvdG8vZXhfZ2V0bG4ucHJvIFwKIAlwcm90by9maWxlaW8ucHJvIFwKIAlwcm90by9nZXRjaGFyLnBybyBcCisJcHJvdG8vaGFyZGNvcHkucHJvIFwKIAlwcm90by9oYXNodGFibGUucHJvIFwKIAlwcm90by9tYWluLnBybyBcCiAJcHJvdG8vbWFyay5wcm8gXApkaWZmIC0tZ2l0IGEvc3JjL01ha2Vfb3MyLm1hayBiL3NyYy9NYWtlX29zMi5tYWsKaW5kZXggYzE4NTM4ZS4uMmM0Y2RhZiAxMDA2NDQKLS0tIGEvc3JjL01ha2Vfb3MyLm1haworKysgYi9zcmMvTWFrZV9vczIubWFrCkBAIC01Myw2ICs1Myw3IEBACiAJZmlsZWlvLm8gXAogCWZvbGQubyBcCiAJZ2V0Y2hhci5vIFwKKwloYXJkY29weS5vIFwKIAloYXNodGFibGUubyBcCiAJbWFpbi5vIFwKIAltYXJrLm8gXApAQCAtMTI0LDYgKzEyNSw3IEBACiBmaWxlaW8ubzoJZmlsZWlvLmMgICQoSU5DTCkKIGZvbGQubzoJCWZvbGQuYyAgJChJTkNMKQogZ2V0Y2hhci5vOglnZXRjaGFyLmMgICQoSU5DTCkKK2hhcmRjb3B5Lm86CWhhcmRjb3B5LmMgICQoSU5DTCkKIGhhc2h0YWJsZS5vOgloYXNodGFibGUuYyAgJChJTkNMKQogbWFpbi5vOgkJbWFpbi5jICAkKElOQ0wpCiBtYXJrLm86CQltYXJrLmMgICQoSU5DTCkKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX3JvLm1hayBiL3NyYy9NYWtlX3JvLm1hawppbmRleCA0Mjk3NTY4Li4zOGU2MzI0IDEwMDY0NAotLS0gYS9zcmMvTWFrZV9yby5tYWsKKysrIGIvc3JjL01ha2Vfcm8ubWFrCkBAIC0xMiw3ICsxMiw4IEBACiBBU01GTEFHUyAgID0gLXRocm93YmFjayAtb2JqYXNtIC1nY2MKIAogT0JKUyA9ICBvLmJ1ZmZlciBvLmNoYXJzZXQgby5kaWZmIG8uZGlncmFwaCBvLmVkaXQgby5ldmFsIG8uZXhfY21kcyBvLmV4X2NtZHMyICBcCi0Jby5leF9kb2NtZCBvLmV4X2V2YWwgby5leF9nZXRsbiBvLmZpbGVpbyBvLmZvbGQgby5nZXRjaGFyIG8uaGFzaHRhYmxlIG8ubWFpbiBvLm1hcmsgby5tYnl0ZSAgXAorCW8uZXhfZG9jbWQgby5leF9ldmFsIG8uZXhfZ2V0bG4gby5maWxlaW8gby5mb2xkIG8uZ2V0Y2hhciBcCisJby5oYXJkY29weSBvLmhhc2h0YWJsZSBvLm1haW4gby5tYXJrIG8ubWJ5dGUgIFwKIAlvLm1lbWZpbGUgby5tZW1saW5lIG8ubWVudSBvLm1lc3NhZ2Ugby5taXNjMSBvLm1pc2MyIG8ubW92ZSAgICAgXAogCW8ubm9ybWFsIG8ub3BzIG8ub3B0aW9uIG8ucXVpY2tmaXggby5yZWdleHAgby5zY3JlZW4gby5zZWFyY2ggICBcCiAJby5zcGVsbCBvLnN5bnRheCBvLnRhZyBvLnRlcm0gby50ZXJtbGliIG8udWkgby51bmRvIG8udmVyc2lvbglcCkBAIC02NSw2ICs2Niw4IEBACiAKIG8uZ2V0Y2hhcjoJYy5nZXRjaGFyCiAKK28uaGFyZGNvcHk6CWMuaGFyZGNvcHkKKwogby5oYXNodGFibGU6CWMuaGFzaHRhYmxlCiAKIG8uZ3VpOgkJYy5ndWkKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX3Nhcy5tYWsgYi9zcmMvTWFrZV9zYXMubWFrCmluZGV4IDNlNTYzZjkuLjQ4NGY1NjIgMTAwNjQ0Ci0tLSBhL3NyYy9NYWtlX3Nhcy5tYWsKKysrIGIvc3JjL01ha2Vfc2FzLm1hawpAQCAtMTAzLDYgKzEwMyw3IEBACiAJZmlsZWlvLmMgXAogCWZvbGQuYyBcCiAJZ2V0Y2hhci5jIFwKKwloYXJkY29weS5jIFwKIAloYXNodGFibGUuYyBcCiAJbWFpbi5jIFwKIAltYXJrLmMgXApAQCAtMTQ2LDYgKzE0Nyw3IEBACiAJZmlsZWlvLm8gXAogCWZvbGQubyBcCiAJZ2V0Y2hhci5vIFwKKwloYXJkY29weS5vIFwKIAloYXNodGFibGUubyBcCiAJbWFpbi5vIFwKIAltYXJrLm8gXApAQCAtMTg5LDYgKzE5MSw3IEBACiAJcHJvdG8vZmlsZWlvLnBybyBcCiAJcHJvdG8vZm9sZC5wcm8gXAogCXByb3RvL2dldGNoYXIucHJvIFwKKwlwcm90by9oYXJkY29weS5wcm8gXAogCXByb3RvL2hhc2h0YWJsZS5wcm8gXAogCXByb3RvL21haW4ucHJvIFwKIAlwcm90by9tYXJrLnBybyBcCkBAIC0zMDAsNiArMzAzLDggQEAKIHByb3RvL2ZvbGQucHJvOgkJZm9sZC5jCiBnZXRjaGFyLm86CQlnZXRjaGFyLmMKIHByb3RvL2dldGNoYXIucHJvOglnZXRjaGFyLmMKK2hhcmRjb3B5Lm86CQloYXJkY29weS5jCitwcm90by9oYXJkY29weS5wcm86CWhhcmRjb3B5LmMKIGhhc2h0YWJsZS5vOgkJaGFzaHRhYmxlLmMKIHByb3RvL2hhc2h0YWJsZS5wcm86CWhhc2h0YWJsZS5jCiBtYWluLm86CQkJbWFpbi5jCmRpZmYgLS1naXQgYS9zcmMvTWFrZV92bXMubW1zIGIvc3JjL01ha2Vfdm1zLm1tcwppbmRleCBlNDRjODNkLi44YjgzNDY4IDEwMDY0NAotLS0gYS9zcmMvTWFrZV92bXMubW1zCisrKyBiL3NyYy9NYWtlX3Ztcy5tbXMKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBWaW0gb24gT3BlblZNUwogIwogIyBNYWludGFpbmVyOiAgIFpvbHRhbiBBcnBhZGZmeSA8YXJwYWRmZnlAcG9sYXJob21lLmNvbT4KLSMgTGFzdCBjaGFuZ2U6ICAyMDA1IEp1bCAxMgorIyBMYXN0IGNoYW5nZTogIDIwMDUgSnVsIDIzCiAjCiAjIFRoaXMgaGFzIHNjcmlwdCBiZWVuIHRlc3RlZCBvbiBWTVMgNi4yIHRvIDguMiBvbiBERUMgQWxwaGEsIFZBWCBhbmQgSUE2NAogIyB3aXRoIE1NUyBhbmQgTU1LCkBAIC0yODcsNyArMjg3LDcgQEAKIAogU1JDID0JYnVmZmVyLmMgY2hhcnNldC5jIGRpZmYuYyBkaWdyYXBoLmMgZWRpdC5jIGV2YWwuYyBleF9jbWRzLmMgZXhfY21kczIuYyBcCiAJZXhfZG9jbWQuYyBleF9ldmFsLmMgZXhfZ2V0bG4uYyBpZl94Y21kc3J2LmMgZmlsZWlvLmMgZm9sZC5jIGdldGNoYXIuYyBcCi0JaGFzaHRhYmxlLmMsIG1haW4uYyBtYXJrLmMgbWVudS5jIG1ieXRlLmMgbWVtZmlsZS5jIG1lbWxpbmUuYyBtZXNzYWdlLmMgbWlzYzEuYyBcCisJaGFyZGNvcHkuYyBoYXNodGFibGUuYyBtYWluLmMgbWFyay5jIG1lbnUuYyBtYnl0ZS5jIG1lbWZpbGUuYyBtZW1saW5lLmMgbWVzc2FnZS5jIG1pc2MxLmMgXAogCW1pc2MyLmMgbW92ZS5jIG5vcm1hbC5jIG9wcy5jIG9wdGlvbi5jIHF1aWNrZml4LmMgcmVnZXhwLmMgc2VhcmNoLmMgXAogCXNwZWxsLmMgc3ludGF4LmMgdGFnLmMgdGVybS5jIHRlcm1saWIuYyB1aS5jIHVuZG8uYyB2ZXJzaW9uLmMgc2NyZWVuLmMgXAogCXdpbmRvdy5jIG9zX3VuaXguYyBvc192bXMuYyBwYXRoZGVmLmMgXApAQCAtMjk2LDcgKzI5Niw3IEBACiAKIE9CSiA9CWJ1ZmZlci5vYmogY2hhcnNldC5vYmogZGlmZi5vYmogZGlncmFwaC5vYmogZWRpdC5vYmogZXZhbC5vYmogXAogCWV4X2NtZHMub2JqIGV4X2NtZHMyLm9iaiBleF9kb2NtZC5vYmogZXhfZXZhbC5vYmogZXhfZ2V0bG4ub2JqIFwKLQlpZl94Y21kc3J2Lm9iaiBmaWxlaW8ub2JqIGZvbGQub2JqIGdldGNoYXIub2JqIGhhc2h0YWJsZS5vYmogbWFpbi5vYmogbWFyay5vYmogXAorCWlmX3hjbWRzcnYub2JqIGZpbGVpby5vYmogZm9sZC5vYmogZ2V0Y2hhci5vYmogaGFyZGNvcHkub2JqIGhhc2h0YWJsZS5vYmogbWFpbi5vYmogbWFyay5vYmogXAogCW1lbnUub2JqIG1lbWZpbGUub2JqIG1lbWxpbmUub2JqIG1lc3NhZ2Uub2JqIG1pc2MxLm9iaiBtaXNjMi5vYmogXAogCW1vdmUub2JqIG1ieXRlLm9iaiBub3JtYWwub2JqIG9wcy5vYmogb3B0aW9uLm9iaiBxdWlja2ZpeC5vYmogXAogCXJlZ2V4cC5vYmogc2VhcmNoLm9iaiBzcGVsbC5vYmogc3ludGF4Lm9iaiB0YWcub2JqIHRlcm0ub2JqIHRlcm1saWIub2JqIFwKQEAgLTUyNyw2ICs1MjcsMTAgQEAKICBhc2NpaS5oIGtleW1hcC5oIHRlcm0uaCBtYWNyb3MuaCBzdHJ1Y3RzLmggcmVnZXhwLmggXAogIGd1aS5oIGd1aV9iZXZhbC5oIFsucHJvdG9dZ3VpX2JldmFsLnBybyBvcHRpb24uaCBleF9jbWRzLmggcHJvdG8uaCBcCiAgZ2xvYmFscy5oIGZhcnNpLmggYXJhYmljLmgKK2hhcmRjb3B5Lm9iaiA6IGhhcmRjb3B5LmMgdmltLmggWy5hdXRvXWNvbmZpZy5oIGZlYXR1cmUuaCBvc191bml4LmggXAorIGFzY2lpLmgga2V5bWFwLmggdGVybS5oIG1hY3Jvcy5oIHN0cnVjdHMuaCByZWdleHAuaCBcCisgZ3VpLmggZ3VpX2JldmFsLmggWy5wcm90b11ndWlfYmV2YWwucHJvIG9wdGlvbi5oIGV4X2NtZHMuaCBwcm90by5oIFwKKyBnbG9iYWxzLmggZmFyc2kuaCBhcmFiaWMuaAogaGFzaHRhYmxlLm9iaiA6IGhhc2h0YWJsZS5jIHZpbS5oIFsuYXV0b11jb25maWcuaCBmZWF0dXJlLmggb3NfdW5peC5oIFwKICBhc2NpaS5oIGtleW1hcC5oIHRlcm0uaCBtYWNyb3MuaCBzdHJ1Y3RzLmggcmVnZXhwLmggXAogIGd1aS5oIGd1aV9iZXZhbC5oIFsucHJvdG9dZ3VpX2JldmFsLnBybyBvcHRpb24uaCBleF9jbWRzLmggcHJvdG8uaCBcCmRpZmYgLS1naXQgYS9zcmMvTWFrZV93MTYubWFrIGIvc3JjL01ha2VfdzE2Lm1hawppbmRleCAzMDNjNjYyLi40MmQxNTQ3IDEwMDY0NAotLS0gYS9zcmMvTWFrZV93MTYubWFrCisrKyBiL3NyYy9NYWtlX3cxNi5tYWsKQEAgLTg3LDYgKzg3LDcgQEAKICAgICQoSU5URElSKVxmaWxlaW8ub2JqXAogICAgJChJTlRESVIpXGZvbGQub2JqXAogICAgJChJTlRESVIpXGdldGNoYXIub2JqXAorICAgJChJTlRESVIpXGhhcmRjb3B5Lm9ialwKICAgICQoSU5URElSKVxoYXNodGFibGUub2JqXAogICAgJChJTlRESVIpXGd1aS5vYmpcCiAgICAkKElOVERJUilcZ3VpX3cxNi5vYmpcCmRpZmYgLS1naXQgYS9zcmMvTWFrZWZpbGUgYi9zcmMvTWFrZWZpbGUKaW5kZXggY2VhMDU4Ny4uODM3MzJhMiAxMDA2NDQKLS0tIGEvc3JjL01ha2VmaWxlCisrKyBiL3NyYy9NYWtlZmlsZQpAQCAtMTM0Myw2ICsxMzQzLDcgQEAKIAlmaWxlaW8uYyBcCiAJZm9sZC5jIFwKIAlnZXRjaGFyLmMgXAorCWhhcmRjb3B5LmMgXAogCWhhc2h0YWJsZS5jIFwKIAlpZl9jc2NvcGUuYyBcCiAJaWZfeGNtZHNydi5jIFwKQEAgLTE0MTEsNiArMTQxMiw3IEBACiAJb2JqZWN0cy9maWxlaW8ubyBcCiAJb2JqZWN0cy9mb2xkLm8gXAogCW9iamVjdHMvZ2V0Y2hhci5vIFwKKwlvYmplY3RzL2hhcmRjb3B5Lm8gXAogCW9iamVjdHMvaGFzaHRhYmxlLm8gXAogCSQoSEFOR1VMSU5fT0JKKSBcCiAJb2JqZWN0cy9pZl9jc2NvcGUubyBcCkBAIC0xNDY4LDYgKzE0NzAsNyBAQAogCWZpbGVpby5wcm8gXAogCWZvbGQucHJvIFwKIAlnZXRjaGFyLnBybyBcCisJaGFyZGNvcHkucHJvIFwKIAloYXNodGFibGUucHJvIFwKIAloYW5ndWxpbi5wcm8gXAogCWlmX2NzY29wZS5wcm8gXApAQCAtMTU5OSw3ICsxNjAyLDkgQEAKICMgR2VuZXJhdGUgdGhlIGNvbnZlcnRlZCAubW8gZmlsZXMgc2VwYXJhdGVseSwgaXQncyBubyBwcm9ibGVtIGlmIHRoaXMgZmFpbHMuCiBsYW5ndWFnZXM6CiAJQGlmIHRlc3QgLW4gIiQoTUFLRU1PKSIgLWEgLWYgJChQT0RJUikvTWFrZWZpbGU7IHRoZW4gXAotCQljZCAkKFBPRElSKTsgQ0M9IiQoQ0MpIiAkKE1BS0UpIHByZWZpeD0kKERFU1RESVIpJChwcmVmaXgpOyBcCisJCWNkICQoUE9ESVIpOyBcCisJCUNDPSIkKENDKSIgJChNQUtFKSBjaGVjazsgXAorCQlDQz0iJChDQykiICQoTUFLRSkgcHJlZml4PSQoREVTVERJUikkKHByZWZpeCk7IFwKIAlmaQogCS1AaWYgdGVzdCAtbiAiJChNQUtFTU8pIiAtYSAtZiAkKFBPRElSKS9NYWtlZmlsZTsgdGhlbiBcCiAJCWNkICQoUE9ESVIpOyBDQz0iJChDQykiICQoTUFLRSkgcHJlZml4PSQoREVTVERJUikkKHByZWZpeCkgY29udmVydGVkOyBcCkBAIC0yMjg1LDYgKzIyOTAsOSBAQAogb2JqZWN0cy9nZXRjaGFyLm86IGdldGNoYXIuYwogCSQoQ0NDKSAtbyAkQCBnZXRjaGFyLmMKIAorb2JqZWN0cy9oYXJkY29weS5vOiBoYXJkY29weS5jCisJJChDQ0MpIC1vICRAIGhhcmRjb3B5LmMKKwogb2JqZWN0cy9oYXNodGFibGUubzogaGFzaHRhYmxlLmMKIAkkKENDQykgLW8gJEAgaGFzaHRhYmxlLmMKIApAQCAtMjYzNyw2ICsyNjQ1LDEwIEBACiAgYXV0by9vc2RlZi5oIGFzY2lpLmgga2V5bWFwLmggdGVybS5oIG1hY3Jvcy5oIHN0cnVjdHMuaCByZWdleHAuaCBcCiAgZ3VpLmggZ3VpX2JldmFsLmggcHJvdG8vZ3VpX2JldmFsLnBybyBvcHRpb24uaCBleF9jbWRzLmggcHJvdG8uaCBcCiAgZ2xvYmFscy5oIGZhcnNpLmggYXJhYmljLmgKK29iamVjdHMvaGFyZGNvcHkubzogaGFyZGNvcHkuYyB2aW0uaCBhdXRvL2NvbmZpZy5oIGZlYXR1cmUuaCBvc191bml4LmggXAorIGF1dG8vb3NkZWYuaCBhc2NpaS5oIGtleW1hcC5oIHRlcm0uaCBtYWNyb3MuaCBzdHJ1Y3RzLmggcmVnZXhwLmggXAorIGd1aS5oIGd1aV9iZXZhbC5oIHByb3RvL2d1aV9iZXZhbC5wcm8gb3B0aW9uLmggZXhfY21kcy5oIHByb3RvLmggXAorIGdsb2JhbHMuaCBmYXJzaS5oIGFyYWJpYy5oCiBvYmplY3RzL2hhc2h0YWJsZS5vOiBoYXNodGFibGUuYyB2aW0uaCBhdXRvL2NvbmZpZy5oIGZlYXR1cmUuaCBvc191bml4LmggXAogIGF1dG8vb3NkZWYuaCBhc2NpaS5oIGtleW1hcC5oIHRlcm0uaCBtYWNyb3MuaCBzdHJ1Y3RzLmggcmVnZXhwLmggXAogIGd1aS5oIGd1aV9iZXZhbC5oIHByb3RvL2d1aV9iZXZhbC5wcm8gb3B0aW9uLmggZXhfY21kcy5oIHByb3RvLmggXApkaWZmIC0tZ2l0IGEvc3JjL2V4X2NtZHMyLmMgYi9zcmMvZXhfY21kczIuYwppbmRleCA5MjNmYWY5Li44NjFmYTgxIDEwMDY0NAotLS0gYS9zcmMvZXhfY21kczIuYworKysgYi9zcmMvZXhfY21kczIuYwpAQCAtMzYyNywzNTI4ICszNjI3LDYgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChGRUFUX1BSSU5URVIpIHx8IGRlZmluZWQoUFJPVE8pCi0vKgotICogUHJpbnRpbmcgY29kZSAoTWFjaGluZS1pbmRlcGVuZGVudC4pCi0gKiBUbyBpbXBsZW1lbnQgcHJpbnRpbmcgb24gYSBwbGF0Zm9ybSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCBiZQotICogZGVmaW5lZDoKLSAqCi0gKiBpbnQgbWNoX3ByaW50X2luaXQocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncywgY2hhcl91ICpqb2JuYW1lLCBpbnQgZm9yY2VpdCkKLSAqIENhbGxlZCBvbmNlLiAgQ29kZSBzaG91bGQgZGlzcGxheSBwcmludGVyIGRpYWxvZ3VlIChpZiBhcHByb3ByaWF0ZSkgYW5kCi0gKiBkZXRlcm1pbmUgcHJpbnRlciBmb250IGFuZCBtYXJnaW4gc2V0dGluZ3MuICBSZXNldCBoYXNfY29sb3IgaWYgdGhlIHByaW50ZXIKLSAqIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMgYXQgYWxsLgotICogUmV0dXJucyBGQUlMIHRvIGFib3J0LgotICoKLSAqIGludCBtY2hfcHJpbnRfYmVnaW4ocHJ0X3NldHRpbmdzX1QgKnNldHRpbmdzKQotICogQ2FsbGVkIHRvIHN0YXJ0IHRoZSBwcmludCBqb2IuCi0gKiBSZXR1cm4gRkFMU0UgdG8gYWJvcnQuCi0gKgotICogaW50IG1jaF9wcmludF9iZWdpbl9wYWdlKGNoYXJfdSAqbXNnKQotICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHBhZ2UuCi0gKiAibXNnIiBpbmRpY2F0ZXMgdGhlIHByb2dyZXNzIG9mIHRoZSBwcmludCBqb2IsIGNhbiBiZSBOVUxMLgotICogUmV0dXJuIEZBTFNFIHRvIGFib3J0LgotICoKLSAqIGludCBtY2hfcHJpbnRfZW5kX3BhZ2UoKQotICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBwYWdlLgotICogUmV0dXJuIEZBTFNFIHRvIGFib3J0LgotICoKLSAqIGludCBtY2hfcHJpbnRfYmxhbmtfcGFnZSgpCi0gKiBDYWxsZWQgdG8gZ2VuZXJhdGUgYSBibGFuayBwYWdlIGZvciBjb2xsYXRlZCwgZHVwbGV4LCBtdWx0aXBsZSBjb3B5Ci0gKiBkb2N1bWVudC4gIFJldHVybiBGQUxTRSB0byBhYm9ydC4KLSAqCi0gKiB2b2lkIG1jaF9wcmludF9lbmQocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykKLSAqIENhbGxlZCBhdCBub3JtYWwgZW5kIG9mIHByaW50IGpvYi4KLSAqCi0gKiB2b2lkIG1jaF9wcmludF9jbGVhbnVwKCkKLSAqIENhbGxlZCBpZiBwcmludCBqb2IgZW5kcyBub3JtYWxseSBvciBpcyBhYmFuZG9uZWQuIEZyZWUgYW55IG1lbW9yeSwgY2xvc2UKLSAqIGRldmljZXMgYW5kIGhhbmRsZXMuICBBbHNvIGNhbGxlZCB3aGVuIG1jaF9wcmludF9iZWdpbigpIGZhaWxzLCBidXQgbm90Ci0gKiB3aGVuIG1jaF9wcmludF9pbml0KCkgZmFpbHMuCi0gKgotICogdm9pZCBtY2hfcHJpbnRfc2V0X2ZvbnQoaW50IEJvbGQsIGludCBJdGFsaWMsIGludCBVbmRlcmxpbmUpOwotICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBmb250IHN0eWxlIGNoYW5nZXMuCi0gKgotICogdm9pZCBtY2hfcHJpbnRfc2V0X2JnKGxvbmcgYmdjb2wpOwotICogQ2FsbGVkIHRvIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIGZvbGxvd2luZyB0ZXh0LiBQYXJhbWV0ZXIgaXMgYW4KLSAqIFJHQiB2YWx1ZS4KLSAqCi0gKiB2b2lkIG1jaF9wcmludF9zZXRfZmcobG9uZyBmZ2NvbCk7Ci0gKiBDYWxsZWQgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGZvciB0aGUgZm9sbG93aW5nIHRleHQuIFBhcmFtZXRlciBpcyBhbgotICogUkdCIHZhbHVlLgotICoKLSAqIG1jaF9wcmludF9zdGFydF9saW5lKGludCBtYXJnaW4sIGludCBwYWdlX2xpbmUpCi0gKiBTZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiBsaW5lICJwYWdlX2xpbmUiLgotICogSWYgbWFyZ2luIGlzIFRSVUUgc3RhcnQgaW4gdGhlIGxlZnQgbWFyZ2luIChmb3IgaGVhZGVyIGFuZCBsaW5lIG51bWJlcikuCi0gKgotICogaW50IG1jaF9wcmludF90ZXh0X291dChjaGFyX3UgKnAsIGludCBsZW4pOwotICogT3V0cHV0IG9uZSBjaGFyYWN0ZXIgb2YgdGV4dCBwW2xlbl0gYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKiBSZXR1cm4gVFJVRSBpZiB0aGVyZSBpcyBubyByb29tIGZvciBhbm90aGVyIGNoYXJhY3RlciBpbiB0aGUgc2FtZSBsaW5lLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgZ2VuZXJpYyBjb2RlIGhhcyBubyBpZGVhIG9mIG1hcmdpbnMuIFRoZSBtYWNoaW5lIGNvZGUgc2hvdWxkCi0gKiBzaW1wbHkgbWFrZSB0aGUgcGFnZSBsb29rIHNtYWxsZXIhICBUaGUgaGVhZGVyIGFuZCB0aGUgbGluZSBudW1iZXJzIGFyZQotICogcHJpbnRlZCBpbiB0aGUgbWFyZ2luLgotICovCi0KLSNpZmRlZiBGRUFUX1NZTl9ITAotc3RhdGljIGNvbnN0IGxvbmdfdSAgY3Rlcm1fY29sb3JfOFs4XSA9Ci17Ci0gICAgKGxvbmdfdSkweDAwMDAwMEwsIChsb25nX3UpMHhmZjAwMDBMLCAobG9uZ191KTB4MDBmZjAwTCwgKGxvbmdfdSkweGZmZmYwMEwsCi0gICAgKGxvbmdfdSkweDAwMDBmZkwsIChsb25nX3UpMHhmZjAwZmZMLCAobG9uZ191KTB4MDBmZmZmTCwgKGxvbmdfdSkweGZmZmZmZkwKLX07Ci0KLXN0YXRpYyBjb25zdCBsb25nX3UgIGN0ZXJtX2NvbG9yXzE2WzE2XSA9Ci17Ci0gICAgKGxvbmdfdSkweDAwMDAwMEwsIChsb25nX3UpMHgwMDAwYzBMLCAobG9uZ191KTB4MDA4MDAwTCwgKGxvbmdfdSkweDAwNDA4MEwsCi0gICAgKGxvbmdfdSkweGMwMDAwMEwsIChsb25nX3UpMHhjMDAwYzBMLCAobG9uZ191KTB4ODA4MDAwTCwgKGxvbmdfdSkweGMwYzBjMEwsCi0gICAgKGxvbmdfdSkweDgwODA4MEwsIChsb25nX3UpMHg2MDYwZmZMLCAobG9uZ191KTB4MDBmZjAwTCwgKGxvbmdfdSkweDAwZmZmZkwsCi0gICAgKGxvbmdfdSkweGZmODA4MEwsIChsb25nX3UpMHhmZjQwZmZMLCAobG9uZ191KTB4ZmZmZjAwTCwgKGxvbmdfdSkweGZmZmZmZkwKLX07Ci0KLXN0YXRpYyBpbnQJCWN1cnJlbnRfc3luX2lkOwotI2VuZGlmCi0KLSNkZWZpbmUgUFJDT0xPUl9CTEFDSwkobG9uZ191KTAKLSNkZWZpbmUgUFJDT0xPUl9XSElURQkobG9uZ191KTB4RkZGRkZGTAotCi1zdGF0aWMgaW50CWN1cnJfaXRhbGljOwotc3RhdGljIGludAljdXJyX2JvbGQ7Ci1zdGF0aWMgaW50CWN1cnJfdW5kZXJsaW5lOwotc3RhdGljIGxvbmdfdQljdXJyX2JnOwotc3RhdGljIGxvbmdfdQljdXJyX2ZnOwotc3RhdGljIGludAlwYWdlX2NvdW50OwotCi0vKgotICogVGhlc2UgdmFsdWVzIGRldGVybWluZSB0aGUgcHJpbnQgcG9zaXRpb24gb24gYSBwYWdlLgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludAkJbGVhZF9zcGFjZXM7CSAgICAvKiByZW1haW5pbmcgc3BhY2VzIGZvciBhIFRBQiAqLwotICAgIGludAkJcHJpbnRfcG9zOwkgICAgLyogdmlydHVhbCBjb2x1bW4gZm9yIGNvbXB1dGluZyBUQUJzICovCi0gICAgY29sbnJfVAljb2x1bW47CQkgICAgLyogYnl0ZSBjb2x1bW4gKi8KLSAgICBsaW5lbnJfVAlmaWxlX2xpbmU7CSAgICAvKiBsaW5lIG5yIGluIHRoZSBidWZmZXIgKi8KLSAgICBsb25nX3UJYnl0ZXNfcHJpbnRlZDsJICAgIC8qIGJ5dGVzIHByaW50ZWQgc28gZmFyICovCi0gICAgaW50CQlmZjsJCSAgICAvKiBzZWVuIGZvcm0gZmVlZCBjaGFyYWN0ZXIgKi8KLX0gcHJ0X3Bvc19UOwotCi0jaWZkZWYgRkVBVF9TWU5fSEwKLXN0YXRpYyBsb25nX3UgZGFya2VuX3JnYiBfX0FSR1MoKGxvbmdfdSByZ2IpKTsKLXN0YXRpYyBsb25nX3UgcHJ0X2dldF90ZXJtX2NvbG9yIF9fQVJHUygoaW50IGNvbG9yaW5kZXgpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcHJ0X3NldF9mZyBfX0FSR1MoKGxvbmdfdSBmZykpOwotc3RhdGljIHZvaWQgcHJ0X3NldF9iZyBfX0FSR1MoKGxvbmdfdSBiZykpOwotc3RhdGljIHZvaWQgcHJ0X3NldF9mb250IF9fQVJHUygoaW50IGJvbGQsIGludCBpdGFsaWMsIGludCB1bmRlcmxpbmUpKTsKLXN0YXRpYyB2b2lkIHBydF9saW5lX251bWJlciBfX0FSR1MoKHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MsIGludCBwYWdlX2xpbmUsIGxpbmVucl9UIGxudW0pKTsKLXN0YXRpYyB2b2lkIHBydF9oZWFkZXIgX19BUkdTKChwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLCBpbnQgcGFnZW51bSwgbGluZW5yX1QgbG51bSkpOwotc3RhdGljIHZvaWQgcHJ0X21lc3NhZ2UgX19BUkdTKChjaGFyX3UgKnMpKTsKLXN0YXRpYyBjb2xucl9UIGhhcmRjb3B5X2xpbmUgX19BUkdTKChwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLCBpbnQgcGFnZV9saW5lLCBwcnRfcG9zX1QgKnBwb3MpKTsKLXN0YXRpYyB2b2lkIHBydF9nZXRfYXR0ciBfX0FSR1MoKGludCBobF9pZCwgcHJ0X3RleHRfYXR0cl9UKiBwYXR0ciwgaW50IG1vZGVjKSk7Ci0KLSNpZmRlZiBGRUFUX1NZTl9ITAotLyoKLSAqIElmIHVzaW5nIGEgZGFyayBiYWNrZ3JvdW5kLCB0aGUgY29sb3JzIHdpbGwgcHJvYmFibHkgYmUgdG9vIGJyaWdodCB0byBzaG93Ci0gKiB1cCB3ZWxsIG9uIHdoaXRlIHBhcGVyLCBzbyByZWR1Y2UgdGhlaXIgYnJpZ2h0bmVzcy4KLSAqLwotICAgIHN0YXRpYyBsb25nX3UKLWRhcmtlbl9yZ2IocmdiKQotICAgIGxvbmdfdQlyZ2I7Ci17Ci0gICAgcmV0dXJuCSgocmdiID4+IDE3KSA8PCAxNikKLQkgICAgKwkoKChyZ2IgJiAweGZmMDApID4+IDkpIDw8IDgpCi0JICAgICsJKChyZ2IgJiAweGZmKSA+PiAxKTsKLX0KLQotICAgIHN0YXRpYyBsb25nX3UKLXBydF9nZXRfdGVybV9jb2xvcihjb2xvcmluZGV4KQotICAgIGludAkgICAgY29sb3JpbmRleDsKLXsKLSAgICAvKiBUT0RPOiBTaG91bGQgY2hlY2sgZm9yIHh0ZXJtIHdpdGggODggb3IgMjU2IGNvbG9ycy4gKi8KLSAgICBpZiAodF9jb2xvcnMgPiA4KQotCXJldHVybiBjdGVybV9jb2xvcl8xNltjb2xvcmluZGV4ICUgMTZdOwotICAgIHJldHVybiBjdGVybV9jb2xvcl84W2NvbG9yaW5kZXggJSA4XTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1wcnRfZ2V0X2F0dHIoaGxfaWQsIHBhdHRyLCBtb2RlYykKLSAgICBpbnQJCQlobF9pZDsKLSAgICBwcnRfdGV4dF9hdHRyX1QJKnBhdHRyOwotICAgIGludAkJCW1vZGVjOwotewotICAgIGludCAgICAgY29sb3JpbmRleDsKLSAgICBsb25nX3UgIGZnX2NvbG9yOwotICAgIGxvbmdfdSAgYmdfY29sb3I7Ci0gICAgY2hhciAgICAqY29sb3I7Ci0KLSAgICBwYXR0ci0+Ym9sZCA9IChoaWdobGlnaHRfaGFzX2F0dHIoaGxfaWQsIEhMX0JPTEQsIG1vZGVjKSAhPSBOVUxMKTsKLSAgICBwYXR0ci0+aXRhbGljID0gKGhpZ2hsaWdodF9oYXNfYXR0cihobF9pZCwgSExfSVRBTElDLCBtb2RlYykgIT0gTlVMTCk7Ci0gICAgcGF0dHItPnVuZGVybGluZSA9IChoaWdobGlnaHRfaGFzX2F0dHIoaGxfaWQsIEhMX1VOREVSTElORSwgbW9kZWMpICE9IE5VTEwpOwotICAgIHBhdHRyLT51bmRlcmN1cmwgPSAoaGlnaGxpZ2h0X2hhc19hdHRyKGhsX2lkLCBITF9VTkRFUkNVUkwsIG1vZGVjKSAhPSBOVUxMKTsKLQotIyBpZmRlZiBGRUFUX0dVSQotICAgIGlmIChndWkuaW5fdXNlKQotICAgIHsKLQliZ19jb2xvciA9IGhpZ2hsaWdodF9ndWlfY29sb3JfcmdiKGhsX2lkLCBGQUxTRSk7Ci0JaWYgKGJnX2NvbG9yID09IFBSQ09MT1JfQkxBQ0spCi0JICAgIGJnX2NvbG9yID0gUFJDT0xPUl9XSElURTsKLQotCWZnX2NvbG9yID0gaGlnaGxpZ2h0X2d1aV9jb2xvcl9yZ2IoaGxfaWQsIFRSVUUpOwotICAgIH0KLSAgICBlbHNlCi0jIGVuZGlmCi0gICAgewotCWJnX2NvbG9yID0gUFJDT0xPUl9XSElURTsKLQotCWNvbG9yID0gKGNoYXIgKiloaWdobGlnaHRfY29sb3IoaGxfaWQsIChjaGFyX3UgKikiZmciLCBtb2RlYyk7Ci0JaWYgKGNvbG9yID09IE5VTEwpCi0JICAgIGNvbG9yaW5kZXggPSAwOwotCWVsc2UKLQkgICAgY29sb3JpbmRleCA9IGF0b2koY29sb3IpOwotCi0JaWYgKGNvbG9yaW5kZXggPj0gMCAmJiBjb2xvcmluZGV4IDwgdF9jb2xvcnMpCi0JICAgIGZnX2NvbG9yID0gcHJ0X2dldF90ZXJtX2NvbG9yKGNvbG9yaW5kZXgpOwotCWVsc2UKLQkgICAgZmdfY29sb3IgPSBQUkNPTE9SX0JMQUNLOwotICAgIH0KLQotICAgIGlmIChmZ19jb2xvciA9PSBQUkNPTE9SX1dISVRFKQotCWZnX2NvbG9yID0gUFJDT0xPUl9CTEFDSzsKLSAgICBlbHNlIGlmICgqcF9iZyA9PSAnZCcpCi0JZmdfY29sb3IgPSBkYXJrZW5fcmdiKGZnX2NvbG9yKTsKLQotICAgIHBhdHRyLT5mZ19jb2xvciA9IGZnX2NvbG9yOwotICAgIHBhdHRyLT5iZ19jb2xvciA9IGJnX2NvbG9yOwotfQotI2VuZGlmIC8qIEZFQVRfU1lOX0hMICovCi0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3NldF9mZyhmZykKLSAgICBsb25nX3UgZmc7Ci17Ci0gICAgaWYgKGZnICE9IGN1cnJfZmcpCi0gICAgewotCWN1cnJfZmcgPSBmZzsKLQltY2hfcHJpbnRfc2V0X2ZnKGZnKTsKLSAgICB9Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3NldF9iZyhiZykKLSAgICBsb25nX3UgYmc7Ci17Ci0gICAgaWYgKGJnICE9IGN1cnJfYmcpCi0gICAgewotCWN1cnJfYmcgPSBiZzsKLQltY2hfcHJpbnRfc2V0X2JnKGJnKTsKLSAgICB9Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3NldF9mb250KGJvbGQsIGl0YWxpYywgdW5kZXJsaW5lKQotICAgIGludAkJYm9sZDsKLSAgICBpbnQJCWl0YWxpYzsKLSAgICBpbnQJCXVuZGVybGluZTsKLXsKLSAgICBpZiAoY3Vycl9ib2xkICE9IGJvbGQKLQkgICAgfHwgY3Vycl9pdGFsaWMgIT0gaXRhbGljCi0JICAgIHx8IGN1cnJfdW5kZXJsaW5lICE9IHVuZGVybGluZSkKLSAgICB7Ci0JY3Vycl91bmRlcmxpbmUgPSB1bmRlcmxpbmU7Ci0JY3Vycl9pdGFsaWMgPSBpdGFsaWM7Ci0JY3Vycl9ib2xkID0gYm9sZDsKLQltY2hfcHJpbnRfc2V0X2ZvbnQoYm9sZCwgaXRhbGljLCB1bmRlcmxpbmUpOwotICAgIH0KLX0KLQotLyoKLSAqIFByaW50IHRoZSBsaW5lIG51bWJlciBpbiB0aGUgbGVmdCBtYXJnaW4uCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotcHJ0X2xpbmVfbnVtYmVyKHBzZXR0aW5ncywgcGFnZV9saW5lLCBsbnVtKQotICAgIHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3M7Ci0gICAgaW50CQlwYWdlX2xpbmU7Ci0gICAgbGluZW5yX1QJbG51bTsKLXsKLSAgICBpbnQJCWk7Ci0gICAgY2hhcl91CXRidWZbMjBdOwotCi0gICAgcHJ0X3NldF9mZyhwc2V0dGluZ3MtPm51bWJlci5mZ19jb2xvcik7Ci0gICAgcHJ0X3NldF9iZyhwc2V0dGluZ3MtPm51bWJlci5iZ19jb2xvcik7Ci0gICAgcHJ0X3NldF9mb250KHBzZXR0aW5ncy0+bnVtYmVyLmJvbGQsIHBzZXR0aW5ncy0+bnVtYmVyLml0YWxpYywgcHNldHRpbmdzLT5udW1iZXIudW5kZXJsaW5lKTsKLSAgICBtY2hfcHJpbnRfc3RhcnRfbGluZShUUlVFLCBwYWdlX2xpbmUpOwotCi0gICAgLyogTGVhdmUgdHdvIHNwYWNlcyBiZXR3ZWVuIHRoZSBudW1iZXIgYW5kIHRoZSB0ZXh0OyBkZXBlbmRzIG9uCi0gICAgICogUFJJTlRfTlVNQkVSX1dJRFRILiAqLwotICAgIHNwcmludGYoKGNoYXIgKil0YnVmLCAiJTZsZCIsIChsb25nKWxudW0pOwotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JKHZvaWQpbWNoX3ByaW50X3RleHRfb3V0KCZ0YnVmW2ldLCAxKTsKLQotI2lmZGVmIEZFQVRfU1lOX0hMCi0gICAgaWYgKHBzZXR0aW5ncy0+ZG9fc3ludGF4KQotCS8qIFNldCBjb2xvcnMgZm9yIG5leHQgY2hhcmFjdGVyLiAqLwotCWN1cnJlbnRfc3luX2lkID0gLTE7Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotCS8qIFNldCBjb2xvcnMgYW5kIGZvbnQgYmFjayB0byBub3JtYWwuICovCi0JcHJ0X3NldF9mZyhQUkNPTE9SX0JMQUNLKTsKLQlwcnRfc2V0X2JnKFBSQ09MT1JfV0hJVEUpOwotCXBydF9zZXRfZm9udChGQUxTRSwgRkFMU0UsIEZBTFNFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBsaW5lbnJfVCBwcmludGVyX3BhZ2VfbnVtOwotCi0gICAgaW50Ci1nZXRfcHJpbnRlcl9wYWdlX251bSgpCi17Ci0gICAgcmV0dXJuIHByaW50ZXJfcGFnZV9udW07Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIGN1cnJlbnRseSBlZmZlY3RpdmUgaGVhZGVyIGhlaWdodC4KLSAqLwotICAgIGludAotcHJ0X2hlYWRlcl9oZWlnaHQoKQotewotICAgIGlmIChwcmludGVyX29wdHNbT1BUX1BSSU5UX0hFQURFUkhFSUdIVF0ucHJlc2VudCkKLQlyZXR1cm4gcHJpbnRlcl9vcHRzW09QVF9QUklOVF9IRUFERVJIRUlHSFRdLm51bWJlcjsKLSAgICByZXR1cm4gMjsKLX0KLQotLyoKLSAqIFJldHVybiBUUlVFIGlmIHVzaW5nIGEgbGluZSBudW1iZXIgZm9yIHByaW50aW5nLgotICovCi0gICAgaW50Ci1wcnRfdXNlX251bWJlcigpCi17Ci0gICAgcmV0dXJuIChwcmludGVyX29wdHNbT1BUX1BSSU5UX05VTUJFUl0ucHJlc2VudAotCSAgICAmJiBUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX05VTUJFUl0uc3RyaW5nWzBdKSA9PSAneScpOwotfQotCi0vKgotICogUmV0dXJuIHRoZSB1bml0IHVzZWQgaW4gYSBtYXJnaW4gaXRlbSBpbiAncHJpbnRvcHRpb25zJy4KLSAqIFJldHVybnMgUFJUX1VOSVRfTk9ORSBpZiBub3QgcmVjb2duaXplZC4KLSAqLwotICAgIGludAotcHJ0X2dldF91bml0KGlkeCkKLSAgICBpbnQJCWlkeDsKLXsKLSAgICBpbnQJCXUgPSBQUlRfVU5JVF9OT05FOwotICAgIGludAkJaTsKLSAgICBzdGF0aWMgY2hhciAqKHVuaXRzWzRdKSA9IFBSVF9VTklUX05BTUVTOwotCi0gICAgaWYgKHByaW50ZXJfb3B0c1tpZHhdLnByZXNlbnQpCi0JZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKLQkgICAgaWYgKFNUUk5JQ01QKHByaW50ZXJfb3B0c1tpZHhdLnN0cmluZywgdW5pdHNbaV0sIDIpID09IDApCi0JICAgIHsKLQkJdSA9IGk7Ci0JCWJyZWFrOwotCSAgICB9Ci0gICAgcmV0dXJuIHU7Ci19Ci0KLS8qCi0gKiBQcmludCB0aGUgcGFnZSBoZWFkZXIuCi0gKi8KLS8qQVJHU1VTRUQqLwotICAgIHN0YXRpYyB2b2lkCi1wcnRfaGVhZGVyKHBzZXR0aW5ncywgcGFnZW51bSwgbG51bSkKLSAgICBwcnRfc2V0dGluZ3NfVCAgKnBzZXR0aW5nczsKLSAgICBpbnQJCXBhZ2VudW07Ci0gICAgbGluZW5yX1QJbG51bTsKLXsKLSAgICBpbnQJCXdpZHRoID0gcHNldHRpbmdzLT5jaGFyc19wZXJfbGluZTsKLSAgICBpbnQJCXBhZ2VfbGluZTsKLSAgICBjaGFyX3UJKnRidWY7Ci0gICAgY2hhcl91CSpwOwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBpbnQJCWw7Ci0jZW5kaWYKLQotICAgIC8qIEFsc28gdXNlIHRoZSBzcGFjZSBmb3IgdGhlIGxpbmUgbnVtYmVyLiAqLwotICAgIGlmIChwcnRfdXNlX251bWJlcigpKQotCXdpZHRoICs9IFBSSU5UX05VTUJFUl9XSURUSDsKLQotICAgIHRidWYgPSBhbGxvYyh3aWR0aCArIElPU0laRSk7Ci0gICAgaWYgKHRidWYgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSNpZmRlZiBGRUFUX1NUTF9PUFQKLSAgICBpZiAoKnBfaGVhZGVyICE9IE5VTCkKLSAgICB7Ci0JbGluZW5yX1QJdG1wX2xudW0sIHRtcF90b3BsaW5lLCB0bXBfYm90bGluZTsKLQotCS8qCi0JICogTmVlZCB0byAodGVtcG9yYXJpbHkpIHNldCBjdXJyZW50IGxpbmUgbnVtYmVyIGFuZCBmaXJzdC9sYXN0IGxpbmUKLQkgKiBudW1iZXIgb24gdGhlICd3aW5kb3cnLiAgU2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgbG9uZyB0aGUgcGFnZSBpcywKLQkgKiBzZXQgdGhlIGZpcnN0IGFuZCBjdXJyZW50IGxpbmUgbnVtYmVyIHRvIHRoZSB0b3AgbGluZSwgYW5kIGd1ZXNzCi0JICogdGhhdCB0aGUgcGFnZSBsZW5ndGggaXMgNjQuCi0JICovCi0JdG1wX2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07Ci0JdG1wX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKLQl0bXBfYm90bGluZSA9IGN1cndpbi0+d19ib3RsaW5lOwotCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07Ci0JY3Vyd2luLT53X3RvcGxpbmUgPSBsbnVtOwotCWN1cndpbi0+d19ib3RsaW5lID0gbG51bSArIDYzOwotCXByaW50ZXJfcGFnZV9udW0gPSBwYWdlbnVtOwotCi0JYnVpbGRfc3RsX3N0cl9obChjdXJ3aW4sIHRidWYsIChzaXplX3QpKHdpZHRoICsgSU9TSVpFKSwKLQkJCQkJCSAgcF9oZWFkZXIsICcgJywgd2lkdGgsIE5VTEwpOwotCi0JLyogUmVzZXQgbGluZSBudW1iZXJzICovCi0JY3Vyd2luLT53X2N1cnNvci5sbnVtID0gdG1wX2xudW07Ci0JY3Vyd2luLT53X3RvcGxpbmUgPSB0bXBfdG9wbGluZTsKLQljdXJ3aW4tPndfYm90bGluZSA9IHRtcF9ib3RsaW5lOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLQlzcHJpbnRmKChjaGFyICopdGJ1ZiwgXygiUGFnZSAlZCIpLCBwYWdlbnVtKTsKLQotICAgIHBydF9zZXRfZmcoUFJDT0xPUl9CTEFDSyk7Ci0gICAgcHJ0X3NldF9iZyhQUkNPTE9SX1dISVRFKTsKLSAgICBwcnRfc2V0X2ZvbnQoVFJVRSwgRkFMU0UsIEZBTFNFKTsKLQotICAgIC8qIFVzZSBhIG5lZ2F0aXZlIGxpbmUgbnVtYmVyIHRvIGluZGljYXRlIHByaW50aW5nIGluIHRoZSB0b3AgbWFyZ2luLiAqLwotICAgIHBhZ2VfbGluZSA9IDAgLSBwcnRfaGVhZGVyX2hlaWdodCgpOwotICAgIG1jaF9wcmludF9zdGFydF9saW5lKFRSVUUsIHBhZ2VfbGluZSk7Ci0gICAgZm9yIChwID0gdGJ1ZjsgKnAgIT0gTlVMOyApCi0gICAgewotCWlmIChtY2hfcHJpbnRfdGV4dF9vdXQocCwKLSNpZmRlZiBGRUFUX01CWVRFCi0JCShsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkKLSNlbHNlCi0JCTEKLSNlbmRpZgotCQkgICAgKSkKLQl7Ci0JICAgICsrcGFnZV9saW5lOwotCSAgICBpZiAocGFnZV9saW5lID49IDApIC8qIG91dCBvZiByb29tIGluIGhlYWRlciAqLwotCQlicmVhazsKLQkgICAgbWNoX3ByaW50X3N0YXJ0X2xpbmUoVFJVRSwgcGFnZV9saW5lKTsKLQl9Ci0jaWZkZWYgRkVBVF9NQllURQotCXAgKz0gbDsKLSNlbHNlCi0JcCsrOwotI2VuZGlmCi0gICAgfQotCi0gICAgdmltX2ZyZWUodGJ1Zik7Ci0KLSNpZmRlZiBGRUFUX1NZTl9ITAotICAgIGlmIChwc2V0dGluZ3MtPmRvX3N5bnRheCkKLQkvKiBTZXQgY29sb3JzIGZvciBuZXh0IGNoYXJhY3Rlci4gKi8KLQljdXJyZW50X3N5bl9pZCA9IC0xOwotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLQkvKiBTZXQgY29sb3JzIGFuZCBmb250IGJhY2sgdG8gbm9ybWFsLiAqLwotCXBydF9zZXRfZmcoUFJDT0xPUl9CTEFDSyk7Ci0JcHJ0X3NldF9iZyhQUkNPTE9SX1dISVRFKTsKLQlwcnRfc2V0X2ZvbnQoRkFMU0UsIEZBTFNFLCBGQUxTRSk7Ci0gICAgfQotfQotCi0vKgotICogRGlzcGxheSBhIHByaW50IHN0YXR1cyBtZXNzYWdlLgotICovCi0gICAgc3RhdGljIHZvaWQKLXBydF9tZXNzYWdlKHMpCi0gICAgY2hhcl91CSpzOwotewotICAgIHNjcmVlbl9maWxsKChpbnQpUm93cyAtIDEsIChpbnQpUm93cywgMCwgKGludClDb2x1bW5zLCAnICcsICcgJywgMCk7Ci0gICAgc2NyZWVuX3B1dHMocywgKGludClSb3dzIC0gMSwgMCwgaGxfYXR0cihITEZfUikpOwotICAgIG91dF9mbHVzaCgpOwotfQotCi0gICAgdm9pZAotZXhfaGFyZGNvcHkoZWFwKQotICAgIGV4YXJnX1QJKmVhcDsKLXsKLSAgICBsaW5lbnJfVAkJbG51bTsKLSAgICBpbnQJCQljb2xsYXRlZF9jb3BpZXMsIHVuY29sbGF0ZWRfY29waWVzOwotICAgIHBydF9zZXR0aW5nc19UCXNldHRpbmdzOwotICAgIGxvbmdfdQkJYnl0ZXNfdG9fcHJpbnQgPSAwOwotICAgIGludAkJCXBhZ2VfbGluZTsKLSAgICBpbnQJCQlqb2JzcGxpdDsKLSAgICBpbnQJCQlpZDsKLQotICAgIG1lbXNldCgmc2V0dGluZ3MsIDAsIHNpemVvZihwcnRfc2V0dGluZ3NfVCkpOwotICAgIHNldHRpbmdzLmhhc19jb2xvciA9IFRSVUU7Ci0KLSMgaWZkZWYgRkVBVF9QT1NUU0NSSVBUCi0gICAgaWYgKCplYXAtPmFyZyA9PSAnPicpCi0gICAgewotCWNoYXJfdQkqZXJyb3Jtc2cgPSBOVUxMOwotCi0JLyogRXhwYW5kIHRoaW5ncyBsaWtlICIlLnBzIi4gKi8KLQlpZiAoZXhwYW5kX2ZpbGVuYW1lKGVhcCwgZWFwLT5jbWRsaW5lcCwgJmVycm9ybXNnKSA9PSBGQUlMKQotCXsKLQkgICAgaWYgKGVycm9ybXNnICE9IE5VTEwpCi0JCUVNU0coZXJyb3Jtc2cpOwotCSAgICByZXR1cm47Ci0JfQotCXNldHRpbmdzLm91dGZpbGUgPSBza2lwd2hpdGUoZWFwLT5hcmcgKyAxKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKmVhcC0+YXJnICE9IE5VTCkKLQlzZXR0aW5ncy5hcmd1bWVudHMgPSBlYXAtPmFyZzsKLSMgZW5kaWYKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSBmb3IgcHJpbnRpbmcuICBBc2sgdGhlIHVzZXIgZm9yIHNldHRpbmdzLCB1bmxlc3MgZm9yY2VpdCBpcwotICAgICAqIHNldC4KLSAgICAgKiBUaGUgbWNoX3ByaW50X2luaXQoKSBjb2RlIHNob3VsZCBzZXQgdXAgbWFyZ2lucyBpZiBhcHBsaWNhYmxlLiAoSXQgbWF5Ci0gICAgICogbm90IGJlIGEgcmVhbCBwcmludGVyIC0gZm9yIGV4YW1wbGUgdGhlIGVuZ2luZSBtaWdodCBnZW5lcmF0ZSBIVE1MIG9yCi0gICAgICogUFMuKQotICAgICAqLwotICAgIGlmIChtY2hfcHJpbnRfaW5pdCgmc2V0dGluZ3MsCi0JCQljdXJidWYtPmJfZm5hbWUgPT0gTlVMTAotCQkJICAgID8gKGNoYXJfdSAqKWJ1Zl9zcG5hbWUoY3VyYnVmKQotCQkJICAgIDogY3VyYnVmLT5iX3NmbmFtZSA9PSBOVUxMCi0JCQkJPyBjdXJidWYtPmJfZm5hbWUKLQkJCQk6IGN1cmJ1Zi0+Yl9zZm5hbWUsCi0JCQllYXAtPmZvcmNlaXQpID09IEZBSUwpCi0JcmV0dXJuOwotCi0jaWZkZWYgRkVBVF9TWU5fSEwKLSMgaWZkZWYgIEZFQVRfR1VJCi0gICAgaWYgKGd1aS5pbl91c2UpCi0Jc2V0dGluZ3MubW9kZWMgPSAnZyc7Ci0gICAgZWxzZQotIyBlbmRpZgotCWlmICh0X2NvbG9ycyA+IDEpCi0JICAgIHNldHRpbmdzLm1vZGVjID0gJ2MnOwotCWVsc2UKLQkgICAgc2V0dGluZ3MubW9kZWMgPSAndCc7Ci0KLSAgICBpZiAoIXN5bnRheF9wcmVzZW50KGN1cmJ1ZikpCi0Jc2V0dGluZ3MuZG9fc3ludGF4ID0gRkFMU0U7Ci0gICAgZWxzZSBpZiAocHJpbnRlcl9vcHRzW09QVF9QUklOVF9TWU5UQVhdLnByZXNlbnQKLQkgICAgJiYgVE9MT1dFUl9BU0MocHJpbnRlcl9vcHRzW09QVF9QUklOVF9TWU5UQVhdLnN0cmluZ1swXSkgIT0gJ2EnKQotCXNldHRpbmdzLmRvX3N5bnRheCA9Ci0JICAgICAgIChUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX1NZTlRBWF0uc3RyaW5nWzBdKSA9PSAneScpOwotICAgIGVsc2UKLQlzZXR0aW5ncy5kb19zeW50YXggPSBzZXR0aW5ncy5oYXNfY29sb3I7Ci0jZW5kaWYKLQotICAgIC8qIFNldCB1cCBwcmludGluZyBhdHRyaWJ1dGVzIGZvciBsaW5lIG51bWJlcnMgKi8KLSAgICBzZXR0aW5ncy5udW1iZXIuZmdfY29sb3IgPSBQUkNPTE9SX0JMQUNLOwotICAgIHNldHRpbmdzLm51bWJlci5iZ19jb2xvciA9IFBSQ09MT1JfV0hJVEU7Ci0gICAgc2V0dGluZ3MubnVtYmVyLmJvbGQgPSBGQUxTRTsKLSAgICBzZXR0aW5ncy5udW1iZXIuaXRhbGljID0gVFJVRTsKLSAgICBzZXR0aW5ncy5udW1iZXIudW5kZXJsaW5lID0gRkFMU0U7Ci0jaWZkZWYgRkVBVF9TWU5fSEwKLSAgICAvKgotICAgICAqIFN5bnRheCBoaWdobGlnaHRpbmcgb2YgbGluZSBudW1iZXJzLgotICAgICAqLwotICAgIGlmIChwcnRfdXNlX251bWJlcigpICYmIHNldHRpbmdzLmRvX3N5bnRheCkKLSAgICB7Ci0JaWQgPSBzeW5fbmFtZTJpZCgoY2hhcl91ICopIkxpbmVOciIpOwotCWlmIChpZCA+IDApCi0JICAgIGlkID0gc3luX2dldF9maW5hbF9pZChpZCk7Ci0KLQlwcnRfZ2V0X2F0dHIoaWQsICZzZXR0aW5ncy5udW1iZXIsIHNldHRpbmdzLm1vZGVjKTsKLSAgICB9Ci0jZW5kaWYgLyogRkVBVF9TWU5fSEwgKi8KLQotICAgIC8qCi0gICAgICogRXN0aW1hdGUgdGhlIHRvdGFsIGxpbmVzIHRvIGJlIHByaW50ZWQKLSAgICAgKi8KLSAgICBmb3IgKGxudW0gPSBlYXAtPmxpbmUxOyBsbnVtIDw9IGVhcC0+bGluZTI7IGxudW0rKykKLQlieXRlc190b19wcmludCArPSAobG9uZ191KVNUUkxFTihza2lwd2hpdGUobWxfZ2V0KGxudW0pKSk7Ci0gICAgaWYgKGJ5dGVzX3RvX3ByaW50ID09IDApCi0gICAgewotCU1TRyhfKCJObyB0ZXh0IHRvIGJlIHByaW50ZWQiKSk7Ci0JZ290byBwcmludF9mYWlsX25vX2JlZ2luOwotICAgIH0KLQotICAgIC8qIFNldCBjb2xvcnMgYW5kIGZvbnQgdG8gbm9ybWFsLiAqLwotICAgIGN1cnJfYmcgPSAobG9uZ191KTB4ZmZmZmZmZmZMOwotICAgIGN1cnJfZmcgPSAobG9uZ191KTB4ZmZmZmZmZmZMOwotICAgIGN1cnJfaXRhbGljID0gTUFZQkU7Ci0gICAgY3Vycl9ib2xkID0gTUFZQkU7Ci0gICAgY3Vycl91bmRlcmxpbmUgPSBNQVlCRTsKLQotICAgIHBydF9zZXRfZmcoUFJDT0xPUl9CTEFDSyk7Ci0gICAgcHJ0X3NldF9iZyhQUkNPTE9SX1dISVRFKTsKLSAgICBwcnRfc2V0X2ZvbnQoRkFMU0UsIEZBTFNFLCBGQUxTRSk7Ci0jaWZkZWYgRkVBVF9TWU5fSEwKLSAgICBjdXJyZW50X3N5bl9pZCA9IC0xOwotI2VuZGlmCi0KLSAgICBqb2JzcGxpdCA9IChwcmludGVyX29wdHNbT1BUX1BSSU5UX0pPQlNQTElUXS5wcmVzZW50Ci0JICAgJiYgVE9MT1dFUl9BU0MocHJpbnRlcl9vcHRzW09QVF9QUklOVF9KT0JTUExJVF0uc3RyaW5nWzBdKSA9PSAneScpOwotCi0gICAgaWYgKCFtY2hfcHJpbnRfYmVnaW4oJnNldHRpbmdzKSkKLQlnb3RvIHByaW50X2ZhaWxfbm9fYmVnaW47Ci0KLSAgICAvKgotICAgICAqIExvb3Agb3ZlciBjb2xsYXRlZCBjb3BpZXM6IDEgMiAzLCAxIDIgMywgLi4uCi0gICAgICovCi0gICAgcGFnZV9jb3VudCA9IDA7Ci0gICAgZm9yIChjb2xsYXRlZF9jb3BpZXMgPSAwOwotCSAgICBjb2xsYXRlZF9jb3BpZXMgPCBzZXR0aW5ncy5uX2NvbGxhdGVkX2NvcGllczsKLQkgICAgY29sbGF0ZWRfY29waWVzKyspCi0gICAgewotCXBydF9wb3NfVAlwcnRwb3M7CQkvKiBjdXJyZW50IHByaW50IHBvc2l0aW9uICovCi0JcHJ0X3Bvc19UCXBhZ2VfcHJ0cG9zOwkvKiBwcmludCBwb3NpdGlvbiBhdCBwYWdlIHN0YXJ0ICovCi0JaW50CQlzaWRlOwotCi0JbWVtc2V0KCZwYWdlX3BydHBvcywgMCwgc2l6ZW9mKHBydF9wb3NfVCkpOwotCXBhZ2VfcHJ0cG9zLmZpbGVfbGluZSA9IGVhcC0+bGluZTE7Ci0JcHJ0cG9zID0gcGFnZV9wcnRwb3M7Ci0KLQlpZiAoam9ic3BsaXQgJiYgY29sbGF0ZWRfY29waWVzID4gMCkKLQl7Ci0JICAgIC8qIFNwbGl0dGluZyBqb2JzOiBTdG9wIGEgcHJldmlvdXMgam9iIGFuZCBzdGFydCBhIG5ldyBvbmUuICovCi0JICAgIG1jaF9wcmludF9lbmQoJnNldHRpbmdzKTsKLQkgICAgaWYgKCFtY2hfcHJpbnRfYmVnaW4oJnNldHRpbmdzKSkKLQkJZ290byBwcmludF9mYWlsX25vX2JlZ2luOwotCX0KLQotCS8qCi0JICogTG9vcCBvdmVyIGFsbCBwYWdlcyBpbiB0aGUgcHJpbnQgam9iOiAxIDIgMyAuLi4KLQkgKi8KLQlmb3IgKHBhZ2VfY291bnQgPSAwOyBwcnRwb3MuZmlsZV9saW5lIDw9IGVhcC0+bGluZTI7ICsrcGFnZV9jb3VudCkKLQl7Ci0JICAgIC8qCi0JICAgICAqIExvb3Agb3ZlciB1bmNvbGxhdGVkIGNvcGllczogMSAxIDEsIDIgMiAyLCAzIDMgMywgLi4uCi0JICAgICAqIEZvciBkdXBsZXg6IDEyIDEyIDEyIDM0IDM0IDM0LCAuLi4KLQkgICAgICovCi0JICAgIGZvciAodW5jb2xsYXRlZF9jb3BpZXMgPSAwOwotCQkgICAgdW5jb2xsYXRlZF9jb3BpZXMgPCBzZXR0aW5ncy5uX3VuY29sbGF0ZWRfY29waWVzOwotCQkgICAgdW5jb2xsYXRlZF9jb3BpZXMrKykKLQkgICAgewotCQkvKiBTZXQgdGhlIHByaW50IHBvc2l0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGlzIHBhZ2UuICovCi0JCXBydHBvcyA9IHBhZ2VfcHJ0cG9zOwotCi0JCS8qCi0JCSAqIERvIGZyb250IGFuZCByZWFyIHNpZGUgb2YgYSBwYWdlLgotCQkgKi8KLQkJZm9yIChzaWRlID0gMDsgc2lkZSA8PSBzZXR0aW5ncy5kdXBsZXg7ICsrc2lkZSkKLQkJewotCQkgICAgLyoKLQkJICAgICAqIFByaW50IG9uZSBwYWdlLgotCQkgICAgICovCi0KLQkJICAgIC8qIENoZWNrIGZvciBpbnRlcnJ1cHQgY2hhcmFjdGVyIGV2ZXJ5IHBhZ2UuICovCi0JCSAgICB1aV9icmVha2NoZWNrKCk7Ci0JCSAgICBpZiAoZ290X2ludCB8fCBzZXR0aW5ncy51c2VyX2Fib3J0KQotCQkJZ290byBwcmludF9mYWlsOwotCi0JCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJQcmludGluZyBwYWdlICVkICglZCUlKSIpLAotCQkJICAgIHBhZ2VfY291bnQgKyAxICsgc2lkZSwKLQkJCSAgICBwcnRwb3MuYnl0ZXNfcHJpbnRlZCA+IDEwMDAwMDAKLQkJCQk/IChpbnQpKHBydHBvcy5ieXRlc19wcmludGVkIC8KLQkJCQkJCSAgICAgICAoYnl0ZXNfdG9fcHJpbnQgLyAxMDApKQotCQkJCTogKGludCkoKHBydHBvcy5ieXRlc19wcmludGVkICogMTAwKQotCQkJCQkJCSAgIC8gYnl0ZXNfdG9fcHJpbnQpKTsKLQkJICAgIGlmICghbWNoX3ByaW50X2JlZ2luX3BhZ2UoSU9idWZmKSkKLQkJCWdvdG8gcHJpbnRfZmFpbDsKLQotCQkgICAgaWYgKHNldHRpbmdzLm5fY29sbGF0ZWRfY29waWVzID4gMSkKLQkJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYgKyBTVFJMRU4oSU9idWZmKSwKLQkJCQlfKCIgQ29weSAlZCBvZiAlZCIpLAotCQkJCWNvbGxhdGVkX2NvcGllcyArIDEsCi0JCQkJc2V0dGluZ3Mubl9jb2xsYXRlZF9jb3BpZXMpOwotCQkgICAgcHJ0X21lc3NhZ2UoSU9idWZmKTsKLQotCQkgICAgLyoKLQkJICAgICAqIE91dHB1dCBoZWFkZXIgaWYgcmVxdWlyZWQKLQkJICAgICAqLwotCQkgICAgaWYgKHBydF9oZWFkZXJfaGVpZ2h0KCkgPiAwKQotCQkJcHJ0X2hlYWRlcigmc2V0dGluZ3MsIHBhZ2VfY291bnQgKyAxICsgc2lkZSwKLQkJCQkJCQlwcnRwb3MuZmlsZV9saW5lKTsKLQotCQkgICAgZm9yIChwYWdlX2xpbmUgPSAwOyBwYWdlX2xpbmUgPCBzZXR0aW5ncy5saW5lc19wZXJfcGFnZTsKLQkJCQkJCQkJICArK3BhZ2VfbGluZSkKLQkJICAgIHsKLQkJCXBydHBvcy5jb2x1bW4gPSBoYXJkY29weV9saW5lKCZzZXR0aW5ncywKLQkJCQkJCQkgICBwYWdlX2xpbmUsICZwcnRwb3MpOwotCQkJaWYgKHBydHBvcy5jb2x1bW4gPT0gMCkKLQkJCXsKLQkJCSAgICAvKiBmaW5pc2hlZCBhIGZpbGUgbGluZSAqLwotCQkJICAgIHBydHBvcy5ieXRlc19wcmludGVkICs9Ci0JCQkJICBTVFJMRU4oc2tpcHdoaXRlKG1sX2dldChwcnRwb3MuZmlsZV9saW5lKSkpOwotCQkJICAgIGlmICgrK3BydHBvcy5maWxlX2xpbmUgPiBlYXAtPmxpbmUyKQotCQkJCWJyZWFrOyAvKiByZWFjaGVkIHRoZSBlbmQgKi8KLQkJCX0KLQkJCWVsc2UgaWYgKHBydHBvcy5mZikKLQkJCXsKLQkJCSAgICAvKiBMaW5lIGhhZCBhIGZvcm1mZWVkIGluIGl0IC0gc3RhcnQgbmV3IHBhZ2UgYnV0Ci0JCQkgICAgICogc3RheSBvbiB0aGUgY3VycmVudCBsaW5lICovCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICAgIGlmICghbWNoX3ByaW50X2VuZF9wYWdlKCkpCi0JCQlnb3RvIHByaW50X2ZhaWw7Ci0JCSAgICBpZiAocHJ0cG9zLmZpbGVfbGluZSA+IGVhcC0+bGluZTIpCi0JCQlicmVhazsgLyogcmVhY2hlZCB0aGUgZW5kICovCi0JCX0KLQotCQkvKgotCQkgKiBFeHRyYSBibGFuayBwYWdlIGZvciBkdXBsZXhpbmcgd2l0aCBvZGQgbnVtYmVyIG9mIHBhZ2VzIGFuZAotCQkgKiBtb3JlIGNvcGllcyB0byBjb21lLgotCQkgKi8KLQkJaWYgKHBydHBvcy5maWxlX2xpbmUgPiBlYXAtPmxpbmUyICYmIHNldHRpbmdzLmR1cGxleAotCQkJCQkJCQkgJiYgc2lkZSA9PSAwCi0JCSAgICAmJiB1bmNvbGxhdGVkX2NvcGllcyArIDEgPCBzZXR0aW5ncy5uX3VuY29sbGF0ZWRfY29waWVzKQotCQl7Ci0JCSAgICBpZiAoIW1jaF9wcmludF9ibGFua19wYWdlKCkpCi0JCQlnb3RvIHByaW50X2ZhaWw7Ci0JCX0KLQkgICAgfQotCSAgICBpZiAoc2V0dGluZ3MuZHVwbGV4ICYmIHBydHBvcy5maWxlX2xpbmUgPD0gZWFwLT5saW5lMikKLQkJKytwYWdlX2NvdW50OwotCi0JICAgIC8qIFJlbWVtYmVyIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBwYWdlIHN0YXJ0cy4gKi8KLQkgICAgcGFnZV9wcnRwb3MgPSBwcnRwb3M7Ci0JfQotCi0JdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsIF8oIlByaW50ZWQ6ICVzIiksCi0JCQkJCQkJICAgIHNldHRpbmdzLmpvYm5hbWUpOwotCXBydF9tZXNzYWdlKElPYnVmZik7Ci0gICAgfQotCi1wcmludF9mYWlsOgotICAgIGlmIChnb3RfaW50IHx8IHNldHRpbmdzLnVzZXJfYWJvcnQpCi0gICAgewotCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsICIlcyIsIF8oIlByaW50aW5nIGFib3J0ZWQiKSk7Ci0JcHJ0X21lc3NhZ2UoSU9idWZmKTsKLSAgICB9Ci0gICAgbWNoX3ByaW50X2VuZCgmc2V0dGluZ3MpOwotCi1wcmludF9mYWlsX25vX2JlZ2luOgotICAgIG1jaF9wcmludF9jbGVhbnVwKCk7Ci19Ci0KLS8qCi0gKiBQcmludCBvbmUgcGFnZSBsaW5lLgotICogUmV0dXJuIHRoZSBuZXh0IGNvbHVtbiB0byBwcmludCwgb3IgemVybyBpZiB0aGUgbGluZSBpcyBmaW5pc2hlZC4KLSAqLwotICAgIHN0YXRpYyBjb2xucl9UCi1oYXJkY29weV9saW5lKHBzZXR0aW5ncywgcGFnZV9saW5lLCBwcG9zKQotICAgIHBydF9zZXR0aW5nc19UCSpwc2V0dGluZ3M7Ci0gICAgaW50CQkJcGFnZV9saW5lOwotICAgIHBydF9wb3NfVAkJKnBwb3M7Ci17Ci0gICAgY29sbnJfVAljb2w7Ci0gICAgY2hhcl91CSpsaW5lOwotICAgIGludAkJbmVlZF9icmVhayA9IEZBTFNFOwotICAgIGludAkJb3V0cHV0bGVuOwotICAgIGludAkJdGFiX3NwYWNlczsKLSAgICBsb25nX3UJcHJpbnRfcG9zOwotI2lmZGVmIEZFQVRfU1lOX0hMCi0gICAgcHJ0X3RleHRfYXR0cl9UIGF0dHI7Ci0gICAgaW50CQlpZDsKLSNlbmRpZgotCi0gICAgaWYgKHBwb3MtPmNvbHVtbiA9PSAwIHx8IHBwb3MtPmZmKQotICAgIHsKLQlwcmludF9wb3MgPSAwOwotCXRhYl9zcGFjZXMgPSAwOwotCWlmICghcHBvcy0+ZmYgJiYgcHJ0X3VzZV9udW1iZXIoKSkKLQkgICAgcHJ0X2xpbmVfbnVtYmVyKHBzZXR0aW5ncywgcGFnZV9saW5lLCBwcG9zLT5maWxlX2xpbmUpOwotCXBwb3MtPmZmID0gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JLyogbGVmdCBvdmVyIGZyb20gd3JhcCBoYWxmd2F5IGEgdGFiICovCi0JcHJpbnRfcG9zID0gcHBvcy0+cHJpbnRfcG9zOwotCXRhYl9zcGFjZXMgPSBwcG9zLT5sZWFkX3NwYWNlczsKLSAgICB9Ci0KLSAgICBtY2hfcHJpbnRfc3RhcnRfbGluZSgwLCBwYWdlX2xpbmUpOwotICAgIGxpbmUgPSBtbF9nZXQocHBvcy0+ZmlsZV9saW5lKTsKLQotICAgIC8qCi0gICAgICogTG9vcCBvdmVyIHRoZSBjb2x1bW5zIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUgbGluZSBvciByaWdodCBtYXJnaW4uCi0gICAgICovCi0gICAgZm9yIChjb2wgPSBwcG9zLT5jb2x1bW47IGxpbmVbY29sXSAhPSBOVUwgJiYgIW5lZWRfYnJlYWs7IGNvbCArPSBvdXRwdXRsZW4pCi0gICAgewotCW91dHB1dGxlbiA9IDE7Ci0jaWZkZWYgRkVBVF9NQllURQotCWlmIChoYXNfbWJ5dGUgJiYgKG91dHB1dGxlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykobGluZSArIGNvbCkpIDwgMSkKLQkgICAgb3V0cHV0bGVuID0gMTsKLSNlbmRpZgotI2lmZGVmIEZFQVRfU1lOX0hMCi0JLyoKLQkgKiBzeW50YXggaGlnaGxpZ2h0aW5nIHN0dWZmLgotCSAqLwotCWlmIChwc2V0dGluZ3MtPmRvX3N5bnRheCkKLQl7Ci0JICAgIGlkID0gc3luX2dldF9pZChwcG9zLT5maWxlX2xpbmUsIGNvbCwgMSwgTlVMTCk7Ci0JICAgIGlmIChpZCA+IDApCi0JCWlkID0gc3luX2dldF9maW5hbF9pZChpZCk7Ci0JICAgIGVsc2UKLQkJaWQgPSAwOwotCSAgICAvKiBHZXQgdGhlIGxpbmUgYWdhaW4sIGEgbXVsdGktbGluZSByZWdleHAgbWF5IGludmFsaWRhdGUgaXQuICovCi0JICAgIGxpbmUgPSBtbF9nZXQocHBvcy0+ZmlsZV9saW5lKTsKLQotCSAgICBpZiAoaWQgIT0gY3VycmVudF9zeW5faWQpCi0JICAgIHsKLQkJY3VycmVudF9zeW5faWQgPSBpZDsKLQkJcHJ0X2dldF9hdHRyKGlkLCAmYXR0ciwgcHNldHRpbmdzLT5tb2RlYyk7Ci0JCXBydF9zZXRfZm9udChhdHRyLmJvbGQsIGF0dHIuaXRhbGljLCBhdHRyLnVuZGVybGluZSk7Ci0JCXBydF9zZXRfZmcoYXR0ci5mZ19jb2xvcik7Ci0JCXBydF9zZXRfYmcoYXR0ci5iZ19jb2xvcik7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogRkVBVF9TWU5fSEwgKi8KLQotCS8qCi0JICogQXBwcm9wcmlhdGVseSBleHBhbmQgYW55IHRhYnMgdG8gc3BhY2VzLgotCSAqLwotCWlmIChsaW5lW2NvbF0gPT0gVEFCIHx8IHRhYl9zcGFjZXMgIT0gMCkKLQl7Ci0JICAgIGlmICh0YWJfc3BhY2VzID09IDApCi0JCXRhYl9zcGFjZXMgPSBjdXJidWYtPmJfcF90cyAtIChwcmludF9wb3MgJSBjdXJidWYtPmJfcF90cyk7Ci0KLQkgICAgd2hpbGUgKHRhYl9zcGFjZXMgPiAwKQotCSAgICB7Ci0JCW5lZWRfYnJlYWsgPSBtY2hfcHJpbnRfdGV4dF9vdXQoKGNoYXJfdSAqKSIgIiwgMSk7Ci0JCXByaW50X3BvcysrOwotCQl0YWJfc3BhY2VzLS07Ci0JCWlmIChuZWVkX2JyZWFrKQotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgLyogS2VlcCB0aGUgVEFCIGlmIHdlIGRpZG4ndCBmaW5pc2ggaXQuICovCi0JICAgIGlmIChuZWVkX2JyZWFrICYmIHRhYl9zcGFjZXMgPiAwKQotCQlicmVhazsKLQl9Ci0JZWxzZSBpZiAobGluZVtjb2xdID09IEZGCi0JCSYmIHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfRk9STUZFRURdLnByZXNlbnQKLQkJJiYgVE9MT1dFUl9BU0MocHJpbnRlcl9vcHRzW09QVF9QUklOVF9GT1JNRkVFRF0uc3RyaW5nWzBdKQotCQkJCQkJCQkgICAgICAgPT0gJ3knKQotCXsKLQkgICAgcHBvcy0+ZmYgPSBUUlVFOwotCSAgICBuZWVkX2JyZWFrID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgbmVlZF9icmVhayA9IG1jaF9wcmludF90ZXh0X291dChsaW5lICsgY29sLCBvdXRwdXRsZW4pOwotI2lmZGVmIEZFQVRfTUJZVEUKLQkgICAgaWYgKGhhc19tYnl0ZSkKLQkJcHJpbnRfcG9zICs9ICgqbWJfcHRyMmNlbGxzKShsaW5lICsgY29sKTsKLQkgICAgZWxzZQotI2VuZGlmCi0JCXByaW50X3BvcysrOwotCX0KLSAgICB9Ci0KLSAgICBwcG9zLT5sZWFkX3NwYWNlcyA9IHRhYl9zcGFjZXM7Ci0gICAgcHBvcy0+cHJpbnRfcG9zID0gcHJpbnRfcG9zOwotCi0gICAgLyoKLSAgICAgKiBTdGFydCBuZXh0IGxpbmUgb2YgZmlsZSBpZiB3ZSBjbGlwIGxpbmVzLCBvciBoYXZlIHJlYWNoZWQgZW5kIG9mIHRoZQotICAgICAqIGxpbmUsIHVubGVzcyB3ZSBhcmUgZG9pbmcgYSBmb3JtZmVlZC4KLSAgICAgKi8KLSAgICBpZiAoIXBwb3MtPmZmCi0JICAgICYmIChsaW5lW2NvbF0gPT0gTlVMCi0JCXx8IChwcmludGVyX29wdHNbT1BUX1BSSU5UX1dSQVBdLnByZXNlbnQKLQkJICAgICYmIFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfV1JBUF0uc3RyaW5nWzBdKQotCQkJCQkJCQkgICAgID09ICduJykpKQotCXJldHVybiAwOwotICAgIHJldHVybiBjb2w7Ci19Ci0KLSMgaWYgZGVmaW5lZChGRUFUX1BPU1RTQ1JJUFQpIHx8IGRlZmluZWQoUFJPVE8pCi0KLS8qCi0gKiBQUyBwcmludGVyIHN0dWZmLgotICoKLSAqIFNvdXJjZXMgb2YgaW5mb3JtYXRpb24gdG8gaGVscCBtYWludGFpbiB0aGUgUFMgcHJpbnRpbmcgY29kZToKLSAqCi0gKiAxLiBQb3N0U2NyaXB0IExhbmd1YWdlIFJlZmVyZW5jZSwgM3JkIEVkaXRpb24sCi0gKiAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTk5LCBJU0JOIDAtMjAxLTM3OTIyLTgKLSAqIDIuIFBvc3RTY3JpcHQgTGFuZ3VhZ2UgUHJvZ3JhbSBEZXNpZ24sCi0gKiAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTg4LCBJU0JOIDAtMjAxLTE0Mzk2LTgKLSAqIDMuIFBvc3RTY3JpcHQgVHV0b3JpYWwgYW5kIENvb2tib29rLAotICogICAgICBBZGRpc29uIFdlc2xleSwgMTk4NSwgSVNCTiAwLTIwMS0xMDE3OS0zCi0gKiA0LiBQb3N0U2NyaXB0IExhbmd1YWdlIERvY3VtZW50IFN0cnVjdHVyaW5nIENvbnZlbnRpb25zIFNwZWNpZmljYXRpb24sCi0gKiAgICB2ZXJzaW9uIDMuMCwKLSAqICAgICAgQWRvYmUgVGVjaG5vdGUgNTAwMSwgMjV0aCBTZXB0ZW1iZXIgMTk5MgotICogNS4gUG9zdFNjcmlwdCBQcmludGVyIERlc2NyaXB0aW9uIEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24sIFZlcnNpb24gNC4zLAotICogICAgICBBZG9iZSB0ZWNobm90ZSA1MDAzLCA5dGggRmVicnVhcnkgMTk5NgotICogNi4gQWRvYmUgRm9udCBNZXRyaWNzIEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24sIFZlcnNpb24gNC4xLAotICogICAgICBBZG9iZSBUZWNobm90ZSA1MDA3LCA3dGggT2N0b2JlciAxOTk4Ci0gKiA3LiBBZG9iZSBDTWFwIGFuZCBDSURGb250IEZpbGVzIFNwZWNpZmljYXRpb24sIFZlcnNpb24gMS4wLAotICogICAgICBBZG9iZSBUZWNobm90ZSA1MDE0LCA4dGggT2N0b2JlciAxOTk2Ci0gKiA4LiBBZG9iZSBDSktWIENoYXJhY3RlciBDb2xsZWN0aW9ucyBhbmQgQ01hcHMgZm9yIENJRC1LZXllZCBGb250cywKLSAqICAgICAgQWRvYm9lIFRlY2hub3RlIDUwOTQsIDh0aCBTZXB0ZW1iZXIsIDIwMDEKLSAqIDkuIENKS1YgSW5mb3JtYXRpb24gUHJvY2Vzc2luZywgMm5kIEVkaXRpb24sCi0gKiAgICAgIE8nUmVpbGx5LCAyMDAyLCBJU0JOIDEtNTY1OTItMjI0LTcKLSAqCi0gKiBTb21lIG9mIHRoZXNlIGRvY3VtZW50cyBjYW4gYmUgZm91bmQgaW4gUERGIGZvcm0gb24gQWRvYmUncyB3ZWIgc2l0ZSAtCi0gKiBodHRwOi8vd3d3LmFkb2JlLmNvbQotICovCi0KLSNkZWZpbmUgTlVNX0VMRU1FTlRTKGFycikgICAoc2l6ZW9mKGFycikvc2l6ZW9mKChhcnIpWzBdKSkKLQotI2RlZmluZSBQUlRfUFNfREVGQVVMVF9EUEkJICAgICg3MikgICAgLyogRGVmYXVsdCB1c2VyIHNwYWNlIHJlc29sdXRpb24gKi8KLSNkZWZpbmUgUFJUX1BTX0RFRkFVTFRfRk9OVFNJWkUgICAgICgxMCkKLSNkZWZpbmUgUFJUX1BTX0RFRkFVTFRfQlVGRkVSX1NJWkUgICg4MCkKLQotc3RydWN0IHBydF9tZWRpYXNpemVfUwotewotICAgIGNoYXIJKm5hbWU7Ci0gICAgZmxvYXQJd2lkdGg7CQkvKiB3aWR0aCBhbmQgaGVpZ2h0IGluIHBvaW50cyBmb3IgcG9ydHJhaXQgKi8KLSAgICBmbG9hdAloZWlnaHQ7Ci19OwotCi0jZGVmaW5lIFBSVF9NRURJQVNJWkVfTEVOICAoc2l6ZW9mKHBydF9tZWRpYXNpemUpIC8gc2l6ZW9mKHN0cnVjdCBwcnRfbWVkaWFzaXplX1MpKQotCi1zdGF0aWMgc3RydWN0IHBydF9tZWRpYXNpemVfUyBwcnRfbWVkaWFzaXplW10gPQotewotICAgIHsiQTQiLAkJNTk1LjAsICA4NDIuMH0sCi0gICAgeyJsZXR0ZXIiLAkJNjEyLjAsICA3OTIuMH0sCi0gICAgeyIxMHgxNCIsCQk3MjAuMCwgMTAwOC4wfSwKLSAgICB7IkEzIiwJCTg0Mi4wLCAxMTkxLjB9LAotICAgIHsiQTUiLAkJNDIwLjAsICA1OTUuMH0sCi0gICAgeyJCNCIsCQk3MjkuMCwgMTAzMi4wfSwKLSAgICB7IkI1IiwJCTUxNi4wLCAgNzI5LjB9LAotICAgIHsiZXhlY3V0aXZlIiwJNTIyLjAsICA3NTYuMH0sCi0gICAgeyJmb2xpbyIsCQk1OTUuMCwgIDkzNS4wfSwKLSAgICB7ImxlZGdlciIsCSAgICAgICAxMjI0LjAsICA3OTIuMH0sICAgLyogWWVzLCBpdCBpcyB3aWRlciB0aGFuIHRhbGxlciEgKi8KLSAgICB7ImxlZ2FsIiwJCTYxMi4wLCAxMDA4LjB9LAotICAgIHsicXVhcnRvIiwJCTYxMC4wLCAgNzgwLjB9LAotICAgIHsic3RhdGVtZW50IiwJMzk2LjAsICA2MTIuMH0sCi0gICAgeyJ0YWJsb2lkIiwJCTc5Mi4wLCAxMjI0LjB9Ci19OwotCi0vKiBQUyBmb250IG5hbWVzLCBtdXN0IGJlIGluIFJvbWFuLCBCb2xkLCBJdGFsaWMsIEJvbGQtSXRhbGljIG9yZGVyICovCi1zdHJ1Y3QgcHJ0X3BzX2ZvbnRfUwotewotICAgIGludAkJd3g7Ci0gICAgaW50CQl1bGluZV9vZmZzZXQ7Ci0gICAgaW50CQl1bGluZV93aWR0aDsKLSAgICBpbnQJCWJib3hfbWluX3k7Ci0gICAgaW50CQliYm94X21heF95OwotICAgIGNoYXIJKihwc19mb250bmFtZVs0XSk7Ci19OwotCi0jZGVmaW5lIFBSVF9QU19GT05UX1JPTUFOCSgwKQotI2RlZmluZSBQUlRfUFNfRk9OVF9CT0xECSgxKQotI2RlZmluZSBQUlRfUFNfRk9OVF9PQkxJUVVFCSgyKQotI2RlZmluZSBQUlRfUFNfRk9OVF9CT0xET0JMSVFVRSAoMykKLQotLyogU3RhbmRhcmQgZm9udCBtZXRyaWNzIGZvciBDb3VyaWVyIGZhbWlseSAqLwotc3RhdGljIHN0cnVjdCBwcnRfcHNfZm9udF9TIHBydF9wc19jb3VyaWVyX2ZvbnQgPQotewotICAgIDYwMCwKLSAgICAtMTAwLCA1MCwKLSAgICAtMjUwLCA4MDUsCi0gICAgeyJDb3VyaWVyIiwgIkNvdXJpZXItQm9sZCIsICJDb3VyaWVyLU9ibGlxdWUiLCAiQ291cmllci1Cb2xkT2JsaXF1ZSJ9Ci19OwotCi0jaWZkZWYgRkVBVF9NQllURQotLyogR2VuZXJpYyBmb250IG1ldHJpY3MgZm9yIG11bHRpLWJ5dGUgZm9udHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcHJ0X3BzX2ZvbnRfUyBwcnRfcHNfbWJfZm9udCA9Ci17Ci0gICAgMTAwMCwKLSAgICAtMTAwLCA1MCwKLSAgICAtMjUwLCA4MDUsCi0gICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Ci19OwotI2VuZGlmCi0KLS8qIFBvaW50ZXIgdG8gY3VycmVudCBmb250IHNldCBiZWluZyB1c2VkICovCi1zdGF0aWMgc3RydWN0IHBydF9wc19mb250X1MqIHBydF9wc19mb250OwotCi0vKiBTdHJ1Y3R1cmVzIHRvIG1hcCB1c2VyIG5hbWVkIGVuY29kaW5nIGFuZCBtYXBwaW5nIHRvIFBTIGVxdWl2YWxlbnRzIGZvcgotICogYnVpbGRpbmcgQ0lEIGZvbnQgbmFtZSAqLwotc3RydWN0IHBydF9wc19lbmNvZGluZ19TCi17Ci0gICAgY2hhcgkqZW5jb2Rpbmc7Ci0gICAgY2hhcgkqY21hcF9lbmNvZGluZzsKLSAgICBpbnQJCW5lZWRzX2NoYXJzZXQ7Ci19OwotCi1zdHJ1Y3QgcHJ0X3BzX2NoYXJzZXRfUwotewotICAgIGNoYXIJKmNoYXJzZXQ7Ci0gICAgY2hhcgkqY21hcF9jaGFyc2V0OwotICAgIGludAkJaGFzX2NoYXJzZXQ7Ci19OwotCi0jaWZkZWYgRkVBVF9NQllURQotCi0jZGVmaW5lIENTX0pJU19DXzE5NzggICAoMHgwMSkKLSNkZWZpbmUgQ1NfSklTX1hfMTk4MyAgICgweDAyKQotI2RlZmluZSBDU19KSVNfWF8xOTkwICAgKDB4MDQpCi0jZGVmaW5lIENTX05FQyAgICAgICAgICAoMHgwOCkKLSNkZWZpbmUgQ1NfTVNXSU5ET1dTICAgICgweDEwKQotI2RlZmluZSBDU19DUDkzMiAgICAgICAgKDB4MjApCi0jZGVmaW5lIENTX0tBTkpJVEFMSzYgICAoMHg0MCkKLSNkZWZpbmUgQ1NfS0FOSklUQUxLNyAgICgweDgwKQotCi0vKiBKYXBhbmVzZSBlbmNvZGluZ3MgYW5kIGNoYXJzZXRzICovCi1zdGF0aWMgc3RydWN0IHBydF9wc19lbmNvZGluZ19TIGpfZW5jb2RpbmdzW10gPQotewotICAgIHsiaXNvLTIwMjItanAiLCBOVUxMLCAgICAgICAoQ1NfSklTX0NfMTk3OHxDU19KSVNfWF8xOTgzfENTX0pJU19YXzE5OTB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX05FQyl9LAotICAgIHsiZXVjLWpwIiwgICAgICAiRVVDIiwgICAgICAoQ1NfSklTX0NfMTk3OHxDU19KSVNfWF8xOTgzfENTX0pJU19YXzE5OTApfSwKLSAgICB7InNqaXMiLCAgICAgICAgIlJLU0oiLCAgICAgKENTX0pJU19DXzE5Nzh8Q1NfSklTX1hfMTk4M3xDU19NU1dJTkRPV1N8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19LQU5KSVRBTEs2fENTX0tBTkpJVEFMSzcpfSwKLSAgICB7ImNwOTMyIiwgICAgICAgIlJLU0oiLCAgICAgQ1NfSklTX1hfMTk4M30sCi0gICAgeyJ1Y3MtMiIsICAgICAgICJVQ1MyIiwgICAgIENTX0pJU19YXzE5OTB9LAotICAgIHsidXRmLTgiLCAgICAgICAiVVRGOCIgLCAgICBDU19KSVNfWF8xOTkwfQotfTsKLXN0YXRpYyBzdHJ1Y3QgcHJ0X3BzX2NoYXJzZXRfUyBqX2NoYXJzZXRzW10gPQotewotICAgIHsiSklTX0NfMTk3OCIsICAiNzgiLCAgICAgICBDU19KSVNfQ18xOTc4fSwKLSAgICB7IkpJU19YXzE5ODMiLCAgTlVMTCwgICAgICAgQ1NfSklTX1hfMTk4M30sCi0gICAgeyJKSVNfWF8xOTkwIiwgICJIb2pvIiwgICAgIENTX0pJU19YXzE5OTB9LAotICAgIHsiTkVDIiwgICAgICAgICAiRXh0IiwgICAgICBDU19ORUN9LAotICAgIHsiTVNXSU5ET1dTIiwgICAiOTBtcyIsICAgICBDU19NU1dJTkRPV1N9LAotICAgIHsiQ1A5MzIiLCAgICAgICAiOTBtcyIsICAgICBDU19KSVNfWF8xOTgzfSwKLSAgICB7IktBTkpJVEFMSzYiLCAgIjgzcHYiLCAgICAgQ1NfS0FOSklUQUxLNn0sCi0gICAgeyJLQU5KSVRBTEs3IiwgICI5MHB2IiwgICAgIENTX0tBTkpJVEFMSzd9Ci19OwotCi0jZGVmaW5lIENTX0dCXzIzMTJfODAgICAgICAgKDB4MDEpCi0jZGVmaW5lIENTX0dCVF8xMjM0NV85MCAgICAgKDB4MDIpCi0jZGVmaW5lIENTX0dCSzJLICAgICAgICAgICAgKDB4MDQpCi0jZGVmaW5lIENTX1NDX01BQyAgICAgICAgICAgKDB4MDgpCi0jZGVmaW5lIENTX0dCVF85MF9NQUMgICAgICAgKDB4MTApCi0jZGVmaW5lIENTX0dCSyAgICAgICAgICAgICAgKDB4MjApCi0jZGVmaW5lIENTX1NDX0lTTzEwNjQ2ICAgICAgKDB4NDApCi0KLS8qIFNpbXBsaWZpZWQgQ2hpbmVzZSBlbmNvZGluZ3MgYW5kIGNoYXJzZXRzICovCi1zdGF0aWMgc3RydWN0IHBydF9wc19lbmNvZGluZ19TIHNjX2VuY29kaW5nc1tdID0KLXsKLSAgICB7Imlzby0yMDIyIiwgICAgTlVMTCwgICAgICAgKENTX0dCXzIzMTJfODB8Q1NfR0JUXzEyMzQ1XzkwKX0sCi0gICAgeyJnYjE4MDMwIiwgICAgIE5VTEwsICAgICAgIENTX0dCSzJLfSwKLSAgICB7ImV1Yy1jbiIsICAgICAgIkVVQyIsICAgICAgKENTX0dCXzIzMTJfODB8Q1NfR0JUXzEyMzQ1XzkwfENTX1NDX01BQ3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19HQlRfOTBfTUFDKX0sCi0gICAgeyJnYmsiLCAgICAgICAgICJFVUMiLCAgICAgIENTX0dCS30sCi0gICAgeyJ1Y3MtMiIsICAgICAgICJVQ1MyIiwgICAgIENTX1NDX0lTTzEwNjQ2fSwKLSAgICB7InV0Zi04IiwgICAgICAgIlVURjgiLCAgICAgQ1NfU0NfSVNPMTA2NDZ9Ci19Owotc3RhdGljIHN0cnVjdCBwcnRfcHNfY2hhcnNldF9TIHNjX2NoYXJzZXRzW10gPQotewotICAgIHsiR0JfMjMxMi04MCIsICAiR0IiLCAgICAgICBDU19HQl8yMzEyXzgwfSwKLSAgICB7IkdCVF8xMjM0NS05MCIsIkdCVCIsICAgICAgQ1NfR0JUXzEyMzQ1XzkwfSwKLSAgICB7Ik1BQyIsICAgICAgICAgIkdCcGMiLCAgICAgQ1NfU0NfTUFDfSwKLSAgICB7IkdCVC05MF9NQUMiLCAgIkdCVHBjIiwgICAgQ1NfR0JUXzkwX01BQ30sCi0gICAgeyJHQksiLCAgICAgICAgICJHQksiLCAgICAgIENTX0dCS30sCi0gICAgeyJHQjE4MDMwIiwgICAgICJHQksySyIsICAgIENTX0dCSzJLfSwKLSAgICB7IklTTzEwNjQ2IiwgICAgIlVuaUdCIiwgICAgQ1NfU0NfSVNPMTA2NDZ9Ci19OwotCi0jZGVmaW5lIENTX0NOU19QTEFORV8xICAgICAgKDB4MDEpCi0jZGVmaW5lIENTX0NOU19QTEFORV8yICAgICAgKDB4MDIpCi0jZGVmaW5lIENTX0NOU19QTEFORV8xXzIgICAgKDB4MDQpCi0jZGVmaW5lIENTX0I1ICAgICAgICAgICAgICAgKDB4MDgpCi0jZGVmaW5lIENTX0VURU4gICAgICAgICAgICAgKDB4MTApCi0jZGVmaW5lIENTX0hLX0dDQ1MgICAgICAgICAgKDB4MjApCi0jZGVmaW5lIENTX0hLX1NDUyAgICAgICAgICAgKDB4NDApCi0jZGVmaW5lIENTX0hLX1NDU19FVEVOICAgICAgKDB4ODApCi0jZGVmaW5lIENTX01USEtMICAgICAgICAgICAgKDB4MTAwKQotI2RlZmluZSBDU19NVEhLUyAgICAgICAgICAgICgweDIwMCkKLSNkZWZpbmUgQ1NfRExIS0wgICAgICAgICAgICAoMHg0MDApCi0jZGVmaW5lIENTX0RMSEtTICAgICAgICAgICAgKDB4ODAwKQotI2RlZmluZSBDU19UQ19JU08xMDY0NiAgICAgICgweDEwMDApCi0KLS8qIFRyYWRpdGlvbmFsIENoaW5lc2UgZW5jb2RpbmdzIGFuZCBjaGFyc2V0cyAqLwotc3RhdGljIHN0cnVjdCBwcnRfcHNfZW5jb2RpbmdfUyB0Y19lbmNvZGluZ3NbXSA9Ci17Ci0gICAgeyJpc28tMjAyMiIsICAgIE5VTEwsICAgICAgIChDU19DTlNfUExBTkVfMXxDU19DTlNfUExBTkVfMil9LAotICAgIHsiZXVjLXR3IiwgICAgICAiRVVDIiwgICAgICBDU19DTlNfUExBTkVfMV8yfSwKLSAgICB7ImJpZzUiLCAgICAgICAgIkI1IiwgICAgICAgKENTX0I1fENTX0VURU58Q1NfSEtfR0NDU3xDU19IS19TQ1N8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19IS19TQ1NfRVRFTnxDU19NVEhLTHxDU19NVEhLU3xDU19ETEhLTHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfRExIS1MpfSwKLSAgICB7ImNwOTUwIiwgICAgICAgIkI1IiwgICAgICAgQ1NfQjV9LAotICAgIHsidWNzLTIiLCAgICAgICAiVUNTMiIsICAgICBDU19UQ19JU08xMDY0Nn0sCi0gICAgeyJ1dGYtOCIsICAgICAgICJVVEY4IiwgICAgIENTX1RDX0lTTzEwNjQ2fSwKLSAgICB7InV0Zi0xNiIsICAgICAgIlVURjE2IiwgICAgQ1NfVENfSVNPMTA2NDZ9LAotICAgIHsidXRmLTMyIiwgICAgICAiVVRGMzIiLCAgICBDU19UQ19JU08xMDY0Nn0KLX07Ci1zdGF0aWMgc3RydWN0IHBydF9wc19jaGFyc2V0X1MgdGNfY2hhcnNldHNbXSA9Ci17Ci0gICAgeyJDTlNfMTk5Ml8xIiwgICJDTlMxIiwgICAgIENTX0NOU19QTEFORV8xfSwKLSAgICB7IkNOU18xOTkyXzIiLCAgIkNOUzIiLCAgICAgQ1NfQ05TX1BMQU5FXzJ9LAotICAgIHsiQ05TXzE5OTMiLCAgICAiQ05TIiwgICAgICBDU19DTlNfUExBTkVfMV8yfSwKLSAgICB7IkJJRzUiLCAgICAgICAgTlVMTCwgICAgICAgQ1NfQjV9LAotICAgIHsiQ1A5NTAiLCAgICAgICBOVUxMLCAgICAgICBDU19CNX0sCi0gICAgeyJFVEVOIiwgICAgICAgICJFVGVuIiwgICAgIENTX0VURU59LAotICAgIHsiSEtfR0NDUyIsICAgICAiSEtnY2NzIiwgICBDU19IS19HQ0NTfSwKLSAgICB7IlNDUyIsICAgICAgICAgIkhLc2NzIiwgICAgQ1NfSEtfU0NTfSwKLSAgICB7IlNDU19FVEVOIiwgICAgIkVUSEsiLCAgICAgQ1NfSEtfU0NTX0VURU59LAotICAgIHsiTVRIS0wiLCAgICAgICAiSEttNDcxIiwgICBDU19NVEhLTH0sCi0gICAgeyJNVEhLUyIsICAgICAgICJIS20zMTQiLCAgIENTX01USEtTfSwKLSAgICB7IkRMSEtMIiwgICAgICAgIkhLZGxhIiwgICAgQ1NfRExIS0x9LAotICAgIHsiRExIS1MiLCAgICAgICAiSEtkbGIiLCAgICBDU19ETEhLU30sCi0gICAgeyJJU08xMDY0NiIsICAgICJVbmlDTlMiLCAgIENTX1RDX0lTTzEwNjQ2fQotfTsKLQotI2RlZmluZSBDU19LUl9YXzE5OTIgICAgICAgICgweDAxKQotI2RlZmluZSBDU19LUl9NQUMgICAgICAgICAgICgweDAyKQotI2RlZmluZSBDU19LUl9YXzE5OTJfTVMgICAgICgweDA0KQotI2RlZmluZSBDU19LUl9JU08xMDY0NiAgICAgICgweDA4KQotCi0vKiBLb3JlYW4gZW5jb2RpbmdzIGFuZCBjaGFyc2V0cyAqLwotc3RhdGljIHN0cnVjdCBwcnRfcHNfZW5jb2RpbmdfUyBrX2VuY29kaW5nc1tdID0KLXsKLSAgICB7Imlzby0yMDIyLWtyIiwgTlVMTCwgICAgICAgQ1NfS1JfWF8xOTkyfSwKLSAgICB7ImV1Yy1rciIsICAgICAgIkVVQyIsICAgICAgKENTX0tSX1hfMTk5MnxDU19LUl9NQUMpfSwKLSAgICB7ImpvaGFiIiwgICAgICAgIkpvaGFiIiwgICAgQ1NfS1JfWF8xOTkyfSwKLSAgICB7ImNwMTM2MSIsICAgICAgIkpvaGFiIiwgICAgQ1NfS1JfWF8xOTkyfSwKLSAgICB7InVoYyIsICAgICAgICAgIlVIQyIsICAgICAgQ1NfS1JfWF8xOTkyX01TfSwKLSAgICB7ImNwOTQ5IiwgICAgICAgIlVIQyIsICAgICAgQ1NfS1JfWF8xOTkyX01TfSwKLSAgICB7InVjcy0yIiwgICAgICAgIlVDUzIiLCAgICAgQ1NfS1JfSVNPMTA2NDZ9LAotICAgIHsidXRmLTgiLCAgICAgICAiVVRGOCIsICAgICBDU19LUl9JU08xMDY0Nn0KLX07Ci1zdGF0aWMgc3RydWN0IHBydF9wc19jaGFyc2V0X1Mga19jaGFyc2V0c1tdID0KLXsKLSAgICB7IktTX1hfMTk5MiIsICAgIktTQyIsICAgICAgQ1NfS1JfWF8xOTkyfSwKLSAgICB7IkNQMTM2MSIsICAgICAgIktTQyIsICAgICAgQ1NfS1JfWF8xOTkyfSwKLSAgICB7Ik1BQyIsICAgICAgICAgIktTQ3BjIiwgICAgQ1NfS1JfTUFDfSwKLSAgICB7Ik1TV0lORE9XUyIsICAgIktTQ21zIiwgICAgQ1NfS1JfWF8xOTkyX01TfSwKLSAgICB7IkNQOTQ5IiwgICAgICAgIktTQ21zIiwgICAgQ1NfS1JfWF8xOTkyX01TfSwKLSAgICB7IldBTlNVTkciLCAgICAgIktTQ21zIiwgICAgQ1NfS1JfWF8xOTkyX01TfSwKLSAgICB7IklTTzEwNjQ2IiwgICAgIlVuaUtTIiwgICAgQ1NfS1JfSVNPMTA2NDZ9Ci19OwotCi0vKiBDb2xsZWN0aW9ucyBvZiBlbmNvZGluZ3MgYW5kIGNoYXJzZXRzIGZvciBtdWx0aS1ieXRlIHByaW50aW5nICovCi1zdHJ1Y3QgcHJ0X3BzX21iZm9udF9TCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9lbmNvZGluZ3M7Ci0gICAgc3RydWN0IHBydF9wc19lbmNvZGluZ19TICAgICplbmNvZGluZ3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jaGFyc2V0czsKLSAgICBzdHJ1Y3QgcHJ0X3BzX2NoYXJzZXRfUyAgICAgKmNoYXJzZXRzOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAqYXNjaWlfZW5jOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAqZGVmY3M7Ci19OwotCi1zdGF0aWMgc3RydWN0IHBydF9wc19tYmZvbnRfUyBwcnRfcHNfbWJmb250c1tdID0KLXsKLSAgICB7Ci0gICAgICAgIE5VTV9FTEVNRU5UUyhqX2VuY29kaW5ncyksCi0gICAgICAgIGpfZW5jb2RpbmdzLAotICAgICAgICBOVU1fRUxFTUVOVFMoal9jaGFyc2V0cyksCi0gICAgICAgIGpfY2hhcnNldHMsCi0gICAgICAgICJqaXNfcm9tYW4iLAotICAgICAgICAiSklTX1hfMTk4MyIKLSAgICB9LAotICAgIHsKLSAgICAgICAgTlVNX0VMRU1FTlRTKHNjX2VuY29kaW5ncyksCi0gICAgICAgIHNjX2VuY29kaW5ncywKLSAgICAgICAgTlVNX0VMRU1FTlRTKHNjX2NoYXJzZXRzKSwKLSAgICAgICAgc2NfY2hhcnNldHMsCi0gICAgICAgICJnYl9yb21hbiIsCi0gICAgICAgICJHQl8yMzEyLTgwIgotICAgIH0sCi0gICAgewotICAgICAgICBOVU1fRUxFTUVOVFModGNfZW5jb2RpbmdzKSwKLSAgICAgICAgdGNfZW5jb2RpbmdzLAotICAgICAgICBOVU1fRUxFTUVOVFModGNfY2hhcnNldHMpLAotICAgICAgICB0Y19jaGFyc2V0cywKLSAgICAgICAgImNuc19yb21hbiIsCi0gICAgICAgICJCSUc1IgotICAgIH0sCi0gICAgewotICAgICAgICBOVU1fRUxFTUVOVFMoa19lbmNvZGluZ3MpLAotICAgICAgICBrX2VuY29kaW5ncywKLSAgICAgICAgTlVNX0VMRU1FTlRTKGtfY2hhcnNldHMpLAotICAgICAgICBrX2NoYXJzZXRzLAotICAgICAgICAia3Nfcm9tYW4iLAotICAgICAgICAiS1NfWF8xOTkyIgotICAgIH0KLX07Ci0jZW5kaWYgLyogRkVBVF9NQllURSAqLwotCi1zdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MKLXsKLSAgICBjaGFyX3UgIG5hbWVbNjRdOwotICAgIGNoYXJfdSAgZmlsZW5hbWVbTUFYUEFUSEwgKyAxXTsKLSAgICBpbnQgICAgIHR5cGU7Ci0gICAgY2hhcl91ICB0aXRsZVsyNTZdOwotICAgIGNoYXJfdSAgdmVyc2lvblsyNTZdOwotfTsKLQotLyogVHlwZXMgb2YgUFMgcmVzb3VyY2UgZmlsZSBjdXJyZW50bHkgdXNlZCAqLwotI2RlZmluZSBQUlRfUkVTT1VSQ0VfVFlQRV9QUk9DU0VUICAgKDApCi0jZGVmaW5lIFBSVF9SRVNPVVJDRV9UWVBFX0VOQ09ESU5HICAoMSkKLSNkZWZpbmUgUFJUX1JFU09VUkNFX1RZUEVfQ01BUCAgICAgICgyKQotCi0vKiBUaGUgUFMgcHJvbG9nIGZpbGUgdmVyc2lvbiBudW1iZXIgaGFzIHRvIG1hdGNoIC0gaWYgdGhlIHByb2xvZyBmaWxlIGlzCi0gKiB1cGRhdGVkLCBpbmNyZW1lbnQgdGhlIG51bWJlciBpbiB0aGUgZmlsZSBhbmQgaGVyZS4gIFZlcnNpb24gY2hlY2tpbmcgd2FzCi0gKiBhZGRlZCBhcyBvZiBWSU0gNi4yLgotICogVGhlIENJRCBwcm9sb2cgZmlsZSB2ZXJzaW9uIG51bWJlciBiZWhhdmVzIGFzIHBlciBQUyBwcm9sb2cuCi0gKiBUYWJsZSBvZiBWSU0gYW5kIHByb2xvZyB2ZXJzaW9uczoKLSAqCi0gKiBWSU0gICAgICBQcm9sb2cgIENJRFByb2xvZwotICogNi4yICAgICAgMS4zCi0gKiA3LjAgICAgICAxLjQJICAgIDEuMAotICovCi0jZGVmaW5lIFBSVF9QUk9MT0dfVkVSU0lPTiAgKChjaGFyX3UgKikiMS40IikKLSNkZWZpbmUgUFJUX0NJRF9QUk9MT0dfVkVSU0lPTiAgKChjaGFyX3UgKikiMS4wIikKLQotLyogU3RyaW5nIHZlcnNpb25zIG9mIFBTIHJlc291cmNlIHR5cGVzIC0gaW5kZXhlZCBieSBjb25zdGFudHMgYWJvdmUgc28gZG9uJ3QKLSAqIHJlLW9yZGVyIQotICovCi1zdGF0aWMgY2hhciAqcHJ0X3Jlc291cmNlX3R5cGVzW10gPQotewotICAgICJwcm9jc2V0IiwKLSAgICAiZW5jb2RpbmciLAotICAgICJjbWFwIgotfTsKLQotLyogU3RyaW5ncyB0byBsb29rIGZvciBpbiBhIFBTIHJlc291cmNlIGZpbGUgKi8KLSNkZWZpbmUgUFJUX1JFU09VUkNFX0hFQURFUgkgICAgIiUhUFMtQWRvYmUtIgotI2RlZmluZSBQUlRfUkVTT1VSQ0VfUkVTT1VSQ0UJICAgICJSZXNvdXJjZS0iCi0jZGVmaW5lIFBSVF9SRVNPVVJDRV9QUk9DU0VUCSAgICAiUHJvY1NldCIKLSNkZWZpbmUgUFJUX1JFU09VUkNFX0VOQ09ESU5HCSAgICAiRW5jb2RpbmciCi0jZGVmaW5lIFBSVF9SRVNPVVJDRV9DTUFQICAgICAgICAgICAiQ01hcCIKLQotCi0vKiBEYXRhIGZvciB0YWJsZSBiYXNlZCBEU0MgY29tbWVudCByZWNvZ25pdGlvbiwgZWFzeSB0byBleHRlbmQgaWYgVklNIG5lZWRzIHRvCi0gKiByZWFkIG1vcmUgY29tbWVudHMuICovCi0jZGVmaW5lIFBSVF9EU0NfTUlTQ19UWVBFICAgICAgICAgICAoLTEpCi0jZGVmaW5lIFBSVF9EU0NfVElUTEVfVFlQRSAgICAgICAgICAoMSkKLSNkZWZpbmUgUFJUX0RTQ19WRVJTSU9OX1RZUEUgICAgICAgICgyKQotI2RlZmluZSBQUlRfRFNDX0VORENPTU1FTlRTX1RZUEUgICAgKDMpCi0KLSNkZWZpbmUgUFJUX0RTQ19USVRMRQkgICAgICAgICAgICAiJSVUaXRsZToiCi0jZGVmaW5lIFBSVF9EU0NfVkVSU0lPTgkgICAgICAgICAgICAiJSVWZXJzaW9uOiIKLSNkZWZpbmUgUFJUX0RTQ19FTkRDT01NRU5UUyAgICAgICAgICIlJUVuZENvbW1lbnRzOiIKLQotc3RydWN0IHBydF9kc2NfY29tbWVudF9TCi17Ci0gICAgY2hhcgkqc3RyaW5nOwotICAgIGludAkJbGVuOwotICAgIGludAkJdHlwZTsKLX07Ci0KLXN0cnVjdCBwcnRfZHNjX2xpbmVfUwotewotICAgIGludAkJdHlwZTsKLSAgICBjaGFyX3UJKnN0cmluZzsKLSAgICBpbnQJCWxlbjsKLX07Ci0KLQotI2RlZmluZSBTSVpFT0ZfQ1NUUihzKSAgICAgIChzaXplb2YocykgLSAxKQotc3RhdGljIHN0cnVjdCBwcnRfZHNjX2NvbW1lbnRfUyBwcnRfZHNjX3RhYmxlW10gPQotewotICAgIHtQUlRfRFNDX1RJVExFLCAgICAgICBTSVpFT0ZfQ1NUUihQUlRfRFNDX1RJVExFKSwgICAgIFBSVF9EU0NfVElUTEVfVFlQRX0sCi0gICAge1BSVF9EU0NfVkVSU0lPTiwgICAgIFNJWkVPRl9DU1RSKFBSVF9EU0NfVkVSU0lPTiksCi0JCQkJCQkJUFJUX0RTQ19WRVJTSU9OX1RZUEV9LAotICAgIHtQUlRfRFNDX0VORENPTU1FTlRTLCBTSVpFT0ZfQ1NUUihQUlRfRFNDX0VORENPTU1FTlRTKSwKLQkJCQkJCSAgICAgUFJUX0RTQ19FTkRDT01NRU5UU19UWVBFfQotfTsKLQotc3RhdGljIHZvaWQgcHJ0X3dyaXRlX2ZpbGVfcmF3X2xlbiBfX0FSR1MoKGNoYXJfdSAqYnVmZmVyLCBpbnQgYnl0ZXMpKTsKLXN0YXRpYyB2b2lkIHBydF93cml0ZV9maWxlIF9fQVJHUygoY2hhcl91ICpidWZmZXIpKTsKLXN0YXRpYyB2b2lkIHBydF93cml0ZV9maWxlX2xlbiBfX0FSR1MoKGNoYXJfdSAqYnVmZmVyLCBpbnQgYnl0ZXMpKTsKLXN0YXRpYyB2b2lkIHBydF93cml0ZV9zdHJpbmcgX19BUkdTKChjaGFyICpzKSk7Ci1zdGF0aWMgdm9pZCBwcnRfd3JpdGVfaW50IF9fQVJHUygoaW50IGkpKTsKLXN0YXRpYyB2b2lkIHBydF93cml0ZV9ib29sZWFuIF9fQVJHUygoaW50IGIpKTsKLXN0YXRpYyB2b2lkIHBydF9kZWZfZm9udCBfX0FSR1MoKGNoYXIgKm5ld19uYW1lLCBjaGFyICplbmNvZGluZywgaW50IGhlaWdodCwgY2hhciAqZm9udCkpOwotc3RhdGljIHZvaWQgcHJ0X3JlYWxfYml0cyBfX0FSR1MoKGRvdWJsZSByZWFsLCBpbnQgcHJlY2lzaW9uLCBpbnQgKnBpbnRlZ2VyLCBpbnQgKnBmcmFjdGlvbikpOwotc3RhdGljIHZvaWQgcHJ0X3dyaXRlX3JlYWwgX19BUkdTKChkb3VibGUgdmFsLCBpbnQgcHJlYykpOwotc3RhdGljIHZvaWQgcHJ0X2RlZl92YXIgX19BUkdTKChjaGFyICpuYW1lLCBkb3VibGUgdmFsdWUsIGludCBwcmVjKSk7Ci1zdGF0aWMgdm9pZCBwcnRfZmx1c2hfYnVmZmVyIF9fQVJHUygodm9pZCkpOwotc3RhdGljIHZvaWQgcHJ0X3Jlc291cmNlX25hbWUgX19BUkdTKChjaGFyX3UgKmZpbGVuYW1lLCB2b2lkICpjb29raWUpKTsKLXN0YXRpYyBpbnQgcHJ0X2ZpbmRfcmVzb3VyY2UgX19BUkdTKChjaGFyICpuYW1lLCBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlKSk7Ci1zdGF0aWMgaW50IHBydF9vcGVuX3Jlc291cmNlIF9fQVJHUygoc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZSkpOwotc3RhdGljIGludCBwcnRfY2hlY2tfcmVzb3VyY2UgX19BUkdTKChzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlLCBjaGFyX3UgKnZlcnNpb24pKTsKLXN0YXRpYyB2b2lkIHBydF9kc2Nfc3RhcnQgX19BUkdTKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcnRfZHNjX25vYXJnIF9fQVJHUygoY2hhciAqY29tbWVudCkpOwotc3RhdGljIHZvaWQgcHJ0X2RzY190ZXh0bGluZSBfX0FSR1MoKGNoYXIgKmNvbW1lbnQsIGNoYXIgKnRleHQpKTsKLXN0YXRpYyB2b2lkIHBydF9kc2NfdGV4dCBfX0FSR1MoKGNoYXIgKmNvbW1lbnQsIGNoYXIgKnRleHQpKTsKLXN0YXRpYyB2b2lkIHBydF9kc2NfaW50cyBfX0FSR1MoKGNoYXIgKmNvbW1lbnQsIGludCBjb3VudCwgaW50ICppbnRzKSk7Ci1zdGF0aWMgdm9pZCBwcnRfZHNjX3JlcXVpcmVtZW50cyBfX0FSR1MoKGludCBkdXBsZXgsIGludCB0dW1ibGUsIGludCBjb2xsYXRlLCBpbnQgY29sb3IsIGludCBudW1fY29waWVzKSk7Ci1zdGF0aWMgdm9pZCBwcnRfZHNjX2RvY21lZGlhIF9fQVJHUygoY2hhciAqcGFwZXJfbmFtZSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgd2VpZ2h0LCBjaGFyICpjb2xvdXIsIGNoYXIgKnR5cGUpKTsKLXN0YXRpYyB2b2lkIHBydF9kc2NfcmVzb3VyY2VzIF9fQVJHUygoY2hhciAqY29tbWVudCwgY2hhciAqdHlwZSwgY2hhciAqc3RyaW5ncykpOwotc3RhdGljIHZvaWQgcHJ0X2RzY19mb250X3Jlc291cmNlIF9fQVJHUygoY2hhciAqcmVzb3VyY2UsIHN0cnVjdCBwcnRfcHNfZm9udF9TICpwc19mb250KSk7Ci1zdGF0aWMgZmxvYXQgdG9fZGV2aWNlX3VuaXRzIF9fQVJHUygoaW50IGlkeCwgZG91YmxlIHBoeXNzaXplLCBpbnQgZGVmX251bWJlcikpOwotc3RhdGljIHZvaWQgcHJ0X3BhZ2VfbWFyZ2lucyBfX0FSR1MoKGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlICpsZWZ0LCBkb3VibGUgKnJpZ2h0LCBkb3VibGUgKnRvcCwgZG91YmxlICpib3R0b20pKTsKLXN0YXRpYyB2b2lkIHBydF9mb250X21ldHJpY3MgX19BUkdTKChpbnQgZm9udF9zY2FsZSkpOwotc3RhdGljIGludCBwcnRfZ2V0X2NwbCBfX0FSR1MoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcHJ0X2dldF9scHAgX19BUkdTKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHBydF9hZGRfcmVzb3VyY2UgX19BUkdTKChzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlKSk7Ci1zdGF0aWMgaW50IHBydF9yZXNmaWxlX25leHRfbGluZSBfX0FSR1MoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcHJ0X3Jlc2ZpbGVfc3RybmNtcCBfX0FSR1MoKGludCBvZmZzZXQsIGNoYXIgKnN0cmluZywgaW50IGxlbikpOwotc3RhdGljIGludCBwcnRfcmVzZmlsZV9za2lwX25vbndzIF9fQVJHUygoaW50IG9mZnNldCkpOwotc3RhdGljIGludCBwcnRfcmVzZmlsZV9za2lwX3dzIF9fQVJHUygoaW50IG9mZnNldCkpOwotc3RhdGljIGludCBwcnRfbmV4dF9kc2MgX19BUkdTKChzdHJ1Y3QgcHJ0X2RzY19saW5lX1MgKnBfZHNjX2xpbmUpKTsKLSNpZmRlZiBGRUFUX01CWVRFCi1zdGF0aWMgaW50IHBydF9idWlsZF9jaWRfZm9udG5hbWUgX19BUkdTKChpbnQgZm9udCwgY2hhcl91ICpuYW1lLCBpbnQgbmFtZV9sZW4pKTsKLXN0YXRpYyB2b2lkIHBydF9kZWZfY2lkZm9udCBfX0FSR1MoKGNoYXIgKm5ld19uYW1lLCBpbnQgaGVpZ2h0LCBjaGFyICpjaWRmb250KSk7Ci1zdGF0aWMgdm9pZCBwcnRfZHVwX2NpZGZvbnQgX19BUkdTKChjaGFyICpvcmlnaW5hbF9uYW1lLCBjaGFyICpuZXdfbmFtZSkpOwotc3RhdGljIGludCBwcnRfbWF0Y2hfZW5jb2RpbmcgX19BUkdTKChjaGFyICpwX2VuY29kaW5nLCBzdHJ1Y3QgcHJ0X3BzX21iZm9udF9TICpwX2NtYXAsIHN0cnVjdCBwcnRfcHNfZW5jb2RpbmdfUyAqKnBwX21iZW5jKSk7Ci1zdGF0aWMgaW50IHBydF9tYXRjaF9jaGFyc2V0IF9fQVJHUygoY2hhciAqcF9jaGFyc2V0LCBzdHJ1Y3QgcHJ0X3BzX21iZm9udF9TICpwX2NtYXAsIHN0cnVjdCBwcnRfcHNfY2hhcnNldF9TICoqcHBfbWJjaGFyKSk7Ci0jZW5kaWYKLQotLyoKLSAqIFZhcmlhYmxlcyBmb3IgdGhlIG91dHB1dCBQb3N0U2NyaXB0IGZpbGUuCi0gKi8KLXN0YXRpYyBGSUxFICpwcnRfcHNfZmQ7Ci1zdGF0aWMgaW50IHBydF9maWxlX2Vycm9yOwotc3RhdGljIGNoYXJfdSAqcHJ0X3BzX2ZpbGVfbmFtZSA9IE5VTEw7Ci0KLS8qCi0gKiBWYXJpb3VzIG9mZnNldHMgYW5kIGRpbWVuc2lvbnMgaW4gZGVmYXVsdCBQb3N0U2NyaXB0IHVzZXIgc3BhY2UgKHBvaW50cykuCi0gKiBVc2VkIGZvciB0ZXh0IHBvc2l0aW9uaW5nIGNhbGN1bGF0aW9ucwotICovCi1zdGF0aWMgZmxvYXQgcHJ0X3BhZ2Vfd2lkdGg7Ci1zdGF0aWMgZmxvYXQgcHJ0X3BhZ2VfaGVpZ2h0Owotc3RhdGljIGZsb2F0IHBydF9sZWZ0X21hcmdpbjsKLXN0YXRpYyBmbG9hdCBwcnRfcmlnaHRfbWFyZ2luOwotc3RhdGljIGZsb2F0IHBydF90b3BfbWFyZ2luOwotc3RhdGljIGZsb2F0IHBydF9ib3R0b21fbWFyZ2luOwotc3RhdGljIGZsb2F0IHBydF9saW5lX2hlaWdodDsKLXN0YXRpYyBmbG9hdCBwcnRfZmlyc3RfbGluZV9oZWlnaHQ7Ci1zdGF0aWMgZmxvYXQgcHJ0X2NoYXJfd2lkdGg7Ci1zdGF0aWMgZmxvYXQgcHJ0X251bWJlcl93aWR0aDsKLXN0YXRpYyBmbG9hdCBwcnRfYmdjb2xfb2Zmc2V0Owotc3RhdGljIGZsb2F0IHBydF9wb3NfeF9tb3ZldG8gPSAwLjA7Ci1zdGF0aWMgZmxvYXQgcHJ0X3Bvc195X21vdmV0byA9IDAuMDsKLQotLyoKLSAqIFZhcmlvdXMgY29udHJvbCB2YXJpYWJsZXMgdXNlZCB0byBkZWNpZGUgd2hlbiBhbmQgaG93IHRvIGNoYW5nZSB0aGUKLSAqIFBvc3RTY3JpcHQgZ3JhcGhpY3Mgc3RhdGUuCi0gKi8KLXN0YXRpYyBpbnQgcHJ0X25lZWRfbW92ZXRvOwotc3RhdGljIGludCBwcnRfZG9fbW92ZXRvOwotc3RhdGljIGludCBwcnRfbmVlZF9mb250Owotc3RhdGljIGludCBwcnRfZm9udDsKLXN0YXRpYyBpbnQgcHJ0X25lZWRfdW5kZXJsaW5lOwotc3RhdGljIGludCBwcnRfdW5kZXJsaW5lOwotc3RhdGljIGludCBwcnRfZG9fdW5kZXJsaW5lOwotc3RhdGljIGludCBwcnRfbmVlZF9mZ2NvbDsKLXN0YXRpYyBpbnQgcHJ0X2ZnY29sOwotc3RhdGljIGludCBwcnRfbmVlZF9iZ2NvbDsKLXN0YXRpYyBpbnQgcHJ0X2RvX2JnY29sOwotc3RhdGljIGludCBwcnRfYmdjb2w7Ci1zdGF0aWMgaW50IHBydF9uZXdfYmdjb2w7Ci1zdGF0aWMgaW50IHBydF9hdHRyaWJ1dGVfY2hhbmdlOwotc3RhdGljIGZsb2F0IHBydF90ZXh0X3J1bjsKLXN0YXRpYyBpbnQgcHJ0X3BhZ2VfbnVtOwotc3RhdGljIGludCBwcnRfYnVmc2l6OwotCi0vKgotICogVmFyaWFibGVzIGNvbnRyb2xsaW5nIHBoeXNpY2FsIHByaW50aW5nLgotICovCi1zdGF0aWMgaW50IHBydF9tZWRpYTsKLXN0YXRpYyBpbnQgcHJ0X3BvcnRyYWl0Owotc3RhdGljIGludCBwcnRfbnVtX2NvcGllczsKLXN0YXRpYyBpbnQgcHJ0X2R1cGxleDsKLXN0YXRpYyBpbnQgcHJ0X3R1bWJsZTsKLXN0YXRpYyBpbnQgcHJ0X2NvbGxhdGU7Ci0KLS8qCi0gKiBCdWZmZXJzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFBvc3RTY3JpcHQgb3V0cHV0Ci0gKi8KLXN0YXRpYyBjaGFyX3UgcHJ0X2xpbmVfYnVmZmVyWzI1N107Ci1zdGF0aWMgZ2FycmF5X1QgcHJ0X3BzX2J1ZmZlcjsKLQotIyBpZmRlZiBGRUFUX01CWVRFCi1zdGF0aWMgaW50IHBydF9kb19jb252Owotc3RhdGljIHZpbWNvbnZfVCBwcnRfY29udjsKLQotc3RhdGljIGludCBwcnRfb3V0X21ieXRlOwotc3RhdGljIGludCBwcnRfY3VzdG9tX2NtYXA7Ci1zdGF0aWMgY2hhciBwcnRfY21hcFs4MF07Ci1zdGF0aWMgaW50IHBydF91c2VfY291cmllcjsKLXN0YXRpYyBpbnQgcHJ0X2luX2FzY2lpOwotc3RhdGljIGludCBwcnRfaGFsZl93aWR0aDsKLXN0YXRpYyBjaGFyICpwcnRfYXNjaWlfZW5jb2Rpbmc7Ci1zdGF0aWMgY2hhcl91IHBydF9oZXhjaGFyW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0jIGVuZGlmCi0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3dyaXRlX2ZpbGVfcmF3X2xlbihidWZmZXIsIGJ5dGVzKQotICAgIGNoYXJfdQkqYnVmZmVyOwotICAgIGludAkJYnl0ZXM7Ci17Ci0gICAgaWYgKCFwcnRfZmlsZV9lcnJvcgotCSAgICAmJiBmd3JpdGUoYnVmZmVyLCBzaXplb2YoY2hhcl91KSwgYnl0ZXMsIHBydF9wc19mZCkKLQkJCQkJCQkgICAgICE9IChzaXplX3QpYnl0ZXMpCi0gICAgewotCUVNU0coXygiRTQ1NTogRXJyb3Igd3JpdGluZyB0byBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIikpOwotCXBydF9maWxlX2Vycm9yID0gVFJVRTsKLSAgICB9Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3dyaXRlX2ZpbGUoYnVmZmVyKQotICAgIGNoYXJfdQkqYnVmZmVyOwotewotICAgIHBydF93cml0ZV9maWxlX2xlbihidWZmZXIsIFNUUkxFTihidWZmZXIpKTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1wcnRfd3JpdGVfZmlsZV9sZW4oYnVmZmVyLCBieXRlcykKLSAgICBjaGFyX3UJKmJ1ZmZlcjsKLSAgICBpbnQJCWJ5dGVzOwotewotI2lmZGVmIEVCQ0RJQwotICAgIGViY2RpYzJhc2NpaShidWZmZXIsIGJ5dGVzKTsKLSNlbmRpZgotICAgIHBydF93cml0ZV9maWxlX3Jhd19sZW4oYnVmZmVyLCBieXRlcyk7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIHN0cmluZy4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1wcnRfd3JpdGVfc3RyaW5nKHMpCi0gICAgY2hhcgkqczsKLXsKLSAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLCAiJXMiLCBzKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotfQotCi0vKgotICogV3JpdGUgYW4gaW50IGFuZCBhIHNwYWNlLgotICovCi0gICAgc3RhdGljIHZvaWQKLXBydF93cml0ZV9pbnQoaSkKLSAgICBpbnQJCWk7Ci17Ci0gICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVkICIsIGkpOwotICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIGJvb2xlYW4gYW5kIGEgc3BhY2UuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3dyaXRlX2Jvb2xlYW4oYikKLSAgICBpbnQJCWI7Ci17Ci0gICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVzICIsIChiID8gIlQiIDogIkYiKSk7Ci0gICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKLX0KLQotLyoKLSAqIFdyaXRlIFBvc3RTY3JpcHQgdG8gcmUtZW5jb2RlIGFuZCBkZWZpbmUgdGhlIGZvbnQuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotcHJ0X2RlZl9mb250KG5ld19uYW1lLCBlbmNvZGluZywgaGVpZ2h0LCBmb250KQotICAgIGNoYXIJKm5ld19uYW1lOwotICAgIGNoYXIJKmVuY29kaW5nOwotICAgIGludAkJaGVpZ2h0OwotICAgIGNoYXIJKmZvbnQ7Ci17Ci0gICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKLQkJCSAgIi9fJXMgL1ZJTS0lcyAvJXMgcmVmXG4iLCBuZXdfbmFtZSwgZW5jb2RpbmcsIGZvbnQpOwotICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgICAgICBzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiLyVzICVkICVmIC9fJXMgc2Zmc1xuIiwKLQkJICAgICAgIG5ld19uYW1lLCBoZWlnaHQsIDUwMC4vcHJ0X3BzX2NvdXJpZXJfZm9udC53eCwgbmV3X25hbWUpOwotICAgIGVsc2UKLSNlbmRpZgotCXZpbV9zbnByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgc2l6ZW9mKHBydF9saW5lX2J1ZmZlciksCi0JCQkgICAgICIvJXMgJWQgL18lcyBmZnNcbiIsIG5ld19uYW1lLCBoZWlnaHQsIG5ld19uYW1lKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotfQotCi0jaWZkZWYgRkVBVF9NQllURQotLyoKLSAqIFdyaXRlIGEgbGluZSB0byBkZWZpbmUgdGhlIENJRCBmb250LgotICovCi0gICAgc3RhdGljIHZvaWQKLXBydF9kZWZfY2lkZm9udChuZXdfbmFtZSwgaGVpZ2h0LCBjaWRmb250KQotICAgIGNoYXIJKm5ld19uYW1lOwotICAgIGludAkJaGVpZ2h0OwotICAgIGNoYXIJKmNpZGZvbnQ7Ci17Ci0gICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKLQkgICAgICAiL18lcyAvJXNbLyVzXSB2aW1fY29tcG9zZWZvbnRcbiIsIG5ld19uYW1lLCBwcnRfY21hcCwgY2lkZm9udCk7Ci0gICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKLSAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAotCQkJICAgICAiLyVzICVkIC9fJXMgZmZzXG4iLCBuZXdfbmFtZSwgaGVpZ2h0LCBuZXdfbmFtZSk7Ci0gICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKLX0KLQotLyoKLSAqIFdyaXRlIGEgbGluZSB0byBkZWZpbmUgYSBkdXBsaWNhdGUgb2YgYSBDSUQgZm9udAotICovCi0gICAgc3RhdGljIHZvaWQKLXBydF9kdXBfY2lkZm9udChvcmlnaW5hbF9uYW1lLCBuZXdfbmFtZSkKLSAgICBjaGFyCSpvcmlnaW5hbF9uYW1lOwotICAgIGNoYXIJKm5ld19uYW1lOwotewotICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgc2l6ZW9mKHBydF9saW5lX2J1ZmZlciksCi0JCQkJICAgICAgICIvJXMgJXMgZFxuIiwgbmV3X25hbWUsIG9yaWdpbmFsX25hbWUpOwotICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIENvbnZlcnQgYSByZWFsIHZhbHVlIGludG8gYW4gaW50ZWdlciBhbmQgZnJhY3Rpb25hbCBwYXJ0IGFzIGludGVnZXJzLCB3aXRoCi0gKiB0aGUgZnJhY3Rpb25hbCBwYXJ0IGJlaW5nIGluIHRoZSByYW5nZSBbMCwxMF5wcmVjaXNpb24pLiAgVGhlIGZyYWN0aW9uYWwgcGFydAotICogaXMgYWxzbyByb3VuZGVkIGJhc2VkIG9uIHRoZSBwcmVjaXNpb24gKyAxJ3RoIGZyYWN0aW9uYWwgZGlnaXQuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotcHJ0X3JlYWxfYml0cyhyZWFsLCBwcmVjaXNpb24sIHBpbnRlZ2VyLCBwZnJhY3Rpb24pCi0gICAgZG91YmxlICAgICAgcmVhbDsKLSAgICBpbnQJCXByZWNpc2lvbjsKLSAgICBpbnQJCSpwaW50ZWdlcjsKLSAgICBpbnQJCSpwZnJhY3Rpb247Ci17Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgaW50ZWdlcjsKLSAgICBmbG9hdCAgIGZyYWN0aW9uOwotCi0gICAgaW50ZWdlciA9IChpbnQpcmVhbDsKLSAgICBmcmFjdGlvbiA9IChmbG9hdCkocmVhbCAtIGludGVnZXIpOwotICAgIGlmIChyZWFsIDwgKGRvdWJsZSlpbnRlZ2VyKQotCWZyYWN0aW9uID0gLWZyYWN0aW9uOwotICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjaXNpb247IGkrKykKLQlmcmFjdGlvbiAqPSAxMC4wOwotCi0gICAgKnBpbnRlZ2VyID0gaW50ZWdlcjsKLSAgICAqcGZyYWN0aW9uID0gKGludCkoZnJhY3Rpb24gKyAwLjUpOwotfQotCi0vKgotICogV3JpdGUgYSByZWFsIGFuZCBhIHNwYWNlLiAgU2F2ZSBieXRlcyBpZiByZWFsIHZhbHVlIGhhcyBubyBmcmFjdGlvbmFsIHBhcnQhCi0gKiBXZSB1c2UgcHJ0X3JlYWxfYml0cygpIGFzICVmIGluIHNwcmludGYgdXNlcyB0aGUgbG9jYWxlIHNldHRpbmcgdG8gZGVjaWRlCi0gKiB3aGF0IGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyIHRvIHVzZSwgYnV0IFBTIGFsd2F5cyByZXF1aXJlcyBhICcuJy4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1wcnRfd3JpdGVfcmVhbCh2YWwsIHByZWMpCi0gICAgZG91YmxlCXZhbDsKLSAgICBpbnQJCXByZWM7Ci17Ci0gICAgaW50ICAgICBpbnRlZ2VyOwotICAgIGludCAgICAgZnJhY3Rpb247Ci0KLSAgICBwcnRfcmVhbF9iaXRzKHZhbCwgcHJlYywgJmludGVnZXIsICZmcmFjdGlvbik7Ci0gICAgLyogRW1pdCBpbnRlZ2VyIHBhcnQgKi8KLSAgICBzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiJWQiLCBpbnRlZ2VyKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotICAgIC8qIE9ubHkgZW1pdCBmcmFjdGlvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoZnJhY3Rpb24gIT0gMCkKLSAgICB7Ci0JLyogUmVtb3ZlIGFueSB0cmFpbGluZyB6ZXJvcyAqLwotCXdoaWxlICgoZnJhY3Rpb24gJSAxMCkgPT0gMCkKLQl7Ci0JICAgIHByZWMtLTsKLQkgICAgZnJhY3Rpb24gLz0gMTA7Ci0JfQotCS8qIEVtaXQgZnJhY3Rpb24gbGVmdCBwYWRkZWQgd2l0aCB6ZXJvcyAqLwotCXNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIuJTAqZCIsIHByZWMsIGZyYWN0aW9uKTsKLQlwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotICAgIH0KLSAgICBzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiICIpOwotICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIGxpbmUgdG8gZGVmaW5lIGEgbnVtZXJpYyB2YXJpYWJsZS4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1wcnRfZGVmX3ZhcihuYW1lLCB2YWx1ZSwgcHJlYykKLSAgICBjaGFyCSpuYW1lOwotICAgIGRvdWJsZQl2YWx1ZTsKLSAgICBpbnQJCXByZWM7Ci17Ci0gICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKLQkJCQkJCQkJIi8lcyAiLCBuYW1lKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotICAgIHBydF93cml0ZV9yZWFsKHZhbHVlLCBwcmVjKTsKLSAgICBzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiZFxuIik7Ci0gICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKLX0KLQotLyogQ29udmVydCBzaXplIGZyb20gZm9udCBzcGFjZSB0byB1c2VyIHNwYWNlIGF0IGN1cnJlbnQgZm9udCBzY2FsZSAqLwotI2RlZmluZSBQUlRfUFNfRk9OVF9UT19VU0VSKHNjYWxlLCBzaXplKSAgICAoKHNpemUpICogKChzY2FsZSkvMTAwMC4wKSkKLQotICAgIHN0YXRpYyB2b2lkCi1wcnRfZmx1c2hfYnVmZmVyKCkKLXsKLSAgICBpZiAocHJ0X3BzX2J1ZmZlci5nYV9sZW4gPiAwKQotICAgIHsKLQkvKiBBbnkgYmFja2dyb3VuZCBjb2xvciBtdXN0IGJlIGRyYXduIGZpcnN0ICovCi0JaWYgKHBydF9kb19iZ2NvbCAmJiAocHJ0X25ld19iZ2NvbCAhPSBQUkNPTE9SX1dISVRFKSkKLQl7Ci0JICAgIGludCAgICAgciwgZywgYjsKLQotCSAgICBpZiAocHJ0X2RvX21vdmV0bykKLQkgICAgewotCQlwcnRfd3JpdGVfcmVhbChwcnRfcG9zX3hfbW92ZXRvLCAyKTsKLQkJcHJ0X3dyaXRlX3JlYWwocHJ0X3Bvc195X21vdmV0bywgMik7Ci0JCXBydF93cml0ZV9zdHJpbmcoIm1cbiIpOwotCQlwcnRfZG9fbW92ZXRvID0gRkFMU0U7Ci0JICAgIH0KLQotCSAgICAvKiBTaXplIG9mIHJlY3Qgb2YgYmFja2dyb3VuZCBjb2xvciBvbiB3aGljaCB0ZXh0IGlzIHByaW50ZWQgKi8KLQkgICAgcHJ0X3dyaXRlX3JlYWwocHJ0X3RleHRfcnVuLCAyKTsKLQkgICAgcHJ0X3dyaXRlX3JlYWwocHJ0X2xpbmVfaGVpZ2h0LCAyKTsKLQotCSAgICAvKiBMYXN0bHkgYWRkIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZCAqLwotCSAgICByID0gKCh1bnNpZ25lZClwcnRfbmV3X2JnY29sICYgMHhmZjAwMDApID4+IDE2OwotCSAgICBnID0gKCh1bnNpZ25lZClwcnRfbmV3X2JnY29sICYgMHhmZjAwKSA+PiA4OwotCSAgICBiID0gcHJ0X25ld19iZ2NvbCAmIDB4ZmY7Ci0JICAgIHBydF93cml0ZV9yZWFsKHIgLyAyNTUuMCwgMyk7Ci0JICAgIHBydF93cml0ZV9yZWFsKGcgLyAyNTUuMCwgMyk7Ci0JICAgIHBydF93cml0ZV9yZWFsKGIgLyAyNTUuMCwgMyk7Ci0JICAgIHBydF93cml0ZV9zdHJpbmcoImJnXG4iKTsKLQl9Ci0JLyogRHJhdyB1bmRlcmxpbmVzIGJlZm9yZSB0aGUgdGV4dCBhcyBpdCBtYWtlcyBpdCBzbGlnaHRseSBlYXNpZXIgdG8KLQkgKiBmaW5kIHRoZSBzdGFydGluZyBwb2ludC4KLQkgKi8KLQlpZiAocHJ0X2RvX3VuZGVybGluZSkKLQl7Ci0JICAgIGlmIChwcnRfZG9fbW92ZXRvKQotCSAgICB7Ci0JCXBydF93cml0ZV9yZWFsKHBydF9wb3NfeF9tb3ZldG8sIDIpOwotCQlwcnRfd3JpdGVfcmVhbChwcnRfcG9zX3lfbW92ZXRvLCAyKTsKLQkJcHJ0X3dyaXRlX3N0cmluZygibVxuIik7Ci0JCXBydF9kb19tb3ZldG8gPSBGQUxTRTsKLQkgICAgfQotCi0gICAgICAgICAgICAvKiBVbmRlcmxpbmUgbGVuZ3RoIG9mIHRleHQgcnVuICovCi0JICAgIHBydF93cml0ZV9yZWFsKHBydF90ZXh0X3J1biwgMik7Ci0JICAgIHBydF93cml0ZV9zdHJpbmcoInVsXG4iKTsKLQl9Ci0JLyogRHJhdyB0aGUgdGV4dAotCSAqIE5vdGU6IHdlIHdyaXRlIHRleHQgb3V0IHJhdyAtIEVCQ0RJQyBjb252ZXJzaW9uIGlzIGhhbmRsZWQgaW4gdGhlCi0JICogUG9zdFNjcmlwdCB3b3JsZCB2aWEgdGhlIGZvbnQgZW5jb2RpbmcgdmVjdG9yLiAqLwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICAgICAgaWYgKHBydF9vdXRfbWJ5dGUpCi0gICAgICAgICAgICBwcnRfd3JpdGVfc3RyaW5nKCI8Iik7Ci0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgcHJ0X3dyaXRlX3N0cmluZygiKCIpOwotCXBydF93cml0ZV9maWxlX3Jhd19sZW4ocHJ0X3BzX2J1ZmZlci5nYV9kYXRhLCBwcnRfcHNfYnVmZmVyLmdhX2xlbik7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgICAgICBpZiAocHJ0X291dF9tYnl0ZSkKLSAgICAgICAgICAgIHBydF93cml0ZV9zdHJpbmcoIj4iKTsKLSAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICBwcnRfd3JpdGVfc3RyaW5nKCIpIik7Ci0JLyogQWRkIGEgbW92ZXRvIGlmIG5lZWQgYmUgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hvdyBwcm9jZWR1cmUgKi8KLQlpZiAocHJ0X2RvX21vdmV0bykKLQl7Ci0JICAgIHBydF93cml0ZV9yZWFsKHBydF9wb3NfeF9tb3ZldG8sIDIpOwotCSAgICBwcnRfd3JpdGVfcmVhbChwcnRfcG9zX3lfbW92ZXRvLCAyKTsKLQkgICAgLyogbW92ZXRvIGFuZCBhIHNob3cgKi8KLQkgICAgcHJ0X3dyaXRlX3N0cmluZygibXNcbiIpOwotCSAgICBwcnRfZG9fbW92ZXRvID0gRkFMU0U7Ci0JfQotCWVsc2UgLyogU2ltcGxlIHNob3cgKi8KLQkgICAgcHJ0X3dyaXRlX3N0cmluZygic1xuIik7Ci0KLQlnYV9jbGVhcigmcHJ0X3BzX2J1ZmZlcik7Ci0JZ2FfaW5pdDIoJnBydF9wc19idWZmZXIsIChpbnQpc2l6ZW9mKGNoYXIpLCBwcnRfYnVmc2l6KTsKLSAgICB9Ci19Ci0KLQotICAgIHN0YXRpYyB2b2lkCi1wcnRfcmVzb3VyY2VfbmFtZShmaWxlbmFtZSwgY29va2llKQotICAgIGNoYXJfdSAgKmZpbGVuYW1lOwotICAgIHZvaWQgICAgKmNvb2tpZTsKLXsKLSAgICBjaGFyX3UgKnJlc291cmNlX2ZpbGVuYW1lID0gY29va2llOwotCi0gICAgaWYgKFNUUkxFTihmaWxlbmFtZSkgPj0gTUFYUEFUSEwpCi0JKnJlc291cmNlX2ZpbGVuYW1lID0gTlVMOwotICAgIGVsc2UKLQlTVFJDUFkocmVzb3VyY2VfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLX0KLQotICAgIHN0YXRpYyBpbnQKLXBydF9maW5kX3Jlc291cmNlKG5hbWUsIHJlc291cmNlKQotICAgIGNoYXIJKm5hbWU7Ci0gICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZTsKLXsKLSAgICBjaGFyX3UJYnVmZmVyW01BWFBBVEhMICsgMV07Ci0KLSAgICBTVFJDUFkocmVzb3VyY2UtPm5hbWUsIG5hbWUpOwotICAgIC8qIExvb2sgZm9yIG5hbWVkIHJlc291cmNlIGZpbGUgaW4gcnVudGltZXBhdGggKi8KLSAgICBTVFJDUFkoYnVmZmVyLCAicHJpbnQiKTsKLSAgICBhZGRfcGF0aHNlcChidWZmZXIpOwotICAgIFNUUkNBVChidWZmZXIsIG5hbWUpOwotICAgIFNUUkNBVChidWZmZXIsICIucHMiKTsKLSAgICByZXNvdXJjZS0+ZmlsZW5hbWVbMF0gPSBOVUw7Ci0gICAgcmV0dXJuIChkb19pbl9ydW50aW1lcGF0aChidWZmZXIsIEZBTFNFLCBwcnRfcmVzb3VyY2VfbmFtZSwKLQkJCQkJCQkgICByZXNvdXJjZS0+ZmlsZW5hbWUpCi0JICAgICYmIHJlc291cmNlLT5maWxlbmFtZVswXSAhPSBOVUwpOwotfQotCi0vKiBQUyBDUiBhbmQgTEYgY2hhcmFjdGVycyBoYXZlIHBsYXRmb3JtIGluZGVwZW5kZW50IHZhbHVlcyAqLwotI2RlZmluZSBQU0xGICAoMHgwYSkKLSNkZWZpbmUgUFNDUiAgKDB4MGQpCi0KLS8qIFN0YXRpYyBidWZmZXIgdG8gcmVhZCBpbml0aWFsIGNvbW1lbnRzIGluIGEgcmVzb3VyY2UgZmlsZSwgc29tZSBjYW4gaGF2ZSBhCi0gKiBjb3VwbGUgb2YgS0Igb2YgY29tbWVudHMhICovCi0jZGVmaW5lIFBSVF9GSUxFX0JVRkZFUl9MRU4gKDIwNDgpCi1zdHJ1Y3QgcHJ0X3Jlc2ZpbGVfYnVmZmVyX1MKLXsKLSAgICBjaGFyX3UgIGJ1ZmZlcltQUlRfRklMRV9CVUZGRVJfTEVOXTsKLSAgICBpbnQgICAgIGxlbjsKLSAgICBpbnQgICAgIGxpbmVfc3RhcnQ7Ci0gICAgaW50ICAgICBsaW5lX2VuZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJ0X3Jlc2ZpbGVfYnVmZmVyX1MgcHJ0X3Jlc2ZpbGU7Ci0KLSAgICBzdGF0aWMgaW50Ci1wcnRfcmVzZmlsZV9uZXh0X2xpbmUoKQotewotICAgIGludCAgICAgaW5kZXg7Ci0KLSAgICAvKiBNb3ZlIHRvIHN0YXJ0IG9mIG5leHQgbGluZSBhbmQgdGhlbiBmaW5kIGVuZCBvZiBsaW5lICovCi0gICAgaW5kZXggPSBwcnRfcmVzZmlsZS5saW5lX2VuZCArIDE7Ci0gICAgd2hpbGUgKGluZGV4IDwgcHJ0X3Jlc2ZpbGUubGVuKQotICAgIHsKLSAgICAgICAgaWYgKHBydF9yZXNmaWxlLmJ1ZmZlcltpbmRleF0gIT0gUFNMRiAmJiBwcnRfcmVzZmlsZS5idWZmZXJbaW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBQU0NSKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIHBydF9yZXNmaWxlLmxpbmVfc3RhcnQgPSBpbmRleDsKLQotICAgIHdoaWxlIChpbmRleCA8IHBydF9yZXNmaWxlLmxlbikKLSAgICB7Ci0gICAgICAgIGlmIChwcnRfcmVzZmlsZS5idWZmZXJbaW5kZXhdID09IFBTTEYgfHwgcHJ0X3Jlc2ZpbGUuYnVmZmVyW2luZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gUFNDUikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpbmRleCsrOwotICAgIH0KLSAgICBwcnRfcmVzZmlsZS5saW5lX2VuZCA9IGluZGV4OwotCi0gICAgcmV0dXJuIChpbmRleCA8IHBydF9yZXNmaWxlLmxlbik7Ci19Ci0KLSAgICBzdGF0aWMgaW50Ci1wcnRfcmVzZmlsZV9zdHJuY21wKG9mZnNldCwgc3RyaW5nLCBsZW4pCi0gICAgaW50ICAgICBvZmZzZXQ7Ci0gICAgY2hhciAgICAqc3RyaW5nOwotICAgIGludCAgICAgbGVuOwotewotICAgIC8qIEZvcmNlIG5vdCBlcXVhbCBpZiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gcmVtYWluZGVyIG9mIGxpbmUgKi8KLSAgICBpZiAobGVuID4gKHBydF9yZXNmaWxlLmxpbmVfZW5kIC0gKHBydF9yZXNmaWxlLmxpbmVfc3RhcnQgKyBvZmZzZXQpKSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICByZXR1cm4gU1RSTkNNUCgmcHJ0X3Jlc2ZpbGUuYnVmZmVyW3BydF9yZXNmaWxlLmxpbmVfc3RhcnQgKyBvZmZzZXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgbGVuKTsKLX0KLQotICAgIHN0YXRpYyBpbnQKLXBydF9yZXNmaWxlX3NraXBfbm9ud3Mob2Zmc2V0KQotICAgIGludCAgICAgb2Zmc2V0OwotewotICAgIGludCAgICAgaW5kZXg7Ci0KLSAgICBpbmRleCA9IHBydF9yZXNmaWxlLmxpbmVfc3RhcnQgKyBvZmZzZXQ7Ci0gICAgd2hpbGUgKGluZGV4IDwgcHJ0X3Jlc2ZpbGUubGluZV9lbmQpCi0gICAgewotICAgICAgICBpZiAoaXNzcGFjZShwcnRfcmVzZmlsZS5idWZmZXJbaW5kZXhdKSkKLSAgICAgICAgICAgIHJldHVybiBpbmRleCAtIHBydF9yZXNmaWxlLmxpbmVfc3RhcnQ7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotICAgIHN0YXRpYyBpbnQKLXBydF9yZXNmaWxlX3NraXBfd3Mob2Zmc2V0KQotICAgIGludCAgICAgb2Zmc2V0OwotewotICAgIGludCAgICAgaW5kZXg7Ci0KLSAgICBpbmRleCA9IHBydF9yZXNmaWxlLmxpbmVfc3RhcnQgKyBvZmZzZXQ7Ci0gICAgd2hpbGUgKGluZGV4IDwgcHJ0X3Jlc2ZpbGUubGluZV9lbmQpCi0gICAgewotICAgICAgICBpZiAoIWlzc3BhY2UocHJ0X3Jlc2ZpbGUuYnVmZmVyW2luZGV4XSkpCi0gICAgICAgICAgICByZXR1cm4gaW5kZXggLSBwcnRfcmVzZmlsZS5saW5lX3N0YXJ0OwotICAgICAgICBpbmRleCsrOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIHBydF9uZXh0X2RzYygpIC0gcmV0dXJucyBkZXRhaWwgb24gbmV4dCBEU0MgY29tbWVudCBsaW5lIGZvdW5kLiAgUmV0dXJucyB0cnVlCi0gKiBpZiBhIERTQyBjb21tZW50IGlzIGZvdW5kLCBlbHNlIGZhbHNlICovCi0gICAgc3RhdGljIGludAotcHJ0X25leHRfZHNjKHBfZHNjX2xpbmUpCi0gICAgc3RydWN0IHBydF9kc2NfbGluZV9TICpwX2RzY19saW5lOwotewotICAgIGludCAgICAgY29tbWVudDsKLSAgICBpbnQgICAgIG9mZnNldDsKLQotICAgIC8qIE1vdmUgdG8gc3RhcnQgb2YgbmV4dCBsaW5lICovCi0gICAgaWYgKCFwcnRfcmVzZmlsZV9uZXh0X2xpbmUoKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLyogRFNDIGNvbW1lbnRzIGFsd2F5cyBzdGFydCAlJSAqLwotICAgIGlmIChwcnRfcmVzZmlsZV9zdHJuY21wKDAsICIlJSIsIDIpICE9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIC8qIEZpbmQgdHlwZSBvZiBEU0MgY29tbWVudCAqLwotICAgIGZvciAoY29tbWVudCA9IDA7IGNvbW1lbnQgPCBOVU1fRUxFTUVOVFMocHJ0X2RzY190YWJsZSk7IGNvbW1lbnQrKykKLSAgICAgICAgaWYgKHBydF9yZXNmaWxlX3N0cm5jbXAoMCwgcHJ0X2RzY190YWJsZVtjb21tZW50XS5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9kc2NfdGFibGVbY29tbWVudF0ubGVuKSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICBpZiAoY29tbWVudCAhPSBOVU1fRUxFTUVOVFMocHJ0X2RzY190YWJsZSkpCi0gICAgewotICAgICAgICAvKiBSZXR1cm4gdHlwZSBvZiBjb21tZW50ICovCi0gICAgICAgIHBfZHNjX2xpbmUtPnR5cGUgPSBwcnRfZHNjX3RhYmxlW2NvbW1lbnRdLnR5cGU7Ci0gICAgICAgIG9mZnNldCA9IHBydF9kc2NfdGFibGVbY29tbWVudF0ubGVuOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBVbnJlY29nbmlzZWQgRFNDIGNvbW1lbnQsIHNraXAgdG8gd3MgYWZ0ZXIgY29tbWVudCBsZWFkZXIgKi8KLSAgICAgICAgcF9kc2NfbGluZS0+dHlwZSA9IFBSVF9EU0NfTUlTQ19UWVBFOwotICAgICAgICBvZmZzZXQgPSBwcnRfcmVzZmlsZV9za2lwX25vbndzKDApOwotICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIFNraXAgd3MgdG8gY29tbWVudCB2YWx1ZSAqLwotICAgIG9mZnNldCA9IHBydF9yZXNmaWxlX3NraXBfd3Mob2Zmc2V0KTsKLSAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBwX2RzY19saW5lLT5zdHJpbmcgPSAmcHJ0X3Jlc2ZpbGUuYnVmZmVyW3BydF9yZXNmaWxlLmxpbmVfc3RhcnQgKyBvZmZzZXRdOwotICAgIHBfZHNjX2xpbmUtPmxlbiA9IHBydF9yZXNmaWxlLmxpbmVfZW5kIC0gKHBydF9yZXNmaWxlLmxpbmVfc3RhcnQgKyBvZmZzZXQpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIEltcHJvdmVkIGhhbmQgY3JhZnRlZCBwYXJzZXIgdG8gZ2V0IHRoZSB0eXBlLCB0aXRsZSwgYW5kIHZlcnNpb24gbnVtYmVyIG9mIGEKLSAqIFBTIHJlc291cmNlIGZpbGUgc28gdGhlIGZpbGUgZGV0YWlscyBjYW4gYmUgYWRkZWQgdG8gdGhlIERTQyBoZWFkZXIgY29tbWVudHMuCi0gKi8KLSAgICBzdGF0aWMgaW50Ci1wcnRfb3Blbl9yZXNvdXJjZShyZXNvdXJjZSkKLSAgICBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlOwotewotICAgIGludCAgICAgICAgIG9mZnNldDsKLSAgICBpbnQgICAgICAgICBzZWVuX2FsbDsKLSAgICBpbnQgICAgICAgICBzZWVuX3RpdGxlOwotICAgIGludCAgICAgICAgIHNlZW5fdmVyc2lvbjsKLSAgICBGSUxFCSpmZF9yZXNvdXJjZTsKLSAgICBzdHJ1Y3QgcHJ0X2RzY19saW5lX1MgZHNjX2xpbmU7Ci0KLSAgICBmZF9yZXNvdXJjZSA9IG1jaF9mb3BlbigoY2hhciAqKXJlc291cmNlLT5maWxlbmFtZSwgUkVBREJJTik7Ci0gICAgaWYgKGZkX3Jlc291cmNlID09IE5VTEwpCi0gICAgewotCUVNU0cyKF8oIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiKSwgcmVzb3VyY2UtPmZpbGVuYW1lKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZpbV9tZW1zZXQocHJ0X3Jlc2ZpbGUuYnVmZmVyLCBOVUwsIFBSVF9GSUxFX0JVRkZFUl9MRU4pOwotCi0gICAgLyogUGFyc2UgZmlyc3QgbGluZSB0byBlbnN1cmUgdmFsaWQgcmVzb3VyY2UgZmlsZSAqLwotICAgIHBydF9yZXNmaWxlLmxlbiA9IGZyZWFkKChjaGFyICopcHJ0X3Jlc2ZpbGUuYnVmZmVyLCBzaXplb2YoY2hhcl91KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJUX0ZJTEVfQlVGRkVSX0xFTiwgZmRfcmVzb3VyY2UpOwotICAgIGlmIChmZXJyb3IoZmRfcmVzb3VyY2UpKQotICAgIHsKLQlFTVNHMihfKCJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiKSwKLQkJcmVzb3VyY2UtPmZpbGVuYW1lKTsKLQlmY2xvc2UoZmRfcmVzb3VyY2UpOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBwcnRfcmVzZmlsZS5saW5lX2VuZCA9IC0xOwotICAgIHBydF9yZXNmaWxlLmxpbmVfc3RhcnQgPSAwOwotICAgIGlmICghcHJ0X3Jlc2ZpbGVfbmV4dF9saW5lKCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIG9mZnNldCA9IDA7Ci0KLSAgICBpZiAocHJ0X3Jlc2ZpbGVfc3RybmNtcChvZmZzZXQsIFBSVF9SRVNPVVJDRV9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkxFTihQUlRfUkVTT1VSQ0VfSEVBREVSKSkgIT0gMCkKLSAgICB7Ci0JRU1TRzIoXygiRTYxODogZmlsZSBcIiVzXCIgaXMgbm90IGEgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIiksCi0JCXJlc291cmNlLT5maWxlbmFtZSk7Ci0JZmNsb3NlKGZkX3Jlc291cmNlKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogU2tpcCBvdmVyIGFueSB2ZXJzaW9uIG51bWJlcnMgYW5kIGZvbGxvd2luZyB3cyAqLwotICAgIG9mZnNldCArPSBTVFJMRU4oUFJUX1JFU09VUkNFX0hFQURFUik7Ci0gICAgb2Zmc2V0ID0gcHJ0X3Jlc2ZpbGVfc2tpcF9ub253cyhvZmZzZXQpOwotICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBvZmZzZXQgPSBwcnRfcmVzZmlsZV9za2lwX3dzKG9mZnNldCk7Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHBydF9yZXNmaWxlX3N0cm5jbXAob2Zmc2V0LCBQUlRfUkVTT1VSQ0VfUkVTT1VSQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkxFTihQUlRfUkVTT1VSQ0VfUkVTT1VSQ0UpKSAhPSAwKQotICAgIHsKLQlFTVNHMihfKCJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIiksCi0JCXJlc291cmNlLT5maWxlbmFtZSk7Ci0JZmNsb3NlKGZkX3Jlc291cmNlKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG9mZnNldCArPSBTVFJMRU4oUFJUX1JFU09VUkNFX1JFU09VUkNFKTsKLQotICAgIC8qIERlY2lkZSB0eXBlIG9mIHJlc291cmNlIGluIHRoZSBmaWxlICovCi0gICAgaWYgKHBydF9yZXNmaWxlX3N0cm5jbXAob2Zmc2V0LCBQUlRfUkVTT1VSQ0VfUFJPQ1NFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSTEVOKFBSVF9SRVNPVVJDRV9QUk9DU0VUKSkgPT0gMCkKLQlyZXNvdXJjZS0+dHlwZSA9IFBSVF9SRVNPVVJDRV9UWVBFX1BST0NTRVQ7Ci0gICAgZWxzZSBpZiAocHJ0X3Jlc2ZpbGVfc3RybmNtcChvZmZzZXQsIFBSVF9SRVNPVVJDRV9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSTEVOKFBSVF9SRVNPVVJDRV9FTkNPRElORykpID09IDApCi0JcmVzb3VyY2UtPnR5cGUgPSBQUlRfUkVTT1VSQ0VfVFlQRV9FTkNPRElORzsKLSAgICBlbHNlIGlmIChwcnRfcmVzZmlsZV9zdHJuY21wKG9mZnNldCwgUFJUX1JFU09VUkNFX0NNQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkxFTihQUlRfUkVTT1VSQ0VfQ01BUCkpID09IDApCi0JcmVzb3VyY2UtPnR5cGUgPSBQUlRfUkVTT1VSQ0VfVFlQRV9DTUFQOwotICAgIGVsc2UKLSAgICB7Ci0JRU1TRzIoXygiRTYxOTogZmlsZSBcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIpLAotCQlyZXNvdXJjZS0+ZmlsZW5hbWUpOwotCWZjbG9zZShmZF9yZXNvdXJjZSk7Ci0JcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIExvb2sgZm9yIHRpdGxlIGFuZCB2ZXJzaW9uIG9mIHJlc291cmNlICovCi0gICAgcmVzb3VyY2UtPnRpdGxlWzBdID0gJ1wwJzsKLSAgICByZXNvdXJjZS0+dmVyc2lvblswXSA9ICdcMCc7Ci0gICAgc2Vlbl90aXRsZSA9IEZBTFNFOwotICAgIHNlZW5fdmVyc2lvbiA9IEZBTFNFOwotICAgIHNlZW5fYWxsID0gRkFMU0U7Ci0gICAgd2hpbGUgKCFzZWVuX2FsbCAmJiBwcnRfbmV4dF9kc2MoJmRzY19saW5lKSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZHNjX2xpbmUudHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFBSVF9EU0NfVElUTEVfVFlQRToKLSAgICAgICAgICAgIHZpbV9zdHJuY3B5KHJlc291cmNlLT50aXRsZSwgZHNjX2xpbmUuc3RyaW5nLCBkc2NfbGluZS5sZW4pOwotICAgICAgICAgICAgc2Vlbl90aXRsZSA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoc2Vlbl92ZXJzaW9uKQotICAgICAgICAgICAgICAgIHNlZW5fYWxsID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUFJUX0RTQ19WRVJTSU9OX1RZUEU6Ci0gICAgICAgICAgICB2aW1fc3RybmNweShyZXNvdXJjZS0+dmVyc2lvbiwgZHNjX2xpbmUuc3RyaW5nLCBkc2NfbGluZS5sZW4pOwotICAgICAgICAgICAgc2Vlbl92ZXJzaW9uID0gVFJVRTsKLSAgICAgICAgICAgIGlmIChzZWVuX3RpdGxlKQotICAgICAgICAgICAgICAgIHNlZW5fYWxsID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUFJUX0RTQ19FTkRDT01NRU5UU19UWVBFOgotICAgICAgICAgICAgLyogV29udCBmaW5kIHRpdGxlIG9yIHJlc291cmNlIGFmdGVyIHRoaXMgY29tbWVudCwgc3RvcCBzZWFyY2hpbmcgKi8KLSAgICAgICAgICAgIHNlZW5fYWxsID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUFJUX0RTQ19NSVNDX1RZUEU6Ci0gICAgICAgICAgICAvKiBOb3QgaW50ZXJlc3RlZCBpbiB3aGF0ZXZlciBjb21tZW50IHRoaXMgbGluZSBoYWQgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFzZWVuX3RpdGxlIHx8ICFzZWVuX3ZlcnNpb24pCi0gICAgewotCUVNU0cyKF8oIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiKSwKLQkJcmVzb3VyY2UtPmZpbGVuYW1lKTsKLQlmY2xvc2UoZmRfcmVzb3VyY2UpOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLSAgICBzdGF0aWMgaW50Ci1wcnRfY2hlY2tfcmVzb3VyY2UocmVzb3VyY2UsIHZlcnNpb24pCi0gICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZTsKLSAgICBjaGFyX3UgICp2ZXJzaW9uOwotewotICAgIC8qIFZlcnNpb24gbnVtYmVyIG0ubiBzaG91bGQgbWF0Y2gsIHRoZSByZXZpc2lvbiBudW1iZXIgZG9lcyBub3QgbWF0dGVyICovCi0gICAgaWYgKFNUUk5DTVAocmVzb3VyY2UtPnZlcnNpb24sIHZlcnNpb24sIFNUUkxFTih2ZXJzaW9uKSkpCi0gICAgewotCUVNU0cyKF8oIkU2MjE6IFwiJXNcIiByZXNvdXJjZSBmaWxlIGhhcyB3cm9uZyB2ZXJzaW9uIiksCi0JCXJlc291cmNlLT5uYW1lKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogT3RoZXIgY2hlY2tzIHRvIGJlIGFkZGVkIGFzIG5lZWRlZCAqLwotICAgIHJldHVybiBUUlVFOwotfQotCi0gICAgc3RhdGljIHZvaWQKLXBydF9kc2Nfc3RhcnQoKQotewotICAgIHBydF93cml0ZV9zdHJpbmcoIiUhUFMtQWRvYmUtMy4wXG4iKTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1wcnRfZHNjX25vYXJnKGNvbW1lbnQpCi0gICAgY2hhcgkqY29tbWVudDsKLXsKLSAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAotCQkJCQkJCSAiJSUlJSVzXG4iLCBjb21tZW50KTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotfQotCi0gICAgc3RhdGljIHZvaWQKLXBydF9kc2NfdGV4dGxpbmUoY29tbWVudCwgdGV4dCkKLSAgICBjaGFyCSpjb21tZW50OwotICAgIGNoYXIJKnRleHQ7Ci17Ci0gICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKLQkJCQkJICAgICAgICIlJSUlJXM6ICVzXG4iLCBjb21tZW50LCB0ZXh0KTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotfQotCi0gICAgc3RhdGljIHZvaWQKLXBydF9kc2NfdGV4dChjb21tZW50LCB0ZXh0KQotICAgIGNoYXIJKmNvbW1lbnQ7Ci0gICAgY2hhcgkqdGV4dDsKLXsKLSAgICAvKiBUT0RPIC0gc2hvdWxkIHNjYW4gJ3RleHQnIGZvciBhbnkgY2hhcnMgbmVlZGluZyBlc2NhcGluZyEgKi8KLSAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAotCQkJCQkgICAgICIlJSUlJXM6ICglcylcbiIsIGNvbW1lbnQsIHRleHQpOwotICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Ci19Ci0KLSNkZWZpbmUgcHJ0X2RzY19hdGVuZChjKQlwcnRfZHNjX3RleHQoKGMpLCAiYXRlbmQiKQotCi0gICAgc3RhdGljIHZvaWQKLXBydF9kc2NfaW50cyhjb21tZW50LCBjb3VudCwgaW50cykKLSAgICBjaGFyCSpjb21tZW50OwotICAgIGludAkJY291bnQ7Ci0gICAgaW50CQkqaW50czsKLXsKLSAgICBpbnQJCWk7Ci0KLSAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAotCQkJCQkJCSAgIiUlJSUlczoiLCBjb21tZW50KTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotCXNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIgJWQiLCBpbnRzW2ldKTsKLQlwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotICAgIH0KLQotICAgIHBydF93cml0ZV9zdHJpbmcoIlxuIik7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X2RzY19yZXNvdXJjZXMoY29tbWVudCwgdHlwZSwgc3RyaW5nKQotICAgIGNoYXIJKmNvbW1lbnQ7CS8qIGlmIE5VTEwgYWRkIHRvIHByZXZpb3VzICovCi0gICAgY2hhcgkqdHlwZTsKLSAgICBjaGFyCSpzdHJpbmc7Ci17Ci0gICAgaWYgKGNvbW1lbnQgIT0gTlVMTCkKLQl2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAotCQkJCQkJICIlJSUlJXM6ICVzIiwgY29tbWVudCwgdHlwZSk7Ci0gICAgZWxzZQotCXZpbV9zbnByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgc2l6ZW9mKHBydF9saW5lX2J1ZmZlciksCi0JCQkJCQkJICAgICIlJSUlKyAlcyIsIHR5cGUpOwotICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Ci0KLSAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAotCQkJCQkJCSAgICAgIiAlc1xuIiwgc3RyaW5nKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotfQotCi0gICAgc3RhdGljIHZvaWQKLXBydF9kc2NfZm9udF9yZXNvdXJjZShyZXNvdXJjZSwgcHNfZm9udCkKLSAgICBjaGFyCSpyZXNvdXJjZTsKLSAgICBzdHJ1Y3QgcHJ0X3BzX2ZvbnRfUyAqcHNfZm9udDsKLXsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICBwcnRfZHNjX3Jlc291cmNlcyhyZXNvdXJjZSwgImZvbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfZm9udC0+cHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfUk9NQU5dKTsKLSAgICBmb3IgKGkgPSBQUlRfUFNfRk9OVF9CT0xEIDsgaSA8PSBQUlRfUFNfRk9OVF9CT0xET0JMSVFVRSA7IGkrKykKLSAgICAgICAgaWYgKHBzX2ZvbnQtPnBzX2ZvbnRuYW1lW2ldICE9IE5VTEwpCi0gICAgICAgICAgICBwcnRfZHNjX3Jlc291cmNlcyhOVUxMLCAiZm9udCIsIHBzX2ZvbnQtPnBzX2ZvbnRuYW1lW2ldKTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1wcnRfZHNjX3JlcXVpcmVtZW50cyhkdXBsZXgsIHR1bWJsZSwgY29sbGF0ZSwgY29sb3IsIG51bV9jb3BpZXMpCi0gICAgaW50CQlkdXBsZXg7Ci0gICAgaW50CQl0dW1ibGU7Ci0gICAgaW50CQljb2xsYXRlOwotICAgIGludAkJY29sb3I7Ci0gICAgaW50CQludW1fY29waWVzOwotewotICAgIC8qIE9ubHkgb3V0cHV0IHRoZSBjb21tZW50IGlmIHdlIG5lZWQgdG8uCi0gICAgICogTm90ZTogdHVtYmxlIGlzIGlnbm9yZWQgaWYgd2UgYXJlIG5vdCBkdXBsZXhpbmcKLSAgICAgKi8KLSAgICBpZiAoIShkdXBsZXggfHwgY29sbGF0ZSB8fCBjb2xvciB8fCAobnVtX2NvcGllcyA+IDEpKSkKLQlyZXR1cm47Ci0KLSAgICBzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiJSUlJVJlcXVpcmVtZW50czoiKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotCi0gICAgaWYgKGR1cGxleCkKLSAgICB7Ci0JcHJ0X3dyaXRlX3N0cmluZygiIGR1cGxleCIpOwotCWlmICh0dW1ibGUpCi0JICAgIHBydF93cml0ZV9zdHJpbmcoIih0dW1ibGUpIik7Ci0gICAgfQotICAgIGlmIChjb2xsYXRlKQotCXBydF93cml0ZV9zdHJpbmcoIiBjb2xsYXRlIik7Ci0gICAgaWYgKGNvbG9yKQotCXBydF93cml0ZV9zdHJpbmcoIiBjb2xvciIpOwotICAgIGlmIChudW1fY29waWVzID4gMSkKLSAgICB7Ci0JcHJ0X3dyaXRlX3N0cmluZygiIG51bWNvcGllcygiKTsKLQkvKiBOb3RlOiBubyBzcGFjZSB3YW50ZWQgc28gZG9udCB1c2UgcHJ0X3dyaXRlX2ludCgpICovCi0Jc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVkIiwgbnVtX2NvcGllcyk7Ci0JcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKLQlwcnRfd3JpdGVfc3RyaW5nKCIpIik7Ci0gICAgfQotICAgIHBydF93cml0ZV9zdHJpbmcoIlxuIik7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X2RzY19kb2NtZWRpYShwYXBlcl9uYW1lLCB3aWR0aCwgaGVpZ2h0LCB3ZWlnaHQsIGNvbG91ciwgdHlwZSkKLSAgICBjaGFyCSpwYXBlcl9uYW1lOwotICAgIGRvdWJsZQl3aWR0aDsKLSAgICBkb3VibGUJaGVpZ2h0OwotICAgIGRvdWJsZQl3ZWlnaHQ7Ci0gICAgY2hhcgkqY29sb3VyOwotICAgIGNoYXIJKnR5cGU7Ci17Ci0gICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKLQkJCQkJIiUlJSVEb2N1bWVudE1lZGlhOiAlcyAiLCBwYXBlcl9uYW1lKTsKLSAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOwotICAgIHBydF93cml0ZV9yZWFsKHdpZHRoLCAyKTsKLSAgICBwcnRfd3JpdGVfcmVhbChoZWlnaHQsIDIpOwotICAgIHBydF93cml0ZV9yZWFsKHdlaWdodCwgMik7Ci0gICAgaWYgKGNvbG91ciA9PSBOVUxMKQotCXBydF93cml0ZV9zdHJpbmcoIigpIik7Ci0gICAgZWxzZQotCXBydF93cml0ZV9zdHJpbmcoY29sb3VyKTsKLSAgICBwcnRfd3JpdGVfc3RyaW5nKCIgIik7Ci0gICAgaWYgKHR5cGUgPT0gTlVMTCkKLQlwcnRfd3JpdGVfc3RyaW5nKCIoKSIpOwotICAgIGVsc2UKLQlwcnRfd3JpdGVfc3RyaW5nKHR5cGUpOwotICAgIHBydF93cml0ZV9zdHJpbmcoIlxuIik7Ci19Ci0KLSAgICB2b2lkCi1tY2hfcHJpbnRfY2xlYW51cCgpCi17Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgIHsKLSAgICAgICAgaW50ICAgICBpOwotCi0gICAgICAgIC8qIEZyZWUgb2ZmIGFsbCBDSUQgZm9udCBuYW1lcyBjcmVhdGVkLCBidXQgZmlyc3QgY2xlYXIgZHVwbGljYXRlCi0gICAgICAgICAqIHBvaW50ZXJzIHRvIHRoZSBzYW1lIHN0cmluZyAod2hlbiB0aGUgc2FtZSBmb250IGlzIHVzZWQgZm9yIG1vcmUgdGhhbgotICAgICAgICAgKiBvbmUgc3R5bGUpLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpID0gUFJUX1BTX0ZPTlRfUk9NQU47IGkgPD0gUFJUX1BTX0ZPTlRfQk9MRE9CTElRVUU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW2ldICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgdmltX2ZyZWUocHJ0X3BzX21iX2ZvbnQucHNfZm9udG5hbWVbaV0pOwotICAgICAgICAgICAgcHJ0X3BzX21iX2ZvbnQucHNfZm9udG5hbWVbaV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBydF9kb19jb252KQotICAgIHsKLQljb252ZXJ0X3NldHVwKCZwcnRfY29udiwgTlVMTCwgTlVMTCk7Ci0JcHJ0X2RvX2NvbnYgPSBGQUxTRTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAocHJ0X3BzX2ZkICE9IE5VTEwpCi0gICAgewotCWZjbG9zZShwcnRfcHNfZmQpOwotCXBydF9wc19mZCA9IE5VTEw7Ci0JcHJ0X2ZpbGVfZXJyb3IgPSBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBydF9wc19maWxlX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0JdmltX2ZyZWUocHJ0X3BzX2ZpbGVfbmFtZSk7Ci0JcHJ0X3BzX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgfQotfQotCi0gICAgc3RhdGljIGZsb2F0Ci10b19kZXZpY2VfdW5pdHMoaWR4LCBwaHlzc2l6ZSwgZGVmX251bWJlcikKLSAgICBpbnQJCWlkeDsKLSAgICBkb3VibGUJcGh5c3NpemU7Ci0gICAgaW50CQlkZWZfbnVtYmVyOwotewotICAgIGZsb2F0CXJldDsKLSAgICBpbnQJCXU7Ci0gICAgaW50CQlucjsKLQotICAgIHUgPSBwcnRfZ2V0X3VuaXQoaWR4KTsKLSAgICBpZiAodSA9PSBQUlRfVU5JVF9OT05FKQotICAgIHsKLQl1ID0gUFJUX1VOSVRfUEVSQzsKLQluciA9IGRlZl9udW1iZXI7Ci0gICAgfQotICAgIGVsc2UKLQluciA9IHByaW50ZXJfb3B0c1tpZHhdLm51bWJlcjsKLQotICAgIHN3aXRjaCAodSkKLSAgICB7Ci0JY2FzZSBQUlRfVU5JVF9JTkNIOgotCSAgICByZXQgPSAoZmxvYXQpKG5yICogUFJUX1BTX0RFRkFVTFRfRFBJKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQUlRfVU5JVF9NTToKLQkgICAgcmV0ID0gKGZsb2F0KShuciAqIFBSVF9QU19ERUZBVUxUX0RQSSkgLyAoZmxvYXQpMjUuNDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQUlRfVU5JVF9QT0lOVDoKLQkgICAgcmV0ID0gKGZsb2F0KW5yOwotCSAgICBicmVhazsKLQljYXNlIFBSVF9VTklUX1BFUkM6Ci0JZGVmYXVsdDoKLQkgICAgcmV0ID0gKGZsb2F0KShwaHlzc2l6ZSAqIG5yKSAvIDEwMDsKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSBtYXJnaW5zIGZvciBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gcHJpbnRvcHRpb25zIHNldHRpbmdzLgotICovCi0gICAgc3RhdGljIHZvaWQKLXBydF9wYWdlX21hcmdpbnMod2lkdGgsIGhlaWdodCwgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKQotICAgIGRvdWJsZQl3aWR0aDsKLSAgICBkb3VibGUJaGVpZ2h0OwotICAgIGRvdWJsZQkqbGVmdDsKLSAgICBkb3VibGUJKnJpZ2h0OwotICAgIGRvdWJsZQkqdG9wOwotICAgIGRvdWJsZQkqYm90dG9tOwotewotICAgICpsZWZ0ICAgPSB0b19kZXZpY2VfdW5pdHMoT1BUX1BSSU5UX0xFRlQsIHdpZHRoLCAxMCk7Ci0gICAgKnJpZ2h0ICA9IHdpZHRoIC0gdG9fZGV2aWNlX3VuaXRzKE9QVF9QUklOVF9SSUdIVCwgd2lkdGgsIDUpOwotICAgICp0b3AgICAgPSBoZWlnaHQgLSB0b19kZXZpY2VfdW5pdHMoT1BUX1BSSU5UX1RPUCwgaGVpZ2h0LCA1KTsKLSAgICAqYm90dG9tID0gdG9fZGV2aWNlX3VuaXRzKE9QVF9QUklOVF9CT1QsIGhlaWdodCwgNSk7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotcHJ0X2ZvbnRfbWV0cmljcyhmb250X3NjYWxlKQotICAgIGludAkJZm9udF9zY2FsZTsKLXsKLSAgICBwcnRfbGluZV9oZWlnaHQgPSAoZmxvYXQpZm9udF9zY2FsZTsKLSAgICBwcnRfY2hhcl93aWR0aCA9IChmbG9hdClQUlRfUFNfRk9OVF9UT19VU0VSKGZvbnRfc2NhbGUsIHBydF9wc19mb250LT53eCk7Ci19Ci0KLQotICAgIHN0YXRpYyBpbnQKLXBydF9nZXRfY3BsKCkKLXsKLSAgICBpZiAocHJ0X3VzZV9udW1iZXIoKSkKLSAgICB7Ci0JcHJ0X251bWJlcl93aWR0aCA9IFBSSU5UX05VTUJFUl9XSURUSCAqIHBydF9jaGFyX3dpZHRoOwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICAgICAgLyogSWYgd2UgYXJlIG91dHB1dHRpbmcgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIHRoZW4gbGluZSBudW1iZXJzIHdpbGwgYmUKLSAgICAgICAgICogcHJpbnRlZCB3aXRoIGhhbGYgd2lkdGggY2hhcmFjdGVycwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBydF9vdXRfbWJ5dGUpCi0gICAgICAgICAgICBwcnRfbnVtYmVyX3dpZHRoIC89IDI7Ci0jZW5kaWYKLQlwcnRfbGVmdF9tYXJnaW4gKz0gcHJ0X251bWJlcl93aWR0aDsKLSAgICB9Ci0gICAgZWxzZQotCXBydF9udW1iZXJfd2lkdGggPSAwLjA7Ci0KLSAgICByZXR1cm4gKGludCkoKHBydF9yaWdodF9tYXJnaW4gLSBwcnRfbGVmdF9tYXJnaW4pIC8gcHJ0X2NoYXJfd2lkdGgpOwotfQotCi0jaWZkZWYgRkVBVF9NQllURQotICAgIHN0YXRpYyBpbnQKLXBydF9idWlsZF9jaWRfZm9udG5hbWUoZm9udCwgbmFtZSwgbmFtZV9sZW4pCi0gICAgaW50ICAgICBmb250OwotICAgIGNoYXJfdSAgKm5hbWU7Ci0gICAgaW50ICAgICBuYW1lX2xlbjsKLXsKLSAgICBjaGFyICAgICpmb250bmFtZTsKLQotICAgIGZvbnRuYW1lID0gKGNoYXIgKilhbGxvYyhuYW1lX2xlbiArIDEpOwotICAgIGlmIChmb250bmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgdmltX3N0cm5jcHkoKGNoYXJfdSAqKWZvbnRuYW1lLCBuYW1lLCBuYW1lX2xlbik7Ci0gICAgcHJ0X3BzX21iX2ZvbnQucHNfZm9udG5hbWVbZm9udF0gPSBmb250bmFtZTsKLQotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLS8qCi0gKiBHZXQgbnVtYmVyIG9mIGxpbmVzIG9mIHRleHQgdGhhdCBmaXQgb24gYSBwYWdlIChleGNsdWRpbmcgdGhlIGhlYWRlcikuCi0gKi8KLSAgICBzdGF0aWMgaW50Ci1wcnRfZ2V0X2xwcCgpCi17Ci0gICAgaW50IGxwcDsKLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIG9mZnNldCB0byBsb3dlciBsZWZ0IGNvcm5lciBvZiBiYWNrZ3JvdW5kIHJlY3QgYmFzZWQgb24gYWN0dWFsCi0gICAgICogZm9udCBoZWlnaHQgKGJhc2VkIG9uIGl0cyBib3VuZGluZyBib3gpIGFuZCB0aGUgbGluZSBoZWlnaHQsIGhhbmRsaW5nIHRoZQotICAgICAqIGNhc2Ugd2hlcmUgdGhlIGZvbnQgaGVpZ2h0IGNhbiBleGNlZWQgdGhlIGxpbmUgaGVpZ2h0LgotICAgICAqLwotICAgIHBydF9iZ2NvbF9vZmZzZXQgPSAoZmxvYXQpUFJUX1BTX0ZPTlRfVE9fVVNFUihwcnRfbGluZV9oZWlnaHQsCi0JCQkJCSAgIHBydF9wc19mb250LT5iYm94X21pbl95KTsKLSAgICBpZiAoKHBydF9wc19mb250LT5iYm94X21heF95IC0gcHJ0X3BzX2ZvbnQtPmJib3hfbWluX3kpIDwgMTAwMC4wKQotICAgIHsKLQlwcnRfYmdjb2xfb2Zmc2V0IC09IChmbG9hdClQUlRfUFNfRk9OVF9UT19VU0VSKHBydF9saW5lX2hlaWdodCwKLQkJCQkoMTAwMC4wIC0gKHBydF9wc19mb250LT5iYm94X21heF95IC0KLQkJCQkJICAgIHBydF9wc19mb250LT5iYm94X21pbl95KSkgLyAyKTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgaGVpZ2h0IGZvciB0b3Btb3N0IGxpbmUgYmFzZWQgb24gYmFja2dyb3VuZCByZWN0IG9mZnNldC4gKi8KLSAgICBwcnRfZmlyc3RfbGluZV9oZWlnaHQgPSBwcnRfbGluZV9oZWlnaHQgKyBwcnRfYmdjb2xfb2Zmc2V0OwotCi0gICAgLyogQ2FsY3VsYXRlIGxwcCAqLwotICAgIGxwcCA9IChpbnQpKChwcnRfdG9wX21hcmdpbiAtIHBydF9ib3R0b21fbWFyZ2luKSAvIHBydF9saW5lX2hlaWdodCk7Ci0KLSAgICAvKiBBZGp1c3QgdG9wIG1hcmdpbiBpZiB0aGVyZSBpcyBhIGhlYWRlciAqLwotICAgIHBydF90b3BfbWFyZ2luIC09IHBydF9saW5lX2hlaWdodCAqIHBydF9oZWFkZXJfaGVpZ2h0KCk7Ci0KLSAgICByZXR1cm4gbHBwIC0gcHJ0X2hlYWRlcl9oZWlnaHQoKTsKLX0KLQotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBzdGF0aWMgaW50Ci1wcnRfbWF0Y2hfZW5jb2RpbmcocF9lbmNvZGluZywgcF9jbWFwLCBwcF9tYmVuYykKLSAgICBjaGFyCQkJKnBfZW5jb2Rpbmc7Ci0gICAgc3RydWN0IHBydF9wc19tYmZvbnRfUwkqcF9jbWFwOwotICAgIHN0cnVjdCBwcnRfcHNfZW5jb2RpbmdfUwkqKnBwX21iZW5jOwotewotICAgIGludAkJCQltYmVuYzsKLSAgICBpbnQJCQkJZW5jX2xlbjsKLSAgICBzdHJ1Y3QgcHJ0X3BzX2VuY29kaW5nX1MJKnBfbWJlbmM7Ci0KLSAgICAqcHBfbWJlbmMgPSBOVUxMOwotICAgIC8qIExvb2sgZm9yIHJlY29nbmlzZWQgZW5jb2RpbmcgKi8KLSAgICBlbmNfbGVuID0gU1RSTEVOKHBfZW5jb2RpbmcpOwotICAgIHBfbWJlbmMgPSBwX2NtYXAtPmVuY29kaW5nczsKLSAgICBmb3IgKG1iZW5jID0gMDsgbWJlbmMgPCBwX2NtYXAtPm51bV9lbmNvZGluZ3M7IG1iZW5jKyspCi0gICAgewotICAgICAgICBpZiAoU1RSTklDTVAocF9tYmVuYy0+ZW5jb2RpbmcsIHBfZW5jb2RpbmcsIGVuY19sZW4pID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwcF9tYmVuYyA9IHBfbWJlbmM7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwX21iZW5jKys7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotICAgIHN0YXRpYyBpbnQKLXBydF9tYXRjaF9jaGFyc2V0KHBfY2hhcnNldCwgcF9jbWFwLCBwcF9tYmNoYXIpCi0gICAgY2hhcgkJICAgICpwX2NoYXJzZXQ7Ci0gICAgc3RydWN0IHBydF9wc19tYmZvbnRfUyAgKnBfY21hcDsKLSAgICBzdHJ1Y3QgcHJ0X3BzX2NoYXJzZXRfUyAqKnBwX21iY2hhcjsKLXsKLSAgICBpbnQJCQkgICAgbWJjaGFyOwotICAgIGludAkJCSAgICBjaGFyX2xlbjsKLSAgICBzdHJ1Y3QgcHJ0X3BzX2NoYXJzZXRfUyAqcF9tYmNoYXI7Ci0KLSAgICAvKiBMb29rIGZvciByZWNvZ25pc2VkIGNoYXJhY3RlciBzZXQsIHVzaW5nIGRlZmF1bHQgaWYgb25lIGlzIG5vdCBnaXZlbiAqLwotICAgIGlmICgqcF9jaGFyc2V0ID09IE5VTCkKLSAgICAgICAgcF9jaGFyc2V0ID0gcF9jbWFwLT5kZWZjczsKLSAgICBjaGFyX2xlbiA9IFNUUkxFTihwX2NoYXJzZXQpOwotICAgIHBfbWJjaGFyID0gcF9jbWFwLT5jaGFyc2V0czsKLSAgICBmb3IgKG1iY2hhciA9IDA7IG1iY2hhciA8IHBfY21hcC0+bnVtX2NoYXJzZXRzOyBtYmNoYXIrKykKLSAgICB7Ci0gICAgICAgIGlmIChTVFJOSUNNUChwX21iY2hhci0+Y2hhcnNldCwgcF9jaGFyc2V0LCBjaGFyX2xlbikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBwX21iY2hhciA9IHBfbWJjaGFyOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcF9tYmNoYXIrKzsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotI2VuZGlmCi0KLS8qQVJHU1VTRUQqLwotICAgIGludAotbWNoX3ByaW50X2luaXQocHNldHRpbmdzLCBqb2JuYW1lLCBmb3JjZWl0KQotICAgIHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3M7Ci0gICAgY2hhcl91CSpqb2JuYW1lOwotICAgIGludAkJZm9yY2VpdDsKLXsKLSAgICBpbnQJCWk7Ci0gICAgY2hhcgkqcGFwZXJfbmFtZTsKLSAgICBpbnQJCXBhcGVyX3N0cmxlbjsKLSAgICBpbnQJCWZvbnRzaXplOwotICAgIGNoYXJfdQkqcDsKLSAgICBkb3VibGUgICAgICBsZWZ0OwotICAgIGRvdWJsZSAgICAgIHJpZ2h0OwotICAgIGRvdWJsZSAgICAgIHRvcDsKLSAgICBkb3VibGUgICAgICBib3R0b207Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIGludCAgICAgICAgIGNtYXA7Ci0gICAgY2hhcl91CSpwX2VuY29kaW5nOwotICAgIHN0cnVjdCBwcnRfcHNfZW5jb2RpbmdfUyAqcF9tYmVuYzsKLSAgICBzdHJ1Y3QgcHJ0X3BzX2VuY29kaW5nX1MgKnBfbWJlbmNfZmlyc3Q7Ci0gICAgc3RydWN0IHBydF9wc19jaGFyc2V0X1MgICpwX21iY2hhcjsKLSNlbmRpZgotCi0jaWYgMAotICAgIC8qCi0gICAgICogVE9ETzoKLSAgICAgKiBJZiAiZm9yY2VpdCIgaXMgZmFsc2U6IHBvcCB1cCBhIGRpYWxvZyB0byBzZWxlY3Q6Ci0gICAgICoJLSBwcmludGVyIG5hbWUKLSAgICAgKgktIGNvcGllcwotICAgICAqCS0gY29sbGF0ZWQvdW5jb2xsYXRlZAotICAgICAqCS0gZHVwbGV4IG9mZi9sb25nIHNpZGUvc2hvcnQgc2lkZQotICAgICAqCS0gcGFwZXIgc2l6ZQotICAgICAqCS0gcG9ydHJhaXQvbGFuZHNjYXBlCi0gICAgICoJLSBmb250IHNpemUKLSAgICAgKgotICAgICAqIElmICJmb3JjZWl0IiBpcyB0cnVlOiB1c2UgdGhlIGRlZmF1bHQgcHJpbnRlciBhbmQgc2V0dGluZ3MKLSAgICAgKi8KLSAgICBpZiAoZm9yY2VpdCkKLQlzX3BkLkZsYWdzIHw9IFBEX1JFVFVSTkRFRkFVTFQ7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogU2V0IHVwIGZvbnQgYW5kIGVuY29kaW5nLgotICAgICAqLwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBwX2VuY29kaW5nID0gZW5jX3NraXAocF9wZW5jKTsKLSAgICBpZiAoKnBfZW5jb2RpbmcgPT0gTlVMKQotICAgICAgICBwX2VuY29kaW5nID0gZW5jX3NraXAocF9lbmMpOwotCi0gICAgLyogTG9vayBmb3IgcmVjb2duaXNlZCBtdWx0aS1ieXRlIGNvZGluZywgYW5kIGlmIHRoZSBjaGFyc2V0IGlzIHJlY29nbmlzZWQuCi0gICAgICogVGhpcyBpcyB0byBjb3BlIHdpdGggdGhlIGZhY3QgdGhhdCB2YXJpb3VzIHVuaWNvZGUgZW5jb2RpbmdzIGFyZQotICAgICAqIHN1cHBvcnRlZCBpbiBtb3JlIHRoYW4gb25lIG9mIENKSy4gKi8KLSAgICBwX21iZW5jID0gTlVMTDsKLSAgICBwX21iZW5jX2ZpcnN0ID0gTlVMTDsKLSAgICBwX21iY2hhciA9IE5VTEw7Ci0gICAgZm9yIChjbWFwID0gMDsgY21hcCA8IE5VTV9FTEVNRU5UUyhwcnRfcHNfbWJmb250cyk7IGNtYXArKykKLSAgICAgICAgaWYgKHBydF9tYXRjaF9lbmNvZGluZygoY2hhciAqKXBfZW5jb2RpbmcsICZwcnRfcHNfbWJmb250c1tjbWFwXSwKLQkJCQkJCQkJICAgICZwX21iZW5jKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBfbWJlbmNfZmlyc3QgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBwX21iZW5jX2ZpcnN0ID0gcF9tYmVuYzsKLSAgICAgICAgICAgIGlmIChwcnRfbWF0Y2hfY2hhcnNldCgoY2hhciAqKXBfcG1jcywgJnBydF9wc19tYmZvbnRzW2NtYXBdLAotCQkJCQkJCQkgICAmcF9tYmNoYXIpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAvKiBVc2UgZmlyc3QgZW5jb2RpbmcgbWF0Y2hlZCBpZiBubyBjaGFyc2V0IG1hdGNoZWQgKi8KLSAgICBpZiAocF9tYmNoYXIgPT0gTlVMTCAmJiBwX21iZW5jX2ZpcnN0ICE9IE5VTEwpCi0gICAgICAgIHBfbWJlbmMgPSBwX21iZW5jX2ZpcnN0OwotCi0gICAgcHJ0X291dF9tYnl0ZSA9IChwX21iZW5jICE9IE5VTEwpOwotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgIHsKLSAgICAgICAgLyogQnVpbGQgQ01hcCBuYW1lIC0gd2lsbCBiZSBzYW1lIGZvciBhbGwgbXVsdGktYnl0ZSBmb250cyB1c2VkICovCi0gICAgICAgIHBydF9jbWFwWzBdID0gTlVMOwotCi0gICAgICAgIHBydF9jdXN0b21fY21hcCA9IHBydF9vdXRfbWJ5dGUgJiYgcF9tYmNoYXIgPT0gTlVMTDsKLQotICAgICAgICBpZiAoIXBydF9jdXN0b21fY21hcCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2hlY2sgZW5jb2RpbmcgYW5kIGNoYXJhY3RlciBzZXQgYXJlIGNvbXBhdGlibGUgKi8KLSAgICAgICAgICAgIGlmICgocF9tYmVuYy0+bmVlZHNfY2hhcnNldCZwX21iY2hhci0+aGFzX2NoYXJzZXQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRU1TRyhfKCJFNjczOiBJbmNvbXBhdGlibGUgbXVsdGktYnl0ZSBlbmNvZGluZyBhbmQgY2hhcmFjdGVyIHNldC4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgY2hhcnNldCBuYW1lIGlmIG5vdCBlbXB0eSAqLwotICAgICAgICAgICAgaWYgKHBfbWJjaGFyLT5jbWFwX2NoYXJzZXQgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aW1fc3RybmNweSgoY2hhcl91ICopcHJ0X2NtYXAsCi0JCSAgICAgIChjaGFyX3UgKilwX21iY2hhci0+Y21hcF9jaGFyc2V0LCBzaXplb2YocHJ0X2NtYXApIC0gMyk7Ci0gICAgICAgICAgICAgICAgU1RSQ0FUKHBydF9jbWFwLCAiLSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWRkIGN1c3RvbSBDTWFwIGNoYXJhY3RlciBzZXQgbmFtZSAqLwotICAgICAgICAgICAgaWYgKCpwX3BtY3MgPT0gTlVMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVNU0coXygiRTY3NDogcHJpbnRtYmNoYXJzZXQgY2Fubm90IGJlIGVtcHR5IHdpdGggbXVsdGktYnl0ZSBlbmNvZGluZy4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmltX3N0cm5jcHkoKGNoYXJfdSAqKXBydF9jbWFwLCBwX3BtY3MsIHNpemVvZihwcnRfY21hcCkgLSAzKTsKLSAgICAgICAgICAgIFNUUkNBVChwcnRfY21hcCwgIi0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENNYXAgbmFtZSBlbmRzIHdpdGggKG9wdGlvbmFsKSBlbmNvZGluZyBuYW1lIGFuZCAtSCBmb3IgaG9yaXpvbnRhbCAqLwotICAgICAgICBpZiAocF9tYmVuYy0+Y21hcF9lbmNvZGluZyAhPSBOVUxMICYmIFNUUkxFTihwcnRfY21hcCkKLQkJICAgICAgKyBTVFJMRU4ocF9tYmVuYy0+Y21hcF9lbmNvZGluZykgKyAzIDwgc2l6ZW9mKHBydF9jbWFwKSkKLSAgICAgICAgewotICAgICAgICAgICAgU1RSQ0FUKHBydF9jbWFwLCBwX21iZW5jLT5jbWFwX2VuY29kaW5nKTsKLSAgICAgICAgICAgIFNUUkNBVChwcnRfY21hcCwgIi0iKTsKLSAgICAgICAgfQotICAgICAgICBTVFJDQVQocHJ0X2NtYXAsICJIIik7Ci0KLSAgICAgICAgaWYgKCFtYmZvbnRfb3B0c1tPUFRfTUJGT05UX1JFR1VMQVJdLnByZXNlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVNU0coXygiRTY3NTogTm8gZGVmYXVsdCBmb250IHNwZWNpZmllZCBmb3IgbXVsdGktYnl0ZSBwcmludGluZy4iKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEZXJpdmUgQ0lEIGZvbnQgbmFtZXMgd2l0aCBmYWxsYmFja3MgaWYgbm90IGRlZmluZWQgKi8KLSAgICAgICAgaWYgKCFwcnRfYnVpbGRfY2lkX2ZvbnRuYW1lKFBSVF9QU19GT05UX1JPTUFOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJmb250X29wdHNbT1BUX01CRk9OVF9SRUdVTEFSXS5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmZvbnRfb3B0c1tPUFRfTUJGT05UX1JFR1VMQVJdLnN0cmxlbikpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmIChtYmZvbnRfb3B0c1tPUFRfTUJGT05UX0JPTERdLnByZXNlbnQpCi0gICAgICAgICAgICBpZiAoIXBydF9idWlsZF9jaWRfZm9udG5hbWUoUFJUX1BTX0ZPTlRfQk9MRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmZvbnRfb3B0c1tPUFRfTUJGT05UX0JPTERdLnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmZvbnRfb3B0c1tPUFRfTUJGT05UX0JPTERdLnN0cmxlbikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAobWJmb250X29wdHNbT1BUX01CRk9OVF9PQkxJUVVFXS5wcmVzZW50KQotICAgICAgICAgICAgaWYgKCFwcnRfYnVpbGRfY2lkX2ZvbnRuYW1lKFBSVF9QU19GT05UX09CTElRVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJmb250X29wdHNbT1BUX01CRk9OVF9PQkxJUVVFXS5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJmb250X29wdHNbT1BUX01CRk9OVF9PQkxJUVVFXS5zdHJsZW4pKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKG1iZm9udF9vcHRzW09QVF9NQkZPTlRfQk9MRE9CTElRVUVdLnByZXNlbnQpCi0gICAgICAgICAgICBpZiAoIXBydF9idWlsZF9jaWRfZm9udG5hbWUoUFJUX1BTX0ZPTlRfQk9MRE9CTElRVUUsCi0JCQkJICAgbWJmb250X29wdHNbT1BUX01CRk9OVF9CT0xET0JMSVFVRV0uc3RyaW5nLAotCQkJCSAgbWJmb250X29wdHNbT1BUX01CRk9OVF9CT0xET0JMSVFVRV0uc3RybGVuKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgbmVlZCB0byB1c2UgQ291cmllciBmb3IgQVNDSUkgY29kZSByYW5nZSwgYW5kIGlmIHNvIHBpY2sgdXAKLSAgICAgICAgICogdGhlIGVuY29kaW5nIHRvIHVzZSAqLwotICAgICAgICBwcnRfdXNlX2NvdXJpZXIgPSBtYmZvbnRfb3B0c1tPUFRfTUJGT05UX1VTRUNPVVJJRVJdLnByZXNlbnQgJiYKLSAgICAgICAgICAgIChUT0xPV0VSX0FTQyhtYmZvbnRfb3B0c1tPUFRfTUJGT05UX1VTRUNPVVJJRVJdLnN0cmluZ1swXSkgPT0gJ3knKTsKLSAgICAgICAgaWYgKHBydF91c2VfY291cmllcikKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXNlIG5hdGlvbmFsIEFTQ0lJIHZhcmlhbnQgdW5sZXNzIEFTQ0lJIHdhbnRlZCAqLwotICAgICAgICAgICAgaWYgKG1iZm9udF9vcHRzW09QVF9NQkZPTlRfQVNDSUldLnByZXNlbnQgJiYKLSAgICAgICAgICAgICAgICAoVE9MT1dFUl9BU0MobWJmb250X29wdHNbT1BUX01CRk9OVF9BU0NJSV0uc3RyaW5nWzBdKSA9PSAneScpKQotICAgICAgICAgICAgICAgIHBydF9hc2NpaV9lbmNvZGluZyA9ICJhc2NpaSI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJ0X2FzY2lpX2VuY29kaW5nID0gcHJ0X3BzX21iZm9udHNbY21hcF0uYXNjaWlfZW5jOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJ0X3BzX2ZvbnQgPSAmcHJ0X3BzX21iX2ZvbnQ7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgICAgIHBydF91c2VfY291cmllciA9IEZBTFNFOwotI2VuZGlmCi0gICAgICAgIHBydF9wc19mb250ID0gJnBydF9wc19jb3VyaWVyX2ZvbnQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBwYXBlciBhbmQgc2V0IHRoZSBtYXJnaW5zLgotICAgICAqLwotICAgIHBydF9wb3J0cmFpdCA9ICghcHJpbnRlcl9vcHRzW09QVF9QUklOVF9QT1JUUkFJVF0ucHJlc2VudAotCSAgIHx8IFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfUE9SVFJBSVRdLnN0cmluZ1swXSkgPT0gJ3knKTsKLSAgICBpZiAocHJpbnRlcl9vcHRzW09QVF9QUklOVF9QQVBFUl0ucHJlc2VudCkKLSAgICB7Ci0JcGFwZXJfbmFtZSA9IChjaGFyICopcHJpbnRlcl9vcHRzW09QVF9QUklOVF9QQVBFUl0uc3RyaW5nOwotCXBhcGVyX3N0cmxlbiA9IHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfUEFQRVJdLnN0cmxlbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwYXBlcl9uYW1lID0gIkE0IjsKLQlwYXBlcl9zdHJsZW4gPSAyOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgUFJUX01FRElBU0laRV9MRU47ICsraSkKLQlpZiAoU1RSTEVOKHBydF9tZWRpYXNpemVbaV0ubmFtZSkgPT0gKHVuc2lnbmVkKXBhcGVyX3N0cmxlbgotCQkmJiBTVFJOSUNNUChwcnRfbWVkaWFzaXplW2ldLm5hbWUsIHBhcGVyX25hbWUsCi0JCQkJCQkJICAgcGFwZXJfc3RybGVuKSA9PSAwKQotCSAgICBicmVhazsKLSAgICBpZiAoaSA9PSBQUlRfTUVESUFTSVpFX0xFTikKLQlpID0gMDsKLSAgICBwcnRfbWVkaWEgPSBpOwotCi0gICAgLyoKLSAgICAgKiBTZXQgUFMgcGFnZXNpemUgYmFzZWQgb24gbWVkaWEgZGltZW5zaW9ucyBhbmQgcHJpbnQgb3JpZW50YXRpb24uCi0gICAgICogTm90ZTogTWVkaWEgYW5kIHBhZ2Ugc2l6ZXMgaGF2ZSBkZWZpbmVkIG1lYW5pbmdzIGluIFBvc3RTY3JpcHQgYW5kIHNob3VsZAotICAgICAqIGJlIGtlcHQgZGlzdGluY3QuICBNZWRpYSBpcyB0aGUgcGFwZXIgKG9yIHRyYW5zcGFyZW5jeSwgb3IgLi4uKSB0aGF0IGlzCi0gICAgICogcHJpbnRlZCBvbiwgd2hlcmVhcyB0aGUgcGFnZSBzaXplIGlzIHRoZSBhcmVhIHRoYXQgdGhlIFBvc3RTY3JpcHQKLSAgICAgKiBpbnRlcnByZXRlciByZW5kZXJzIGludG8uCi0gICAgICovCi0gICAgaWYgKHBydF9wb3J0cmFpdCkKLSAgICB7Ci0JcHJ0X3BhZ2Vfd2lkdGggPSBwcnRfbWVkaWFzaXplW2ldLndpZHRoOwotCXBydF9wYWdlX2hlaWdodCA9IHBydF9tZWRpYXNpemVbaV0uaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXBydF9wYWdlX3dpZHRoID0gcHJ0X21lZGlhc2l6ZVtpXS5oZWlnaHQ7Ci0JcHJ0X3BhZ2VfaGVpZ2h0ID0gcHJ0X21lZGlhc2l6ZVtpXS53aWR0aDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldCBQUyBwYWdlIG1hcmdpbnMgYmFzZWQgb24gdGhlIFBTIHBhZ2VzaXplLCBub3QgdGhlIG1lZGlhc2l6ZSAtIHRoaXMKLSAgICAgKiBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSB0aGUgY3BsIGFuZCBscHAgYXJlIGNhbGN1bGF0ZWQuCi0gICAgICovCi0gICAgcHJ0X3BhZ2VfbWFyZ2lucyhwcnRfcGFnZV93aWR0aCwgcHJ0X3BhZ2VfaGVpZ2h0LCAmbGVmdCwgJnJpZ2h0LCAmdG9wLAotCQkJCQkJCQkgICAgJmJvdHRvbSk7Ci0gICAgcHJ0X2xlZnRfbWFyZ2luID0gKGZsb2F0KWxlZnQ7Ci0gICAgcHJ0X3JpZ2h0X21hcmdpbiA9IChmbG9hdClyaWdodDsKLSAgICBwcnRfdG9wX21hcmdpbiA9IChmbG9hdCl0b3A7Ci0gICAgcHJ0X2JvdHRvbV9tYXJnaW4gPSAoZmxvYXQpYm90dG9tOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdXAgdGhlIGZvbnQgc2l6ZS4KLSAgICAgKi8KLSAgICBmb250c2l6ZSA9IFBSVF9QU19ERUZBVUxUX0ZPTlRTSVpFOwotICAgIGZvciAocCA9IHBfcGZuOyAocCA9IHZpbV9zdHJjaHIocCwgJzonKSkgIT0gTlVMTDsgKytwKQotCWlmIChwWzFdID09ICdoJyAmJiBWSU1fSVNESUdJVChwWzJdKSkKLQkgICAgZm9udHNpemUgPSBhdG9pKChjaGFyICopcCArIDIpOwotICAgIHBydF9mb250X21ldHJpY3MoZm9udHNpemUpOwotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBsaW5lLCBhbmQgbGluZXMgcGVyIHBhZ2UgZm9yIHRoZQotICAgICAqIGdlbmVyaWMgcHJpbnQgY29kZS4KLSAgICAgKi8KLSAgICBwc2V0dGluZ3MtPmNoYXJzX3Blcl9saW5lID0gcHJ0X2dldF9jcGwoKTsKLSAgICBwc2V0dGluZ3MtPmxpbmVzX3Blcl9wYWdlID0gcHJ0X2dldF9scHAoKTsKLQotICAgIC8qIENhdGNoIG1hcmdpbiBzZXR0aW5ncyB0aGF0IGxlYXZlIG5vIHNwYWNlIGZvciBvdXRwdXQhICovCi0gICAgaWYgKHBzZXR0aW5ncy0+Y2hhcnNfcGVyX2xpbmUgPD0gMCB8fCBwc2V0dGluZ3MtPmxpbmVzX3Blcl9wYWdlIDw9IDApCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICAvKgotICAgICAqIFNvcnQgb3V0IHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQuICBQUyBieSBkZWZhdWx0IHdpbGwgZG8KLSAgICAgKiB1bmNvbGxhdGVkIGNvcGllcyBmb3IgeW91LCBzbyBvbmNlIHdlIGtub3cgaG93IG1hbnkgdW5jb2xsYXRlZCBjb3BpZXMgYXJlCi0gICAgICogd2FudGVkIGNhY2hlIGl0IGF3YXkgYW5kIGxpZSB0byB0aGUgZ2VuZXJpYyBjb2RlIHRoYXQgd2Ugb25seSB3YW50IG9uZQotICAgICAqIHVuY29sbGF0ZWQgY29weS4KLSAgICAgKi8KLSAgICBwc2V0dGluZ3MtPm5fY29sbGF0ZWRfY29waWVzID0gMTsKLSAgICBwc2V0dGluZ3MtPm5fdW5jb2xsYXRlZF9jb3BpZXMgPSAxOwotICAgIHBydF9udW1fY29waWVzID0gMTsKLSAgICBwcnRfY29sbGF0ZSA9ICghcHJpbnRlcl9vcHRzW09QVF9QUklOVF9DT0xMQVRFXS5wcmVzZW50Ci0JICAgIHx8IFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfQ09MTEFURV0uc3RyaW5nWzBdKSA9PSAneScpOwotICAgIGlmIChwcnRfY29sbGF0ZSkKLSAgICB7Ci0JLyogVE9ETzogR2V0IG51bWJlciBvZiBjb2xsYXRlZCBjb3BpZXMgd2FudGVkLiAqLwotCXBzZXR0aW5ncy0+bl9jb2xsYXRlZF9jb3BpZXMgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCS8qIFRPRE86IEdldCBudW1iZXIgb2YgdW5jb2xsYXRlZCBjb3BpZXMgd2FudGVkIGFuZCB1cGRhdGUgdGhlIGNhY2hlZAotCSAqIGNvdW50LgotCSAqLwotCXBydF9udW1fY29waWVzID0gMTsKLSAgICB9Ci0KLSAgICBwc2V0dGluZ3MtPmpvYm5hbWUgPSBqb2JuYW1lOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdXAgcHJpbnRlciBkdXBsZXggYW5kIHR1bWJsZSBiYXNlZCBvbiBEdXBsZXggb3B0aW9uIHNldHRpbmcgLSBkZWZhdWx0Ci0gICAgICogaXMgbG9uZyBzaWRlZCBkdXBsZXggcHJpbnRpbmcgKGkuZS4gbm8gdHVtYmxlKS4KLSAgICAgKi8KLSAgICBwcnRfZHVwbGV4ID0gVFJVRTsKLSAgICBwcnRfdHVtYmxlID0gRkFMU0U7Ci0gICAgcHNldHRpbmdzLT5kdXBsZXggPSAxOwotICAgIGlmIChwcmludGVyX29wdHNbT1BUX1BSSU5UX0RVUExFWF0ucHJlc2VudCkKLSAgICB7Ci0JaWYgKFNUUk5JQ01QKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfRFVQTEVYXS5zdHJpbmcsICJvZmYiLCAzKSA9PSAwKQotCXsKLQkgICAgcHJ0X2R1cGxleCA9IEZBTFNFOwotCSAgICBwc2V0dGluZ3MtPmR1cGxleCA9IDA7Ci0JfQotCWVsc2UgaWYgKFNUUk5JQ01QKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfRFVQTEVYXS5zdHJpbmcsICJzaG9ydCIsIDUpCi0JCQkJCQkJCQkgPT0gMCkKLQkgICAgcHJ0X3R1bWJsZSA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogRm9yIG5vdyB1c2VyIGFib3J0IG5vdCBzdXBwb3J0ZWQgKi8KLSAgICBwc2V0dGluZ3MtPnVzZXJfYWJvcnQgPSAwOwotCi0gICAgLyogSWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBmaWxlIG5hbWUsIHVzZSBhIHRlbXAgZmlsZS4gKi8KLSAgICBpZiAocHNldHRpbmdzLT5vdXRmaWxlID09IE5VTEwpCi0gICAgewotCXBydF9wc19maWxlX25hbWUgPSB2aW1fdGVtcG5hbWUoJ3AnKTsKLQlpZiAocHJ0X3BzX2ZpbGVfbmFtZSA9PSBOVUxMKQotCXsKLQkgICAgRU1TRyhfKGVfbm90bXApKTsKLQkgICAgcmV0dXJuIEZBSUw7Ci0JfQotCXBydF9wc19mZCA9IG1jaF9mb3BlbigoY2hhciAqKXBydF9wc19maWxlX25hbWUsIFdSSVRFQklOKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwID0gZXhwYW5kX2Vudl9zYXZlKHBzZXR0aW5ncy0+b3V0ZmlsZSk7Ci0JaWYgKHAgIT0gTlVMTCkKLQl7Ci0JICAgIHBydF9wc19mZCA9IG1jaF9mb3BlbigoY2hhciAqKXAsIFdSSVRFQklOKTsKLQkgICAgdmltX2ZyZWUocCk7Ci0JfQotICAgIH0KLSAgICBpZiAocHJ0X3BzX2ZkID09IE5VTEwpCi0gICAgewotCUVNU0coXygiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIikpOwotCW1jaF9wcmludF9jbGVhbnVwKCk7Ci0JcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gICAgcHJ0X2J1ZnNpeiA9IHBzZXR0aW5ncy0+Y2hhcnNfcGVyX2xpbmU7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgICAgICBwcnRfYnVmc2l6ICo9IDI7Ci0jZW5kaWYKLSAgICBnYV9pbml0MigmcHJ0X3BzX2J1ZmZlciwgKGludClzaXplb2YoY2hhciksIHBydF9idWZzaXopOwotCi0gICAgcHJ0X3BhZ2VfbnVtID0gMDsKLQotICAgIHBydF9hdHRyaWJ1dGVfY2hhbmdlID0gRkFMU0U7Ci0gICAgcHJ0X25lZWRfbW92ZXRvID0gRkFMU0U7Ci0gICAgcHJ0X25lZWRfZm9udCA9IEZBTFNFOwotICAgIHBydF9uZWVkX2ZnY29sID0gRkFMU0U7Ci0gICAgcHJ0X25lZWRfYmdjb2wgPSBGQUxTRTsKLSAgICBwcnRfbmVlZF91bmRlcmxpbmUgPSBGQUxTRTsKLQotICAgIHBydF9maWxlX2Vycm9yID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLSAgICBzdGF0aWMgaW50Ci1wcnRfYWRkX3Jlc291cmNlKHJlc291cmNlKQotICAgIHN0cnVjdCBwcnRfcHNfcmVzb3VyY2VfUyAqcmVzb3VyY2U7Ci17Ci0gICAgRklMRSoJZmRfcmVzb3VyY2U7Ci0gICAgY2hhcl91CXJlc291cmNlX2J1ZmZlcls1MTJdOwotICAgIHNpemVfdAlieXRlc19yZWFkOwotCi0gICAgZmRfcmVzb3VyY2UgPSBtY2hfZm9wZW4oKGNoYXIgKilyZXNvdXJjZS0+ZmlsZW5hbWUsIFJFQURCSU4pOwotICAgIGlmIChmZF9yZXNvdXJjZSA9PSBOVUxMKQotICAgIHsKLQlFTVNHMihfKCJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIiksIHJlc291cmNlLT5maWxlbmFtZSk7Ci0JcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwcnRfZHNjX3Jlc291cmNlcygiQmVnaW5SZXNvdXJjZSIsIHBydF9yZXNvdXJjZV90eXBlc1tyZXNvdXJjZS0+dHlwZV0sCi0JCQkJCQkgICAgIChjaGFyICopcmVzb3VyY2UtPnRpdGxlKTsKLQotICAgIHBydF9kc2NfdGV4dGxpbmUoIkJlZ2luRG9jdW1lbnQiLCAoY2hhciAqKXJlc291cmNlLT5maWxlbmFtZSk7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLQlieXRlc19yZWFkID0gZnJlYWQoKGNoYXIgKilyZXNvdXJjZV9idWZmZXIsIHNpemVvZihjaGFyX3UpLAotCQkJICAgc2l6ZW9mKHJlc291cmNlX2J1ZmZlciksIGZkX3Jlc291cmNlKTsKLQlpZiAoZmVycm9yKGZkX3Jlc291cmNlKSkKLQl7Ci0JICAgIEVNU0cyKF8oIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIpLAotCQkJCQkJCSAgICByZXNvdXJjZS0+ZmlsZW5hbWUpOwotCSAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOwotCSAgICByZXR1cm4gRkFMU0U7Ci0JfQotCWlmIChieXRlc19yZWFkID09IDApCi0JICAgIGJyZWFrOwotCXBydF93cml0ZV9maWxlX3Jhd19sZW4ocmVzb3VyY2VfYnVmZmVyLCBieXRlc19yZWFkKTsKLQlpZiAocHJ0X2ZpbGVfZXJyb3IpCi0JewotCSAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOwotCSAgICByZXR1cm4gRkFMU0U7Ci0JfQotICAgIH0KLSAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOwotCi0gICAgcHJ0X2RzY19ub2FyZygiRW5kRG9jdW1lbnQiKTsKLQotICAgIHBydF9kc2Nfbm9hcmcoIkVuZFJlc291cmNlIik7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotICAgIGludAotbWNoX3ByaW50X2JlZ2luKHBzZXR0aW5ncykKLSAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzOwotewotICAgIHRpbWVfdAlub3c7Ci0gICAgaW50CQliYm94WzRdOwotICAgIGNoYXIJKnBfdGltZTsKLSAgICBkb3VibGUgICAgICBsZWZ0OwotICAgIGRvdWJsZSAgICAgIHJpZ2h0OwotICAgIGRvdWJsZSAgICAgIHRvcDsKLSAgICBkb3VibGUgICAgICBib3R0b207Ci0gICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TIHJlc19wcm9sb2c7Ci0gICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TIHJlc19lbmNvZGluZzsKLSAgICBjaGFyCWJ1ZmZlclsyNTZdOwotICAgIGNoYXJfdSAgICAgICpwX2VuY29kaW5nOwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgcmVzX2NpZGZvbnQ7Ci0gICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TIHJlc19jbWFwOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFBTIERTQyBIZWFkZXIgY29tbWVudHMgLSBubyBQUyBjb2RlIQotICAgICAqLwotICAgIHBydF9kc2Nfc3RhcnQoKTsKLSAgICBwcnRfZHNjX3RleHRsaW5lKCJUaXRsZSIsIChjaGFyICopcHNldHRpbmdzLT5qb2JuYW1lKTsKLSAgICBpZiAoIWdldF91c2VyX25hbWUoKGNoYXJfdSAqKWJ1ZmZlciwgMjU2KSkKLSAgICAgICAgU1RSQ1BZKGJ1ZmZlciwgIlVua25vd24iKTsKLSAgICBwcnRfZHNjX3RleHRsaW5lKCJGb3IiLCBidWZmZXIpOwotICAgIHBydF9kc2NfdGV4dGxpbmUoIkNyZWF0b3IiLCBWSU1fVkVSU0lPTl9MT05HKTsKLSAgICAvKiBOb3RlOiB0byBlbnN1cmUgQ2xlYW44Yml0IEkgZG9uJ3QgdGhpbmsgd2UgY2FuIHVzZSBMQ19USU1FICovCi0gICAgbm93ID0gdGltZShOVUxMKTsKLSAgICBwX3RpbWUgPSBjdGltZSgmbm93KTsKLSAgICAvKiBOb3RlOiBjdGltZSgpIGFkZHMgYSBcbiBzbyB3ZSBoYXZlIHRvIHJlbW92ZSBpdCA6LSggKi8KLSAgICAqKHZpbV9zdHJjaHIoKGNoYXJfdSAqKXBfdGltZSwgJ1xuJykpID0gJ1wwJzsKLSAgICBwcnRfZHNjX3RleHRsaW5lKCJDcmVhdGlvbkRhdGUiLCBwX3RpbWUpOwotICAgIHBydF9kc2NfdGV4dGxpbmUoIkRvY3VtZW50RGF0YSIsICJDbGVhbjhCaXQiKTsKLSAgICBwcnRfZHNjX3RleHRsaW5lKCJPcmllbnRhdGlvbiIsICJQb3J0cmFpdCIpOwotICAgIHBydF9kc2NfYXRlbmQoIlBhZ2VzIik7Ci0gICAgcHJ0X2RzY190ZXh0bGluZSgiUGFnZU9yZGVyIiwgIkFzY2VuZCIpOwotICAgIC8qIFRoZSBiYm94IGRvZXMgbm90IGNoYW5nZSB3aXRoIG9yaWVudGF0aW9uIC0gaXQgaXMgYWx3YXlzIGluIHRoZSBkZWZhdWx0Ci0gICAgICogdXNlciBjb29yZGluYXRlIHN5c3RlbSEgIFdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgcmlnaHQgYW5kIGJvdHRvbQotICAgICAqIGNvb3JkaW5hdGVzIGJhc2VkIG9uIHRoZSBmb250IG1ldHJpY3MgZm9yIHRoZSBiYm94IHRvIGJlIGFjY3VyYXRlLiAqLwotICAgIHBydF9wYWdlX21hcmdpbnMocHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLndpZHRoLAotCQkJCQkgICAgcHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLmhlaWdodCwKLQkJCQkJICAgICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOwotICAgIGJib3hbMF0gPSAoaW50KWxlZnQ7Ci0gICAgaWYgKHBydF9wb3J0cmFpdCkKLSAgICB7Ci0JLyogSW4gcG9ydHJhaXQgcHJpbnRpbmcgdGhlIGZpeGVkIHBvaW50IGlzIHRoZSB0b3AgbGVmdCBjb3JuZXIgc28gd2UKLQkgKiBkZXJpdmUgdGhlIGJib3ggZnJvbSB0aGF0IHBvaW50LiAgV2UgaGF2ZSB0aGUgZXhwZWN0ZWQgY3BsIGNoYXJzCi0JICogYWNyb3NzIHRoZSBtZWRpYSBhbmQgbHBwIGxpbmVzIGRvd24gdGhlIG1lZGlhLgotCSAqLwotCWJib3hbMV0gPSAoaW50KSh0b3AgLSAocHNldHRpbmdzLT5saW5lc19wZXJfcGFnZSArIHBydF9oZWFkZXJfaGVpZ2h0KCkpCi0JCQkJCQkJICAgICogcHJ0X2xpbmVfaGVpZ2h0KTsKLQliYm94WzJdID0gKGludCkobGVmdCArIHBzZXR0aW5ncy0+Y2hhcnNfcGVyX2xpbmUgKiBwcnRfY2hhcl93aWR0aAotCQkJCQkJCQkJKyAwLjUpOwotCWJib3hbM10gPSAoaW50KSh0b3AgKyAwLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCS8qIEluIGxhbmRzY2FwZSBwcmludGluZyB0aGUgZml4ZWQgcG9pbnQgaXMgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBzbyB3ZQotCSAqIGRlcml2ZSB0aGUgYmJveCBmcm9tIHRoYXQgcG9pbnQuICBXZSBoYXZlIGxwcCBjaGFycyBhY3Jvc3MgdGhlIG1lZGlhCi0JICogYW5kIGNwbCBsaW5lcyB1cCB0aGUgbWVkaWEuCi0JICovCi0JYmJveFsxXSA9IChpbnQpYm90dG9tOwotCWJib3hbMl0gPSAoaW50KShsZWZ0ICsgKChwc2V0dGluZ3MtPmxpbmVzX3Blcl9wYWdlCi0JCQkgICAgICArIHBydF9oZWFkZXJfaGVpZ2h0KCkpICogcHJ0X2xpbmVfaGVpZ2h0KSArIDAuNSk7Ci0JYmJveFszXSA9IChpbnQpKGJvdHRvbSArIHBzZXR0aW5ncy0+Y2hhcnNfcGVyX2xpbmUgKiBwcnRfY2hhcl93aWR0aAotCQkJCQkJCQkJKyAwLjUpOwotICAgIH0KLSAgICBwcnRfZHNjX2ludHMoIkJvdW5kaW5nQm94IiwgNCwgYmJveCk7Ci0gICAgLyogVGhlIG1lZGlhIHdpZHRoIGFuZCBoZWlnaHQgZG9lcyBub3QgY2hhbmdlIHdpdGggbGFuZHNjYXBlIHByaW50aW5nISAqLwotICAgIHBydF9kc2NfZG9jbWVkaWEocHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLm5hbWUsCi0JCQkJcHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLndpZHRoLAotCQkJCXBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS5oZWlnaHQsCi0JCQkJKGRvdWJsZSkwLCBOVUxMLCBOVUxMKTsKLSAgICAvKiBEZWZpbmUgZm9udHMgbmVlZGVkICovCi0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmICghcHJ0X291dF9tYnl0ZSB8fCBwcnRfdXNlX2NvdXJpZXIpCi0jZW5kaWYKLSAgICAgICAgcHJ0X2RzY19mb250X3Jlc291cmNlKCJEb2N1bWVudE5lZWRlZFJlc291cmNlcyIsICZwcnRfcHNfY291cmllcl9mb250KTsKLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgaWYgKHBydF9vdXRfbWJ5dGUpCi0gICAgewotICAgICAgICBwcnRfZHNjX2ZvbnRfcmVzb3VyY2UoKHBydF91c2VfY291cmllciA/IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkRvY3VtZW50TmVlZGVkUmVzb3VyY2VzIiksICZwcnRfcHNfbWJfZm9udCk7Ci0gICAgICAgIGlmICghcHJ0X2N1c3RvbV9jbWFwKQotICAgICAgICAgICAgcHJ0X2RzY19yZXNvdXJjZXMoTlVMTCwgImNtYXAiLCBwcnRfY21hcCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBTZWFyY2ggZm9yIGV4dGVybmFsIHJlc291cmNlcyBWSU0gc3VwcGxpZXMgKi8KLSAgICBpZiAoIXBydF9maW5kX3Jlc291cmNlKCJwcm9sb2ciLCAmcmVzX3Byb2xvZykpCi0gICAgewotCUVNU0coXygiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIpKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghcHJ0X29wZW5fcmVzb3VyY2UoJnJlc19wcm9sb2cpKQotCXJldHVybiBGQUxTRTsKLSAgICBpZiAoIXBydF9jaGVja19yZXNvdXJjZSgmcmVzX3Byb2xvZywgUFJUX1BST0xPR19WRVJTSU9OKSkKLQlyZXR1cm4gRkFMU0U7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgIHsKLSAgICAgICAgLyogTG9vayBmb3IgcmVxdWlyZWQgdmVyc2lvbiBvZiBtdWx0aS1ieXRlIHByaW50aW5nIHByb2NzZXQgKi8KLSAgICAgICAgaWYgKCFwcnRfZmluZF9yZXNvdXJjZSgiY2lkZm9udCIsICZyZXNfY2lkZm9udCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVNU0coXygiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJjaWRmb250LnBzXCIiKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcnRfb3Blbl9yZXNvdXJjZSgmcmVzX2NpZGZvbnQpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIXBydF9jaGVja19yZXNvdXJjZSgmcmVzX2NpZGZvbnQsIFBSVF9DSURfUFJPTE9HX1ZFUlNJT04pKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogRmluZCBhbiBlbmNvZGluZyB0byB1c2UgZm9yIHByaW50aW5nLgotICAgICAqIENoZWNrICdwcmludGVuY29kaW5nJy4gSWYgbm90IHNldCBvciBub3QgZm91bmQsIHRoZW4gdXNlICdlbmNvZGluZycuIElmCi0gICAgICogdGhhdCBjYW5ub3QgYmUgZm91bmQgdGhlbiBkZWZhdWx0IHRvICJsYXRpbjEiLgotICAgICAqIE5vdGU6IFZJTSBzcGVjaWZpYyBlbmNvZGluZyBoZWFkZXIgaXMgYWx3YXlzIHNraXBwZWQuCi0gICAgICovCi0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmICghcHJ0X291dF9tYnl0ZSkKLSAgICB7Ci0jZW5kaWYKLSAgICAgICAgcF9lbmNvZGluZyA9IGVuY19za2lwKHBfcGVuYyk7Ci0gICAgICAgIGlmICgqcF9lbmNvZGluZyA9PSBOVUwKLSAgICAgICAgICAgICAgICB8fCAhcHJ0X2ZpbmRfcmVzb3VyY2UoKGNoYXIgKilwX2VuY29kaW5nLCAmcmVzX2VuY29kaW5nKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogJ3ByaW50ZW5jb2RpbmcnIG5vdCBzZXQgb3Igbm90IHN1cHBvcnRlZCAtIGZpbmQgYWx0ZXJuYXRlICovCi0jaWZkZWYgRkVBVF9NQllURQotICAgICAgICAgICAgaW50CQlwcm9wczsKLQotICAgICAgICAgICAgcF9lbmNvZGluZyA9IGVuY19za2lwKHBfZW5jKTsKLSAgICAgICAgICAgIHByb3BzID0gZW5jX2Nhbm9uX3Byb3BzKHBfZW5jb2RpbmcpOwotICAgICAgICAgICAgaWYgKCEocHJvcHMgJiBFTkNfOEJJVCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIXBydF9maW5kX3Jlc291cmNlKChjaGFyICopcF9lbmNvZGluZywgJnJlc19lbmNvZGluZykpCi0gICAgICAgICAgICAgICAgLyogOC1iaXQgJ2VuY29kaW5nJyBpcyBub3Qgc3VwcG9ydGVkICovCi0jZW5kaWYKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXNlIGxhdGluMSBhcyBkZWZhdWx0IHByaW50aW5nIGVuY29kaW5nICovCi0gICAgICAgICAgICAgICAgcF9lbmNvZGluZyA9IChjaGFyX3UgKikibGF0aW4xIjsKLSAgICAgICAgICAgICAgICBpZiAoIXBydF9maW5kX3Jlc291cmNlKChjaGFyICopcF9lbmNvZGluZywgJnJlc19lbmNvZGluZykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFTVNHMihfKCJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXBydF9vcGVuX3Jlc291cmNlKCZyZXNfZW5jb2RpbmcpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAvKiBGb3IgdGhlIG1vbWVudCB0aGVyZSBhcmUgbm8gY2hlY2tzIG9uIGVuY29kaW5nIHJlc291cmNlIGZpbGVzIHRvCi0gICAgICAgICAqIHBlcmZvcm0gKi8KLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBfZW5jb2RpbmcgPSBlbmNfc2tpcChwX3BlbmMpOwotICAgICAgICBpZiAoKnBfZW5jb2RpbmcgPT0gTlVMKQotICAgICAgICAgICAgcF9lbmNvZGluZyA9IGVuY19za2lwKHBfZW5jKTsKLSAgICAgICAgaWYgKHBydF91c2VfY291cmllcikKLSAgICAgICAgewotICAgICAgICAgICAgLyogSW5jbHVkZSBBU0NJSSByYW5nZSBlbmNvZGluZyB2ZWN0b3IgKi8KLSAgICAgICAgICAgIGlmICghcHJ0X2ZpbmRfcmVzb3VyY2UocHJ0X2FzY2lpX2VuY29kaW5nLCAmcmVzX2VuY29kaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFTVNHMihfKCJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiKSwKLQkJCQkJCQkgIHBydF9hc2NpaV9lbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwcnRfb3Blbl9yZXNvdXJjZSgmcmVzX2VuY29kaW5nKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAvKiBGb3IgdGhlIG1vbWVudCB0aGVyZSBhcmUgbm8gY2hlY2tzIG9uIGVuY29kaW5nIHJlc291cmNlIGZpbGVzIHRvCi0gICAgICAgICAgICAgKiBwZXJmb3JtICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcnRfY29udi52Y190eXBlID0gQ09OVl9OT05FOwotICAgIGlmICghKGVuY19jYW5vbl9wcm9wcyhwX2VuYykgJiBlbmNfY2Fub25fcHJvcHMocF9lbmNvZGluZykgJiBFTkNfOEJJVCkpIHsKLSAgICAgICAgLyogU2V0IHVwIGVuY29kaW5nIGNvbnZlcnNpb24gaWYgcmVxdWlyZWQgKi8KLQlpZiAoRkFJTCA9PSBjb252ZXJ0X3NldHVwKCZwcnRfY29udiwgcF9lbmMsIHBfZW5jb2RpbmcpKQotCXsKLSAgICAgICAgICAgIEVNU0cyKF8oIkU2MjA6IFVuYWJsZSB0byBjb252ZXJ0IHRvIHByaW50IGVuY29kaW5nIFwiJXNcIiIpLAotCQkgICAgcF9lbmNvZGluZyk7Ci0JICAgIHJldHVybiBGQUxTRTsKLQl9Ci0JcHJ0X2RvX2NvbnYgPSBUUlVFOwotICAgIH0KLSAgICBwcnRfZG9fY29udiA9IHBydF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FOwotCi0gICAgaWYgKHBydF9vdXRfbWJ5dGUgJiYgcHJ0X2N1c3RvbV9jbWFwKQotICAgIHsKLSAgICAgICAgLyogRmluZCB1c2VyIHN1cHBsaWVkIENNYXAgKi8KLSAgICAgICAgaWYgKCFwcnRfZmluZF9yZXNvdXJjZShwcnRfY21hcCwgJnJlc19jbWFwKSkKLSAgICAgICAgewotICAgICAgICAgICAgRU1TRzIoXygiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlcy5wc1wiIiksCi0JCQkJCQkJCSAgICBwcnRfY21hcCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcnRfb3Blbl9yZXNvdXJjZSgmcmVzX2NtYXApKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogTGlzdCByZXNvdXJjZXMgc3VwcGxpZWQgKi8KLSAgICBTVFJDUFkoYnVmZmVyLCByZXNfcHJvbG9nLnRpdGxlKTsKLSAgICBTVFJDQVQoYnVmZmVyLCAiICIpOwotICAgIFNUUkNBVChidWZmZXIsIHJlc19wcm9sb2cudmVyc2lvbik7Ci0gICAgcHJ0X2RzY19yZXNvdXJjZXMoIkRvY3VtZW50U3VwcGxpZWRSZXNvdXJjZXMiLCAicHJvY3NldCIsIGJ1ZmZlcik7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgIHsKLSAgICAgICAgU1RSQ1BZKGJ1ZmZlciwgcmVzX2NpZGZvbnQudGl0bGUpOwotICAgICAgICBTVFJDQVQoYnVmZmVyLCAiICIpOwotICAgICAgICBTVFJDQVQoYnVmZmVyLCByZXNfY2lkZm9udC52ZXJzaW9uKTsKLSAgICAgICAgcHJ0X2RzY19yZXNvdXJjZXMoTlVMTCwgInByb2NzZXQiLCBidWZmZXIpOwotCi0gICAgICAgIGlmIChwcnRfY3VzdG9tX2NtYXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNUUkNQWShidWZmZXIsIHJlc19jbWFwLnRpdGxlKTsKLSAgICAgICAgICAgIFNUUkNBVChidWZmZXIsICIgIik7Ci0gICAgICAgICAgICBTVFJDQVQoYnVmZmVyLCByZXNfY21hcC52ZXJzaW9uKTsKLSAgICAgICAgICAgIHBydF9kc2NfcmVzb3VyY2VzKE5VTEwsICJjbWFwIiwgYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXBydF9vdXRfbWJ5dGUgfHwgcHJ0X3VzZV9jb3VyaWVyKQotI2VuZGlmCi0gICAgewotICAgICAgICBTVFJDUFkoYnVmZmVyLCByZXNfZW5jb2RpbmcudGl0bGUpOwotICAgICAgICBTVFJDQVQoYnVmZmVyLCAiICIpOwotICAgICAgICBTVFJDQVQoYnVmZmVyLCByZXNfZW5jb2RpbmcudmVyc2lvbik7Ci0gICAgICAgIHBydF9kc2NfcmVzb3VyY2VzKE5VTEwsICJlbmNvZGluZyIsIGJ1ZmZlcik7Ci0gICAgfQotICAgIHBydF9kc2NfcmVxdWlyZW1lbnRzKHBydF9kdXBsZXgsIHBydF90dW1ibGUsIHBydF9jb2xsYXRlLAotI2lmZGVmIEZFQVRfU1lOX0hMCi0JCQkJCXBzZXR0aW5ncy0+ZG9fc3ludGF4Ci0jZWxzZQotCQkJCQkwCi0jZW5kaWYKLQkJCQkJLCBwcnRfbnVtX2NvcGllcyk7Ci0gICAgcHJ0X2RzY19ub2FyZygiRW5kQ29tbWVudHMiKTsKLQotICAgIC8qCi0gICAgICogUFMgRG9jdW1lbnQgcGFnZSBkZWZhdWx0cwotICAgICAqLwotICAgIHBydF9kc2Nfbm9hcmcoIkJlZ2luRGVmYXVsdHMiKTsKLQotICAgIC8qIExpc3QgZm9udCByZXNvdXJjZXMgbW9zdCBsaWtlbHkgY29tbW9uIHRvIGFsbCBwYWdlcyAqLwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBpZiAoIXBydF9vdXRfbWJ5dGUgfHwgcHJ0X3VzZV9jb3VyaWVyKQotI2VuZGlmCi0gICAgICAgIHBydF9kc2NfZm9udF9yZXNvdXJjZSgiUGFnZVJlc291cmNlcyIsICZwcnRfcHNfY291cmllcl9mb250KTsKLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgaWYgKHBydF9vdXRfbWJ5dGUpCi0gICAgewotICAgICAgICBwcnRfZHNjX2ZvbnRfcmVzb3VyY2UoKHBydF91c2VfY291cmllciA/IE5VTEwgOiAiUGFnZVJlc291cmNlcyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBydF9wc19tYl9mb250KTsKLSAgICAgICAgaWYgKCFwcnRfY3VzdG9tX2NtYXApCi0gICAgICAgICAgICBwcnRfZHNjX3Jlc291cmNlcyhOVUxMLCAiY21hcCIsIHBydF9jbWFwKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIFBhcGVyIHdpbGwgYmUgdXNlZCBmb3IgYWxsIHBhZ2VzICovCi0gICAgcHJ0X2RzY190ZXh0bGluZSgiUGFnZU1lZGlhIiwgcHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLm5hbWUpOwotCi0gICAgcHJ0X2RzY19ub2FyZygiRW5kRGVmYXVsdHMiKTsKLQotICAgIC8qCi0gICAgICogUFMgRG9jdW1lbnQgcHJvbG9nIGluY2x1c2lvbiAtIGFsbCByZXF1aXJlZCBwcm9jc2V0cy4KLSAgICAgKi8KLSAgICBwcnRfZHNjX25vYXJnKCJCZWdpblByb2xvZyIpOwotCi0gICAgLyogQWRkIHJlcXVpcmVkIHByb2NzZXRzIC0gTk9URTogb3JkZXIgaXMgaW1wb3J0YW50ISAqLwotICAgIGlmICghcHJ0X2FkZF9yZXNvdXJjZSgmcmVzX3Byb2xvZykpCi0JcmV0dXJuIEZBTFNFOwotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBpZiAocHJ0X291dF9tYnl0ZSkKLSAgICB7Ci0gICAgICAgIC8qIEFkZCBDSUQgZm9udCBwcm9jc2V0LCBhbmQgYW55IHVzZXIgc3VwcGxpZWQgQ01hcCAqLwotICAgICAgICBpZiAoIXBydF9hZGRfcmVzb3VyY2UoJnJlc19jaWRmb250KSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKHBydF9jdXN0b21fY21hcCAmJiAhcHJ0X2FkZF9yZXNvdXJjZSgmcmVzX2NtYXApKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgRkVBVF9NQllURQotICAgIGlmICghcHJ0X291dF9tYnl0ZSB8fCBwcnRfdXNlX2NvdXJpZXIpCi0jZW5kaWYKLSAgICAgICAgLyogVGhlcmUgd2lsbCBiZSBvbmx5IG9uZSBSb21hbiBmb250IGVuY29kaW5nIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBQUwotICAgICAgICAgKiBmaWxlLiAqLwotICAgICAgICBpZiAoIXBydF9hZGRfcmVzb3VyY2UoJnJlc19lbmNvZGluZykpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBwcnRfZHNjX25vYXJnKCJFbmRQcm9sb2ciKTsKLQotICAgIC8qCi0gICAgICogUFMgRG9jdW1lbnQgc2V0dXAgLSBtdXN0IGFwcGVhciBhZnRlciB0aGUgcHJvbG9nCi0gICAgICovCi0gICAgcHJ0X2RzY19ub2FyZygiQmVnaW5TZXR1cCIpOwotCi0gICAgLyogRGV2aWNlIHNldHVwIC0gcGFnZSBzaXplIGFuZCBudW1iZXIgb2YgdW5jb2xsYXRlZCBjb3BpZXMgKi8KLSAgICBwcnRfd3JpdGVfaW50KChpbnQpcHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLndpZHRoKTsKLSAgICBwcnRfd3JpdGVfaW50KChpbnQpcHJ0X21lZGlhc2l6ZVtwcnRfbWVkaWFdLmhlaWdodCk7Ci0gICAgcHJ0X3dyaXRlX2ludCgwKTsKLSAgICBwcnRfd3JpdGVfc3RyaW5nKCJzcHNcbiIpOwotICAgIHBydF93cml0ZV9pbnQocHJ0X251bV9jb3BpZXMpOwotICAgIHBydF93cml0ZV9zdHJpbmcoIm5jXG4iKTsKLSAgICBwcnRfd3JpdGVfYm9vbGVhbihwcnRfZHVwbGV4KTsKLSAgICBwcnRfd3JpdGVfYm9vbGVhbihwcnRfdHVtYmxlKTsKLSAgICBwcnRfd3JpdGVfc3RyaW5nKCJkdFxuIik7Ci0gICAgcHJ0X3dyaXRlX2Jvb2xlYW4ocHJ0X2NvbGxhdGUpOwotICAgIHBydF93cml0ZV9zdHJpbmcoImNcbiIpOwotCi0gICAgLyogRm9udCByZXNvdXJjZSBpbmNsdXNpb24gYW5kIGRlZmluaXRpb24gKi8KLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgaWYgKCFwcnRfb3V0X21ieXRlIHx8IHBydF91c2VfY291cmllcikKLSAgICB7Ci0gICAgICAgIC8qIFdoZW4gdXNpbmcgQ291cmllciBmb3IgQVNDSUkgcmFuZ2Ugd2hlbiBwcmludGluZyBtdWx0aS1ieXRlLCBuZWVkIHRvCi0gICAgICAgICAqIHBpY2sgdXAgQVNDSUkgZW5jb2RpbmcgdG8gdXNlIHdpdGggaXQuICovCi0gICAgICAgIGlmIChwcnRfdXNlX2NvdXJpZXIpCi0gICAgICAgICAgICBwX2VuY29kaW5nID0gKGNoYXJfdSAqKXBydF9hc2NpaV9lbmNvZGluZzsKLSNlbmRpZgotICAgICAgICBwcnRfZHNjX3Jlc291cmNlcygiSW5jbHVkZVJlc291cmNlIiwgImZvbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcnRfcHNfY291cmllcl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX1JPTUFOXSk7Ci0gICAgICAgIHBydF9kZWZfZm9udCgiRjAiLCAoY2hhciAqKXBfZW5jb2RpbmcsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgcHJ0X3BzX2NvdXJpZXJfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9ST01BTl0pOwotICAgICAgICBwcnRfZHNjX3Jlc291cmNlcygiSW5jbHVkZVJlc291cmNlIiwgImZvbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcnRfcHNfY291cmllcl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERdKTsKLSAgICAgICAgcHJ0X2RlZl9mb250KCJGMSIsIChjaGFyICopcF9lbmNvZGluZywgKGludClwcnRfbGluZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBwcnRfcHNfY291cmllcl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERdKTsKLSAgICAgICAgcHJ0X2RzY19yZXNvdXJjZXMoIkluY2x1ZGVSZXNvdXJjZSIsICJmb250IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ0X3BzX2NvdXJpZXJfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9PQkxJUVVFXSk7Ci0gICAgICAgIHBydF9kZWZfZm9udCgiRjIiLCAoY2hhciAqKXBfZW5jb2RpbmcsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgcHJ0X3BzX2NvdXJpZXJfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9PQkxJUVVFXSk7Ci0gICAgICAgIHBydF9kc2NfcmVzb3VyY2VzKCJJbmNsdWRlUmVzb3VyY2UiLCAiZm9udCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9wc19jb3VyaWVyX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfQk9MRE9CTElRVUVdKTsKLSAgICAgICAgcHJ0X2RlZl9mb250KCJGMyIsIChjaGFyICopcF9lbmNvZGluZywgKGludClwcnRfbGluZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBwcnRfcHNfY291cmllcl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERPQkxJUVVFXSk7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIH0KLSAgICBpZiAocHJ0X291dF9tYnl0ZSkKLSAgICB7Ci0gICAgICAgIC8qIERlZmluZSB0aGUgQ0lEIGZvbnRzIHRvIGJlIHVzZWQgaW4gdGhlIGpvYi4gIFR5cGljYWxseSBDSktWIGZvbnRzIGRvCi0gICAgICAgICAqIG5vdCBoYXZlIGFuIGl0YWxpYyBmb3JtIGJlaW5nIGEgd2VzdGVybiBzdHlsZSwgc28gd2hlcmUgbm8gZm9udCBpcwotICAgICAgICAgKiBkZWZpbmVkIGZvciB0aGVzZSBmYWNlcyBWSU0gZmFsbHMgYmFjayB0byBhbiBleGlzdGluZyBmYWNlLgotICAgICAgICAgKiBOb3RlOiBpZiB1c2luZyBDb3VyaWVyIGZvciB0aGUgQVNDSUkgcmFuZ2UgdGhlbiB0aGUgcHJpbnRvdXQgd2lsbAotICAgICAgICAgKiBoYXZlIGJvbGQvaXRhbGljL2JvbGRpdGFsaWMgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiBwcmludG1iZm9udC4KLSAgICAgICAgICovCi0gICAgICAgIHBydF9kc2NfcmVzb3VyY2VzKCJJbmNsdWRlUmVzb3VyY2UiLCAiZm9udCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX1JPTUFOXSk7Ci0gICAgICAgIGlmICghcHJ0X2N1c3RvbV9jbWFwKQotICAgICAgICAgICAgcHJ0X2RzY19yZXNvdXJjZXMoIkluY2x1ZGVSZXNvdXJjZSIsICJjbWFwIiwgcHJ0X2NtYXApOwotICAgICAgICBwcnRfZGVmX2NpZGZvbnQoIkNGMCIsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgcHJ0X3BzX21iX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfUk9NQU5dKTsKLQotICAgICAgICBpZiAocHJ0X3BzX21iX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfQk9MRF0gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJ0X2RzY19yZXNvdXJjZXMoIkluY2x1ZGVSZXNvdXJjZSIsICJmb250IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERdKTsKLSAgICAgICAgICAgIGlmICghcHJ0X2N1c3RvbV9jbWFwKQotICAgICAgICAgICAgICAgIHBydF9kc2NfcmVzb3VyY2VzKCJJbmNsdWRlUmVzb3VyY2UiLCAiY21hcCIsIHBydF9jbWFwKTsKLSAgICAgICAgICAgIHBydF9kZWZfY2lkZm9udCgiQ0YxIiwgKGludClwcnRfbGluZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ0X3BzX21iX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfQk9MRF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8qIFVzZSBST01BTiBmb3IgQk9MRCAqLwotICAgICAgICAgICAgcHJ0X2R1cF9jaWRmb250KCJDRjAiLCAiQ0YxIik7Ci0KLSAgICAgICAgaWYgKHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX09CTElRVUVdICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBydF9kc2NfcmVzb3VyY2VzKCJJbmNsdWRlUmVzb3VyY2UiLCAiZm9udCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnRfcHNfbWJfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9PQkxJUVVFXSk7Ci0gICAgICAgICAgICBpZiAoIXBydF9jdXN0b21fY21hcCkKLSAgICAgICAgICAgICAgICBwcnRfZHNjX3Jlc291cmNlcygiSW5jbHVkZVJlc291cmNlIiwgImNtYXAiLCBwcnRfY21hcCk7Ci0gICAgICAgICAgICBwcnRfZGVmX2NpZGZvbnQoIkNGMiIsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX09CTElRVUVdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAvKiBVc2UgUk9NQU4gZm9yIE9CTElRVUUgKi8KLSAgICAgICAgICAgIHBydF9kdXBfY2lkZm9udCgiQ0YwIiwgIkNGMiIpOwotCi0gICAgICAgIGlmIChwcnRfcHNfbWJfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9CT0xET0JMSVFVRV0gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJ0X2RzY19yZXNvdXJjZXMoIkluY2x1ZGVSZXNvdXJjZSIsICJmb250IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERPQkxJUVVFXSk7Ci0gICAgICAgICAgICBpZiAoIXBydF9jdXN0b21fY21hcCkKLSAgICAgICAgICAgICAgICBwcnRfZHNjX3Jlc291cmNlcygiSW5jbHVkZVJlc291cmNlIiwgImNtYXAiLCBwcnRfY21hcCk7Ci0gICAgICAgICAgICBwcnRfZGVmX2NpZGZvbnQoIkNGMyIsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydF9wc19tYl9mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERPQkxJUVVFXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLyogVXNlIEJPTEQgZm9yIEJPTERPQkxJUVVFICovCi0gICAgICAgICAgICBwcnRfZHVwX2NpZGZvbnQoIkNGMSIsICJDRjMiKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIE1pc2MgY29uc3RhbnQgdmFycyB1c2VkIGZvciB1bmRlcmxpbmluZyBhbmQgYmFja2dyb3VuZCByZWN0cyAqLwotICAgIHBydF9kZWZfdmFyKCJVTyIsIFBSVF9QU19GT05UX1RPX1VTRVIocHJ0X2xpbmVfaGVpZ2h0LAotCQkJCQkJcHJ0X3BzX2ZvbnQtPnVsaW5lX29mZnNldCksIDIpOwotICAgIHBydF9kZWZfdmFyKCJVVyIsIFBSVF9QU19GT05UX1RPX1VTRVIocHJ0X2xpbmVfaGVpZ2h0LAotCQkJCQkJIHBydF9wc19mb250LT51bGluZV93aWR0aCksIDIpOwotICAgIHBydF9kZWZfdmFyKCJCTyIsIHBydF9iZ2NvbF9vZmZzZXQsIDIpOwotCi0gICAgcHJ0X2RzY19ub2FyZygiRW5kU2V0dXAiKTsKLQotICAgIC8qIEZhaWwgaWYgYW55IHByb2JsZW1zIHdyaXRpbmcgb3V0IHRvIHRoZSBQUyBmaWxlICovCi0gICAgcmV0dXJuICFwcnRfZmlsZV9lcnJvcjsKLX0KLQotICAgIHZvaWQKLW1jaF9wcmludF9lbmQocHNldHRpbmdzKQotICAgIHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3M7Ci17Ci0gICAgcHJ0X2RzY19ub2FyZygiVHJhaWxlciIpOwotCi0gICAgLyoKLSAgICAgKiBPdXRwdXQgYW55IGluZm8gd2UgZG9uJ3Qga25vdyBpbiB0b3RvIHVudGlsIHdlIGZpbmlzaAotICAgICAqLwotICAgIHBydF9kc2NfaW50cygiUGFnZXMiLCAxLCAmcHJ0X3BhZ2VfbnVtKTsKLQotICAgIHBydF9kc2Nfbm9hcmcoIkVPRiIpOwotCi0gICAgLyogV3JpdGUgQ1RSTC1EIHRvIGNsb3NlIHNlcmlhbCBjb21tdW5pY2F0aW9uIGxpbmsgaWYgdXNlZC4KLSAgICAgKiBOT1RISU5HIE1VU1QgQkUgV1JJVFRFTiBBRlRFUiBUSElTISAqLwotICAgIHBydF93cml0ZV9maWxlKChjaGFyX3UgKilJRl9FQigiXDAwNCIsICJcMDY3IikpOwotCi0gICAgaWYgKCFwcnRfZmlsZV9lcnJvciAmJiBwc2V0dGluZ3MtPm91dGZpbGUgPT0gTlVMTAotCQkJCQkmJiAhZ290X2ludCAmJiAhcHNldHRpbmdzLT51c2VyX2Fib3J0KQotICAgIHsKLQkvKiBDbG9zZSB0aGUgZmlsZSBmaXJzdC4gKi8KLQlpZiAocHJ0X3BzX2ZkICE9IE5VTEwpCi0JewotCSAgICBmY2xvc2UocHJ0X3BzX2ZkKTsKLQkgICAgcHJ0X3BzX2ZkID0gTlVMTDsKLQl9Ci0JcHJ0X21lc3NhZ2UoKGNoYXJfdSAqKV8oIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIpKTsKLQotCS8qIE5vdCBwcmludGluZyB0byBhIGZpbGU6IHVzZSAncHJpbnRleHByJyB0byBwcmludCB0aGUgZmlsZS4gKi8KLQlpZiAoZXZhbF9wcmludGV4cHIocHJ0X3BzX2ZpbGVfbmFtZSwgcHNldHRpbmdzLT5hcmd1bWVudHMpID09IEZBSUwpCi0JICAgIEVNU0coXygiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIpKTsKLQllbHNlCi0JICAgIHBydF9tZXNzYWdlKChjaGFyX3UgKilfKCJQcmludCBqb2Igc2VudC4iKSk7Ci0gICAgfQotCi0gICAgbWNoX3ByaW50X2NsZWFudXAoKTsKLX0KLQotICAgIGludAotbWNoX3ByaW50X2VuZF9wYWdlKCkKLXsKLSAgICBwcnRfZmx1c2hfYnVmZmVyKCk7Ci0KLSAgICBwcnRfd3JpdGVfc3RyaW5nKCJyZSBzcFxuIik7Ci0KLSAgICBwcnRfZHNjX25vYXJnKCJQYWdlVHJhaWxlciIpOwotCi0gICAgcmV0dXJuICFwcnRfZmlsZV9lcnJvcjsKLX0KLQotLypBUkdTVVNFRCovCi0gICAgaW50Ci1tY2hfcHJpbnRfYmVnaW5fcGFnZShzdHIpCi0gICAgY2hhcl91CSpzdHI7Ci17Ci0gICAgaW50CQlwYWdlX251bVsyXTsKLQotICAgIHBydF9wYWdlX251bSsrOwotCi0gICAgcGFnZV9udW1bMF0gPSBwYWdlX251bVsxXSA9IHBydF9wYWdlX251bTsKLSAgICBwcnRfZHNjX2ludHMoIlBhZ2UiLCAyLCBwYWdlX251bSk7Ci0KLSAgICBwcnRfZHNjX25vYXJnKCJCZWdpblBhZ2VTZXR1cCIpOwotCi0gICAgcHJ0X3dyaXRlX3N0cmluZygic3ZcbjAgZ1xuIik7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIHBydF9pbl9hc2NpaSA9ICFwcnRfb3V0X21ieXRlOwotICAgIGlmIChwcnRfb3V0X21ieXRlKQotICAgICAgICBwcnRfd3JpdGVfc3RyaW5nKCJDRjAgc2ZcbiIpOwotICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBwcnRfd3JpdGVfc3RyaW5nKCJGMCBzZlxuIik7Ci0gICAgcHJ0X2ZnY29sID0gUFJDT0xPUl9CTEFDSzsKLSAgICBwcnRfYmdjb2wgPSBQUkNPTE9SX1dISVRFOwotICAgIHBydF9mb250ID0gUFJUX1BTX0ZPTlRfUk9NQU47Ci0KLSAgICAvKiBTZXQgdXAgcGFnZSB0cmFuc2Zvcm1hdGlvbiBmb3IgbGFuZHNjYXBlIHByaW50aW5nLiAqLwotICAgIGlmICghcHJ0X3BvcnRyYWl0KQotICAgIHsKLQlwcnRfd3JpdGVfaW50KC0oKGludClwcnRfbWVkaWFzaXplW3BydF9tZWRpYV0ud2lkdGgpKTsKLQlwcnRfd3JpdGVfc3RyaW5nKCJzbFxuIik7Ci0gICAgfQotCi0gICAgcHJ0X2RzY19ub2FyZygiRW5kUGFnZVNldHVwIik7Ci0KLSAgICAvKiBXZSBoYXZlIHJlc2V0IHRoZSBmb250IGF0dHJpYnV0ZXMsIGZvcmNlIHNldHRpbmcgdGhlbSBhZ2Fpbi4gKi8KLSAgICBjdXJyX2JnID0gKGxvbmdfdSkweGZmZmZmZmZmOwotICAgIGN1cnJfZmcgPSAobG9uZ191KTB4ZmZmZmZmZmY7Ci0gICAgY3Vycl9ib2xkID0gTUFZQkU7Ci0KLSAgICByZXR1cm4gIXBydF9maWxlX2Vycm9yOwotfQotCi0gICAgaW50Ci1tY2hfcHJpbnRfYmxhbmtfcGFnZSgpCi17Ci0gICAgcmV0dXJuIChtY2hfcHJpbnRfYmVnaW5fcGFnZShOVUxMKSA/IChtY2hfcHJpbnRfZW5kX3BhZ2UoKSkgOiBGQUxTRSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBwcnRfcG9zX3ggPSAwOwotc3RhdGljIGZsb2F0IHBydF9wb3NfeSA9IDA7Ci0KLSAgICB2b2lkCi1tY2hfcHJpbnRfc3RhcnRfbGluZShtYXJnaW4sIHBhZ2VfbGluZSkKLSAgICBpbnQJCW1hcmdpbjsKLSAgICBpbnQJCXBhZ2VfbGluZTsKLXsKLSAgICBwcnRfcG9zX3ggPSBwcnRfbGVmdF9tYXJnaW47Ci0gICAgaWYgKG1hcmdpbikKLQlwcnRfcG9zX3ggLT0gcHJ0X251bWJlcl93aWR0aDsKLQotICAgIHBydF9wb3NfeSA9IHBydF90b3BfbWFyZ2luIC0gcHJ0X2ZpcnN0X2xpbmVfaGVpZ2h0IC0KLQkJCQkJcGFnZV9saW5lICogcHJ0X2xpbmVfaGVpZ2h0OwotCi0gICAgcHJ0X2F0dHJpYnV0ZV9jaGFuZ2UgPSBUUlVFOwotICAgIHBydF9uZWVkX21vdmV0byA9IFRSVUU7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIHBydF9oYWxmX3dpZHRoID0gRkFMU0U7Ci0jZW5kaWYKLX0KLQotLypBUkdTVVNFRCovCi0gICAgaW50Ci1tY2hfcHJpbnRfdGV4dF9vdXQocCwgbGVuKQotICAgIGNoYXJfdQkqcDsKLSAgICBpbnQJCWxlbjsKLXsKLSAgICBpbnQJCW5lZWRfYnJlYWs7Ci0gICAgY2hhcl91CWNoOwotICAgIGNoYXJfdSAgICAgIGNoX2J1ZmZbOF07Ci0gICAgZmxvYXQgICAgICAgY2hhcl93aWR0aDsKLSAgICBmbG9hdCAgICAgICBuZXh0X3BvczsKLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgaW50ICAgICAgICAgaW5fYXNjaWk7Ci0gICAgaW50ICAgICAgICAgaGFsZl93aWR0aDsKLSNlbmRpZgotCi0gICAgY2hhcl93aWR0aCA9IHBydF9jaGFyX3dpZHRoOwotCi0jaWZkZWYgRkVBVF9NQllURQotICAgIC8qIElkZWFsbHkgVklNIHdvdWxkIGNyZWF0ZSBhIHJlYXJyYW5nZWQgQ0lEIGZvbnQgdG8gY29tYmluZSBhIFJvbWFuIGFuZAotICAgICAqIENKS1YgZm9udCB0byBkbyB3aGF0IFZJTSBpcyBkb2luZyBoZXJlIC0gdXNlIGEgUm9tYW4gZm9udCBmb3IgY2hhcmFjdGVycwotICAgICAqIGluIHRoZSBBU0NJSSByYW5nZSwgYW5kIHRoZSBvcmlnaW5nYWwgQ0lEIGZvbnQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KLSAgICAgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IEdob3N0U2NyaXB0IHN0aWxsIChhcyBvZiA4LjEzKSBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICogcmVhcnJhbmdlZCBmb250cyBldmVuIHRob3VnaCB0aGV5IGhhdmUgYmVlbiBkb2N1bWVudGVkIGJ5IEFkb2JlIGZvciA3Ci0gICAgICogeWVhcnMhICBJZiB0aGV5IGV2ZXIgZG8sIGEgbG90IG9mIHRoaXMgY29kZSB3aWxsIGRpc2FwcGVhci4KLSAgICAgKi8KLSAgICBpZiAocHJ0X3VzZV9jb3VyaWVyKQotICAgIHsKLSAgICAgICAgaW5fYXNjaWkgPSAobGVuID09IDEgJiYgKnAgPCAweDgwKTsKLSAgICAgICAgaWYgKHBydF9pbl9hc2NpaSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpbl9hc2NpaSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBObyBsb25nZXIgaW4gQVNDSUkgcmFuZ2UgLSBuZWVkIHRvIHN3aXRjaCBmb250ICovCi0gICAgICAgICAgICAgICAgcHJ0X2luX2FzY2lpID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgcHJ0X25lZWRfZm9udCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgcHJ0X2F0dHJpYnV0ZV9jaGFuZ2UgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGluX2FzY2lpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBOb3cgaW4gQVNDSUkgcmFuZ2UgLSBuZWVkIHRvIHN3aXRjaCBmb250ICovCi0gICAgICAgICAgICBwcnRfaW5fYXNjaWkgPSBUUlVFOwotICAgICAgICAgICAgcHJ0X25lZWRfZm9udCA9IFRSVUU7Ci0gICAgICAgICAgICBwcnRfYXR0cmlidXRlX2NoYW5nZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBydF9vdXRfbWJ5dGUpCi0gICAgewotICAgICAgICBoYWxmX3dpZHRoID0gKCgqbWJfcHRyMmNlbGxzKShwKSA9PSAxKTsKLSAgICAgICAgaWYgKGhhbGZfd2lkdGgpCi0gICAgICAgICAgICBjaGFyX3dpZHRoIC89IDI7Ci0gICAgICAgIGlmIChwcnRfaGFsZl93aWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYWxmX3dpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBydF9oYWxmX3dpZHRoID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgcHJ0X3Bvc194ICs9IHBydF9jaGFyX3dpZHRoLzQ7Ci0gICAgICAgICAgICAgICAgcHJ0X25lZWRfbW92ZXRvID0gVFJVRTsKLSAgICAgICAgICAgICAgICBwcnRfYXR0cmlidXRlX2NoYW5nZSA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGFsZl93aWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJ0X2hhbGZfd2lkdGggPSBUUlVFOwotICAgICAgICAgICAgcHJ0X3Bvc194ICs9IHBydF9jaGFyX3dpZHRoLzQ7Ci0gICAgICAgICAgICBwcnRfbmVlZF9tb3ZldG8gPSBUUlVFOwotICAgICAgICAgICAgcHJ0X2F0dHJpYnV0ZV9jaGFuZ2UgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBPdXRwdXQgYW55IHJlcXVpcmVkIGNoYW5nZXMgdG8gdGhlIGdyYXBoaWNzIHN0YXRlLCBhZnRlciBmbHVzaGluZyBhbnkKLSAgICAgKiB0ZXh0IGJ1ZmZlcmVkIHNvIGZhci4KLSAgICAgKi8KLSAgICBpZiAocHJ0X2F0dHJpYnV0ZV9jaGFuZ2UpCi0gICAgewotCXBydF9mbHVzaF9idWZmZXIoKTsKLQkvKiBSZXNldCBjb3VudCBvZiBudW1iZXIgb2YgY2hhcnMgdGhhdCB3aWxsIGJlIHByaW50ZWQgKi8KLQlwcnRfdGV4dF9ydW4gPSAwOwotCi0JaWYgKHBydF9uZWVkX21vdmV0bykKLQl7Ci0JICAgIHBydF9wb3NfeF9tb3ZldG8gPSBwcnRfcG9zX3g7Ci0JICAgIHBydF9wb3NfeV9tb3ZldG8gPSBwcnRfcG9zX3k7Ci0JICAgIHBydF9kb19tb3ZldG8gPSBUUlVFOwotCi0JICAgIHBydF9uZWVkX21vdmV0byA9IEZBTFNFOwotCX0KLQlpZiAocHJ0X25lZWRfZm9udCkKLQl7Ci0jaWZkZWYgRkVBVF9NQllURQotICAgICAgICAgICAgaWYgKCFwcnRfaW5fYXNjaWkpCi0gICAgICAgICAgICAgICAgcHJ0X3dyaXRlX3N0cmluZygiQ0YiKTsKLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgIHBydF93cml0ZV9zdHJpbmcoIkYiKTsKLSAgICAgICAgICAgIHBydF93cml0ZV9pbnQocHJ0X2ZvbnQpOwotICAgICAgICAgICAgcHJ0X3dyaXRlX3N0cmluZygic2ZcbiIpOwotICAgICAgICAgICAgcHJ0X25lZWRfZm9udCA9IEZBTFNFOwotCX0KLQlpZiAocHJ0X25lZWRfZmdjb2wpCi0JewotCSAgICBpbnQgICAgIHIsIGcsIGI7Ci0JICAgIHIgPSAoKHVuc2lnbmVkKXBydF9mZ2NvbCAmIDB4ZmYwMDAwKSA+PiAxNjsKLQkgICAgZyA9ICgodW5zaWduZWQpcHJ0X2ZnY29sICYgMHhmZjAwKSA+PiA4OwotCSAgICBiID0gcHJ0X2ZnY29sICYgMHhmZjsKLQotCSAgICBwcnRfd3JpdGVfcmVhbChyIC8gMjU1LjAsIDMpOwotCSAgICBpZiAociA9PSBnICYmIGcgPT0gYikKLQkJcHJ0X3dyaXRlX3N0cmluZygiZ1xuIik7Ci0JICAgIGVsc2UKLQkgICAgewotCQlwcnRfd3JpdGVfcmVhbChnIC8gMjU1LjAsIDMpOwotCQlwcnRfd3JpdGVfcmVhbChiIC8gMjU1LjAsIDMpOwotCQlwcnRfd3JpdGVfc3RyaW5nKCJyXG4iKTsKLQkgICAgfQotCSAgICBwcnRfbmVlZF9mZ2NvbCA9IEZBTFNFOwotCX0KLQotCWlmIChwcnRfYmdjb2wgIT0gUFJDT0xPUl9XSElURSkKLQl7Ci0JICAgIHBydF9uZXdfYmdjb2wgPSBwcnRfYmdjb2w7Ci0JICAgIGlmIChwcnRfbmVlZF9iZ2NvbCkKLQkJcHJ0X2RvX2JnY29sID0gVFJVRTsKLQl9Ci0JZWxzZQotCSAgICBwcnRfZG9fYmdjb2wgPSBGQUxTRTsKLQlwcnRfbmVlZF9iZ2NvbCA9IEZBTFNFOwotCi0JaWYgKHBydF9uZWVkX3VuZGVybGluZSkKLQkgICAgcHJ0X2RvX3VuZGVybGluZSA9IHBydF91bmRlcmxpbmU7Ci0JcHJ0X25lZWRfdW5kZXJsaW5lID0gRkFMU0U7Ci0KLQlwcnRfYXR0cmlidXRlX2NoYW5nZSA9IEZBTFNFOwotICAgIH0KLQotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICBpZiAocHJ0X2RvX2NvbnYpCi0gICAgewotCS8qIENvbnZlcnQgZnJvbSBtdWx0aS1ieXRlIHRvIDgtYml0IGVuY29kaW5nICovCi0JcCA9IHN0cmluZ19jb252ZXJ0KCZwcnRfY29udiwgcCwgJmxlbik7Ci0JaWYgKHAgPT0gTlVMTCkKLQkgICAgcCA9IChjaGFyX3UgKikiIjsKLSAgICB9Ci0KLSAgICBpZiAocHJ0X291dF9tYnl0ZSkKLSAgICB7Ci0gICAgICAgIC8qIE11bHRpLWJ5dGUgY2hhcmFjdGVyIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIG1vcmUgZWZmaWNpZW50bHkgYXMgaGV4Ci0gICAgICAgICAqIHN0cmluZ3Mgd2hlbiBvdXRwdXR0aW5nIGNsZWFuIDggYml0IFBTLgotICAgICAgICAgKi8KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICBjaCA9IHBydF9oZXhjaGFyWyh1bnNpZ25lZCkoKnApID4+IDRdOwotICAgICAgICAgICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIGNoKTsKLSAgICAgICAgICAgY2ggPSBwcnRfaGV4Y2hhclsoKnApICYgMHhmXTsKLSAgICAgICAgICAgZ2FfYXBwZW5kKCZwcnRfcHNfYnVmZmVyLCBjaCk7Ci0gICAgICAgICAgIHArKzsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoLS1sZW4pOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIC8qIEFkZCBuZXh0IGNoYXJhY3RlciB0byBidWZmZXIgb2YgY2hhcmFjdGVycyB0byBvdXRwdXQuCi0gICAgICAgICAqIE5vdGU6IE9uZSBwcmludGVkIGNoYXJhY3RlciBtYXkgcmVxdWlyZSBzZXZlcmFsIFBTIGNoYXJhY3RlcnMgdG8KLSAgICAgICAgICogcmVwcmVzZW50IGl0LCBidXQgd2Ugb25seSBjb3VudCB0aGVtIGFzIG9uZSBwcmludGVkIGNoYXJhY3Rlci4KLSAgICAgICAgICovCi0gICAgICAgIGNoID0gKnA7Ci0gICAgICAgIGlmIChjaCA8IDMyIHx8IGNoID09ICcoJyB8fCBjaCA9PSAnKScgfHwgY2ggPT0gJ1xcJykKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29udmVydCBub24tcHJpbnRpbmcgY2hhcmFjdGVycyB0byBlaXRoZXIgdGhlaXIgZXNjYXBlIG9yIG9jdGFsCi0gICAgICAgICAgICAgKiBzZXF1ZW5jZSwgZW5zdXJlcyBQUyBzZW50IG92ZXIgYSBzZXJpYWwgbGluZSBkb2VzIG5vdCBpbnRlcmZlcmUKLSAgICAgICAgICAgICAqIHdpdGggdGhlIGNvbW1zIHByb3RvY29sLiAgTm90ZTogRm9yIEVCQ0RJQyB3ZSBuZWVkIHRvIHdyaXRlIG91dAotICAgICAgICAgICAgICogdGhlIGVzY2FwZSBzZXF1ZW5jZXMgYXMgQVNDSUkgY29kZXMhCi0JICAgICAqIE5vdGUgMjogQ2hhciBjb2RlcyA8IDMyIGFyZSBpZGVudGljYWwgaW4gRUJDRElDIGFuZCBBU0NJSSBBRkFJSyEKLQkgICAgICovCi0gICAgICAgICAgICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIElGX0VCKCdcXCcsIDAxMzQpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCUzogICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIElGX0VCKCdiJywgMDE0MikpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRBQjogIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ3QnLCAwMTY0KSk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTkw6ICAgZ2FfYXBwZW5kKCZwcnRfcHNfYnVmZmVyLCBJRl9FQignbicsIDAxNTYpKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGRjogICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIElGX0VCKCdmJywgMDE0NikpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENBUjogIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ3InLCAwMTYyKSk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJygnOiAgZ2FfYXBwZW5kKCZwcnRfcHNfYnVmZmVyLCBJRl9FQignKCcsIDAwNTApKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKSc6ICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIElGX0VCKCcpJywgMDA1MSkpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdcXCc6IGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ1xcJywgMDEzNCkpOyBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKChjaGFyICopY2hfYnVmZiwgIiUwM28iLCAodW5zaWduZWQgaW50KWNoKTsKLSNpZmRlZiBFQkNESUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGViY2RpYzJhc2NpaShjaF9idWZmLCAzKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FfYXBwZW5kKCZwcnRfcHNfYnVmZmVyLCBjaF9idWZmWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgY2hfYnVmZlsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIGNoX2J1ZmZbMl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2FfYXBwZW5kKCZwcnRfcHNfYnVmZmVyLCBjaCk7Ci0gICAgfQotCi0jaWZkZWYgRkVBVF9NQllURQotICAgIC8qIE5lZWQgdG8gZnJlZSBhbnkgdHJhbnNsYXRlZCBjaGFyYWN0ZXJzICovCi0gICAgaWYgKHBydF9kb19jb252ICYmICgqcCAhPSBOVUwpKQotCXZpbV9mcmVlKHApOwotI2VuZGlmCi0KLSAgICBwcnRfdGV4dF9ydW4gKz0gY2hhcl93aWR0aDsKLSAgICBwcnRfcG9zX3ggKz0gY2hhcl93aWR0aDsKLQotICAgIC8qIFRoZSBkb3duc2lkZSBvZiBmcCAtIHVzZSByZWxhdGl2ZSBlcnJvciBvbiByaWdodCBtYXJnaW4gY2hlY2sgKi8KLSAgICBuZXh0X3BvcyA9IHBydF9wb3NfeCArIHBydF9jaGFyX3dpZHRoOwotICAgIG5lZWRfYnJlYWsgPSAobmV4dF9wb3MgPiBwcnRfcmlnaHRfbWFyZ2luKSAmJgotICAgICAgICAgICAgICAgICAgICAoKG5leHRfcG9zIC0gcHJ0X3JpZ2h0X21hcmdpbikgPiAocHJ0X3JpZ2h0X21hcmdpbioxZS01KSk7Ci0KLSAgICBpZiAobmVlZF9icmVhaykKLQlwcnRfZmx1c2hfYnVmZmVyKCk7Ci0KLSAgICByZXR1cm4gbmVlZF9icmVhazsKLX0KLQotICAgIHZvaWQKLW1jaF9wcmludF9zZXRfZm9udChpQm9sZCwgaUl0YWxpYywgaVVuZGVybGluZSkKLSAgICBpbnQJCWlCb2xkOwotICAgIGludAkJaUl0YWxpYzsKLSAgICBpbnQJCWlVbmRlcmxpbmU7Ci17Ci0gICAgaW50CQlmb250ID0gMDsKLQotICAgIGlmIChpQm9sZCkKLQlmb250IHw9IDB4MDE7Ci0gICAgaWYgKGlJdGFsaWMpCi0JZm9udCB8PSAweDAyOwotCi0gICAgaWYgKGZvbnQgIT0gcHJ0X2ZvbnQpCi0gICAgewotCXBydF9mb250ID0gZm9udDsKLQlwcnRfYXR0cmlidXRlX2NoYW5nZSA9IFRSVUU7Ci0JcHJ0X25lZWRfZm9udCA9IFRSVUU7Ci0gICAgfQotICAgIGlmIChwcnRfdW5kZXJsaW5lICE9IGlVbmRlcmxpbmUpCi0gICAgewotCXBydF91bmRlcmxpbmUgPSBpVW5kZXJsaW5lOwotCXBydF9hdHRyaWJ1dGVfY2hhbmdlID0gVFJVRTsKLQlwcnRfbmVlZF91bmRlcmxpbmUgPSBUUlVFOwotICAgIH0KLX0KLQotICAgIHZvaWQKLW1jaF9wcmludF9zZXRfYmcoYmdjb2wpCi0gICAgbG9uZ191CWJnY29sOwotewotICAgIHBydF9iZ2NvbCA9IGJnY29sOwotICAgIHBydF9hdHRyaWJ1dGVfY2hhbmdlID0gVFJVRTsKLSAgICBwcnRfbmVlZF9iZ2NvbCA9IFRSVUU7Ci19Ci0KLSAgICB2b2lkCi1tY2hfcHJpbnRfc2V0X2ZnKGZnY29sKQotICAgIGxvbmdfdQlmZ2NvbDsKLXsKLSAgICBpZiAoZmdjb2wgIT0gKGxvbmdfdSlwcnRfZmdjb2wpCi0gICAgewotCXBydF9mZ2NvbCA9IGZnY29sOwotCXBydF9hdHRyaWJ1dGVfY2hhbmdlID0gVFJVRTsKLQlwcnRfbmVlZF9mZ2NvbCA9IFRSVUU7Ci0gICAgfQotfQotCi0jIGVuZGlmIC8qRkVBVF9QT1NUU0NSSVBUKi8KLSNlbmRpZiAvKkZFQVRfUFJJTlRFUiovCi0KICNpZiAoZGVmaW5lZChIQVZFX0xPQ0FMRV9IKSB8fCBkZWZpbmVkKFhfTE9DQUxFKSkgXAogCSYmIChkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX01VTFRJX0xBTkcpKQogc3RhdGljIGNoYXIgKmdldF9sb2NhbGVfdmFsIF9fQVJHUygoaW50IHdoYXQpKTsKZGlmZiAtLWdpdCBhL3NyYy9nbG9iYWxzLmggYi9zcmMvZ2xvYmFscy5oCmluZGV4IDcyMzEwYmQuLjJjNmQ4ZTIgMTAwNjQ0Ci0tLSBhL3NyYy9nbG9iYWxzLmgKKysrIGIvc3JjL2dsb2JhbHMuaApAQCAtMTA4MCw2ICsxMDgwLDkgQEAKICNlbmRpZgogCiAjaWZkZWYgRkVBVF9QUklOVEVSCisvKgorICogUHJpbnRlciBzdHVmZiBzaGFyZWQgYmV0d2VlbiBoYXJkY29weS5jIGFuZCBtYWNoaW5lLXNwZWNpZmljIHByaW50aW5nIGNvZGUuCisgKi8KICMgZGVmaW5lIE9QVF9QUklOVF9UT1AJCTAKICMgZGVmaW5lIE9QVF9QUklOVF9CT1QJCTEKICMgZGVmaW5lIE9QVF9QUklOVF9MRUZUCQkyCkBAIC0xMTI2LDM0ICsxMTI5LDExIEBACiAjIGRlZmluZSBQUlRfVU5JVF9NTQkyCiAjIGRlZmluZSBQUlRfVU5JVF9QT0lOVAkzCiAjIGRlZmluZSBQUlRfVU5JVF9OQU1FUyB7InBjIiwgImluIiwgIm1tIiwgInB0In0KLQotIyBpZmRlZiBGRUFUX01CWVRFCi0jIGRlZmluZSBPUFRfTUJGT05UX1VTRUNPVVJJRVIgIDAKLSMgZGVmaW5lIE9QVF9NQkZPTlRfQVNDSUkgICAgICAgMQotIyBkZWZpbmUgT1BUX01CRk9OVF9SRUdVTEFSICAgICAyCi0jIGRlZmluZSBPUFRfTUJGT05UX0JPTEQgICAgICAgIDMKLSMgZGVmaW5lIE9QVF9NQkZPTlRfT0JMSVFVRSAgICAgNAotIyBkZWZpbmUgT1BUX01CRk9OVF9CT0xET0JMSVFVRSA1Ci0jIGRlZmluZSBPUFRfTUJGT05UX05VTV9PUFRJT05TIDYKLSMKLUVYVEVSTiBvcHRpb25fdGFibGVfVCBtYmZvbnRfb3B0c1tPUFRfTUJGT05UX05VTV9PUFRJT05TXQotIyAgaWZkZWYgRE9fSU5JVAotID0KLXsKLSAgICB7ImMiLAlGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAotICAgIHsiYSIsCUZBTFNFLCAwLCBOVUxMLCAwLCBGQUxTRX0sCi0gICAgeyJyIiwJRkFMU0UsIDAsIE5VTEwsIDAsIEZBTFNFfSwKLSAgICB7ImIiLAlGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAotICAgIHsiaSIsCUZBTFNFLCAwLCBOVUxMLCAwLCBGQUxTRX0sCi0gICAgeyJvIiwJRkFMU0UsIDAsIE5VTEwsIDAsIEZBTFNFfSwKLX0KLSMgIGVuZGlmCi07Ci0jIGVuZGlmCiAjZW5kaWYKIAogI2lmZGVmIEZFQVRfWENMSVBCT0FSRAotRVhURVJOIGNoYXIJKnh0ZXJtX2Rpc3BsYXkgSU5JVCg9IE5VTEwpOwkvKiB4dGVybSBkaXNwbGF5IG5hbWUgKi8KK0VYVEVSTiBjaGFyCSp4dGVybV9kaXNwbGF5IElOSVQoPSBOVUxMKTsJLyogeHRlcm0gZGlzcGxheSBuYW1lOyBwb2ludHMKKwkJCQkJCSAgIGludG8gYXJndltdICovCiBFWFRFUk4gRGlzcGxheQkqeHRlcm1fZHB5IElOSVQoPSBOVUxMKTsJLyogeHRlcm0gZGlzcGxheSBwb2ludGVyICovCiAjZW5kaWYKICNpZiBkZWZpbmVkKEZFQVRfWENMSVBCT0FSRCkgfHwgZGVmaW5lZChGRUFUX0dVSV9YMTEpCmRpZmYgLS1naXQgYS9zcmMvbWFpbi5jIGIvc3JjL21haW4uYwppbmRleCAwZjUwN2U3Li4wZTI3NGFkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi5jCisrKyBiL3NyYy9tYWluLmMKQEAgLTI5LDYgKzI5LDE1IEBACiAjIGluY2x1ZGUgPGxpbWl0cy5oPgogI2VuZGlmCiAKKy8qIFN0cnVjdCBmb3IgdmFyaW91cyBwYXJhbWV0ZXJzIHBhc3NlZCBiZXR3ZWVuIG1haW4oKSBhbmQgb3RoZXIgZnVuY3Rpb25zLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQJCXNlcnZlckFyZzsJCS8qIFRSVUUgd2hlbiBhcmd1bWVudCBmb3IgYSBzZXJ2ZXIgKi8KKyAgICBjaGFyX3UJKnNlcnZlck5hbWVfYXJnOwkvKiBjbWRsaW5lIGFyZyBmb3Igc2VydmVyIG5hbWUgKi8KKyAgICBpbnQJCWV2aW1fbW9kZTsJCS8qIHN0YXJ0ZWQgYXMgImV2aW0iICovCisgICAgY2hhcl91CSp1c2VfdmltcmM7CQkvKiB2aW1yYyBmcm9tIC11IG9wdGlvbiAqLworfSBtcGFybV9UOworCiAjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKIHN0YXRpYyBpbnQgZmlsZV9vd25lZCBfX0FSR1MoKGNoYXIgKmZuYW1lKSk7CiAjZW5kaWYKQEAgLTM2LDYgKzQ1LDkgQEAKIHN0YXRpYyB2b2lkIG1haW5fbXNnIF9fQVJHUygoY2hhciAqcykpOwogc3RhdGljIHZvaWQgdXNhZ2UgX19BUkdTKCh2b2lkKSk7CiBzdGF0aWMgaW50IGdldF9udW1iZXJfYXJnIF9fQVJHUygoY2hhcl91ICpwLCBpbnQgKmlkeCwgaW50IGRlZikpOworc3RhdGljIHZvaWQgZWFybHlfYXJnX3NjYW4gX19BUkdTKChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIG1wYXJtX1QgKnBhcm1wKSk7CitzdGF0aWMgdm9pZCBleGVfcHJlX2NvbW1hbmRzIF9fQVJHUygoY2hhcl91ICoqY21kcywgaW50IGNudCkpOworc3RhdGljIHZvaWQgc291cmNlX3N0YXJ0dXBfc2NyaXB0cyBfX0FSR1MoKG1wYXJtX1QgKnBhcm1wKSk7CiBzdGF0aWMgdm9pZCBtYWluX3N0YXJ0X2d1aSBfX0FSR1MoKHZvaWQpKTsKICNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCiBzdGF0aWMgdm9pZCBjaGVja19zd2FwX2V4aXN0c19hY3Rpb24gX19BUkdTKCh2b2lkKSk7CkBAIC01MCw4ICs2Miw2IEBACiBzdGF0aWMgRklMRSAqdGltZV9mZCA9IE5VTEw7CiAjZW5kaWYKIAotI2RlZmluZSBGRUFUX1BSRUNPTU1BTkRTCi0KIC8qCiAgKiBEaWZmZXJlbnQgdHlwZXMgb2YgZXJyb3IgbWVzc2FnZXMuCiAgKi8KQEAgLTk1LDcgKzEwNSw2IEBACiAgICAgY2hhcl91CSp0ZXJtID0gTlVMTDsJCS8qIHNwZWNpZmllZCB0ZXJtaW5hbCBuYW1lICovCiAgICAgY2hhcl91CSpmbmFtZSA9IE5VTEw7CQkvKiBmaWxlIG5hbWUgZnJvbSBjb21tYW5kIGxpbmUgKi8KICAgICBjaGFyX3UJKnRhZ25hbWUgPSBOVUxMOwkvKiB0YWcgZnJvbSAtdCBvcHRpb24gKi8KLSAgICBjaGFyX3UJKnVzZV92aW1yYyA9IE5VTEw7CS8qIHZpbXJjIGZyb20gLXUgb3B0aW9uICovCiAjaWZkZWYgRkVBVF9RVUlDS0ZJWAogICAgIGNoYXJfdQkqdXNlX2VmID0gTlVMTDsJCS8qICdlcnJvcmZpbGUnIGZyb20gLXEgb3B0aW9uICovCiAjZW5kaWYKQEAgLTEwNSwxMCArMTE0LDggQEAKICAgICBpbnQJCW5fY29tbWFuZHMgPSAwOwkJLyogbm8uIG9mIGNvbW1hbmRzIGZyb20gKyBvciAtYyAqLwogICAgIGNoYXJfdQkqY29tbWFuZHNbTUFYX0FSR19DTURTXTsgLyogY29tbWFuZHMgZnJvbSArIG9yIC1jIG9wdGlvbiAqLwogICAgIGNoYXJfdQljbWRzX3RvZnJlZVtNQVhfQVJHX0NNRFNdOyAgLyogY29tbWFuZHMgdGhhdCBuZWVkIGZyZWUoKSAqLwotI2lmZGVmIEZFQVRfUFJFQ09NTUFORFMKLSAgICBpbnQJCXBfY29tbWFuZHMgPSAwOwkJLyogbm8uIG9mIGNvbW1hbmRzIGZyb20gLS1jbWQgKi8KKyAgICBpbnQJCW5fcHJlX2NvbW1hbmRzID0gMDsJLyogbm8uIG9mIGNvbW1hbmRzIGZyb20gLS1jbWQgKi8KICAgICBjaGFyX3UJKnByZV9jb21tYW5kc1tNQVhfQVJHX0NNRFNdOyAvKiBjb21tYW5kcyBmcm9tIC0tY21kIG9wdGlvbiAqLwotI2VuZGlmCiAgICAgaW50CQlub19zd2FwX2ZpbGUgPSBGQUxTRTsgICAvKiAiLW4iIG9wdGlvbiB1c2VkICovCiAgICAgaW50CQljOwogICAgIGludAkJaTsKQEAgLTEzNSw3ICsxNDIsNiBAQAogI2lmZGVmIEZFQVRfRElGRgogICAgIGludAkJZGlmZl9tb2RlID0gRkFMU0U7CS8qIHN0YXJ0IHdpdGggJ2RpZmYnIHNldCAqLwogI2VuZGlmCi0gICAgaW50CQlldmltX21vZGUgPSBGQUxTRTsJLyogc3RhcnRlZCBhcyAiZXZpbSIgKi8KICAgICBpbnQJCXN0ZG91dF9pc2F0dHk7CQkvKiBpcyBzdGRvdXQgYSB0ZXJtaW5hbD8gKi8KICAgICBpbnQJCWlucHV0X2lzYXR0eTsJCS8qIGlzIGFjdGl2ZSBpbnB1dCBhIHRlcm1pbmFsPyAqLwogI2lmZGVmIE1TV0lOCkBAIC0xNDQsMTMgKzE1MCwxMyBAQAogI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCiAgICAgY2hhcl91CSpzZXJ2ZXJTdHIgPSBOVUxMOwkvKiByZW1vdGUgc2VydmVyIGNvbW1hbmQgKi8KICAgICBjaGFyX3UJKnNlcnZlclN0ckVuYyA9IE5VTEw7CS8qIGVuY29kaW5nIG9mIHNlcnZlclN0ciAqLwotICAgIGNoYXJfdQkqc2VydmVyTmFtZV9hcmcgPSBOVUxMOwkvKiBjbWRsaW5lIGFyZyBmb3Igc2VydmVyIG5hbWUgKi8KLSAgICBpbnQJCXNlcnZlckFyZyA9IEZBTFNFOwkvKiBUUlVFIHdoZW4gYXJndW1lbnQgZm9yIGEgc2VydmVyICovCiAgICAgY2hhcl91CSpzZXJ2ZXJuYW1lID0gTlVMTDsJLyogYWxsb2NhdGVkIG5hbWUgZm9yIG91ciBzZXJ2ZXIgKi8KICNlbmRpZgogI2lmICghZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChfX0VNWF9fKSkgfHwgZGVmaW5lZChBUkNISUUpCiAgICAgaW50CQlsaXRlcmFsID0gRkFMU0U7CS8qIGRvbid0IGV4cGFuZCBmaWxlIG5hbWVzICovCiAjZW5kaWYKKyAgICBtcGFybV9UCXBhcmFtczsJCQkvKiB2YXJpb3VzIHBhcmFtZXRlcnMgcGFzc2VkIGJldHdlZW4KKwkJCQkJICogbWFpbigpIGFuZCBvdGhlciBmdW5jdGlvbnMuICovCiAKICAgICAvKgogICAgICAqIERvIGFueSBzeXN0ZW0tc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zLiAgVGhlc2UgY2FuIE5PVCB1c2UgSU9idWZmIG9yCkBAIC0xNTgsNiArMTY0LDggQEAKICAgICAgKi8KICAgICBtY2hfZWFybHlfaW5pdCgpOwogCisgICAgdmltX21lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisKICNpZmRlZiBGRUFUX1RDTAogICAgIHZpbV90Y2xfaW5pdChhcmd2WzBdKTsKICNlbmRpZgpAQCAtMTk4LDcgKzIwNiw3IEBACiAgICAgaW5pdF9ub3JtYWxfY21kcygpOwogCiAjaWYgZGVmaW5lZChIQVZFX0RBVEVfVElNRSkgJiYgZGVmaW5lZChWTVMpICYmIGRlZmluZWQoVkFYQykKLSAgICBtYWtlX3ZlcnNpb24oKTsKKyAgICBtYWtlX3ZlcnNpb24oKTsJLyogQ29uc3RydWN0IHRoZSBsb25nIHZlcnNpb24gc3RyaW5nLiAqLwogI2VuZGlmCiAKICAgICAvKgpAQCAtMjU1LDc1ICsyNjMsMTMgQEAKICAgICBndWkuZG9mb3JrID0gVFJVRTsJCSAgICAvKiBkZWZhdWx0IGlzIHRvIHVzZSBmb3JrKCkgKi8KICNlbmRpZgogCi0jaWYgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpIHx8IGRlZmluZWQoRkVBVF9DTElFTlRTRVJWRVIpCiAgICAgLyoKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGRpc3BsYXksIGJlZm9yZSBndWlfcHJlcGFyZSgpIHJlbW92ZXMgaXQgZnJvbQotICAgICAqIGFyZ3ZbXS4gIFVzZWQgZm9yIHRoZSB4dGVybS1jbGlwYm9hcmQgZGlzcGxheS4KLSAgICAgKgotICAgICAqIEFsc28gZmluZCB0aGUgLS1zZXJ2ZXIuLi4gYXJndW1lbnRzCisgICAgICogRG8gYSBmaXJzdCBzY2FuIG9mIHRoZSBhcmd1bWVudHMgaW4gImFyZ3ZbXSI6CisgICAgICogICAtZGlzcGxheQorICAgICAqICAgLS1zZXJ2ZXIuLi4KKyAgICAgKiAgIC0tc29ja2V0aWQKICAgICAgKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLQlpZiAoU1RSQ01QKGFyZ3ZbaV0sICItLSIpID09IDApCi0JICAgIGJyZWFrOwotIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKLQllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItZGlzcGxheSIpID09IDAKLSMgIGlmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0tERSkKLQkJfHwgU1RSSUNNUChhcmd2W2ldLCAiLS1kaXNwbGF5IikgPT0gMAotIyAgZW5kaWYKLQkJKQotCXsKLQkgICAgaWYgKGkgPT0gYXJnYyAtIDEpCi0JCW1haW5lcnJfYXJnX21pc3NpbmcoKGNoYXJfdSAqKWFyZ3ZbaV0pOwotCSAgICB4dGVybV9kaXNwbGF5ID0gYXJndlsrK2ldOwotCX0KLSMgZW5kaWYKLSMgaWZkZWYgRkVBVF9DTElFTlRTRVJWRVIKLQllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItLXNlcnZlcm5hbWUiKSA9PSAwKQotCXsKLQkgICAgaWYgKGkgPT0gYXJnYyAtIDEpCi0JCW1haW5lcnJfYXJnX21pc3NpbmcoKGNoYXJfdSAqKWFyZ3ZbaV0pOwotCSAgICBzZXJ2ZXJOYW1lX2FyZyA9IChjaGFyX3UgKilhcmd2WysraV07Ci0JfQotCWVsc2UgaWYgKFNUUklDTVAoYXJndltpXSwgIi0tc2VydmVybGlzdCIpID09IDAKLQkJIHx8IFNUUklDTVAoYXJndltpXSwgIi0tcmVtb3RlLXNlbmQiKSA9PSAwCi0JCSB8fCBTVFJJQ01QKGFyZ3ZbaV0sICItLXJlbW90ZS1leHByIikgPT0gMAotCQkgfHwgU1RSSUNNUChhcmd2W2ldLCAiLS1yZW1vdGUiKSA9PSAwCi0JCSB8fCBTVFJJQ01QKGFyZ3ZbaV0sICItLXJlbW90ZS1zaWxlbnQiKSA9PSAwKQotCSAgICBzZXJ2ZXJBcmcgPSBUUlVFOwotCWVsc2UgaWYgKFNUUklDTVAoYXJndltpXSwgIi0tcmVtb3RlLXdhaXQiKSA9PSAwCi0JCXx8IFNUUklDTVAoYXJndltpXSwgIi0tcmVtb3RlLXdhaXQtc2lsZW50IikgPT0gMCkKLQl7Ci0JICAgIHNlcnZlckFyZyA9IFRSVUU7Ci0jaWZkZWYgRkVBVF9HVUkKLQkgICAgLyogZG9uJ3QgZm9yaygpIHdoZW4gc3RhcnRpbmcgdGhlIEdVSSB0byBlZGl0IHRoZSBmaWxlcyBvdXJzZWxmICovCi0JICAgIGd1aS5kb2ZvcmsgPSBGQUxTRTsKLSNlbmRpZgotCX0KLSMgZW5kaWYKLSMgaWZkZWYgRkVBVF9HVUlfR1RLCi0JZWxzZSBpZiAoU1RSSUNNUChhcmd2W2ldLCAiLS1zb2NrZXRpZCIpID09IDApCi0JewotCSAgICB1bnNpZ25lZCBpbnQgICAgc29ja2V0X2lkOwotCSAgICBpbnQJCSAgICBjb3VudDsKLQotCSAgICBpZiAoaSA9PSBhcmdjIC0gMSkKLQkJbWFpbmVycl9hcmdfbWlzc2luZygoY2hhcl91ICopYXJndltpXSk7Ci0JICAgIGlmIChTVFJOSUNNUChhcmd2W2krMV0sICIweCIsIDIpID09IDApCi0JCWNvdW50ID0gc3NjYW5mKCYoYXJndltpICsgMV1bMl0pLCAiJXgiLCAmc29ja2V0X2lkKTsKLQkgICAgZWxzZQotCQljb3VudCA9IHNzY2FuZihhcmd2W2krMV0sICIldSIsICZzb2NrZXRfaWQpOwotCSAgICBpZiAoY291bnQgIT0gMSkKLQkJbWFpbmVycihNRV9JTlZBTElEX0FSRywgKGNoYXJfdSAqKWFyZ3ZbaV0pOwotCSAgICBlbHNlCi0JCWd0a19zb2NrZXRfaWQgPSBzb2NrZXRfaWQ7Ci0JICAgIGkrKzsKLQl9Ci0JZWxzZSBpZiAoU1RSSUNNUChhcmd2W2ldLCAiLS1lY2hvLXdpZCIpID09IDApCi0JICAgIGVjaG9fd2lkX2FyZyA9IFRSVUU7Ci0jIGVuZGlmCi0gICAgfQotI2VuZGlmCisgICAgZWFybHlfYXJnX3NjYW4oYXJnYywgYXJndiwgJnBhcmFtcyk7CiAKICNpZmRlZiBGRUFUX1NVTl9XT1JLU0hPUAogICAgIGZpbmRZb3Vyc2VsZihhcmd2WzBdKTsKQEAgLTM3Niw3ICszMjIsNyBAQAogICAgIC8qCiAgICAgICogRG8gdGhlIGNsaWVudC1zZXJ2ZXIgc3R1ZmYsIHVubGVzcyAiLS1zZXJ2ZXJuYW1lICcnIiB3YXMgdXNlZC4KICAgICAgKi8KLSAgICBpZiAoc2VydmVyTmFtZV9hcmcgPT0gTlVMTCB8fCAqc2VydmVyTmFtZV9hcmcgIT0gTlVMKQorICAgIGlmIChwYXJhbXMuc2VydmVyTmFtZV9hcmcgPT0gTlVMTCB8fCAqcGFyYW1zLnNlcnZlck5hbWVfYXJnICE9IE5VTCkKICAgICB7CiAjIGlmZGVmIFdJTjMyCiAJLyogSW5pdGlhbGlzZSB0aGUgY2xpZW50L3NlcnZlciBtZXNzYWdpbmcgaW5mcmFzdHJ1Y3R1cmUuICovCkBAIC0zODgsOSArMzM0LDkgQEAKIAkgKiBleGl0IFZpbSB3aGVuIGl0IHdhcyBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlIGl0J3MgZXhlY3V0ZWQgZnVydGhlcgogCSAqIG9uLiAgUmVtZW1iZXIgdGhlIGVuY29kaW5nIHVzZWQgaGVyZSBpbiAic2VydmVyU3RyRW5jIi4KIAkgKi8KLQlpZiAoc2VydmVyQXJnKQorCWlmIChwYXJhbXMuc2VydmVyQXJnKQogCXsKLQkgICAgY21kc3J2X21haW4oJmFyZ2MsIGFyZ3YsIHNlcnZlck5hbWVfYXJnLCAmc2VydmVyU3RyKTsKKwkgICAgY21kc3J2X21haW4oJmFyZ2MsIGFyZ3YsIHBhcmFtcy5zZXJ2ZXJOYW1lX2FyZywgJnNlcnZlclN0cik7CiAjIGlmZGVmIEZFQVRfTUJZVEUKIAkgICAgc2VydmVyU3RyRW5jID0gdmltX3N0cnNhdmUocF9lbmMpOwogIyBlbmRpZgpAQCAtMzk5LDcgKzM0NSw3IEBACiAJLyogSWYgd2UncmUgc3RpbGwgcnVubmluZywgZ2V0IHRoZSBuYW1lIHRvIHJlZ2lzdGVyIG91cnNlbHZlcy4KIAkgKiBPbiBXaW4zMiBjYW4gcmVnaXN0ZXIgcmlnaHQgbm93LCBmb3IgWDExIG5lZWQgdG8gc2V0dXAgdGhlCiAJICogY2xpcGJvYXJkIGZpcnN0LCBpdCdzIGZ1cnRoZXIgZG93bi4gKi8KLQlzZXJ2ZXJuYW1lID0gc2VydmVyTWFrZU5hbWUoc2VydmVyTmFtZV9hcmcsIGFyZ3ZbMF0pOworCXNlcnZlcm5hbWUgPSBzZXJ2ZXJNYWtlTmFtZShwYXJhbXMuc2VydmVyTmFtZV9hcmcsIGFyZ3ZbMF0pOwogIyBpZmRlZiBXSU4zMgogCWlmIChzZXJ2ZXJuYW1lICE9IE5VTEwpCiAJewpAQCAtNDUzLDcgKzM5OSw3IEBACiAjaWZkZWYgRkVBVF9HVUkKIAlndWkuc3RhcnRpbmcgPSBUUlVFOwogI2VuZGlmCi0JZXZpbV9tb2RlID0gVFJVRTsKKwlwYXJhbXMuZXZpbV9tb2RlID0gVFJVRTsKIAkrK2luaXRzdHI7CiAgICAgfQogCkBAIC01ODgsMTMgKzUzNCwxMSBAQAogCQl9CiAJCWVsc2UgaWYgKFNUUk5JQ01QKGFyZ3ZbMF0gKyBhcmd2X2lkeCwgIm5vcGx1Z2luIiwgOCkgPT0gMCkKIAkJICAgIHBfbHBsID0gRkFMU0U7Ci0jaWZkZWYgRkVBVF9QUkVDT01NQU5EUwogCQllbHNlIGlmIChTVFJOSUNNUChhcmd2WzBdICsgYXJndl9pZHgsICJjbWQiLCAzKSA9PSAwKQogCQl7CiAJCSAgICB3YW50X2FyZ3VtZW50ID0gVFJVRTsKIAkJICAgIGFyZ3ZfaWR4ICs9IDM7CiAJCX0KLSNlbmRpZgogI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCiAJCWVsc2UgaWYgKFNUUk5JQ01QKGFyZ3ZbMF0gKyBhcmd2X2lkeCwgInNlcnZlcmxpc3QiLCAxMCkgPT0gMCkKIAkJICAgIDsgLyogYWxyZWFkeSBwcm9jZXNzZWQgLS0gbm8gYXJnICovCkBAIC03MjQsNyArNjY4LDcgQEAKICNpZmRlZiBGRUFUX0dVSQogCQlndWkuc3RhcnRpbmcgPSBUUlVFOwkvKiBzdGFydCBHVUkgYSBiaXQgbGF0ZXIgKi8KICNlbmRpZgotCQlldmltX21vZGUgPSBUUlVFOworCQlwYXJhbXMuZXZpbV9tb2RlID0gVFJVRTsKIAkJYnJlYWs7CiAKIAkgICAgY2FzZSAnTic6CQkvKiAiLU4iICBOb2NvbXBhdGlibGUgKi8KQEAgLTk0MCwxMyArODg0LDExIEBACiAJCQljb21tYW5kc1tuX2NvbW1hbmRzKytdID0gKGNoYXJfdSAqKWFyZ3ZbMF07CiAJCSAgICBicmVhazsKIAotI2lmZGVmIEZFQVRfUFJFQ09NTUFORFMKIAkJY2FzZSAnLSc6CS8qICItLWNtZCB7Y29tbWFuZH0iIGV4ZWN1dGUgY29tbWFuZCAqLwotCQkgICAgaWYgKHBfY29tbWFuZHMgPj0gTUFYX0FSR19DTURTKQorCQkgICAgaWYgKG5fcHJlX2NvbW1hbmRzID49IE1BWF9BUkdfQ01EUykKIAkJCW1haW5lcnIoTUVfRVhUUkFfQ01ELCBOVUxMKTsKLQkJICAgIHByZV9jb21tYW5kc1twX2NvbW1hbmRzKytdID0gKGNoYXJfdSAqKWFyZ3ZbMF07CisJCSAgICBwcmVfY29tbWFuZHNbbl9wcmVfY29tbWFuZHMrK10gPSAoY2hhcl91ICopYXJndlswXTsKIAkJICAgIGJyZWFrOwotI2VuZGlmCiAKIAkgICAgLyoJY2FzZSAnZCc6ICAgLWQge2RldmljZX0gaXMgaGFuZGxlZCBpbiBtY2hfY2hlY2tfd2luKCkgZm9yIHRoZQogCSAgICAgKgkJICAgIEFtaWdhICovCkBAIC0xMDAyLDcgKzk0NCw3IEBACiAJCSAgICBicmVhazsKIAogCQljYXNlICd1JzoJLyogIi11IHt2aW1yY30iIHZpbSBpbml0cyBmaWxlICovCi0JCSAgICB1c2VfdmltcmMgPSAoY2hhcl91ICopYXJndlswXTsKKwkJICAgIHBhcmFtcy51c2VfdmltcmMgPSAoY2hhcl91ICopYXJndlswXTsKIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgJ1UnOgkvKiAiLVUge2d2aW1yY30iIGd2aW0gaW5pdHMgZmlsZSAqLwpAQCAtMTE1MSw3ICsxMDkzLDcgQEAKIAogCS8qIFdoZW4gcnVubmluZyAiZXZpbSIgb3IgImd2aW0gLXkiIHdlIG5lZWQgdGhlIG1lbnVzLCBleGl0IGlmIHdlCiAJICogZG9uJ3QgaGF2ZSB0aGVtLiAqLwotCWlmIChldmltX21vZGUpCisJaWYgKHBhcmFtcy5ldmltX21vZGUpCiAJICAgIG1jaF9leGl0KDEpOwogICAgIH0KICMgZW5kaWYKQEAgLTEzNjUsMTc2ICsxMzA3LDE3IEBACiAKICAgICBpbml0X2hpZ2hsaWdodChUUlVFLCBGQUxTRSk7IC8qIHNldCB0aGUgZGVmYXVsdCBoaWdobGlnaHQgZ3JvdXBzICovCiAgICAgVElNRV9NU0coImluaXQgaGlnaGxpZ2h0Iik7Ci0jaWZkZWYgQ1VSU09SX1NIQVBFCi0gICAgcGFyc2Vfc2hhcGVfb3B0KFNIQVBFX0NVUlNPUik7IC8qIHNldCBjdXJzb3Igc2hhcGVzIGZyb20gJ2d1aWN1cnNvcicgKi8KLSNlbmRpZgotI2lmZGVmIEZFQVRfTU9VU0VTSEFQRQotICAgIHBhcnNlX3NoYXBlX29wdChTSEFQRV9NT1VTRSk7ICAvKiBzZXQgbW91c2Ugc2hhcGVzIGZyb20gJ21vdXNlc2hhcGUnICovCi0jZW5kaWYKLSNpZmRlZiBGRUFUX1BSSU5URVIKLSAgICBwYXJzZV9saXN0X29wdGlvbnMocF9wb3B0LCBwcmludGVyX29wdHMsIE9QVF9QUklOVF9OVU1fT1BUSU9OUyk7Ci0jZW5kaWYKIAogI2lmZGVmIEZFQVRfRVZBTAogICAgIC8qIFNldCB0aGUgYnJlYWsgbGV2ZWwgYWZ0ZXIgdGhlIHRlcm1pbmFsIGlzIGluaXRpYWxpemVkLiAqLwogICAgIGRlYnVnX2JyZWFrX2xldmVsID0gdXNlX2RlYnVnX2JyZWFrX2xldmVsOwogI2VuZGlmCiAKLSNpZmRlZiBGRUFUX1BSRUNPTU1BTkRTCi0gICAgaWYgKHBfY29tbWFuZHMgPiAwKQotICAgIHsKLQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAwOyAvKiBqdXN0IGluIGNhc2UuLiAqLwotCXNvdXJjaW5nX25hbWUgPSAoY2hhcl91ICopXygicHJlLXZpbXJjIGNvbW1hbmQgbGluZSIpOwotIyBpZmRlZiBGRUFUX0VWQUwKLQljdXJyZW50X1NJRCA9IFNJRF9DTURBUkc7Ci0jIGVuZGlmCi0JZm9yIChpID0gMDsgaSA8IHBfY29tbWFuZHM7ICsraSkKLQkgICAgZG9fY21kbGluZV9jbWQocHJlX2NvbW1hbmRzW2ldKTsKLQlzb3VyY2luZ19uYW1lID0gTlVMTDsKLSMgaWZkZWYgRkVBVF9FVkFMCi0JY3VycmVudF9TSUQgPSAwOwotIyBlbmRpZgotICAgIH0KLSNlbmRpZgorICAgIC8qIEV4ZWN1dGUgLS1jbWQgYXJndW1lbnRzLiAqLworICAgIGV4ZV9wcmVfY29tbWFuZHMocHJlX2NvbW1hbmRzLCBuX3ByZV9jb21tYW5kcyk7CiAKLSAgICAvKgotICAgICAqIEZvciAiZXZpbSIgc291cmNlIGV2aW0udmltIGZpcnN0IG9mIGFsbCwgc28gdGhhdCB0aGUgdXNlciBjYW4gb3ZlcnJ1bGUKLSAgICAgKiBhbnkgdGhpbmdzIGhlIGRvZXNuJ3QgbGlrZS4KLSAgICAgKi8KLSAgICBpZiAoZXZpbV9tb2RlKQotICAgIHsKLQkodm9pZClkb19zb3VyY2UoKGNoYXJfdSAqKUVWSU1fRklMRSwgRkFMU0UsIEZBTFNFKTsKLQlUSU1FX01TRygic291cmNlIGV2aW0gZmlsZSIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgLXUgb3B0aW9uIGdpdmVuLCB1c2Ugb25seSB0aGUgaW5pdGlhbGl6YXRpb25zIGZyb20gdGhhdCBmaWxlIGFuZAotICAgICAqIG5vdGhpbmcgZWxzZS4KLSAgICAgKi8KLSAgICBpZiAodXNlX3ZpbXJjICE9IE5VTEwpCi0gICAgewotCWlmIChTVFJDTVAodXNlX3ZpbXJjLCAiTk9ORSIpID09IDAgfHwgU1RSQ01QKHVzZV92aW1yYywgIk5PUkMiKSA9PSAwKQotCXsKLSNpZmRlZiBGRUFUX0dVSQotCSAgICBpZiAodXNlX2d2aW1yYyA9PSBOVUxMKQkgICAgLyogZG9uJ3QgbG9hZCBndmltcmMgZWl0aGVyICovCi0JCXVzZV9ndmltcmMgPSB1c2VfdmltcmM7Ci0jZW5kaWYKLQkgICAgaWYgKHVzZV92aW1yY1syXSA9PSAnTicpCi0JCXBfbHBsID0gRkFMU0U7CQkgICAgLyogZG9uJ3QgbG9hZCBwbHVnaW5zIGVpdGhlciAqLwotCX0KLQllbHNlCi0JewotCSAgICBpZiAoZG9fc291cmNlKHVzZV92aW1yYywgRkFMU0UsIEZBTFNFKSAhPSBPSykKLQkJRU1TRzIoXygiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiKSwgdXNlX3ZpbXJjKTsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzaWxlbnRfbW9kZSkKLSAgICB7Ci0jaWZkZWYgQU1JR0EKLQlzdHJ1Y3QgUHJvY2VzcwkqcHJvYyA9IChzdHJ1Y3QgUHJvY2VzcyAqKUZpbmRUYXNrKDBMKTsKLQlBUFRSCQlzYXZlX3dpbnB0ciA9IHByb2MtPnByX1dpbmRvd1B0cjsKLQotCS8qIEF2b2lkIGEgcmVxdWVzdGVyIGhlcmUgZm9yIGEgdm9sdW1lIHRoYXQgZG9lc24ndCBleGlzdC4gKi8KLQlwcm9jLT5wcl9XaW5kb3dQdHIgPSAoQVBUUiktMUw7Ci0jZW5kaWYKLQotCS8qCi0JICogR2V0IHN5c3RlbSB3aWRlIGRlZmF1bHRzLCBpZiB0aGUgZmlsZSBuYW1lIGlzIGRlZmluZWQuCi0JICovCi0jaWZkZWYgU1lTX1ZJTVJDX0ZJTEUKLQkodm9pZClkb19zb3VyY2UoKGNoYXJfdSAqKVNZU19WSU1SQ19GSUxFLCBGQUxTRSwgRkFMU0UpOwotI2VuZGlmCi0KLQkvKgotCSAqIFRyeSB0byByZWFkIGluaXRpYWxpemF0aW9uIGNvbW1hbmRzIGZyb20gdGhlIGZvbGxvd2luZyBwbGFjZXM6Ci0JICogLSBlbnZpcm9ubWVudCB2YXJpYWJsZSBWSU1JTklUCi0JICogLSB1c2VyIHZpbXJjIGZpbGUgKHM6LnZpbXJjIGZvciBBbWlnYSwgfi8udmltcmMgb3RoZXJ3aXNlKQotCSAqIC0gc2Vjb25kIHVzZXIgdmltcmMgZmlsZSAoJFZJTS8udmltcmMgZm9yIERvcykKLQkgKiAtIGVudmlyb25tZW50IHZhcmlhYmxlIEVYSU5JVAotCSAqIC0gdXNlciBleHJjIGZpbGUgKHM6LmV4cmMgZm9yIEFtaWdhLCB+Ly5leHJjIG90aGVyd2lzZSkKLQkgKiAtIHNlY29uZCB1c2VyIGV4cmMgZmlsZSAoJFZJTS8uZXhyYyBmb3IgRG9zKQotCSAqIFRoZSBmaXJzdCB0aGF0IGV4aXN0cyBpcyB1c2VkLCB0aGUgcmVzdCBpcyBpZ25vcmVkLgotCSAqLwotCWlmIChwcm9jZXNzX2VudigoY2hhcl91ICopIlZJTUlOSVQiLCBUUlVFKSAhPSBPSykKLQl7Ci0JICAgIGlmIChkb19zb3VyY2UoKGNoYXJfdSAqKVVTUl9WSU1SQ19GSUxFLCBUUlVFLCBUUlVFKSA9PSBGQUlMCi0jaWZkZWYgVVNSX1ZJTVJDX0ZJTEUyCi0JCSYmIGRvX3NvdXJjZSgoY2hhcl91ICopVVNSX1ZJTVJDX0ZJTEUyLCBUUlVFLCBUUlVFKSA9PSBGQUlMCi0jZW5kaWYKLSNpZmRlZiBVU1JfVklNUkNfRklMRTMKLQkJJiYgZG9fc291cmNlKChjaGFyX3UgKilVU1JfVklNUkNfRklMRTMsIFRSVUUsIFRSVUUpID09IEZBSUwKLSNlbmRpZgotCQkmJiBwcm9jZXNzX2VudigoY2hhcl91ICopIkVYSU5JVCIsIEZBTFNFKSA9PSBGQUlMCi0JCSYmIGRvX3NvdXJjZSgoY2hhcl91ICopVVNSX0VYUkNfRklMRSwgRkFMU0UsIEZBTFNFKSA9PSBGQUlMKQotCSAgICB7Ci0jaWZkZWYgVVNSX0VYUkNfRklMRTIKLQkJKHZvaWQpZG9fc291cmNlKChjaGFyX3UgKilVU1JfRVhSQ19GSUxFMiwgRkFMU0UsIEZBTFNFKTsKLSNlbmRpZgotCSAgICB9Ci0JfQotCi0JLyoKLQkgKiBSZWFkIGluaXRpYWxpemF0aW9uIGNvbW1hbmRzIGZyb20gIi52aW1yYyIgb3IgIi5leHJjIiBpbiBjdXJyZW50Ci0JICogZGlyZWN0b3J5LiAgVGhpcyBpcyBvbmx5IGRvbmUgaWYgdGhlICdleHJjJyBvcHRpb24gaXMgc2V0LgotCSAqIEJlY2F1c2Ugb2Ygc2VjdXJpdHkgcmVhc29ucyB3ZSBkaXNhbGxvdyBzaGVsbCBhbmQgd3JpdGUgY29tbWFuZHMKLQkgKiBub3csIGV4Y2VwdCBmb3IgdW5peCBpZiB0aGUgZmlsZSBpcyBvd25lZCBieSB0aGUgdXNlciBvciAnc2VjdXJlJwotCSAqIG9wdGlvbiBoYXMgYmVlbiByZXNldCBpbiBlbnZpcm9ubWVudCBvZiBnbG9iYWwgIi5leHJjIiBvciAiLnZpbXJjIi4KLQkgKiBPbmx5IGRvIHRoaXMgaWYgVklNUkNfRklMRSBpcyBub3QgdGhlIHNhbWUgYXMgVVNSX1ZJTVJDX0ZJTEUgb3IKLQkgKiBTWVNfVklNUkNfRklMRS4KLQkgKi8KLQlpZiAocF9leHJjKQotCXsKLSNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQotCSAgICAvKiBJZiAiLnZpbXJjIiBmaWxlIGlzIG5vdCBvd25lZCBieSB1c2VyLCBzZXQgJ3NlY3VyZScgbW9kZS4gKi8KLQkgICAgaWYgKCFmaWxlX293bmVkKFZJTVJDX0ZJTEUpKQotI2VuZGlmCi0JCXNlY3VyZSA9IHBfc2VjdXJlOwotCi0JICAgIGkgPSBGQUlMOwotCSAgICBpZiAoZnVsbHBhdGhjbXAoKGNoYXJfdSAqKVVTUl9WSU1SQ19GSUxFLAotCQkJCSAgICAgIChjaGFyX3UgKilWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKLSNpZmRlZiBVU1JfVklNUkNfRklMRTIKLQkJICAgICYmIGZ1bGxwYXRoY21wKChjaGFyX3UgKilVU1JfVklNUkNfRklMRTIsCi0JCQkJICAgICAgKGNoYXJfdSAqKVZJTVJDX0ZJTEUsIEZBTFNFKSAhPSBGUENfU0FNRQotI2VuZGlmCi0jaWZkZWYgVVNSX1ZJTVJDX0ZJTEUzCi0JCSAgICAmJiBmdWxscGF0aGNtcCgoY2hhcl91ICopVVNSX1ZJTVJDX0ZJTEUzLAotCQkJCSAgICAgIChjaGFyX3UgKilWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKLSNlbmRpZgotI2lmZGVmIFNZU19WSU1SQ19GSUxFCi0JCSAgICAmJiBmdWxscGF0aGNtcCgoY2hhcl91ICopU1lTX1ZJTVJDX0ZJTEUsCi0JCQkJICAgICAgKGNoYXJfdSAqKVZJTVJDX0ZJTEUsIEZBTFNFKSAhPSBGUENfU0FNRQotI2VuZGlmCi0JCQkJKQotCQlpID0gZG9fc291cmNlKChjaGFyX3UgKilWSU1SQ19GSUxFLCBUUlVFLCBUUlVFKTsKLQotCSAgICBpZiAoaSA9PSBGQUlMKQotCSAgICB7Ci0jaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKLQkJLyogaWYgIi5leHJjIiBpcyBub3Qgb3duZWQgYnkgdXNlciBzZXQgJ3NlY3VyZScgbW9kZSAqLwotCQlpZiAoIWZpbGVfb3duZWQoRVhSQ19GSUxFKSkKLQkJICAgIHNlY3VyZSA9IHBfc2VjdXJlOwotCQllbHNlCi0JCSAgICBzZWN1cmUgPSAwOwotI2VuZGlmCi0JCWlmICgJICAgZnVsbHBhdGhjbXAoKGNoYXJfdSAqKVVTUl9FWFJDX0ZJTEUsCi0JCQkJICAgICAgKGNoYXJfdSAqKUVYUkNfRklMRSwgRkFMU0UpICE9IEZQQ19TQU1FCi0jaWZkZWYgVVNSX0VYUkNfRklMRTIKLQkJCSYmIGZ1bGxwYXRoY21wKChjaGFyX3UgKilVU1JfRVhSQ19GSUxFMiwKLQkJCQkgICAgICAoY2hhcl91ICopRVhSQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKLSNlbmRpZgotCQkJCSkKLQkJICAgICh2b2lkKWRvX3NvdXJjZSgoY2hhcl91ICopRVhSQ19GSUxFLCBGQUxTRSwgRkFMU0UpOwotCSAgICB9Ci0JfQotCWlmIChzZWN1cmUgPT0gMikKLQkgICAgbmVlZF93YWl0X3JldHVybiA9IFRSVUU7Ci0Jc2VjdXJlID0gMDsKLSNpZmRlZiBBTUlHQQotCXByb2MtPnByX1dpbmRvd1B0ciA9IHNhdmVfd2lucHRyOwotI2VuZGlmCi0gICAgfQotICAgIFRJTUVfTVNHKCJzb3VyY2luZyB2aW1yYyBmaWxlKHMpIik7CisgICAgLyogU291cmNlIHN0YXJ0dXAgc2NyaXB0cy4gKi8KKyAgICBzb3VyY2Vfc3RhcnR1cF9zY3JpcHRzKCZwYXJhbXMpOwogCiAjaWZkZWYgRkVBVF9FVkFMCiAgICAgLyoKQEAgLTE1OTksNyArMTM4Miw3IEBACiAKIAkvKiBXaGVuIHJ1bm5pbmcgImV2aW0iIG9yICJndmltIC15IiB3ZSBuZWVkIHRoZSBtZW51cywgZXhpdCBpZiB3ZQogCSAqIGRvbid0IGhhdmUgdGhlbS4gKi8KLQlpZiAoIWd1aS5pbl91c2UgJiYgZXZpbV9tb2RlKQorCWlmICghZ3VpLmluX3VzZSAmJiBwYXJhbXMuZXZpbV9tb2RlKQogCSAgICBtY2hfZXhpdCgxKTsKICAgICB9CiAjZW5kaWYKQEAgLTE2OTAsNyArMTQ3Myw3IEBACiAjIGlmZGVmIEZFQVRfR1VJCiAJCWd1aS5pbl91c2UgfHwKICMgZW5kaWYKLQkJc2VydmVyTmFtZV9hcmcgIT0gTlVMTCkpCisJCXBhcmFtcy5zZXJ2ZXJOYW1lX2FyZyAhPSBOVUxMKSkKICAgICB7CiAJKHZvaWQpc2VydmVyUmVnaXN0ZXJOYW1lKFhfRElTUExBWSwgc2VydmVybmFtZSk7CiAJdmltX2ZyZWUoc2VydmVybmFtZSk7CkBAIC0xNzc4LDggKzE1NjEsNyBAQAogI2VuZGlmCiAgICAgaWYgKHNjcm9sbF9yZWdpb24pCiAJc2Nyb2xsX3JlZ2lvbl9yZXNldCgpOwkJLyogSW4gY2FzZSBSb3dzIGNoYW5nZWQgKi8KLQotICAgIHNjcm9sbF9zdGFydCgpOworICAgIHNjcm9sbF9zdGFydCgpOwkvKiBtYXkgc2Nyb2xsIHRoZSBzY3JlZW4gdG8gdGhlIHJpZ2h0IHBvc2l0aW9uICovCiAKICAgICAvKgogICAgICAqIERvbid0IGNsZWFyIHRoZSBzY3JlZW4gd2hlbiBzdGFydGluZyBpbiBFeCBtb2RlLCB1bmxlc3MgdXNpbmcgdGhlIEdVSS4KQEAgLTI0MzksNiArMjIyMSwyNjIgQEAKIH0KIAogLyoKKyAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZGlzcGxheSwgYmVmb3JlIGd1aV9wcmVwYXJlKCkgcmVtb3ZlcyBpdCBmcm9tCisgKiBhcmd2W10uICBVc2VkIGZvciB0aGUgeHRlcm0tY2xpcGJvYXJkIGRpc3BsYXkuCisgKgorICogQWxzbyBmaW5kIHRoZSAtLXNlcnZlci4uLiBhcmd1bWVudHMgYW5kIC0tc29ja2V0aWQKKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2Vhcmx5X2FyZ19zY2FuKGFyZ2MsIGFyZ3YsIHBhcm1wKQorICAgIGludAkJYXJnYzsKKyAgICBjaGFyCSoqYXJndjsKKyAgICBtcGFybV9UCSpwYXJtcDsKK3sKKyNpZiBkZWZpbmVkKEZFQVRfWENMSVBCT0FSRCkgfHwgZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikKKyAgICBpbnQJCWk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKwlpZiAoU1RSQ01QKGFyZ3ZbaV0sICItLSIpID09IDApCisJICAgIGJyZWFrOworIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItZGlzcGxheSIpID09IDAKKyMgIGlmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0tERSkKKwkJfHwgU1RSSUNNUChhcmd2W2ldLCAiLS1kaXNwbGF5IikgPT0gMAorIyAgZW5kaWYKKwkJKQorCXsKKwkgICAgaWYgKGkgPT0gYXJnYyAtIDEpCisJCW1haW5lcnJfYXJnX21pc3NpbmcoKGNoYXJfdSAqKWFyZ3ZbaV0pOworCSAgICB4dGVybV9kaXNwbGF5ID0gYXJndlsrK2ldOworCX0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9DTElFTlRTRVJWRVIKKwllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItLXNlcnZlcm5hbWUiKSA9PSAwKQorCXsKKwkgICAgaWYgKGkgPT0gYXJnYyAtIDEpCisJCW1haW5lcnJfYXJnX21pc3NpbmcoKGNoYXJfdSAqKWFyZ3ZbaV0pOworCSAgICBwYXJtcC0+c2VydmVyTmFtZV9hcmcgPSAoY2hhcl91ICopYXJndlsrK2ldOworCX0KKwllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItLXNlcnZlcmxpc3QiKSA9PSAwCisJCXx8IFNUUklDTVAoYXJndltpXSwgIi0tcmVtb3RlLXNlbmQiKSA9PSAwCisJCXx8IFNUUklDTVAoYXJndltpXSwgIi0tcmVtb3RlLWV4cHIiKSA9PSAwCisJCXx8IFNUUklDTVAoYXJndltpXSwgIi0tcmVtb3RlIikgPT0gMAorCQl8fCBTVFJJQ01QKGFyZ3ZbaV0sICItLXJlbW90ZS1zaWxlbnQiKSA9PSAwKQorCSAgICBwYXJtcC0+c2VydmVyQXJnID0gVFJVRTsKKwllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItLXJlbW90ZS13YWl0IikgPT0gMAorCQl8fCBTVFJJQ01QKGFyZ3ZbaV0sICItLXJlbW90ZS13YWl0LXNpbGVudCIpID09IDApCisJeworCSAgICBwYXJtcC0+c2VydmVyQXJnID0gVFJVRTsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICAvKiBkb24ndCBmb3JrKCkgd2hlbiBzdGFydGluZyB0aGUgR1VJIHRvIGVkaXQgdGhlIGZpbGVzIG91cnNlbGYgKi8KKwkgICAgZ3VpLmRvZm9yayA9IEZBTFNFOworI2VuZGlmCisJfQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX0dVSV9HVEsKKwllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItLXNvY2tldGlkIikgPT0gMCkKKwl7CisJICAgIHVuc2lnbmVkIGludCAgICBzb2NrZXRfaWQ7CisJICAgIGludAkJICAgIGNvdW50OworCisJICAgIGlmIChpID09IGFyZ2MgLSAxKQorCQltYWluZXJyX2FyZ19taXNzaW5nKChjaGFyX3UgKilhcmd2W2ldKTsKKwkgICAgaWYgKFNUUk5JQ01QKGFyZ3ZbaSsxXSwgIjB4IiwgMikgPT0gMCkKKwkJY291bnQgPSBzc2NhbmYoJihhcmd2W2kgKyAxXVsyXSksICIleCIsICZzb2NrZXRfaWQpOworCSAgICBlbHNlCisJCWNvdW50ID0gc3NjYW5mKGFyZ3ZbaSsxXSwgIiV1IiwgJnNvY2tldF9pZCk7CisJICAgIGlmIChjb3VudCAhPSAxKQorCQltYWluZXJyKE1FX0lOVkFMSURfQVJHLCAoY2hhcl91ICopYXJndltpXSk7CisJICAgIGVsc2UKKwkJZ3RrX3NvY2tldF9pZCA9IHNvY2tldF9pZDsKKwkgICAgaSsrOworCX0KKwllbHNlIGlmIChTVFJJQ01QKGFyZ3ZbaV0sICItLWVjaG8td2lkIikgPT0gMCkKKwkgICAgZWNob193aWRfYXJnID0gVFJVRTsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEV4ZWN1dGUgdGhlIGNvbW1hbmRzIGZyb20gLS1jbWQgYXJndW1lbnRzICJjbWRzW2NudF0iLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4ZV9wcmVfY29tbWFuZHMoY21kcywgY250KQorICAgIGNoYXJfdQkqKmNtZHM7CisgICAgaW50CQljbnQ7Cit7CisgICAgaW50CQlpOworCisgICAgaWYgKGNudCA+IDApCisgICAgeworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IDA7IC8qIGp1c3QgaW4gY2FzZS4uICovCisJc291cmNpbmdfbmFtZSA9IChjaGFyX3UgKilfKCJwcmUtdmltcmMgY29tbWFuZCBsaW5lIik7CisjIGlmZGVmIEZFQVRfRVZBTAorCWN1cnJlbnRfU0lEID0gU0lEX0NNREFSRzsKKyMgZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgY250OyArK2kpCisJICAgIGRvX2NtZGxpbmVfY21kKGNtZHNbaV0pOworCXNvdXJjaW5nX25hbWUgPSBOVUxMOworIyBpZmRlZiBGRUFUX0VWQUwKKwljdXJyZW50X1NJRCA9IDA7CisjIGVuZGlmCisJVElNRV9NU0coIi0tY21kIGNvbW1hbmRzIik7CisgICAgfQorfQorCisvKgorICogU291cmNlIHN0YXJ0dXAgc2NyaXB0cy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzb3VyY2Vfc3RhcnR1cF9zY3JpcHRzKHBhcm1wKQorICAgIG1wYXJtX1QJKnBhcm1wOworeworICAgIGludAkJaTsKKworICAgIC8qCisgICAgICogRm9yICJldmltIiBzb3VyY2UgZXZpbS52aW0gZmlyc3Qgb2YgYWxsLCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBvdmVycnVsZQorICAgICAqIGFueSB0aGluZ3MgaGUgZG9lc24ndCBsaWtlLgorICAgICAqLworICAgIGlmIChwYXJtcC0+ZXZpbV9tb2RlKQorICAgIHsKKwkodm9pZClkb19zb3VyY2UoKGNoYXJfdSAqKUVWSU1fRklMRSwgRkFMU0UsIEZBTFNFKTsKKwlUSU1FX01TRygic291cmNlIGV2aW0gZmlsZSIpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgLXUgb3B0aW9uIGdpdmVuLCB1c2Ugb25seSB0aGUgaW5pdGlhbGl6YXRpb25zIGZyb20gdGhhdCBmaWxlIGFuZAorICAgICAqIG5vdGhpbmcgZWxzZS4KKyAgICAgKi8KKyAgICBpZiAocGFybXAtPnVzZV92aW1yYyAhPSBOVUxMKQorICAgIHsKKwlpZiAoU1RSQ01QKHBhcm1wLT51c2VfdmltcmMsICJOT05FIikgPT0gMCB8fCBTVFJDTVAocGFybXAtPnVzZV92aW1yYywgIk5PUkMiKSA9PSAwKQorCXsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICBpZiAodXNlX2d2aW1yYyA9PSBOVUxMKQkgICAgLyogZG9uJ3QgbG9hZCBndmltcmMgZWl0aGVyICovCisJCXVzZV9ndmltcmMgPSBwYXJtcC0+dXNlX3ZpbXJjOworI2VuZGlmCisJICAgIGlmIChwYXJtcC0+dXNlX3ZpbXJjWzJdID09ICdOJykKKwkJcF9scGwgPSBGQUxTRTsJCSAgICAvKiBkb24ndCBsb2FkIHBsdWdpbnMgZWl0aGVyICovCisJfQorCWVsc2UKKwl7CisJICAgIGlmIChkb19zb3VyY2UocGFybXAtPnVzZV92aW1yYywgRkFMU0UsIEZBTFNFKSAhPSBPSykKKwkJRU1TRzIoXygiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiKSwgcGFybXAtPnVzZV92aW1yYyk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmICghc2lsZW50X21vZGUpCisgICAgeworI2lmZGVmIEFNSUdBCisJc3RydWN0IFByb2Nlc3MJKnByb2MgPSAoc3RydWN0IFByb2Nlc3MgKilGaW5kVGFzaygwTCk7CisJQVBUUgkJc2F2ZV93aW5wdHIgPSBwcm9jLT5wcl9XaW5kb3dQdHI7CisKKwkvKiBBdm9pZCBhIHJlcXVlc3RlciBoZXJlIGZvciBhIHZvbHVtZSB0aGF0IGRvZXNuJ3QgZXhpc3QuICovCisJcHJvYy0+cHJfV2luZG93UHRyID0gKEFQVFIpLTFMOworI2VuZGlmCisKKwkvKgorCSAqIEdldCBzeXN0ZW0gd2lkZSBkZWZhdWx0cywgaWYgdGhlIGZpbGUgbmFtZSBpcyBkZWZpbmVkLgorCSAqLworI2lmZGVmIFNZU19WSU1SQ19GSUxFCisJKHZvaWQpZG9fc291cmNlKChjaGFyX3UgKilTWVNfVklNUkNfRklMRSwgRkFMU0UsIEZBTFNFKTsKKyNlbmRpZgorCisJLyoKKwkgKiBUcnkgdG8gcmVhZCBpbml0aWFsaXphdGlvbiBjb21tYW5kcyBmcm9tIHRoZSBmb2xsb3dpbmcgcGxhY2VzOgorCSAqIC0gZW52aXJvbm1lbnQgdmFyaWFibGUgVklNSU5JVAorCSAqIC0gdXNlciB2aW1yYyBmaWxlIChzOi52aW1yYyBmb3IgQW1pZ2EsIH4vLnZpbXJjIG90aGVyd2lzZSkKKwkgKiAtIHNlY29uZCB1c2VyIHZpbXJjIGZpbGUgKCRWSU0vLnZpbXJjIGZvciBEb3MpCisJICogLSBlbnZpcm9ubWVudCB2YXJpYWJsZSBFWElOSVQKKwkgKiAtIHVzZXIgZXhyYyBmaWxlIChzOi5leHJjIGZvciBBbWlnYSwgfi8uZXhyYyBvdGhlcndpc2UpCisJICogLSBzZWNvbmQgdXNlciBleHJjIGZpbGUgKCRWSU0vLmV4cmMgZm9yIERvcykKKwkgKiBUaGUgZmlyc3QgdGhhdCBleGlzdHMgaXMgdXNlZCwgdGhlIHJlc3QgaXMgaWdub3JlZC4KKwkgKi8KKwlpZiAocHJvY2Vzc19lbnYoKGNoYXJfdSAqKSJWSU1JTklUIiwgVFJVRSkgIT0gT0spCisJeworCSAgICBpZiAoZG9fc291cmNlKChjaGFyX3UgKilVU1JfVklNUkNfRklMRSwgVFJVRSwgVFJVRSkgPT0gRkFJTAorI2lmZGVmIFVTUl9WSU1SQ19GSUxFMgorCQkmJiBkb19zb3VyY2UoKGNoYXJfdSAqKVVTUl9WSU1SQ19GSUxFMiwgVFJVRSwgVFJVRSkgPT0gRkFJTAorI2VuZGlmCisjaWZkZWYgVVNSX1ZJTVJDX0ZJTEUzCisJCSYmIGRvX3NvdXJjZSgoY2hhcl91ICopVVNSX1ZJTVJDX0ZJTEUzLCBUUlVFLCBUUlVFKSA9PSBGQUlMCisjZW5kaWYKKwkJJiYgcHJvY2Vzc19lbnYoKGNoYXJfdSAqKSJFWElOSVQiLCBGQUxTRSkgPT0gRkFJTAorCQkmJiBkb19zb3VyY2UoKGNoYXJfdSAqKVVTUl9FWFJDX0ZJTEUsIEZBTFNFLCBGQUxTRSkgPT0gRkFJTCkKKwkgICAgeworI2lmZGVmIFVTUl9FWFJDX0ZJTEUyCisJCSh2b2lkKWRvX3NvdXJjZSgoY2hhcl91ICopVVNSX0VYUkNfRklMRTIsIEZBTFNFLCBGQUxTRSk7CisjZW5kaWYKKwkgICAgfQorCX0KKworCS8qCisJICogUmVhZCBpbml0aWFsaXphdGlvbiBjb21tYW5kcyBmcm9tICIudmltcmMiIG9yICIuZXhyYyIgaW4gY3VycmVudAorCSAqIGRpcmVjdG9yeS4gIFRoaXMgaXMgb25seSBkb25lIGlmIHRoZSAnZXhyYycgb3B0aW9uIGlzIHNldC4KKwkgKiBCZWNhdXNlIG9mIHNlY3VyaXR5IHJlYXNvbnMgd2UgZGlzYWxsb3cgc2hlbGwgYW5kIHdyaXRlIGNvbW1hbmRzCisJICogbm93LCBleGNlcHQgZm9yIHVuaXggaWYgdGhlIGZpbGUgaXMgb3duZWQgYnkgdGhlIHVzZXIgb3IgJ3NlY3VyZScKKwkgKiBvcHRpb24gaGFzIGJlZW4gcmVzZXQgaW4gZW52aXJvbm1lbnQgb2YgZ2xvYmFsICIuZXhyYyIgb3IgIi52aW1yYyIuCisJICogT25seSBkbyB0aGlzIGlmIFZJTVJDX0ZJTEUgaXMgbm90IHRoZSBzYW1lIGFzIFVTUl9WSU1SQ19GSUxFIG9yCisJICogU1lTX1ZJTVJDX0ZJTEUuCisJICovCisJaWYgKHBfZXhyYykKKwl7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKwkgICAgLyogSWYgIi52aW1yYyIgZmlsZSBpcyBub3Qgb3duZWQgYnkgdXNlciwgc2V0ICdzZWN1cmUnIG1vZGUuICovCisJICAgIGlmICghZmlsZV9vd25lZChWSU1SQ19GSUxFKSkKKyNlbmRpZgorCQlzZWN1cmUgPSBwX3NlY3VyZTsKKworCSAgICBpID0gRkFJTDsKKwkgICAgaWYgKGZ1bGxwYXRoY21wKChjaGFyX3UgKilVU1JfVklNUkNfRklMRSwKKwkJCQkgICAgICAoY2hhcl91ICopVklNUkNfRklMRSwgRkFMU0UpICE9IEZQQ19TQU1FCisjaWZkZWYgVVNSX1ZJTVJDX0ZJTEUyCisJCSAgICAmJiBmdWxscGF0aGNtcCgoY2hhcl91ICopVVNSX1ZJTVJDX0ZJTEUyLAorCQkJCSAgICAgIChjaGFyX3UgKilWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKKyNlbmRpZgorI2lmZGVmIFVTUl9WSU1SQ19GSUxFMworCQkgICAgJiYgZnVsbHBhdGhjbXAoKGNoYXJfdSAqKVVTUl9WSU1SQ19GSUxFMywKKwkJCQkgICAgICAoY2hhcl91ICopVklNUkNfRklMRSwgRkFMU0UpICE9IEZQQ19TQU1FCisjZW5kaWYKKyNpZmRlZiBTWVNfVklNUkNfRklMRQorCQkgICAgJiYgZnVsbHBhdGhjbXAoKGNoYXJfdSAqKVNZU19WSU1SQ19GSUxFLAorCQkJCSAgICAgIChjaGFyX3UgKilWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKKyNlbmRpZgorCQkJCSkKKwkJaSA9IGRvX3NvdXJjZSgoY2hhcl91ICopVklNUkNfRklMRSwgVFJVRSwgVFJVRSk7CisKKwkgICAgaWYgKGkgPT0gRkFJTCkKKwkgICAgeworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCisJCS8qIGlmICIuZXhyYyIgaXMgbm90IG93bmVkIGJ5IHVzZXIgc2V0ICdzZWN1cmUnIG1vZGUgKi8KKwkJaWYgKCFmaWxlX293bmVkKEVYUkNfRklMRSkpCisJCSAgICBzZWN1cmUgPSBwX3NlY3VyZTsKKwkJZWxzZQorCQkgICAgc2VjdXJlID0gMDsKKyNlbmRpZgorCQlpZiAoCSAgIGZ1bGxwYXRoY21wKChjaGFyX3UgKilVU1JfRVhSQ19GSUxFLAorCQkJCSAgICAgIChjaGFyX3UgKilFWFJDX0ZJTEUsIEZBTFNFKSAhPSBGUENfU0FNRQorI2lmZGVmIFVTUl9FWFJDX0ZJTEUyCisJCQkmJiBmdWxscGF0aGNtcCgoY2hhcl91ICopVVNSX0VYUkNfRklMRTIsCisJCQkJICAgICAgKGNoYXJfdSAqKUVYUkNfRklMRSwgRkFMU0UpICE9IEZQQ19TQU1FCisjZW5kaWYKKwkJCQkpCisJCSAgICAodm9pZClkb19zb3VyY2UoKGNoYXJfdSAqKUVYUkNfRklMRSwgRkFMU0UsIEZBTFNFKTsKKwkgICAgfQorCX0KKwlpZiAoc2VjdXJlID09IDIpCisJICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBUUlVFOworCXNlY3VyZSA9IDA7CisjaWZkZWYgQU1JR0EKKwlwcm9jLT5wcl9XaW5kb3dQdHIgPSBzYXZlX3dpbnB0cjsKKyNlbmRpZgorICAgIH0KKyAgICBUSU1FX01TRygic291cmNpbmcgdmltcmMgZmlsZShzKSIpOworfQorCisvKgogICogU2V0dXAgdG8gc3RhcnQgdXNpbmcgdGhlIEdVSS4gIEV4aXQgd2l0aCBhbiBlcnJvciB3aGVuIG5vdCBhdmFpbGFibGUuCiAgKi8KICAgICBzdGF0aWMgdm9pZApAQCAtMjY1Niw5ICsyNjk0LDcgQEAKICAgICBtYWluX21zZyhfKCItT1tOXVx0XHRMaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IikpOwogICAgIG1haW5fbXNnKF8oIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIpKTsKICAgICBtYWluX21zZyhfKCIrPGxudW0+XHRcdFN0YXJ0IGF0IGxpbmUgPGxudW0+IikpOwotI2lmZGVmIEZFQVRfUFJFQ09NTUFORFMKICAgICBtYWluX21zZyhfKCItLWNtZCA8Y29tbWFuZD5cdEV4ZWN1dGUgPGNvbW1hbmQ+IGJlZm9yZSBsb2FkaW5nIGFueSB2aW1yYyBmaWxlIikpOwotI2VuZGlmCiAgICAgbWFpbl9tc2coXygiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiKSk7CiAgICAgbWFpbl9tc2coXygiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIikpOwogICAgIG1haW5fbXNnKF8oIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iKSk7CmRpZmYgLS1naXQgYS9zcmMvbWlzYzIuYyBiL3NyYy9taXNjMi5jCmluZGV4IDg0MzRlYzYuLmRiNjY0MmUgMTAwNjQ0Ci0tLSBhL3NyYy9taXNjMi5jCisrKyBiL3NyYy9taXNjMi5jCkBAIC01NTU3LDgwICs1NTU3LDYgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChGRUFUX1BSSU5URVIpIHx8IGRlZmluZWQoUFJPVE8pCi0vKgotICogUGFyc2UgYSBsaXN0IG9mIG9wdGlvbnMgaW4gdGhlIGZvcm0KLSAqIG9wdGlvbjp2YWx1ZSxvcHRpb246dmFsdWUsb3B0aW9uOnZhbHVlCi0gKgotICogInZhbHVlIiBjYW4gc3RhcnQgd2l0aCBhIG51bWJlciB3aGljaCBpcyBwYXJzZWQgb3V0LCBlLmcuCi0gKiBtYXJnaW46MTJtbQotICoKLSAqIFJldHVybnMgZXJyb3IgbWVzc2FnZSBmb3IgYW4gaWxsZWdhbCBvcHRpb24sIE5VTEwgb3RoZXJ3aXNlLgotICogT25seSB1c2VkIGZvciB0aGUgcHJpbnRlciBhdCB0aGUgbW9tZW50Li4uCi0gKi8KLSAgICBjaGFyX3UgKgotcGFyc2VfbGlzdF9vcHRpb25zKG9wdGlvbl9zdHIsIHRhYmxlLCB0YWJsZV9zaXplKQotICAgIGNoYXJfdQkJKm9wdGlvbl9zdHI7Ci0gICAgb3B0aW9uX3RhYmxlX1QJKnRhYmxlOwotICAgIGludAkJCXRhYmxlX3NpemU7Ci17Ci0gICAgY2hhcl91CSpzdHJpbmdwOwotICAgIGNoYXJfdQkqY29sb25wOwotICAgIGNoYXJfdQkqY29tbWFwOwotICAgIGNoYXJfdQkqcDsKLSAgICBpbnQJCWlkeCA9IDA7CQkvKiBpbml0IGZvciBHQ0MgKi8KLSAgICBpbnQJCWxlbjsKLQotICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdGFibGVfc2l6ZTsgKytpZHgpCi0JdGFibGVbaWR4XS5wcmVzZW50ID0gRkFMU0U7Ci0KLSAgICAvKgotICAgICAqIFJlcGVhdCBmb3IgYWxsIGNvbW1hIHNlcGFyYXRlZCBwYXJ0cy4KLSAgICAgKi8KLSAgICBzdHJpbmdwID0gb3B0aW9uX3N0cjsKLSAgICB3aGlsZSAoKnN0cmluZ3ApCi0gICAgewotCWNvbG9ucCA9IHZpbV9zdHJjaHIoc3RyaW5ncCwgJzonKTsKLQlpZiAoY29sb25wID09IE5VTEwpCi0JICAgIHJldHVybiAoY2hhcl91ICopTl8oIkU1NTA6IE1pc3NpbmcgY29sb24iKTsKLQljb21tYXAgPSB2aW1fc3RyY2hyKHN0cmluZ3AsICcsJyk7Ci0JaWYgKGNvbW1hcCA9PSBOVUxMKQotCSAgICBjb21tYXAgPSBvcHRpb25fc3RyICsgU1RSTEVOKG9wdGlvbl9zdHIpOwotCi0JbGVuID0gKGludCkoY29sb25wIC0gc3RyaW5ncCk7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHRhYmxlX3NpemU7ICsraWR4KQotCSAgICBpZiAoU1RSTklDTVAoc3RyaW5ncCwgdGFibGVbaWR4XS5uYW1lLCBsZW4pID09IDApCi0JCWJyZWFrOwotCi0JaWYgKGlkeCA9PSB0YWJsZV9zaXplKQotCSAgICByZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIpOwotCi0JcCA9IGNvbG9ucCArIDE7Ci0JdGFibGVbaWR4XS5wcmVzZW50ID0gVFJVRTsKLQotCWlmICh0YWJsZVtpZHhdLmhhc251bSkKLQl7Ci0JICAgIGlmICghVklNX0lTRElHSVQoKnApKQotCQlyZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTUyOiBkaWdpdCBleHBlY3RlZCIpOwotCi0JICAgIHRhYmxlW2lkeF0ubnVtYmVyID0gZ2V0ZGlnaXRzKCZwKTsgLyphZHZhbmNlcyBwKi8KLQl9Ci0KLQl0YWJsZVtpZHhdLnN0cmluZyA9IHA7Ci0JdGFibGVbaWR4XS5zdHJsZW4gPSAoaW50KShjb21tYXAgLSBwKTsKLQotCXN0cmluZ3AgPSBjb21tYXA7Ci0JaWYgKCpzdHJpbmdwID09ICcsJykKLQkgICAgKytzdHJpbmdwOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLSNlbmRpZiAvKkZFQVRfUFJJTlRFUiovCi0KIC8qCiAgKiBUaGUgcHV0ZW52KCkgaW1wbGVtZW50YXRpb24gYmVsb3cgY29tZXMgZnJvbSB0aGUgInNjcmVlbiIgcHJvZ3JhbS4KICAqIEluY2x1ZGVkIHdpdGggcGVybWlzc2lvbiBmcm9tIEp1ZXJnZW4gV2VpZ2VydC4KZGlmZiAtLWdpdCBhL3NyYy9vcHRpb24uYyBiL3NyYy9vcHRpb24uYwppbmRleCAzMDM0MWQ2Li45NDBjNmU3IDEwMDY0NAotLS0gYS9zcmMvb3B0aW9uLmMKKysrIGIvc3JjL29wdGlvbi5jCkBAIC0zMjY5LDYgKzMyNjksMTYgQEAKIAl9CiAgICAgfQogI2VuZGlmCisKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKyAgICBwYXJzZV9zaGFwZV9vcHQoU0hBUEVfQ1VSU09SKTsgLyogc2V0IGN1cnNvciBzaGFwZXMgZnJvbSAnZ3VpY3Vyc29yJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisgICAgcGFyc2Vfc2hhcGVfb3B0KFNIQVBFX01PVVNFKTsgIC8qIHNldCBtb3VzZSBzaGFwZXMgZnJvbSAnbW91c2VzaGFwZScgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfUFJJTlRFUgorICAgICh2b2lkKXBhcnNlX3ByaW50b3B0aW9ucygpOwkgICAgLyogcGFyc2UgJ3ByaW50b3B0aW9ucycgZGVmYXVsdCB2YWx1ZSAqLworI2VuZGlmCiB9CiAKIC8qCkBAIC01NTk4LDEzICs1NjA4LDEwIEBACiAKICNpZmRlZiBGRUFUX1BSSU5URVIKICAgICBlbHNlIGlmICh2YXJwID09ICZwX3BvcHQpCi0JZXJybXNnID0gcGFyc2VfbGlzdF9vcHRpb25zKHBfcG9wdCwgcHJpbnRlcl9vcHRzLAotCQkJCQkJICAgICAgIE9QVF9QUklOVF9OVU1fT1BUSU9OUyk7Ci0KKwllcnJtc2cgPSBwYXJzZV9wcmludG9wdGlvbnMoKTsKICMgaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkKICAgICBlbHNlIGlmICh2YXJwID09ICZwX3BtZm4pCi0JZXJybXNnID0gcGFyc2VfbGlzdF9vcHRpb25zKHBfcG1mbiwgbWJmb250X29wdHMsCi0JCQkJCQkgICAgICBPUFRfTUJGT05UX05VTV9PUFRJT05TKTsKKwllcnJtc2cgPSBwYXJzZV9wcmludG1iZm9udCgpOwogIyBlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy9vc19tc3dpbi5jIGIvc3JjL29zX21zd2luLmMKaW5kZXggY2U0NDIwYi4uNmQwNDMyNiAxMDA2NDQKLS0tIGEvc3JjL29zX21zd2luLmMKKysrIGIvc3JjL29zX21zd2luLmMKQEAgLTIzNTcsNiArMjM1Nyw4IEBACiAKICNlbmRpZiAvKkZFQVRfUFJJTlRFUiAmJiAhRkVBVF9QT1NUU0NSSVBUKi8KIAorCisKICNpZiBkZWZpbmVkKEZFQVRfU0hPUlRDVVQpIHx8IGRlZmluZWQoUFJPVE8pCiAjIGluY2x1ZGUgPHNobG9iai5oPgogCmRpZmYgLS1naXQgYS9zcmMvcG8vTWFrZWZpbGUgYi9zcmMvcG8vTWFrZWZpbGUKaW5kZXggNzMyMGE2MC4uNjE3ZDRmOSAxMDA2NDQKLS0tIGEvc3JjL3BvL01ha2VmaWxlCisrKyBiL3NyYy9wby9NYWtlZmlsZQpAQCAtNTIsOCArNTIsNDkgQEAKIAkJemhfVFcuVVRGLTgubW8gXAogCQl6aF9UVy5tbyBcCiAKK0NPTlZFUlRFRCA9IFwKKwkJY3MuY3AxMjUwLm1vIFwKKwkJamEuc2ppcy5tbyBcCisJCXBsLmNwMTI1MC5tbyBcCisJCXJ1LmNwMTI1MS5tbyBcCisJCXNrLmNwMTI1MC5tbyBcCisJCXVrLmNwMTI1MS5tbyBcCisJCXpoX0NOLmNwOTM2Lm1vIFwKKworQ0hFQ0tGSUxFUyA9IFwKKwkJYWYuY2sgXAorCQljYS5jayBcCisJCWNzLmNrIFwKKwkJZGUuY2sgXAorCQllbl9HQi5jayBcCisJCWVzLmNrIFwKKwkJZnIuY2sgXAorCQlnYS5jayBcCisJCWl0LmNrIFwKKwkJamEuY2sgXAorCQlrby5jayBcCisJCW5vLmNrIFwKKwkJcGwuY2sgXAorCQlydS5jayBcCisJCXNrLmNrIFwKKwkJc3YuY2sgXAorCQl1ay5jayBcCisJCXZpLmNrIFwKKwkJemhfQ04uVVRGLTguY2sgXAorCQl6aF9DTi5jayBcCisJCXpoX1RXLlVURi04LmNrIFwKKwkJemhfVFcuY2sgXAorCQljcy5jcDEyNTAuY2sgXAorCQlqYS5zamlzLmNrIFwKKwkJcGwuY3AxMjUwLmNrIFwKKwkJcnUuY3AxMjUxLmNrIFwKKwkJc2suY3AxMjUwLmNrIFwKKwkJdWsuY3AxMjUxLmNrIFwKKwkJemhfQ04uY3A5MzYuY2sgXAorCiBQQUNLQUdFID0gdmltCiBTSEVMTCA9IC9iaW4vc2gKK1ZJTSA9IC4uL3ZpbQogCiAjIFRoZSBPTERfUE9fRklMRV9JTlBVVCBhbmQgT0xEX1BPX0ZJTEVfT1VUUFVUIGFyZSBmb3IgdGhlIG5ldyBHTlUgZ2V0dGV4dAogIyB0b29scyAwLjEwLjM3LCB3aGljaCB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQgLnBvIGZpbGUgZm9ybWF0IHRoYXQgaXMgbm90CkBAIC02NCwxNiArMTA1LDIyIEBACiBNU0dNRVJHRSA9IE9MRF9QT19GSUxFX0lOUFVUPXllcyBPTERfUE9fRklMRV9PVVRQVVQ9eWVzIG1zZ21lcmdlCiAKIC5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLnBvIC5tbyAucG90Ci0uUEhPTlk6IGFsbCBpbnN0YWxsIHVuaW5zdGFsbCBjaGVjayBjbGVhbiBkaXN0Y2xlYW4gJChMQU5HVUFHRVMpCisuU1VGRklYRVM6IC5wbyAubW8gLnBvdCAuY2sKKy5QSE9OWTogYWxsIGluc3RhbGwgdW5pbnN0YWxsIHByZWZpeGNoZWNrIGNoZWNrIGNsZWFuIGRpc3RjbGVhbiAkKExBTkdVQUdFUykKIAogLnBvLm1vOgogCSQoTVNHRk1UKSAtbyAkQCAkPAogCisucG8uY2s6CisJJChWSU0pIC11IE5PTkUgLWUgLVMgY2hlY2sudmltIC1jICJpZiBlcnJvciA9PSAwIHwgcSB8IGVuZGlmIiAtYyBjcSAkPAorCXRvdWNoICRACisKIGFsbDogJChNT0ZJTEVTKQogCitjaGVjazogJChDSEVDS0ZJTEVTKQorCiBpbnN0YWxsOiAkKE1PRklMRVMpCi0JQCQoTUFLRSkgY2hlY2sKKwlAJChNQUtFKSBwcmVmaXhjaGVjawogCWZvciBsYW5nIGluICQoTEFOR1VBR0VTKTsgZG8gXAogCSAgZGlyPSQoTE9DQUxFRElSKS8kJGxhbmcvOyBcCiAJICBpZiB0ZXN0ICEgLXggIiQkZGlyIjsgdGhlbiBcCkBAIC05MCwyMSArMTM3LDE0IEBACiAJZG9uZQogCiB1bmluc3RhbGw6Ci0JQCQoTUFLRSkgY2hlY2sKKwlAJChNQUtFKSBwcmVmaXhjaGVjawogCWZvciBjYXQgaW4gJChNT0ZJTEVTKTsgZG8gXAogCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKIAkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAogCSAgcm0gLWYgJChMT0NBTEVESVIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpLm1vOyBcCiAJZG9uZQogCi1jb252ZXJ0ZWQ6IFwKLQkJY3MuY3AxMjUwLm1vIFwKLQkJamEuc2ppcy5tbyBcCi0JCXBsLmNwMTI1MC5tbyBcCi0JCXJ1LmNwMTI1MS5tbyBcCi0JCXNrLmNwMTI1MC5tbyBcCi0JCXVrLmNwMTI1MS5tbyBcCi0JCXpoX0NOLmNwOTM2Lm1vIFwKK2NvbnZlcnRlZDogJChDT05WRVJURUQpCiAKICMgQ29udmVydCBqYS5wbyB0byBjcmVhdGUgamEuc2ppcy5wby4gIFJlcXVpcmVzIGRvdWJsaW5nIGJhY2tzbGFzaGVzIGluIHRoZQogIyBzZWNvbmQgYnl0ZS4gIERvbid0IGRlcGVuZCBvbiBzamlzY29yciwgaXQgc2hvdWxkIG9ubHkgYmUgY29tcGlsZWQgd2hlbgpAQCAtMTU0LDcgKzE5NCw3IEBACiAJaWNvbnYgLWYga29pOC11IC10IGNwMTI1MSB1ay5wbyB8IFwKIAkJc2VkIC1lICdzL2NoYXJzZXQ9a29pOC11L2NoYXJzZXQ9Y3AxMjUxLycgLWUgJ3MvIyBPcmlnaW5hbCB0cmFuc2xhdGlvbnMvIyBHZW5lcmF0ZWQgZnJvbSB1ay5wbywgRE8gTk9UIEVESVQvJyA+IHVrLmNwMTI1MS5wbwogCi1jaGVjazoKK3ByZWZpeGNoZWNrOgogCUBpZiB0ZXN0ICJ4IiA9ICJ4JChwcmVmaXgpIjsgdGhlbiBcCiAJICBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOyBcCiAJICBlY2hvICIgIHBsZWFzZSB1c2UgbWFrZSBmcm9tIHRoZSBzcmMgZGlyZWN0b3J5ICAiOyBcCkBAIC0xNjMsNyArMjAzLDcgQEAKIAlmaQogCiBjbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLm9sZC5wbyAqLm1vICoucG90IHNqaXNjb3JyCisJcm0gLWYgY29yZSBjb3JlLiogKi5vbGQucG8gKi5tbyAqLmNrICoucG90IHNqaXNjb3JyCiAKIGRpc3RjbGVhbjogY2xlYW4KIApkaWZmIC0tZ2l0IGEvc3JjL3BvL1JFQURNRS50eHQgYi9zcmMvcG8vUkVBRE1FLnR4dAppbmRleCBiMDIzZWYzLi4zMGFmZDllIDEwMDY0NAotLS0gYS9zcmMvcG8vUkVBRE1FLnR4dAorKysgYi9zcmMvcG8vUkVBRE1FLnR4dApAQCAtOTksNiArOTksNyBAQAogCiAoNCkgQ2hlY2s6CiAKKwl2aW0gLVMgY2hlY2sudmltIHh4LnBvCiAJbWFrZSB4eC5tbwogCiAgICAgTG9vayBvdXQgZm9yIHN5bnRheCBlcnJvcnMgYW5kIGZpeCB0aGVtLgpkaWZmIC0tZ2l0IGEvc3JjL3BvL1JFQURNRV9taW5ndy50eHQgYi9zcmMvcG8vUkVBRE1FX21pbmd3LnR4dAppbmRleCA3YmE5OGU2Li4yNjdkZjI0IDEwMDY0NAotLS0gYS9zcmMvcG8vUkVBRE1FX21pbmd3LnR4dAorKysgYi9zcmMvcG8vUkVBRE1FX21pbmd3LnR4dApAQCAtNzQsNiArNzQsNyBAQAogCiAoNCkgQ2hlY2s6CiAKKwl2aW0gLVMgY2hlY2sudmltIHh4LnBvCiAJbWFrZSAtZiBNYWtlX21pbmcubWFrIHh4Lm1vCiAKICAgICBMb29rIG91dCBmb3Igc3ludGF4IGVycm9ycyBhbmQgZml4IHRoZW0uCmRpZmYgLS1naXQgYS9zcmMvcG8vY3MuY3AxMjUwLnBvIGIvc3JjL3BvL2NzLmNwMTI1MC5wbwppbmRleCAwNDM3MGRjLi45OWE0NTAyIDEwMDY0NAotLS0gYS9zcmMvcG8vY3MuY3AxMjUwLnBvCisrKyBiL3NyYy9wby9jcy5jcDEyNTAucG8KQEAgLTIzNTEsMTIgKzIzNTEsMTIgQEAKICM6IGlmX3B5dGhvbi5jOjE4MjQKICMsIGMtZm9ybWF0CiBtc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKLW1zZ3N0ciAiPG9iamVrdCBva25hIChzbWF64W4pIG5hICU4bFg+IgorbXNnc3RyICI8b2JqZWt0IG9rbmEgKHNtYXrhbikgbmEgJS44bFg+IgogCiAjOiBpZl9weXRob24uYzoxODM2CiAjLCBjLWZvcm1hdAogbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCi1tc2dzdHIgIjxvYmpla3Qgb2tuYSAobmV6buFt/SkgbmEgJThsWD4iCittc2dzdHIgIjxvYmpla3Qgb2tuYSAobmV6buFt/SkgbmEgJS44bFg+IgogCiAjOiBpZl9weXRob24uYzoxODM4CiAjLCBjLWZvcm1hdApkaWZmIC0tZ2l0IGEvc3JjL3BvL2NzLnBvIGIvc3JjL3BvL2NzLnBvCmluZGV4IGUzOGM2NjUuLmQ2ZTgxZDEgMTAwNjQ0Ci0tLSBhL3NyYy9wby9jcy5wbworKysgYi9zcmMvcG8vY3MucG8KQEAgLTIzNTEsMTIgKzIzNTEsMTIgQEAKICM6IGlmX3B5dGhvbi5jOjE4MjQKICMsIGMtZm9ybWF0CiBtc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKLW1zZ3N0ciAiPG9iamVrdCBva25hIChzbWF64W4pIG5hICU4bFg+IgorbXNnc3RyICI8b2JqZWt0IG9rbmEgKHNtYXrhbikgbmEgJS44bFg+IgogCiAjOiBpZl9weXRob24uYzoxODM2CiAjLCBjLWZvcm1hdAogbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCi1tc2dzdHIgIjxvYmpla3Qgb2tuYSAobmV6buFt/SkgbmEgJThsWD4iCittc2dzdHIgIjxvYmpla3Qgb2tuYSAobmV6buFt/SkgbmEgJS44bFg+IgogCiAjOiBpZl9weXRob24uYzoxODM4CiAjLCBjLWZvcm1hdApkaWZmIC0tZ2l0IGEvc3JjL3BvL3VrLmNwMTI1MS5wbyBiL3NyYy9wby91ay5jcDEyNTEucG8KaW5kZXggNWRmOWIxOC4uMGNhYjEyMSAxMDA2NDQKLS0tIGEvc3JjL3BvL3VrLmNwMTI1MS5wbworKysgYi9zcmMvcG8vdWsuY3AxMjUxLnBvCkBAIC03MjksNyArNzI5LDcgQEAKIAogIzogZXhfY21kczIuYzoyOTEzCiBtc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCi1tc2dzdHIgIsTw8+rzuvL88f8g8fLu8LPt6uAgJWQgKCVkKSIKK21zZ3N0ciAixPDz6vO68vzx/yDx8u7ws+3q4CAlZCAoJWQlJSkiCiAKICM6IGV4X2NtZHMyLmM6MjkyMgogIywgYy1mb3JtYXQKQEAgLTg5NCw3ICs4OTQsNyBAQAogIzogZXhfY21kcy5jOjIyNDQKICMsIGMtZm9ybWF0CiBtc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgotbXNnc3RyICLP5fDl5+Dv6PHg8uggs/Ht8/736Okg9ODp6yBcIiUqLnNcIj8iCittc2dzdHIgIs/l8OXn4O/o8eDy6CCz8e3z/vfo6SD04OnrIFwiJS4qc1wiPyIKIAogIzogZXhfY21kcy5jOjIzMTUKICMsIGMtZm9ybWF0CmRpZmYgLS1naXQgYS9zcmMvcG8vdWsucG8gYi9zcmMvcG8vdWsucG8KaW5kZXggZjgyMjNkMy4uOTJiM2IyZSAxMDA2NDQKLS0tIGEvc3JjL3BvL3VrLnBvCisrKyBiL3NyYy9wby91ay5wbwpAQCAtNzI5LDcgKzcyOSw3IEBACiAKICM6IGV4X2NtZHMyLmM6MjkxMwogbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgotbXNnc3RyICLk0tXL1aTU2NPRINPUz9KmzsvBICVkICglZCkiCittc2dzdHIgIuTS1cvVpNTY09Eg09TP0qbOy8EgJWQgKCVkJSUpIgogCiAjOiBleF9jbWRzMi5jOjI5MjIKICMsIGMtZm9ybWF0CkBAIC04OTQsNyArODk0LDcgQEAKICM6IGV4X2NtZHMuYzoyMjQ0CiAjLCBjLWZvcm1hdAogbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKLW1zZ3N0ciAi8MXSxdrB0MnTwdTJIKbTztXA3snKIMbByswgXCIlKi5zXCI/IgorbXNnc3RyICLwxdLF2sHQydPB1MkgptPO1cDeycogxsHKzCBcIiUuKnNcIj8iCiAKICM6IGV4X2NtZHMuYzoyMzE1CiAjLCBjLWZvcm1hdApkaWZmIC0tZ2l0IGEvc3JjL3BvL3poX0NOLlVURi04LnBvIGIvc3JjL3BvL3poX0NOLlVURi04LnBvCmluZGV4IDk1NmE4MmEuLmI2MzQxNmEgMTAwNjQ0Ci0tLSBhL3NyYy9wby96aF9DTi5VVEYtOC5wbworKysgYi9zcmMvcG8vemhfQ04uVVRGLTgucG8KQEAgLTIxMTgsNyArMjExOCw3IEBACiAjOiBpZl9jc2NvcGUuYzoyNgogIywgYy1mb3JtYXQKIG1zZ2lkICJVc2FnZTogY3NbY29wZV0gJXMiCi1tc2dzdHIgIiIKK21zZ3N0ciAiVXNhZ2U6IGNzW2NvcGVdICVzIgogCiAjOiBpZl9jc2NvcGUuYzo2NwogbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKZGlmZiAtLWdpdCBhL3NyYy9wby96aF9DTi5jcDkzNi5wbyBiL3NyYy9wby96aF9DTi5jcDkzNi5wbwppbmRleCA1M2U2Y2JjLi40ZjkxMDJmIDEwMDY0NAotLS0gYS9zcmMvcG8vemhfQ04uY3A5MzYucG8KKysrIGIvc3JjL3BvL3poX0NOLmNwOTM2LnBvCkBAIC0yMTE4LDcgKzIxMTgsNyBAQAogIzogaWZfY3Njb3BlLmM6MjYKICMsIGMtZm9ybWF0CiBtc2dpZCAiVXNhZ2U6IGNzW2NvcGVdICVzIgotbXNnc3RyICIiCittc2dzdHIgIlVzYWdlOiBjc1tjb3BlXSAlcyIKIAogIzogaWZfY3Njb3BlLmM6NjcKIG1zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCmRpZmYgLS1naXQgYS9zcmMvcG8vemhfQ04ucG8gYi9zcmMvcG8vemhfQ04ucG8KaW5kZXggMjhmYjVhZC4uYTA0OWVhYiAxMDA2NDQKLS0tIGEvc3JjL3BvL3poX0NOLnBvCisrKyBiL3NyYy9wby96aF9DTi5wbwpAQCAtMjExOCw3ICsyMTE4LDcgQEAKICM6IGlmX2NzY29wZS5jOjI2CiAjLCBjLWZvcm1hdAogbXNnaWQgIlVzYWdlOiBjc1tjb3BlXSAlcyIKLW1zZ3N0ciAiIgorbXNnc3RyICJVc2FnZTogY3NbY29wZV0gJXMiCiAKICM6IGlmX2NzY29wZS5jOjY3CiBtc2dpZCAiQWRkIGEgbmV3IGRhdGFiYXNlIgpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvLmggYi9zcmMvcHJvdG8uaAppbmRleCBlMjRlYmI0Li4xMTAyNDMyIDEwMDY0NAotLS0gYS9zcmMvcHJvdG8uaAorKysgYi9zcmMvcHJvdG8uaApAQCAtOTIsNiArOTIsNyBAQAogIyBpZmRlZiBGRUFUX0hBTkdVTElOCiAjICBpbmNsdWRlICJoYW5ndWxpbi5wcm8iCiAjIGVuZGlmCisjIGluY2x1ZGUgImhhcmRjb3B5LnBybyIKICMgaW5jbHVkZSAiaGFzaHRhYmxlLnBybyIKICMgaW5jbHVkZSAibWFpbi5wcm8iCiAjIGluY2x1ZGUgIm1hcmsucHJvIgpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2V4X2NtZHMyLnBybyBiL3NyYy9wcm90by9leF9jbWRzMi5wcm8KaW5kZXggMzVjY2MyMC4uODhmYTM1MiAxMDA2NDQKLS0tIGEvc3JjL3Byb3RvL2V4X2NtZHMyLnBybworKysgYi9zcmMvcHJvdG8vZXhfY21kczIucHJvCkBAIC03NSwyMyArNzUsNiBAQAogdm9pZCBkb19maW5pc2ggX19BUkdTKChleGFyZ19UICplYXAsIGludCByZWFuaW1hdGUpKTsKIGludCBzb3VyY2VfZmluaXNoZWQgX19BUkdTKChjaGFyX3UgKigqZ2V0bGluZSkoaW50LCB2b2lkICosIGludCksIHZvaWQgKmNvb2tpZSkpOwogdm9pZCBleF9jaGVja3RpbWUgX19BUkdTKChleGFyZ19UICplYXApKTsKLWludCBnZXRfcHJpbnRlcl9wYWdlX251bSBfX0FSR1MoKHZvaWQpKTsKLWludCBwcnRfaGVhZGVyX2hlaWdodCBfX0FSR1MoKHZvaWQpKTsKLWludCBwcnRfdXNlX251bWJlciBfX0FSR1MoKHZvaWQpKTsKLWludCBwcnRfZ2V0X3VuaXQgX19BUkdTKChpbnQgaWR4KSk7Ci12b2lkIGV4X2hhcmRjb3B5IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Ci12b2lkIG1jaF9wcmludF9jbGVhbnVwIF9fQVJHUygodm9pZCkpOwotaW50IG1jaF9wcmludF9pbml0IF9fQVJHUygocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncywgY2hhcl91ICpqb2JuYW1lLCBpbnQgZm9yY2VpdCkpOwotaW50IG1jaF9wcmludF9iZWdpbiBfX0FSR1MoKHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MpKTsKLXZvaWQgbWNoX3ByaW50X2VuZCBfX0FSR1MoKHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MpKTsKLWludCBtY2hfcHJpbnRfZW5kX3BhZ2UgX19BUkdTKCh2b2lkKSk7Ci1pbnQgbWNoX3ByaW50X2JlZ2luX3BhZ2UgX19BUkdTKChjaGFyX3UgKnN0cikpOwotaW50IG1jaF9wcmludF9ibGFua19wYWdlIF9fQVJHUygodm9pZCkpOwotdm9pZCBtY2hfcHJpbnRfc3RhcnRfbGluZSBfX0FSR1MoKGludCBtYXJnaW4sIGludCBwYWdlX2xpbmUpKTsKLWludCBtY2hfcHJpbnRfdGV4dF9vdXQgX19BUkdTKChjaGFyX3UgKnAsIGludCBsZW4pKTsKLXZvaWQgbWNoX3ByaW50X3NldF9mb250IF9fQVJHUygoaW50IGlCb2xkLCBpbnQgaUl0YWxpYywgaW50IGlVbmRlcmxpbmUpKTsKLXZvaWQgbWNoX3ByaW50X3NldF9iZyBfX0FSR1MoKGxvbmdfdSBiZ2NvbCkpOwotdm9pZCBtY2hfcHJpbnRfc2V0X2ZnIF9fQVJHUygobG9uZ191IGZnY29sKSk7CiBjaGFyX3UgKmdldF9tZXNzX2xhbmcgX19BUkdTKCh2b2lkKSk7CiB2b2lkIHNldF9sYW5nX3ZhciBfX0FSR1MoKHZvaWQpKTsKIHZvaWQgZXhfbGFuZ3VhZ2UgX19BUkdTKChleGFyZ19UICplYXApKTsKZGlmZiAtLWdpdCBhL3NyYy9wcm90by9taXNjMi5wcm8gYi9zcmMvcHJvdG8vbWlzYzIucHJvCmluZGV4IDNmNmUyZWQuLjgwZDE3ODkgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by9taXNjMi5wcm8KKysrIGIvc3JjL3Byb3RvL21pc2MyLnBybwpAQCAtOTMsNyArOTMsNiBAQAogaW50IGdldF91c2VyX25hbWUgX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IGxlbikpOwogdm9pZCBzb3J0X3N0cmluZ3MgX19BUkdTKChjaGFyX3UgKipmaWxlcywgaW50IGNvdW50KSk7CiBpbnQgcGF0aGNtcCBfX0FSR1MoKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnEsIGludCBtYXhsZW4pKTsKLWNoYXJfdSAqcGFyc2VfbGlzdF9vcHRpb25zIF9fQVJHUygoY2hhcl91ICpvcHRpb25fc3RyLCBvcHRpb25fdGFibGVfVCAqdGFibGUsIGludCB0YWJsZV9zaXplKSk7CiBpbnQgZmlsZXdyaXRhYmxlIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOwogaW50IGVtc2czIF9fQVJHUygoY2hhcl91ICpzLCBjaGFyX3UgKmExLCBjaGFyX3UgKmEyKSk7CiBpbnQgZW1zZ24gX19BUkdTKChjaGFyX3UgKnMsIGxvbmcgbikpOwpkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uaCBiL3NyYy92ZXJzaW9uLmgKaW5kZXggM2JiZThlYy4uZGIxYmEwMyAxMDA2NDQKLS0tIGEvc3JjL3ZlcnNpb24uaAorKysgYi9zcmMvdmVyc2lvbi5oCkBAIC0zNiw1ICszNiw1IEBACiAjZGVmaW5lIFZJTV9WRVJTSU9OX05PRE9UCSJ2aW03MGFhIgogI2RlZmluZSBWSU1fVkVSU0lPTl9TSE9SVAkiNy4wYWEiCiAjZGVmaW5lIFZJTV9WRVJTSU9OX01FRElVTQkiNy4wYWEgQUxQSEEiCi0jZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkcJIlZJTSAtIFZpIElNcHJvdmVkIDcuMGFhIEFMUEhBICgyMDA1IEp1bCAyMikiCi0jZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkdfREFURQkiVklNIC0gVmkgSU1wcm92ZWQgNy4wYWEgQUxQSEEgKDIwMDUgSnVsIDIyLCBjb21waWxlZCAiCisjZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkcJIlZJTSAtIFZpIElNcHJvdmVkIDcuMGFhIEFMUEhBICgyMDA1IEp1bCAyMykiCisjZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkdfREFURQkiVklNIC0gVmkgSU1wcm92ZWQgNy4wYWEgQUxQSEEgKDIwMDUgSnVsIDIzLCBjb21waWxlZCAiCg==