ZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hlYXBtb2R1bGUuYyBiL01vZHVsZXMvX2hlYXBtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU1ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9faGVhcG1vZHVsZS5jCkBAIC0wLDAgKzEsMzY0IEBACisvKiBEcm9wIGluIHJlcGxhY2VtZW50IGZvciBoZWFwcS5weSAKKworQyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGRpcmVjdGx5IGZyb20gaGVhcHEucHkgaW4gUHkyLjMKK3doaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywKK2Fubm90YXRlZCBieSBGcmFu529pcyBQaW5hcmQsIGFuZCBjb252ZXJ0ZWQgdG8gQyBieSBSYXltb25kIEhldHRpbmdlci4KKworKi8KKworI2luY2x1ZGUgIlB5dGhvbi5oIgorCitzdGF0aWMgaW50Citfc2lmdGRvd24oUHlMaXN0T2JqZWN0ICpoZWFwLCBpbnQgc3RhcnRwb3MsIGludCBwb3MpCit7CisJUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CisJaW50IGNtcCwgcGFyZW50cG9zOworCisJYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CisJaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKwlQeV9JTkNSRUYobmV3aXRlbSk7CisJLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKKwkgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KKwl3aGlsZSAocG9zID4gc3RhcnRwb3MpeworCQlwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKKwkJcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CisJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChwYXJlbnQsIG5ld2l0ZW0sIFB5X0xFKTsKKwkJaWYgKGNtcCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGNtcCA9PSAxKQorCQkJYnJlYWs7CisJCVB5X0lOQ1JFRihwYXJlbnQpOworCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOworCQlwb3MgPSBwYXJlbnRwb3M7CisJfQorCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19zaWZ0dXAoUHlMaXN0T2JqZWN0ICpoZWFwLCBpbnQgcG9zKQoreworCWludCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7CisJaW50IGNtcDsKKwlQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKKworCWFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworCWVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKKwlzdGFydHBvcyA9IHBvczsKKwlpZiAocG9zID49IGVuZHBvcykgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworCQlyZXR1cm4gLTE7CisJfQorCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKwlQeV9JTkNSRUYobmV3aXRlbSk7CisKKwkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCisJY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLworCXdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykgeworCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLworCQlyaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKKwkJaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7CisJCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCisJCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSwKKwkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpLAorCQkJCVB5X0xFKTsKKwkJCWlmIChjbXAgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGNtcCA9PSAxKQorCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7CisJCX0KKwkJLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KKwkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKKwkJUHlfSU5DUkVGKHRtcCk7CisJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisJCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7CisJCXBvcyA9IGNoaWxkcG9zOworCQljaGlsZHBvcyA9IDIqcG9zICsgMTsKKwl9CisKKwkvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBhbmQgYnViYmxlCisJICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCisJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKwlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKKwlyZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgoraGVhcHB1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCVB5T2JqZWN0ICpoZWFwLCAqaXRlbTsKKworCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBpdGVtKSA9PSAtMSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoX3NpZnRkb3duKChQeUxpc3RPYmplY3QgKiloZWFwLCAwLCBQeUxpc3RfR0VUX1NJWkUoaGVhcCktMSkgPT0gLTEpCisJCXJldHVybiBOVUxMOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKK30KKworUHlEb2NfU1RSVkFSKGhlYXBwdXNoX2RvYywKKyJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKK3sKKwlQeU9iamVjdCAqbGFzdGVsdCwgKnJldHVybml0ZW07CisJaW50IG47CisKKwlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkgKi8KKwluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworCWlmIChuID09IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGFzdGVsdCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBuLTEpIDsKKwlQeV9JTkNSRUYobGFzdGVsdCk7CisJUHlMaXN0X1NldFNsaWNlKGhlYXAsIG4tMSwgbiwgTlVMTCk7CisJbi0tOworCisJaWYgKCFuKSAKKwkJcmV0dXJuIGxhc3RlbHQ7CisJcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKwlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgbGFzdGVsdCk7CisJaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CisJCVB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiByZXR1cm5pdGVtOworfQorCitQeURvY19TVFJWQVIoaGVhcHBvcF9kb2MsCisiUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIpOworCitzdGF0aWMgUHlPYmplY3QgKgoraGVhcHJlcGxhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCVB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07CisKKwlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA8IDEpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKwlQeV9JTkNSRUYoaXRlbSk7CisJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOworCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworCQlQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcmV0dXJuaXRlbTsKK30KKworUHlEb2NfU1RSVkFSKGhlYXByZXBsYWNlX2RvYywKKyJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXG5cCitcblwKK1RoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxuXAorbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXAorcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXG5cCit0aGlzIHJvdXRpbmUuXG4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK2hlYXBpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpoZWFwKQoreworCWludCBpLCBuOworCisJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKKwkvKiBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8KKwkgICBsb29raW5nIGF0IGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdAorCSAgIGhhdmUgMippICsgMSA8IG4sIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzCisJICAgKDIqai0xKS8yID0gai0xLzIgc28gai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmCisJICAgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LAorCSAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgorCSovCisJZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKKwkJaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCisJCQlyZXR1cm4gTlVMTDsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJcmV0dXJuIFB5X05vbmU7Cit9CisKK1B5RG9jX1NUUlZBUihoZWFwaWZ5X2RvYywKKyJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKGhlYXApKSB0aW1lLiIpOworCitzdGF0aWMgUHlNZXRob2REZWYgaGVhcHFfbWV0aG9kc1tdID0geworCXsiaGVhcHB1c2giLAkoUHlDRnVuY3Rpb24paGVhcHB1c2gsCQkKKwkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaF9kb2N9LAorCXsiaGVhcHBvcCIsCShQeUNGdW5jdGlvbiloZWFwcG9wLAorCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCisJeyJoZWFwcmVwbGFjZSIsCShQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKKwkJTUVUSF9WQVJBUkdTLAloZWFwcmVwbGFjZV9kb2N9LAorCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAorCQlNRVRIX08sCQloZWFwaWZ5X2RvY30sCisJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KK307CisKK1B5RG9jX1NUUlZBUihtb2R1bGVfZG9jLAorIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxuXAorXG5cCitIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvclxuXAorYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxuXAorbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCitwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC5cblwKK1xuXAorVXNhZ2U6XG5cCitcblwKK2hlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXG5cCitoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cCitpdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcFxuXAoraXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxuXAoraGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXAoraXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkc1xuXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXG5cCitcblwKK091ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOlxuXAorXG5cCistIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cCisgIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzc1xuXAorICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxuXAorXG5cCistIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC5cblwKK1xuXAorVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwKK3dpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KClcblwKK21haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXG4iKTsKKworCitQeURvY19TVFJWQVIoX19hYm91dF9fLAorIkhlYXAgcXVldWVzXG5cCitcblwKK1tleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdXG5cCitcblwKK0hlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCithbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXG5cCitub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcblwKK3Byb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuIgorIlxuXAorVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcblwKK3JlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXTpcblwKK1xuXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG5cCitcblwKKyAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXG5cCitcblwKKyAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNlxuXAorXG5cCisgICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XG5cCitcblwKKyAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXG5cCitcblwKK1xuXAorSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cblwKK2FuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cCitvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWVcblwKK3RvIHNlZSBhbGwgb3Bwb25lbnRzIHMvaGUgaGFkLiAgSG93ZXZlciwgaW4gbWFueSBjb21wdXRlciBhcHBsaWNhdGlvbnNcblwKK29mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXAorVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG9cblwKK3JlcGxhY2UgaXQgYnkgc29tZXRoaW5nIGVsc2UgYXQgYSBsb3dlciBsZXZlbCwgYW5kIHRoZSBydWxlIGJlY29tZXNcblwKK3RoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cCitidXQgdGhlIHRvcCBjZWxsIFwid2luc1wiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuXG4iCisiXG5cCitJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cCit0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmRcblwKK2ZpbmQgdGhlIFwibmV4dFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxuXAorZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXAordGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLlxuXAorVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXG5cCitCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iCisiXG5cCitBIG5pY2UgZmVhdHVyZSBvZiB0aGlzIHNvcnQgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IGluc2VydCBuZXdcblwKK2l0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwKK25vdCBcImJldHRlclwiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzXG5cCitlc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcblwKK2luY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cCit0aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcblwKK3NjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGFcblwKK2hlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cCit1c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXG4iCisiXG5cCitWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXAorc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSxcblwKK3RoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcblwKK3RoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwKK2FyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLlxuIgorIlxuXAorSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwKK2tub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nIFwicnVuc1wiICh3aGljaCBhcmUgcHJlLXNvcnRlZFxuXAorc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxuXAorZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXAordmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsXG5cCitzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxuXAordG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXAorcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbFxuXAorcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXG5cCithbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiIKKyJcblwKK01vcmVvdmVyLCBpZiB5b3Ugb3V0cHV0IHRoZSAwJ3RoIGl0ZW0gb24gZGlzayBhbmQgZ2V0IGFuIGlucHV0IHdoaWNoXG5cCittYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cCit0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGVcblwKK2hlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcblwKK2ZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cCitzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseVxuXAordmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcblwKK2VmZmVjdGl2ZSFcblwKK1xuXAorSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXG5cCithIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwKK2Fyb3VuZC4gOi0pXG4iCisiXG5cCistLS0tLS0tLS0tLS0tLS0tLS0tLVxuXAorWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlXG5cCittb3JlIGFubm95aW5nIHRoYW4gY2xldmVyLCBhbmQgdGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBzZWVraW5nXG5cCitjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwKK3RhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeVxuXAorY2xldmVyIHRvIGVuc3VyZSAoZmFyIGluIGFkdmFuY2UpIHRoYXQgZWFjaCB0YXBlIG1vdmVtZW50IHdpbGwgYmUgdGhlXG5cCittb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cCitcInByb2dyZXNzaW5nXCIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZFxuXAorYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cblwKK0JlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cCitGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKVxuIik7CisKK1B5TU9ESU5JVF9GVU5DCitpbml0X2hlYXBxKHZvaWQpCit7CisJUHlPYmplY3QgKm07CisKKwltID0gUHlfSW5pdE1vZHVsZTMoIl9oZWFwcSIsIGhlYXBxX21ldGhvZHMsIG1vZHVsZV9kb2MpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hYm91dF9fIiwgUHlTdHJpbmdfRnJvbVN0cmluZyhfX2Fib3V0X18pKTsKK30KKwo=